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

Method _process_leaf_versioned

src/borg/hlfuse.py:257–341  ·  view source on GitHub ↗

Process a file leaf node in versions mode

(self, segments, item, root_node, hlm)

Source from the content-addressed store, hash-verified

255 hlm.remember(id=item.hlid, info=item.path)
256
257 def _process_leaf_versioned(self, segments, item, root_node, hlm):
258 """Process a file leaf node in versions mode"""
259 path = b"/".join(segments)
260 original_path = item.path
261
262 # Handle hardlinks in versions mode - check if we've seen this hardlink before
263 is_hardlink = "hlid" in item
264 link_target = None
265 if is_hardlink:
266 link_target = hlm.retrieve(id=item.hlid, default=None)
267 if link_target is None:
268 # First occurrence of this hardlink
269 hlm.remember(id=item.hlid, info=original_path)
270
271 # Calculate version for this file
272 # If it's a hardlink to a previous file, use that version
273 if is_hardlink and link_target is not None:
274 link_target_enc = os.fsencode(link_target)
275 version = self.file_versions.get(link_target_enc)
276 else:
277 version = self._file_version(item, path)
278
279 # Store version for this path
280 if version is not None:
281 self.file_versions[path] = version
282
283 # Navigate to parent directory
284 node = root_node
285 for segment in segments[:-1]:
286 if not node.has_child(segment):
287 new_node = self._create_node(parent=node)
288 self.set_inode(new_node.ino, Item(internal_dict=self.default_dir.as_dict()))
289 node.add_child(segment, new_node)
290 node = node.get_child(segment)
291
292 # Create intermediate directory with the filename
293 leaf_name = segments[-1]
294 if not node.has_child(leaf_name):
295 intermediate_node = self._create_node(parent=node)
296 self.set_inode(intermediate_node.ino, Item(internal_dict=self.default_dir.as_dict()))
297 node.add_child(leaf_name, intermediate_node)
298 else:
299 intermediate_node = node.get_child(leaf_name)
300
301 # Create versioned filename
302 if version is not None:
303 versioned_name = self._make_versioned_name(leaf_name, version)
304
305 # If this is a hardlink to a previous file, reuse that node
306 if is_hardlink and link_target is not None:
307 link_target_enc = os.fsencode(link_target)
308 link_segments = link_target_enc.split(b"/")
309 link_version = self.file_versions.get(link_target_enc)
310 if link_version is not None:
311 # Navigate to the link target
312 target_node = root_node
313 for seg in link_segments[:-1]:
314 if target_node.has_child(seg):

Callers 1

_process_archiveMethod · 0.95

Calls 12

_file_versionMethod · 0.95
_create_nodeMethod · 0.95
set_inodeMethod · 0.95
_make_versioned_nameMethod · 0.95
get_inodeMethod · 0.95
retrieveMethod · 0.80
rememberMethod · 0.80
has_childMethod · 0.80
as_dictMethod · 0.80
add_childMethod · 0.80
get_childMethod · 0.80
getMethod · 0.45

Tested by

no test coverage detected