fix: allow shared CLI flags after subcommands in scan and plan modes

This commit is contained in:
Eddie Nielsen 2026-03-23 15:30:05 +00:00
parent 168f0a38ed
commit 4d36198bdd

View file

@ -94,10 +94,6 @@ def classify_entries(
def dedupe_entries(entries: Iterable[dict[str, Any]]) -> list[dict[str, Any]]: def dedupe_entries(entries: Iterable[dict[str, Any]]) -> list[dict[str, Any]]:
"""
Dedupe primært path.
Første forekomst bevares.
"""
deduped: list[dict[str, Any]] = [] deduped: list[dict[str, Any]] = []
seen: set[str] = set() 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: 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( parser = argparse.ArgumentParser(
prog="dockervault", prog="dockervault",
description="Intelligent Docker backup discovery with Borg integration", description="Intelligent Docker backup discovery with Borg integration",
parents=[common],
) )
subparsers = parser.add_subparsers(dest="command") 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") 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") scan_parser.add_argument("root", help="Root directory to scan")
parser.add_argument("--repo", help="Borg repository path") parser.add_argument(
parser.add_argument("--run-borg", action="store_true", help="Run borg create after building the backup plan") "--version",
parser.add_argument("--dry-run", action="store_true", help="Show borg command without executing it") action="version",
parser.add_argument("--automation", action="store_true", help="Output machine-readable JSON") version=f"%(prog)s {__version__}",
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( parser.add_argument(
"legacy_target", "legacy_target",
@ -349,7 +380,6 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
args = parser.parse_args(argv) args = parser.parse_args(argv)
# legacy mode: dockervault docker-compose.yml
if args.command is None and args.legacy_target: if args.command is None and args.legacy_target:
args.command = "plan" args.command = "plan"
args.compose = args.legacy_target args.compose = args.legacy_target