diff --git a/src/borg/archive.py b/src/borg/archive.py index e97b06b11..5e64f51cc 100644 --- a/src/borg/archive.py +++ b/src/borg/archive.py @@ -1852,7 +1852,7 @@ class ArchiveRecreater: exclude_caches=False, exclude_if_present=None, keep_exclude_tags=False, chunker_params=None, compression=None, recompress=False, always_recompress=False, dry_run=False, stats=False, progress=False, file_status_printer=None, - checkpoint_interval=1800): + timestamp=None, checkpoint_interval=1800): self.repository = repository self.key = key self.manifest = manifest @@ -1872,6 +1872,7 @@ class ArchiveRecreater: self.compression = compression or CompressionSpec('none') self.seen_chunks = set() + self.timestamp = timestamp self.dry_run = dry_run self.stats = stats self.progress = progress @@ -1976,18 +1977,33 @@ class ArchiveRecreater: return if comment is None: comment = archive.metadata.get('comment', '') - target.save(comment=comment, stats=target.stats, additional_metadata={ - # keep some metadata as in original archive: - 'time': archive.metadata.time, - 'time_end': archive.metadata.get('time_end') or archive.metadata.time, - 'cmdline': archive.metadata.cmdline, - # but also remember recreate metadata: - 'recreate_cmdline': sys.argv, - }) + + # Keep for the statistics if necessary + if self.stats: + _start = target.start + + if self.timestamp is None: + additional_metadata = { + 'time': archive.metadata.time, + 'time_end': archive.metadata.get('time_end') or archive.metadata.time, + 'cmdline': archive.metadata.cmdline, + # but also remember recreate metadata: + 'recreate_cmdline': sys.argv, + } + else: + additional_metadata = { + 'cmdline': archive.metadata.cmdline, + # but also remember recreate metadata: + 'recreate_cmdline': sys.argv, + } + + target.save(comment=comment, timestamp=self.timestamp, + stats=target.stats, additional_metadata=additional_metadata) if replace_original: archive.delete(Statistics(), progress=self.progress) target.rename(archive.name) if self.stats: + target.start = _start target.end = datetime.utcnow() log_multi(DASHES, str(target), diff --git a/src/borg/archiver.py b/src/borg/archiver.py index faad61a65..6d16b9d77 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -1560,7 +1560,7 @@ class Archiver: progress=args.progress, stats=args.stats, file_status_printer=self.print_file_status, checkpoint_interval=args.checkpoint_interval, - dry_run=args.dry_run) + dry_run=args.dry_run, timestamp=args.timestamp) if args.location.archive: name = args.location.archive diff --git a/src/borg/testsuite/archiver.py b/src/borg/testsuite/archiver.py index 42843e67a..2d1948def 100644 --- a/src/borg/testsuite/archiver.py +++ b/src/borg/testsuite/archiver.py @@ -2551,6 +2551,17 @@ class ArchiverTestCase(ArchiverTestCaseBase): assert int(csize) < int(size) assert sha256_before == sha256_after + def test_recreate_timestamp(self): + self.create_test_files() + self.cmd('init', '--encryption=repokey', self.repository_location) + archive = self.repository_location + '::test0' + self.cmd('create', archive, 'input') + self.cmd('recreate', '--timestamp', "1970-01-02T00:00:00", '--comment', + 'test', archive) + info = self.cmd('info', archive).splitlines() + assert any([re.search(r'Time \(start\).+ 1970-01-02', item) for item in info]) + assert any([re.search(r'Time \(end\).+ 1970-01-02', item) for item in info]) + def test_recreate_dry_run(self): self.create_regular_file('compressible', size=10000) self.cmd('init', '--encryption=repokey', self.repository_location)