2
0
Эх сурвалжийг харах

Mostly revert "clean imports, remove unused code"

This reverts commit b7eaeee26631f145a2b7d73f73f20fb56314c3a8.

We still need the bigint stuff for compatibility to borg 1.0 archives.

# Conflicts:
#	src/borg/archive.py
#	src/borg/archiver.py
#	src/borg/helpers.py
#	src/borg/key.py
Thomas Waldmann 8 жил өмнө
parent
commit
04dba76fc9

+ 1 - 0
src/borg/archive.py

@@ -34,6 +34,7 @@ from .helpers import safe_encode, safe_decode, make_path_safe, remove_surrogates
 from .helpers import StableDict
 from .helpers import bin_to_hex
 from .helpers import safe_ns
+from .helpers import int_to_bigint, bigint_to_int
 from .helpers import ellipsis_truncate, ProgressIndicatorPercent, log_multi
 from .helpers import PathPrefixPattern, FnmatchPattern
 from .helpers import CompressionDecider1, CompressionDecider2, CompressionSpec

+ 19 - 1
src/borg/helpers.py

@@ -859,7 +859,7 @@ def safe_ns(ts):
 
 
 def safe_timestamp(item_timestamp_ns):
-    t_ns = safe_ns(item_timestamp_ns)
+    t_ns = safe_ns(bigint_to_int(item_timestamp_ns))
     return datetime.fromtimestamp(t_ns / 1e9)
 
 
@@ -1332,6 +1332,24 @@ class StableDict(dict):
         return sorted(super().items())
 
 
+def bigint_to_int(mtime):
+    """Convert bytearray to int
+    """
+    if isinstance(mtime, bytes):
+        return int.from_bytes(mtime, 'little', signed=True)
+    return mtime
+
+
+def int_to_bigint(value):
+    """Convert integers larger than 64 bits to bytearray
+
+    Smaller integers are left alone
+    """
+    if value.bit_length() > 63:
+        return value.to_bytes((value.bit_length() + 9) // 8, 'little', signed=True)
+    return value
+
+
 def is_slow_msgpack():
     return msgpack.Packer is msgpack.fallback.Packer
 

+ 13 - 1
src/borg/testsuite/helpers.py

@@ -20,7 +20,7 @@ from ..helpers import prune_within, prune_split
 from ..helpers import get_cache_dir, get_keys_dir, get_security_dir
 from ..helpers import is_slow_msgpack
 from ..helpers import yes, TRUISH, FALSISH, DEFAULTISH
-from ..helpers import StableDict, bin_to_hex
+from ..helpers import StableDict, int_to_bigint, bigint_to_int, bin_to_hex
 from ..helpers import parse_timestamp, ChunkIteratorFileWrapper, ChunkerParams, Chunk
 from ..helpers import ProgressIndicatorPercent, ProgressIndicatorEndless
 from ..helpers import load_exclude_file, load_pattern_file
@@ -33,6 +33,18 @@ from ..helpers import safe_ns, safe_s
 from . import BaseTestCase, FakeInputs
 
 
+class BigIntTestCase(BaseTestCase):
+
+    def test_bigint(self):
+        self.assert_equal(int_to_bigint(0), 0)
+        self.assert_equal(int_to_bigint(2**63-1), 2**63-1)
+        self.assert_equal(int_to_bigint(-2**63+1), -2**63+1)
+        self.assert_equal(int_to_bigint(2**63), b'\x00\x00\x00\x00\x00\x00\x00\x80\x00')
+        self.assert_equal(int_to_bigint(-2**63), b'\x00\x00\x00\x00\x00\x00\x00\x80\xff')
+        self.assert_equal(bigint_to_int(int_to_bigint(-2**70)), -2**70)
+        self.assert_equal(bigint_to_int(int_to_bigint(2**70)), 2**70)
+
+
 def test_bin_to_hex():
     assert bin_to_hex(b'') == ''
     assert bin_to_hex(b'\x00\x01\xff') == '0001ff'