diff --git a/setup.cfg b/setup.cfg index f0d8509..27b05d1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,7 +3,7 @@ [metadata] name = subprocess-util -version = 0.0.1 +version = 0.0.2 author = Daniel Langbein author_email = daniel@systemli.org description = subprocess utility functions diff --git a/src/subprocess_util/chunked_transfer/active_receive/btrfs_receive_chunks_active.py b/src/subprocess_util/chunked_transfer/active_receive/btrfs_receive_chunks_active.py index 1ae38f2..2fa2935 100644 --- a/src/subprocess_util/chunked_transfer/active_receive/btrfs_receive_chunks_active.py +++ b/src/subprocess_util/chunked_transfer/active_receive/btrfs_receive_chunks_active.py @@ -14,24 +14,23 @@ def main(): target_chunk_dir: Path = args.chunk_dir target_path: Path = args.target_path - target_path.parent.mkdir(parents=True, exist_ok=True) - command = ['btrfs', 'receive', str(target_path.parent)] - exec_receive_chunks_active( + returncode = exec_receive_chunks_active( command, ssh_source, source_chunk_dir, target_chunk_dir, ) + exit(returncode) def parse_args(): - parser = argparse.ArgumentParser(prog='btrfs-receive-chunks') + parser = argparse.ArgumentParser(prog='btrfs-receive-chunks-active') parser.add_argument('--chunk-dir', help='Chunks are saved in this directory. ' - 'Defaults to parent directory of SUBVOLUME.', + 'Defaults to directory `.chunk` next to SUBVOLUME.', dest='chunk_dir', type=Path, metavar='CHUNK_DIR', @@ -39,35 +38,60 @@ def parse_args(): ) parser.add_argument('ssh_source', - help='Hostname of source computer; as configured in ~/.ssh/config.', + help='Hostname of sending side; as configured in ~/.ssh/config.', metavar='SSH_SOURCE' ) - parser.add_argument('source_chunk_dir', - help='Chunks are saved in this directory on SSH_SOURCE. ' + parser.add_argument('--child', + help='Path to child subvolume on sending side. ' 'Must be an absolute path.', + dest='child', + type=Path, + metavar='CHILD_SUBVOLUME', + default=None, + ) + + parser.add_argument('--source-chunk-dir', + help='Chunks are saved in this directory on sending side. ' + 'Must be an absolute path. ' + 'Defaults to directory `.chunk` next to CHILD_SUBVOLUME', + dest='source_chunk_dir', type=Path, metavar='SOURCE_CHUNK_DIR', + default=None, ) parser.add_argument('target_path', help='Path where the subvolume will be created. ' 'The last component of the path ' - 'must be equal to the name of the subvolume on the sending side.', + 'must be equal to the name of CHILD_SUBVOLUME on the sending side.', type=Path, metavar='SUBVOLUME' ) args = parser.parse_args() - # Make all paths absolute. Set default values. + # child and source_chunk_dir + if args.child is None and args.source_chunk_dir is None: + raise ValueError('Either CHILD_SUBVOLUME or SOURCE_CHUNK_DIR must be given') + + if args.source_chunk_dir is not None: + if not args.source_chunk_dir.is_absolute(): + raise ValueError('SOURCE_CHUNK_DIR must be absolute') + if args.child is not None: + if not args.child.is_absolute(): + raise ValueError('CHILD_SUBVOLUME must be absolute') + + if args.source_chunk_dir is None: + args.source_chunk_dir = args.child.parent.joinpath(f'{args.child.name}.chunk') + + # target_path args.target_path = args.target_path.absolute() - if args.chunk_dir: - args.chunk_dir = args.chunk_dir.absolute() - else: - args.chunk_dir = args.target_path.absolute().parent - if not args.source_chunk_dir.is_absolute(): - raise ValueError(f'SOURCE_CHUNK_DIR must be absolute') + + # chunk_dir + if args.chunk_dir is None: + args.chunk_dir = args.target_path.parent.joinpath(f'{args.target_path.name}.chunk') + args.chunk_dir = args.chunk_dir.absolute() return args diff --git a/src/subprocess_util/chunked_transfer/active_receive/btrfs_send_chunks_passive.py b/src/subprocess_util/chunked_transfer/active_receive/btrfs_send_chunks_passive.py index 9ef249c..9cd03f9 100644 --- a/src/subprocess_util/chunked_transfer/active_receive/btrfs_send_chunks_passive.py +++ b/src/subprocess_util/chunked_transfer/active_receive/btrfs_send_chunks_passive.py @@ -15,8 +15,6 @@ def main(): parent: Path | None = args.parent source_chunk_dir: Path = args.chunk_dir - source_chunk_dir.mkdir(parents=True, exist_ok=True) - command_parts = ( ['btrfs', 'send'], ['-p', str(parent)] if parent else [], @@ -33,7 +31,7 @@ def main(): def parse_args(): - parser = argparse.ArgumentParser(prog='btrfs-send-chunks') + parser = argparse.ArgumentParser(prog='btrfs-send-chunks-passive') parser.add_argument('-p', help='Path to parent subvolume; forwarded to btrfs-send.', @@ -59,7 +57,7 @@ def parse_args(): parser.add_argument('--chunk-dir', help='Chunks are saved in this directory. ' - 'Defaults to parent directory of CHILD.', + 'Defaults to directory `.chunk` next to CHILD_SUBVOLUME.', dest='chunk_dir', type=Path, metavar='CHUNK_DIR', @@ -74,15 +72,16 @@ def parse_args(): args = parser.parse_args() - # Make all paths absolute. Set default values. + # child args.child = args.child.absolute() - # - if args.chunk_dir: + + # chunk_dir + if args.chunk_dir is None: + args.chunk_dir = args.child.parent.joinpath(f'{args.child.name}.chunk') + else: args.chunk_dir = args.chunk_dir.absolute() - else: # Default value - args.chunk_dir = args.child.absolute().parent - # - if args.parent: + + if args.parent is not None: args.parent = args.parent.absolute() return args diff --git a/src/subprocess_util/chunked_transfer/active_send/btrfs_receive_chunks_passive.py b/src/subprocess_util/chunked_transfer/active_send/btrfs_receive_chunks_passive.py index 44038f7..fd2a1ca 100644 --- a/src/subprocess_util/chunked_transfer/active_send/btrfs_receive_chunks_passive.py +++ b/src/subprocess_util/chunked_transfer/active_send/btrfs_receive_chunks_passive.py @@ -22,11 +22,11 @@ def main(): def parse_args(): - parser = argparse.ArgumentParser(prog='btrfs-receive-chunks') + parser = argparse.ArgumentParser(prog='btrfs-receive-chunks-passive') parser.add_argument('--chunk-dir', help='Chunks are saved in this directory. ' - 'Defaults to parent directory of SUBVOLUME.', + 'Defaults to folder `.chunk` next to SUBVOLUME.', dest='chunk_dir', type=Path, metavar='CHUNK_DIR', diff --git a/src/subprocess_util/chunked_transfer/active_send/btrfs_send_chunks_active.py b/src/subprocess_util/chunked_transfer/active_send/btrfs_send_chunks_active.py index ab34e9e..1763400 100644 --- a/src/subprocess_util/chunked_transfer/active_send/btrfs_send_chunks_active.py +++ b/src/subprocess_util/chunked_transfer/active_send/btrfs_send_chunks_active.py @@ -36,7 +36,7 @@ def main(): def parse_args(): - parser = argparse.ArgumentParser(prog='btrfs-send-chunks') + parser = argparse.ArgumentParser(prog='btrfs-send-chunks-active') parser.add_argument('-p', help='Path to parent subvolume; forwarded to btrfs-send.',