(self, archive_id, root_node=None)
| 186 | yield item |
| 187 | |
| 188 | def _process_archive(self, archive_id, root_node=None): |
| 189 | if root_node is None: |
| 190 | root_node = self.root |
| 191 | |
| 192 | self.file_versions = {} # for versions mode: original path -> version |
| 193 | |
| 194 | archive = Archive(self._manifest, archive_id) |
| 195 | strip_components = self._args.strip_components |
| 196 | # omitting args.pattern_roots here, restricting to paths only by cli args.paths: |
| 197 | matcher = build_matcher(self._args.patterns, self._args.paths) |
| 198 | hlm = HardLinkManager(id_type=bytes, info_type=str) |
| 199 | |
| 200 | filter = build_filter(matcher, strip_components) |
| 201 | |
| 202 | for item in self._iter_archive_items(archive.metadata.items, filter=filter): |
| 203 | if strip_components: |
| 204 | item.path = os.sep.join(item.path.split(os.sep)[strip_components:]) |
| 205 | |
| 206 | path = os.fsencode(item.path) |
| 207 | segments = path.split(b"/") |
| 208 | is_dir = stat.S_ISDIR(item.mode) |
| 209 | |
| 210 | # For versions mode, handle files differently |
| 211 | if self.versions and not is_dir: |
| 212 | self._process_leaf_versioned(segments, item, root_node, hlm) |
| 213 | else: |
| 214 | # Original non-versions logic |
| 215 | node = root_node |
| 216 | # Traverse/Create directories |
| 217 | for segment in segments[:-1]: |
| 218 | if not node.has_child(segment): |
| 219 | new_node = self._create_node(parent=node) |
| 220 | # We might need a default directory item if it's an implicit directory |
| 221 | self.set_inode(new_node.ino, Item(internal_dict=self.default_dir.as_dict())) |
| 222 | node.add_child(segment, new_node) |
| 223 | node = node.get_child(segment) |
| 224 | |
| 225 | # Leaf (file or explicit directory) |
| 226 | leaf_name = segments[-1] |
| 227 | if node.has_child(leaf_name): |
| 228 | # Already exists (e.g. implicit dir became explicit) |
| 229 | child = node.get_child(leaf_name) |
| 230 | self.set_inode(child.ino, item) # Update item |
| 231 | node = child |
| 232 | else: |
| 233 | new_node = self._create_node(item, parent=node) |
| 234 | node.add_child(leaf_name, new_node) |
| 235 | node = new_node |
| 236 | |
| 237 | # Handle hardlinks (non-versions mode) |
| 238 | if "hlid" in item: |
| 239 | link_target = hlm.retrieve(id=item.hlid, default=None) |
| 240 | if link_target is not None: |
| 241 | target_path = os.fsencode(link_target) |
| 242 | target_node = self._find_node_from_root(root_node, target_path) |
| 243 | if target_node: |
| 244 | # Reuse ino and item from target |
| 245 | node.ino = target_node.ino |
no test coverage detected