MCPcopy
hub / github.com/borgbackup/borg / _process_archive

Method _process_archive

src/borg/hlfuse.py:188–255  ·  view source on GitHub ↗
(self, archive_id, root_node=None)

Source from the content-addressed store, hash-verified

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

Callers 2

_create_filesystemMethod · 0.95
check_pending_archiveMethod · 0.95

Calls 15

_iter_archive_itemsMethod · 0.95
_create_nodeMethod · 0.95
set_inodeMethod · 0.95
retrieveMethod · 0.95
_find_node_from_rootMethod · 0.95
get_inodeMethod · 0.95
rememberMethod · 0.95
ArchiveClass · 0.85
build_matcherFunction · 0.85
HardLinkManagerClass · 0.85
build_filterFunction · 0.85

Tested by

no test coverage detected