Browse Source

create-from-tar: fix and adapt to current master branch

- remove --progress (it is a common option now)
- remove --compression-from COMPRESSIONCONFIG (not supported any more)
- chunker-params: ALGO added
- return exit code, fix compression param
- give compatibility argument to with_repository decorator
- fix typos / c&p errors
- remove duplicate archive.add_item() call
- use dash_open(), this also fixes: use sys.stdin.buffer (binary)
- remove non-working compression/chunking code,
  this needs a bigger refactor...
Thomas Waldmann 4 years ago
parent
commit
9fc350ff20
1 changed files with 17 additions and 29 deletions
  1. 17 29
      src/borg/archiver.py

+ 17 - 29
src/borg/archiver.py

@@ -52,7 +52,7 @@ try:
     from .helpers import PrefixSpec, GlobSpec, CommentSpec, SortBySpec, FilesCacheMode
     from .helpers import PrefixSpec, GlobSpec, CommentSpec, SortBySpec, FilesCacheMode
     from .helpers import BaseFormatter, ItemFormatter, ArchiveFormatter
     from .helpers import BaseFormatter, ItemFormatter, ArchiveFormatter
     from .helpers import format_timedelta, format_file_size, parse_file_size, format_archive
     from .helpers import format_timedelta, format_file_size, parse_file_size, format_archive
-    from .helpers import safe_encode, remove_surrogates, bin_to_hex, prepare_dump_dict, eval_escapes
+    from .helpers import safe_encode, remove_surrogates, bin_to_hex, prepare_dump_dict, eval_escapes, make_path_safe
     from .helpers import interval, prune_within, prune_split, PRUNING_PATTERNS
     from .helpers import interval, prune_within, prune_split, PRUNING_PATTERNS
     from .helpers import timestamp
     from .helpers import timestamp
     from .helpers import get_cache_dir, os_stat
     from .helpers import get_cache_dir, os_stat
@@ -1700,7 +1700,7 @@ class Archiver:
             cache.commit()
             cache.commit()
         return self.exit_code
         return self.exit_code
 
 
-    @with_repository(cache=True, exclusive=True)
+    @with_repository(cache=True, exclusive=True, compatibility=(Manifest.Operation.WRITE,))
     def do_create_from_tar(self, args, repository, manifest, key, cache):
     def do_create_from_tar(self, args, repository, manifest, key, cache):
         self.output_filter = args.output_filter
         self.output_filter = args.output_filter
         self.output_list = args.output_list
         self.output_list = args.output_list
@@ -1717,10 +1717,8 @@ class Archiver:
         else:
         else:
             filter = args.tar_filter
             filter = args.tar_filter
 
 
-        if args.tarfile == '-':
-            tarstream, tarstream_close = sys.stdin, False
-        else:
-            tarstream, tarstream_close = open(args.tarfile, 'rb'), True
+        tarstream = dash_open(args.tarfile, 'rb')
+        tarstream_close = args.tarfile != '-'
 
 
         if filter:
         if filter:
             filterin = tarstream
             filterin = tarstream
@@ -1747,6 +1745,8 @@ class Archiver:
         if tarstream_close:
         if tarstream_close:
             tarstream.close()
             tarstream.close()
 
 
+        return self.exit_code
+
     def _create_from_tar(self, args, repository, manifest, key, cache, tar):
     def _create_from_tar(self, args, repository, manifest, key, cache, tar):
         def tarinfo_to_item(tarinfo, type=0):
         def tarinfo_to_item(tarinfo, type=0):
             return Item(path=make_path_safe(tarinfo.name), mode=tarinfo.mode | type,
             return Item(path=make_path_safe(tarinfo.name), mode=tarinfo.mode | type,
@@ -1760,7 +1760,6 @@ class Archiver:
                           create=True, checkpoint_interval=args.checkpoint_interval,
                           create=True, checkpoint_interval=args.checkpoint_interval,
                           progress=args.progress,
                           progress=args.progress,
                           chunker_params=args.chunker_params, start=t0, start_monotonic=t0_monotonic,
                           chunker_params=args.chunker_params, start=t0, start_monotonic=t0_monotonic,
-                          compression=args.compression, compression_files=args.compression_files,
                           log_json=args.log_json)
                           log_json=args.log_json)
 
 
         while True:
         while True:
@@ -1772,15 +1771,13 @@ class Archiver:
                 status = 'A'
                 status = 'A'
                 fd = tar.extractfile(tarinfo)
                 fd = tar.extractfile(tarinfo)
                 item = tarinfo_to_item(tarinfo, stat.S_IFREG)
                 item = tarinfo_to_item(tarinfo, stat.S_IFREG)
-                compress = archive.compression_decider1.decide(tarinfo.name)
-                archive.file_compression_logger.debug('%s -> compression %s', tarinfo.name, compress['name'])
-                archive.chunk_file(item, cache, archive.stats, backup_io_iter(archive.chunker.chunkify(fd)), compress=compress)
+                fd = fd  # avoid "unused fd" warning
+                item.chunks = []  # TODO, see do_create
                 item.get_size(memorize=True)
                 item.get_size(memorize=True)
                 archive.stats.nfiles += 1
                 archive.stats.nfiles += 1
             elif tarinfo.isdir():
             elif tarinfo.isdir():
                 status = 'd'
                 status = 'd'
                 item = tarinfo_to_item(tarinfo, stat.S_IFDIR)
                 item = tarinfo_to_item(tarinfo, stat.S_IFDIR)
-                archive.add_item(item)
             elif tarinfo.issym():
             elif tarinfo.issym():
                 status = 's'
                 status = 's'
                 item = tarinfo_to_item(tarinfo, stat.S_IFLNK)
                 item = tarinfo_to_item(tarinfo, stat.S_IFLNK)
@@ -1793,6 +1790,7 @@ class Archiver:
                 item = tarinfo_to_item(tarinfo, stat.S_IFREG)
                 item = tarinfo_to_item(tarinfo, stat.S_IFREG)
                 item.source = tarinfo.linkname
                 item.source = tarinfo.linkname
             else:
             else:
+                # TODO: chr and blk devices, fifos? GNUTYPE_SPARSE?
                 self.print_warning('%s: Unsupported tar type %s', tarinfo.name, tarinfo.type)
                 self.print_warning('%s: Unsupported tar type %s', tarinfo.name, tarinfo.type)
                 self.print_file_status('E', tarinfo.name)
                 self.print_file_status('E', tarinfo.name)
                 continue
                 continue
@@ -3873,7 +3871,7 @@ class Archiver:
         - .tar.bz2: bzip2
         - .tar.bz2: bzip2
         - .tar.xz: xz
         - .tar.xz: xz
 
 
-        Alternatively a ``--tar-filter`` program may be explicitly specified. It should
+        Alternatively, a ``--tar-filter`` program may be explicitly specified. It should
         read the uncompressed tar stream from stdin and write a compressed/filtered
         read the uncompressed tar stream from stdin and write a compressed/filtered
         tar stream to stdout.
         tar stream to stdout.
 
 
@@ -4738,13 +4736,13 @@ class Archiver:
         When giving '-' as path, Borg will read a tar stream from standard input.
         When giving '-' as path, Borg will read a tar stream from standard input.
 
 
         By default (--tar-filter=auto) Borg will detect whether the file is compressed
         By default (--tar-filter=auto) Borg will detect whether the file is compressed
-        based on it's file extension and pipe the file through an appropriate filter:
+        based on its file extension and pipe the file through an appropriate filter:
 
 
         - .tar.gz: gunzip
         - .tar.gz: gunzip
         - .tar.bz2: bunzip2
         - .tar.bz2: bunzip2
         - .tar.xz: unxz
         - .tar.xz: unxz
 
 
-        Alternatively a --tar-filter program may be explicitly specified. It should
+        Alternatively, a --tar-filter program may be explicitly specified. It should
         read compressed data from stdin and output an uncompressed tar stream on
         read compressed data from stdin and output an uncompressed tar stream on
         stdout.
         stdout.
 
 
@@ -4765,11 +4763,6 @@ class Archiver:
         subparser.add_argument('-s', '--stats', dest='stats',
         subparser.add_argument('-s', '--stats', dest='stats',
                                action='store_true', default=False,
                                action='store_true', default=False,
                                help='print statistics for the created archive')
                                help='print statistics for the created archive')
-        subparser.add_argument('-p', '--progress', dest='progress',
-                               action='store_true', default=False,
-                               help='show progress display while creating the archive, showing Original, '
-                                    'Compressed and Deduplicated sizes, followed by the Number of files seen '
-                                    'and the path being processed, default: %(default)s')
         subparser.add_argument('--list', dest='output_list',
         subparser.add_argument('--list', dest='output_list',
                                action='store_true', default=False,
                                action='store_true', default=False,
                                help='output verbose list of items (files, dirs, ...)')
                                help='output verbose list of items (files, dirs, ...)')
@@ -4792,23 +4785,18 @@ class Archiver:
         archive_group.add_argument('--chunker-params', dest='chunker_params',
         archive_group.add_argument('--chunker-params', dest='chunker_params',
                                    type=ChunkerParams, default=CHUNKER_PARAMS,
                                    type=ChunkerParams, default=CHUNKER_PARAMS,
                                    metavar='PARAMS',
                                    metavar='PARAMS',
-                                   help='specify the chunker parameters (CHUNK_MIN_EXP, CHUNK_MAX_EXP, '
-                                        'HASH_MASK_BITS, HASH_WINDOW_SIZE). default: %d,%d,%d,%d' % CHUNKER_PARAMS)
-        archive_group.add_argument('-C', '--compression', dest='compression',
-                                   type=CompressionSpec, default=dict(name='lz4'), metavar='COMPRESSION',
+                                   help='specify the chunker parameters (ALGO, CHUNK_MIN_EXP, CHUNK_MAX_EXP, '
+                                        'HASH_MASK_BITS, HASH_WINDOW_SIZE). default: %s,%d,%d,%d,%d' % CHUNKER_PARAMS)
+        archive_group.add_argument('-C', '--compression', metavar='COMPRESSION', dest='compression',
+                                   type=CompressionSpec, default=CompressionSpec('lz4'),
                                    help='select compression algorithm, see the output of the '
                                    help='select compression algorithm, see the output of the '
                                         '"borg help compression" command for details.')
                                         '"borg help compression" command for details.')
-        archive_group.add_argument('--compression-from', dest='compression_files',
-                                   type=argparse.FileType('r'), action='append',
-                                   metavar='COMPRESSIONCONFIG',
-                                   help='read compression patterns from COMPRESSIONCONFIG, see the output of the '
-                                        '"borg help compression" command for details.')
 
 
         subparser.add_argument('location', metavar='ARCHIVE',
         subparser.add_argument('location', metavar='ARCHIVE',
                                type=location_validator(archive=True),
                                type=location_validator(archive=True),
                                help='name of archive to create (must be also a valid directory name)')
                                help='name of archive to create (must be also a valid directory name)')
         subparser.add_argument('tarfile', metavar='TARFILE',
         subparser.add_argument('tarfile', metavar='TARFILE',
-                               help='paths to recreate; patterns are supported')
+                               help='input tar file. "-" to read from stdin instead.')
         return parser
         return parser
 
 
     def get_args(self, argv, cmd):
     def get_args(self, argv, cmd):