mirror of
https://github.com/borgbackup/borg.git
synced 2025-02-25 07:23:28 +00:00
Item: disallow None value for .user/group/chunks/chunks_healthy
If we do not know the value, just do not have that key/value pair in the item.
This commit is contained in:
parent
64cc16a9f4
commit
f2b085787b
5 changed files with 22 additions and 25 deletions
|
@ -392,14 +392,14 @@ def get_item_uid_gid(item, *, numeric, uid_forced=None, gid_forced=None, uid_def
|
||||||
if uid_forced is not None:
|
if uid_forced is not None:
|
||||||
uid = uid_forced
|
uid = uid_forced
|
||||||
else:
|
else:
|
||||||
uid = None if numeric else user2uid(item.user)
|
uid = None if numeric else user2uid(item.get('user'))
|
||||||
uid = item.uid if uid is None else uid
|
uid = item.uid if uid is None else uid
|
||||||
if uid < 0:
|
if uid < 0:
|
||||||
uid = uid_default
|
uid = uid_default
|
||||||
if gid_forced is not None:
|
if gid_forced is not None:
|
||||||
gid = gid_forced
|
gid = gid_forced
|
||||||
else:
|
else:
|
||||||
gid = None if numeric else group2gid(item.group)
|
gid = None if numeric else group2gid(item.get('group'))
|
||||||
gid = item.gid if gid is None else gid
|
gid = item.gid if gid is None else gid
|
||||||
if gid < 0:
|
if gid < 0:
|
||||||
gid = gid_default
|
gid = gid_default
|
||||||
|
@ -1089,11 +1089,13 @@ def stat_simple_attrs(self, st):
|
||||||
if not self.nobirthtime and hasattr(st, 'st_birthtime'):
|
if not self.nobirthtime and hasattr(st, 'st_birthtime'):
|
||||||
# sadly, there's no stat_result.st_birthtime_ns
|
# sadly, there's no stat_result.st_birthtime_ns
|
||||||
attrs['birthtime'] = safe_ns(int(st.st_birthtime * 10**9))
|
attrs['birthtime'] = safe_ns(int(st.st_birthtime * 10**9))
|
||||||
if self.numeric_ids:
|
if not self.numeric_ids:
|
||||||
attrs['user'] = attrs['group'] = None
|
user = uid2user(st.st_uid)
|
||||||
else:
|
if user is not None:
|
||||||
attrs['user'] = uid2user(st.st_uid)
|
attrs['user'] = user
|
||||||
attrs['group'] = gid2group(st.st_gid)
|
group = gid2group(st.st_gid)
|
||||||
|
if group is not None:
|
||||||
|
attrs['group'] = group
|
||||||
return attrs
|
return attrs
|
||||||
|
|
||||||
def stat_ext_attrs(self, st, path, fd=None):
|
def stat_ext_attrs(self, st, path, fd=None):
|
||||||
|
@ -1426,8 +1428,11 @@ def s_to_ns(s):
|
||||||
return safe_ns(int(float(s) * 1e9))
|
return safe_ns(int(float(s) * 1e9))
|
||||||
|
|
||||||
item = Item(path=make_path_safe(tarinfo.name), mode=tarinfo.mode | type,
|
item = Item(path=make_path_safe(tarinfo.name), mode=tarinfo.mode | type,
|
||||||
uid=tarinfo.uid, gid=tarinfo.gid, user=tarinfo.uname or None, group=tarinfo.gname or None,
|
uid=tarinfo.uid, gid=tarinfo.gid, mtime=s_to_ns(tarinfo.mtime))
|
||||||
mtime=s_to_ns(tarinfo.mtime))
|
if tarinfo.uname:
|
||||||
|
item.user = tarinfo.uname
|
||||||
|
if tarinfo.gname:
|
||||||
|
item.group = tarinfo.gname
|
||||||
if ph:
|
if ph:
|
||||||
# note: for mtime this is a bit redundant as it is already done by tarfile module,
|
# note: for mtime this is a bit redundant as it is already done by tarfile module,
|
||||||
# but we just do it in our way to be consistent for sure.
|
# but we just do it in our way to be consistent for sure.
|
||||||
|
|
|
@ -1355,8 +1355,8 @@ def item_to_tarinfo(item, original_path):
|
||||||
tarinfo.mode = stat.S_IMODE(item.mode)
|
tarinfo.mode = stat.S_IMODE(item.mode)
|
||||||
tarinfo.uid = item.uid
|
tarinfo.uid = item.uid
|
||||||
tarinfo.gid = item.gid
|
tarinfo.gid = item.gid
|
||||||
tarinfo.uname = item.user or ''
|
tarinfo.uname = item.get('user', '')
|
||||||
tarinfo.gname = item.group or ''
|
tarinfo.gname = item.get('group', '')
|
||||||
# The linkname in tar has 2 uses:
|
# The linkname in tar has 2 uses:
|
||||||
# for symlinks it means the destination, while for hardlinks it refers to the file.
|
# for symlinks it means the destination, while for hardlinks it refers to the file.
|
||||||
# Since hardlinks in tar have a different type code (LNKTYPE) the format might
|
# Since hardlinks in tar have a different type code (LNKTYPE) the format might
|
||||||
|
|
|
@ -808,8 +808,8 @@ def get_item_data(self, item):
|
||||||
hlid = bin_to_hex(hlid) if hlid else ''
|
hlid = bin_to_hex(hlid) if hlid else ''
|
||||||
item_data['type'] = item_type
|
item_data['type'] = item_type
|
||||||
item_data['mode'] = mode
|
item_data['mode'] = mode
|
||||||
item_data['user'] = item.user or item.uid
|
item_data['user'] = item.get('user', str(item.uid))
|
||||||
item_data['group'] = item.group or item.gid
|
item_data['group'] = item.get('group', str(item.gid))
|
||||||
item_data['uid'] = item.uid
|
item_data['uid'] = item.uid
|
||||||
item_data['gid'] = item.gid
|
item_data['gid'] = item.gid
|
||||||
item_data['path'] = remove_surrogates(item.path)
|
item_data['path'] = remove_surrogates(item.path)
|
||||||
|
|
|
@ -249,8 +249,8 @@ class Item(PropDict):
|
||||||
|
|
||||||
path = PropDict._make_property('path', str, 'surrogate-escaped str')
|
path = PropDict._make_property('path', str, 'surrogate-escaped str')
|
||||||
source = PropDict._make_property('source', str, 'surrogate-escaped str')
|
source = PropDict._make_property('source', str, 'surrogate-escaped str')
|
||||||
user = PropDict._make_property('user', (str, type(None)), 'surrogate-escaped str or None')
|
user = PropDict._make_property('user', str, 'surrogate-escaped str')
|
||||||
group = PropDict._make_property('group', (str, type(None)), 'surrogate-escaped str or None')
|
group = PropDict._make_property('group', str, 'surrogate-escaped str')
|
||||||
|
|
||||||
acl_access = PropDict._make_property('acl_access', bytes)
|
acl_access = PropDict._make_property('acl_access', bytes)
|
||||||
acl_default = PropDict._make_property('acl_default', bytes)
|
acl_default = PropDict._make_property('acl_default', bytes)
|
||||||
|
@ -274,8 +274,8 @@ class Item(PropDict):
|
||||||
hlid = PropDict._make_property('hlid', bytes) # hard link id: same value means same hard link.
|
hlid = PropDict._make_property('hlid', bytes) # hard link id: same value means same hard link.
|
||||||
hardlink_master = PropDict._make_property('hardlink_master', bool) # legacy
|
hardlink_master = PropDict._make_property('hardlink_master', bool) # legacy
|
||||||
|
|
||||||
chunks = PropDict._make_property('chunks', (list, type(None)), 'list or None')
|
chunks = PropDict._make_property('chunks', list, 'list')
|
||||||
chunks_healthy = PropDict._make_property('chunks_healthy', (list, type(None)), 'list or None')
|
chunks_healthy = PropDict._make_property('chunks_healthy', list, 'list')
|
||||||
|
|
||||||
xattrs = PropDict._make_property('xattrs', StableDict)
|
xattrs = PropDict._make_property('xattrs', StableDict)
|
||||||
|
|
||||||
|
|
|
@ -89,14 +89,6 @@ def test_item_mptimestamp_property():
|
||||||
assert item.as_dict() == {'atime': Timestamp.from_unix_nano(big)}
|
assert item.as_dict() == {'atime': Timestamp.from_unix_nano(big)}
|
||||||
|
|
||||||
|
|
||||||
def test_item_user_group_none():
|
|
||||||
item = Item()
|
|
||||||
item.user = None
|
|
||||||
assert item.user is None
|
|
||||||
item.group = None
|
|
||||||
assert item.group is None
|
|
||||||
|
|
||||||
|
|
||||||
def test_item_se_str_property():
|
def test_item_se_str_property():
|
||||||
# start simple
|
# start simple
|
||||||
item = Item()
|
item = Item()
|
||||||
|
|
Loading…
Reference in a new issue