def main(args=None): args = parse_args(args) if args.subparser_name in ('extract', 'x'): if args.info: api.extract(args.archive_path, args.dest, components='info') else: api.extract(args.archive_path, args.dest) elif args.subparser_name in ('create', 'c'): api.create(args.prefix, args.file_list, args.out_fn, args.out_folder) elif args.subparser_name in ('transmute', 't'): failed_files = api.transmute(args.in_file, args.out_ext, args.out_folder, args.processes) if failed_files: print("failed files:") print(failed_files) else: raise NotImplementedError("Command {} is not implemented".format( args.subparser_name))
def test_create_package_with_uncommon_conditions_captures_all_content(testing_workdir): os.makedirs('src/a_folder') os.makedirs('src/empty_folder') os.makedirs('src/symlink_stuff') with open('src/a_folder/text_file', 'w') as f: f.write('weee') open('src/empty_file', 'w').close() os.link('src/a_folder/text_file', 'src/a_folder/hardlink_to_text_file') os.symlink('../a_folder', 'src/symlink_stuff/symlink_to_a') os.symlink('../empty_file', 'src/symlink_stuff/symlink_to_empty_file') os.symlink('../a_folder/text_file', 'src/symlink_stuff/symlink_to_text_file') with tarfile.open('pinkie.tar.bz2', 'w:bz2') as tf: tf.add('src/empty_folder', 'empty_folder') tf.add('src/empty_file', 'empty_file') tf.add('src/a_folder', 'a_folder') tf.add('src/a_folder/text_file', 'a_folder/text_file') tf.add('src/a_folder/hardlink_to_text_file', 'a_folder/hardlink_to_text_file') tf.add('src/symlink_stuff/symlink_to_a', 'symlink_stuff/symlink_to_a') tf.add('src/symlink_stuff/symlink_to_empty_file', 'symlink_stuff/symlink_to_empty_file') tf.add('src/symlink_stuff/symlink_to_text_file', 'symlink_stuff/symlink_to_text_file') cph_created = api.create('src', None, 'thebrain.tar.bz2') # test against both archives created manually and those created by cph. They should be equal in all ways. for fn in ('pinkie.tar.bz2', 'thebrain.tar.bz2'): api.extract(fn) target_dir = fn[:-8] flist = [ 'empty_folder', 'empty_file', 'a_folder/text_file', 'a_folder/hardlink_to_text_file', 'symlink_stuff/symlink_to_a', 'symlink_stuff/symlink_to_text_file', 'symlink_stuff/symlink_to_empty_file', ] # no symlinks on windows if sys.platform != 'win32': # not directly included but checked symlink flist.append('symlink_stuff/symlink_to_a/text_file') missing_content = [] for f in flist: path_that_should_be_there = os.path.join(testing_workdir, target_dir, f) if not (os.path.exists(path_that_should_be_there) or os.path.lexists(path_that_should_be_there)): missing_content.append(f) if missing_content: print("missing files in output package") print(missing_content) sys.exit(1) # hardlinks should be preserved, but they're currently not with libarchive # hardlinked_file = os.path.join(testing_workdir, target_dir, 'a_folder/text_file') # stat = os.stat(hardlinked_file) # assert stat.st_nlink == 2 hardlinked_file = os.path.join(testing_workdir, target_dir, 'empty_file') stat = os.stat(hardlinked_file) if sys.platform != 'win32': assert stat.st_nlink == 1