Skip to content

Commit

Permalink
Add support for <absolute> path item types
Browse files Browse the repository at this point in the history
  • Loading branch information
Dale Myers committed Nov 24, 2023
1 parent d1d1243 commit 459e49b
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 29 deletions.
60 changes: 32 additions & 28 deletions xcodeproj/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,8 @@ def from_cache(
return pickle.load(cached_file)
except Exception:
return XcodeProject(
project_path, ignore_deserialization_errors=ignore_deserialization_errors
project_path,
ignore_deserialization_errors=ignore_deserialization_errors,
)

def write_cache(self) -> None:
Expand Down Expand Up @@ -194,6 +195,35 @@ def _populate_cache(self, object_type: Type[PBXObject]) -> None:

self._cached_items[object_type.__name__] = cached_items

def _populate(
self,
parent_group: PBXPathObject,
path: Optional[str],
non_set: list[PBXPathObject],
) -> None:
if path is not None:
setattr(parent_group, "_relative_path", path)

if not isinstance(parent_group, PBXGroup):
return

for subgroup in parent_group.children:
if subgroup.source_tree == "SOURCE_ROOT":
self._populate(subgroup, subgroup.path, non_set)
elif subgroup.source_tree == "<group>":
if subgroup.path is None:
if path is None:
self._populate(subgroup, path, non_set)
else:
non_set.append(subgroup)
else:
if path is not None:
self._populate(subgroup, os.path.join(path, subgroup.path), non_set)
else:
self._populate(subgroup, subgroup.path, non_set)
else:
non_set.append(subgroup)

def populate_paths(self) -> None:
"""Pre-emptively populate group paths.
Expand All @@ -205,34 +235,8 @@ def populate_paths(self) -> None:

non_set = []

def populate(parent_group: PBXPathObject, path: Optional[str]) -> None:
nonlocal non_set

if path is not None:
setattr(parent_group, "_relative_path", path)

if not isinstance(parent_group, PBXGroup):
return

for subgroup in parent_group.children:
if subgroup.source_tree == "SOURCE_ROOT":
populate(subgroup, subgroup.path)
elif subgroup.source_tree == "<group>":
if subgroup.path is None:
if path is None:
populate(subgroup, path)
else:
non_set.append(subgroup)
else:
if path is not None:
populate(subgroup, os.path.join(path, subgroup.path))
else:
populate(subgroup, subgroup.path)
else:
non_set.append(subgroup)

root_group = self.objects[self.project.main_group_id]
populate(root_group, None)
self._populate(root_group, None, non_set)

for item in non_set:
_ = item.relative_path()
Expand Down
13 changes: 12 additions & 1 deletion xcodeproj/pathobjects.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ def parent_group(self) -> Optional["PBXGroup"]:
hasattr(self, "_parent_group_reference")
and getattr(self, "_parent_group_reference") is not None
):
return cast(PBXGroup, self.project().objects[getattr(self, "_parent_group_reference")])
return cast(
PBXGroup,
self.project().objects[getattr(self, "_parent_group_reference")],
)

for group in self.project().fetch_type(PBXGroup).values():
if self in group.children:
Expand Down Expand Up @@ -78,6 +81,11 @@ def relative_path(self) -> Optional[str]:
setattr(self, "_relative_path", self.path)
return cast(str, self.path)

if self.source_tree == "<absolute>":
if not self.path.startswith(os.sep):
setattr(self, "_relative_path", self.path)
return self.path

if self.source_tree != "<group>":
if self.source_tree in ["BUILT_PRODUCTS_DIR", "SDKROOT", "DEVELOPER_DIR"]:
return f"$({self.source_tree})"
Expand Down Expand Up @@ -116,6 +124,9 @@ def absolute_path(self) -> Optional[str]:
if path is None:
return None

if path.startswith("/"):
return path

return os.path.join(self.project().source_root, path)


Expand Down

0 comments on commit 459e49b

Please sign in to comment.