diff --git a/attic/archive.py b/attic/archive.py index 0bf1bd58a..acb9934d9 100644 --- a/attic/archive.py +++ b/attic/archive.py @@ -230,11 +230,14 @@ def add_file_chunks(chunks): cache.rollback() return stats - def extract_item(self, item, restore_attrs=True, dry_run=False): - if dry_run: + def extract_item(self, item, restore_attrs=True, dry_run=False, stdout=False): + if dry_run or stdout: if b'chunks' in item: - for _ in self.pipeline.fetch_many([c[0] for c in item[b'chunks']], is_preloaded=True): - pass + for data in self.pipeline.fetch_many([c[0] for c in item[b'chunks']], is_preloaded=True): + if stdout: + sys.stdout.buffer.write(data) + if stdout: + sys.stdout.buffer.flush() return dest = self.cwd diff --git a/attic/archiver.py b/attic/archiver.py index 585f01537..728393efa 100644 --- a/attic/archiver.py +++ b/attic/archiver.py @@ -202,6 +202,7 @@ def do_extract(self, args): numeric_owner=args.numeric_owner) patterns = adjust_patterns(args.paths, args.excludes) dry_run = args.dry_run + stdout = args.stdout strip_components = args.strip_components dirs = [] for item in archive.iter_items(lambda item: not exclude_path(item[b'path'], patterns), preload=True): @@ -212,7 +213,7 @@ def do_extract(self, args): continue if not args.dry_run: while dirs and not item[b'path'].startswith(dirs[-1][b'path']): - archive.extract_item(dirs.pop(-1)) + archive.extract_item(dirs.pop(-1), stdout=stdout) self.print_verbose(remove_surrogates(orig_path)) try: if dry_run: @@ -222,7 +223,7 @@ def do_extract(self, args): dirs.append(item) archive.extract_item(item, restore_attrs=False) else: - archive.extract_item(item) + archive.extract_item(item, stdout=stdout) except IOError as e: self.print_error('%s: %s', remove_surrogates(orig_path), e) @@ -592,6 +593,9 @@ def run(self, args=None): subparser.add_argument('--strip-components', dest='strip_components', type=int, default=0, metavar='NUMBER', help='Remove the specified number of leading path elements. Pathnames with fewer elements will be silently skipped.') + subparser.add_argument('--stdout', dest='stdout', + action='store_true', default=False, + help='write all extracted data to stdout') subparser.add_argument('archive', metavar='ARCHIVE', type=location_validator(archive=True), help='archive to extract')