From 3bda2f10d96cbfe626d2024ef96c53ad4a6e0fa9 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Thu, 4 Dec 2025 23:32:05 +0100 Subject: [PATCH] HardLinkManager: allow NoneType for contentless hardlinks, see #9208 Some hardlinks have content and thus a chunks list, but e.g. block or char device hardlinks do not have a chunks list. --- src/borg/helpers/fs.py | 2 +- src/borg/upgrade.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/borg/helpers/fs.py b/src/borg/helpers/fs.py index 07c263054..66e1ecdfb 100644 --- a/src/borg/helpers/fs.py +++ b/src/borg/helpers/fs.py @@ -346,7 +346,7 @@ class HardLinkManager: def __init__(self, *, id_type, info_type): self._map = {} self.id_type = id_type - self.info_type = info_type + self.info_type = info_type # can be a single type or a tuple of types def borg1_hardlinkable(self, mode): # legacy return stat.S_ISREG(mode) or stat.S_ISBLK(mode) or stat.S_ISCHR(mode) or stat.S_ISFIFO(mode) diff --git a/src/borg/upgrade.py b/src/borg/upgrade.py index 35d968837..9f6f653f0 100644 --- a/src/borg/upgrade.py +++ b/src/borg/upgrade.py @@ -1,4 +1,5 @@ from struct import Struct +from types import NoneType from .constants import REQUIRED_ITEM_KEYS, CH_BUZHASH from .compress import ZLIB, ZLIB_legacy, ObfuscateSize @@ -53,7 +54,8 @@ class UpgraderFrom12To20: def new_archive(self, *, archive): self.archive = archive - self.hlm = HardLinkManager(id_type=bytes, info_type=list) # hlid -> chunks_correct + # hlid -> chunks_correct list (or None, for contentless hardlinks) + self.hlm = HardLinkManager(id_type=bytes, info_type=(list, NoneType)) def upgrade_item(self, *, item): """Upgrades the item as needed and removes legacy data."""