diff --git a/dockervault/cli.py b/dockervault/cli.py index 07ac0a8..7ff0bd1 100644 --- a/dockervault/cli.py +++ b/dockervault/cli.py @@ -94,10 +94,6 @@ def classify_entries( def dedupe_entries(entries: Iterable[dict[str, Any]]) -> list[dict[str, Any]]: - """ - Dedupe primært på path. - Første forekomst bevares. - """ deduped: list[dict[str, Any]] = [] seen: set[str] = set() @@ -320,26 +316,61 @@ def run_borg(repo: str, include_paths: list[str], dry_run: bool = False) -> int: def parse_args(argv: list[str] | None = None) -> argparse.Namespace: + common = argparse.ArgumentParser(add_help=False) + common.add_argument("--repo", help="Borg repository path") + common.add_argument( + "--run-borg", + action="store_true", + help="Run borg create after building the backup plan", + ) + common.add_argument( + "--dry-run", + action="store_true", + help="Show borg command without executing it", + ) + common.add_argument( + "--automation", + action="store_true", + help="Output machine-readable JSON", + ) + common.add_argument( + "--quiet", + action="store_true", + help="Suppress normal human-readable plan output", + ) + common.add_argument( + "--verbose", + action="store_true", + help="Enable verbose logging", + ) + parser = argparse.ArgumentParser( prog="dockervault", description="Intelligent Docker backup discovery with Borg integration", + parents=[common], ) subparsers = parser.add_subparsers(dest="command") - plan_parser = subparsers.add_parser("plan", help="Analyze a single compose file") + plan_parser = subparsers.add_parser( + "plan", + help="Analyze a single compose file", + parents=[common], + ) plan_parser.add_argument("compose", help="Path to docker-compose.yml or compose.yaml") - scan_parser = subparsers.add_parser("scan", help="Scan a directory for compose files") + scan_parser = subparsers.add_parser( + "scan", + help="Scan a directory for compose files", + parents=[common], + ) scan_parser.add_argument("root", help="Root directory to scan") - parser.add_argument("--repo", help="Borg repository path") - parser.add_argument("--run-borg", action="store_true", help="Run borg create after building the backup plan") - parser.add_argument("--dry-run", action="store_true", help="Show borg command without executing it") - parser.add_argument("--automation", action="store_true", help="Output machine-readable JSON") - parser.add_argument("--quiet", action="store_true", help="Suppress normal human-readable plan output") - parser.add_argument("--verbose", action="store_true", help="Enable verbose logging") - parser.add_argument("--version", action="version", version=f"%(prog)s {__version__}") + parser.add_argument( + "--version", + action="version", + version=f"%(prog)s {__version__}", + ) parser.add_argument( "legacy_target", @@ -349,7 +380,6 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace: args = parser.parse_args(argv) - # legacy mode: dockervault docker-compose.yml if args.command is None and args.legacy_target: args.command = "plan" args.compose = args.legacy_target