From 04dba76fc9761cc71f57a47ff6fdb45808611208 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Tue, 21 Mar 2017 02:05:38 +0100 Subject: [PATCH] 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 --- src/borg/archive.py | 1 + src/borg/helpers.py | 20 +++++++++++++++++++- src/borg/testsuite/helpers.py | 14 +++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/borg/archive.py b/src/borg/archive.py index 94cd482ac..c1d4d8091 100644 --- a/src/borg/archive.py +++ b/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 diff --git a/src/borg/helpers.py b/src/borg/helpers.py index c04da8b6c..e2949c9d0 100644 --- a/src/borg/helpers.py +++ b/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 diff --git a/src/borg/testsuite/helpers.py b/src/borg/testsuite/helpers.py index 02ed0b38f..2dcf287ae 100644 --- a/src/borg/testsuite/helpers.py +++ b/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'