Browse Source

add and use string representation of archive for stats

Antoine Beaupré 9 years ago
parent
commit
8193c414a9
2 changed files with 27 additions and 13 deletions
  1. 24 2
      borg/archive.py
  2. 3 11
      borg/archiver.py

+ 24 - 2
borg/archive.py

@@ -1,3 +1,4 @@
+from binascii import hexlify
 from datetime import datetime
 from datetime import datetime
 from getpass import getuser
 from getpass import getuser
 from itertools import groupby
 from itertools import groupby
@@ -18,7 +19,7 @@ from . import xattr
 from .platform import acl_get, acl_set
 from .platform import acl_get, acl_set
 from .chunker import Chunker
 from .chunker import Chunker
 from .hashindex import ChunkIndex
 from .hashindex import ChunkIndex
-from .helpers import parse_timestamp, Error, uid2user, user2uid, gid2group, group2gid, \
+from .helpers import parse_timestamp, format_timedelta, Error, uid2user, user2uid, gid2group, group2gid, \
     Manifest, Statistics, decode_dict, st_mtime_ns, make_path_safe, StableDict, int_to_bigint, bigint_to_int
     Manifest, Statistics, decode_dict, st_mtime_ns, make_path_safe, StableDict, int_to_bigint, bigint_to_int
 
 
 ITEMS_BUFFER = 1024 * 1024
 ITEMS_BUFFER = 1024 * 1024
@@ -130,7 +131,8 @@ class Archive:
 
 
     def __init__(self, repository, key, manifest, name, cache=None, create=False,
     def __init__(self, repository, key, manifest, name, cache=None, create=False,
                  checkpoint_interval=300, numeric_owner=False, progress=False,
                  checkpoint_interval=300, numeric_owner=False, progress=False,
-                 chunker_params=CHUNKER_PARAMS):
+                 chunker_params=CHUNKER_PARAMS,
+                 start=datetime.now(), end=datetime.now()):
         self.cwd = os.getcwd()
         self.cwd = os.getcwd()
         self.key = key
         self.key = key
         self.repository = repository
         self.repository = repository
@@ -143,6 +145,8 @@ class Archive:
         self.name = name
         self.name = name
         self.checkpoint_interval = checkpoint_interval
         self.checkpoint_interval = checkpoint_interval
         self.numeric_owner = numeric_owner
         self.numeric_owner = numeric_owner
+        self.start = start
+        self.end = end
         self.pipeline = DownloadPipeline(self.repository, self.key)
         self.pipeline = DownloadPipeline(self.repository, self.key)
         if create:
         if create:
             self.items_buffer = CacheChunkBuffer(self.cache, self.key, self.stats, chunker_params)
             self.items_buffer = CacheChunkBuffer(self.cache, self.key, self.stats, chunker_params)
@@ -182,6 +186,24 @@ class Archive:
         """Timestamp of archive creation in UTC"""
         """Timestamp of archive creation in UTC"""
         return parse_timestamp(self.metadata[b'time'])
         return parse_timestamp(self.metadata[b'time'])
 
 
+    @property
+    def fpr(self):
+        return hexlify(self.id).decode('ascii')
+
+    @property
+    def duration(self):
+        return format_timedelta(self.end-self.start)
+
+    def __str__(self):
+        buf = '''Archive name: {0.name}
+Archive fingerprint: {0.fpr}
+Start time: {0.start:%c}
+End time: {0.end:%c}
+Duration: {0.duration}
+Number of files: {0.stats.nfiles}
+This archive: {0.cache}'''.format(self)
+        return buf
+
     def __repr__(self):
     def __repr__(self):
         return 'Archive(%r)' % self.name
         return 'Archive(%r)' % self.name
 
 

+ 3 - 11
borg/archiver.py

@@ -115,7 +115,7 @@ Type "Yes I am sure" if you understand this and want to continue.\n""")
             archive = Archive(repository, key, manifest, args.archive.archive, cache=cache,
             archive = Archive(repository, key, manifest, args.archive.archive, cache=cache,
                               create=True, checkpoint_interval=args.checkpoint_interval,
                               create=True, checkpoint_interval=args.checkpoint_interval,
                               numeric_owner=args.numeric_owner, progress=args.progress,
                               numeric_owner=args.numeric_owner, progress=args.progress,
-                              chunker_params=args.chunker_params)
+                              chunker_params=args.chunker_params, start=t0)
         else:
         else:
             archive = cache = None
             archive = cache = None
         # Add cache dir to inode_skip list
         # Add cache dir to inode_skip list
@@ -160,17 +160,9 @@ Type "Yes I am sure" if you understand this and want to continue.\n""")
             if args.progress:
             if args.progress:
                 archive.stats.show_progress(final=True)
                 archive.stats.show_progress(final=True)
             if args.stats:
             if args.stats:
-                t = datetime.now()
-                diff = t - t0
-                print('-' * 78)
-                print('Archive name: %s' % args.archive.archive)
-                print('Archive fingerprint: %s' % hexlify(archive.id).decode('ascii'))
-                print('Start time: %s' % t0.strftime('%c'))
-                print('End time: %s' % t.strftime('%c'))
-                print('Duration: %s' % format_timedelta(diff))
-                print('Number of files: %d' % archive.stats.nfiles)
+                archive.end = datetime.now()
+                print(str(archive))
                 print(archive.stats.print_('This archive:', cache))
                 print(archive.stats.print_('This archive:', cache))
-                print('-' * 78)
         return self.exit_code
         return self.exit_code
 
 
     def _process(self, archive, cache, excludes, exclude_caches, skip_inodes, path, restrict_dev,
     def _process(self, archive, cache, excludes, exclude_caches, skip_inodes, path, restrict_dev,