generated from coulomb/repo-seed
Add discovery registry review flow
This commit is contained in:
@@ -122,6 +122,21 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
cyclonedx.add_argument("--registry-url", default="http://127.0.0.1:8765")
|
||||
cyclonedx.add_argument("--repo-slug", required=True)
|
||||
cyclonedx.add_argument("--json", action="store_true", help="Print the raw ingest response.")
|
||||
|
||||
discovery = registry_sub.add_parser("ingest-discovery", help="Store a discovery snapshot for review.")
|
||||
discovery.add_argument("snapshot", type=Path)
|
||||
discovery.add_argument("--registry-url", default="http://127.0.0.1:8765")
|
||||
discovery.add_argument("--repo-slug", default=None)
|
||||
discovery.add_argument("--json", action="store_true", help="Print the raw ingest response.")
|
||||
|
||||
accept_discovery = registry_sub.add_parser("accept-discovery", help="Project accepted discovery candidates into a graph snapshot.")
|
||||
accept_discovery.add_argument("repo_slug")
|
||||
accept_discovery.add_argument("discovery_snapshot_id", type=int)
|
||||
accept_discovery.add_argument("--registry-url", default="http://127.0.0.1:8765")
|
||||
accept_discovery.add_argument("--accepted-key", action="append", default=[])
|
||||
accept_discovery.add_argument("--accept-review-state", action="append", default=None)
|
||||
accept_discovery.add_argument("--commit", default=None)
|
||||
accept_discovery.add_argument("--json", action="store_true", help="Print the raw accept response.")
|
||||
return parser
|
||||
|
||||
|
||||
@@ -185,6 +200,10 @@ def main(argv: list[str] | None = None) -> int:
|
||||
return _registry_sync_manifest(args)
|
||||
if args.registry_command == "ingest-cyclonedx":
|
||||
return _registry_ingest_cyclonedx(args)
|
||||
if args.registry_command == "ingest-discovery":
|
||||
return _registry_ingest_discovery(args)
|
||||
if args.registry_command == "accept-discovery":
|
||||
return _registry_accept_discovery(args)
|
||||
|
||||
parser.error(f"unknown command {args.command!r}")
|
||||
return 2
|
||||
@@ -406,6 +425,62 @@ def _registry_ingest_cyclonedx(args: argparse.Namespace) -> int:
|
||||
return 0
|
||||
|
||||
|
||||
def _registry_ingest_discovery(args: argparse.Namespace) -> int:
|
||||
payload = json.loads(args.snapshot.read_text(encoding="utf-8"))
|
||||
if not isinstance(payload, dict):
|
||||
print(f"ERROR {args.snapshot}: discovery snapshot must be a JSON object", file=sys.stderr)
|
||||
return 1
|
||||
source = payload.get("source") if isinstance(payload.get("source"), dict) else {}
|
||||
repo_slug = args.repo_slug or str(source.get("repo_slug") or "").strip()
|
||||
if not repo_slug:
|
||||
print("ERROR discovery snapshot source.repo_slug is required unless --repo-slug is provided", file=sys.stderr)
|
||||
return 1
|
||||
result = _registry_post(
|
||||
args.registry_url,
|
||||
f"/repositories/{repo_slug}/discovery-snapshots",
|
||||
payload,
|
||||
)
|
||||
if args.json:
|
||||
print(json.dumps(result, indent=2, sort_keys=True))
|
||||
else:
|
||||
candidates = result.get("snapshot", {}).get("candidates", {})
|
||||
counts = {
|
||||
"nodes": len(candidates.get("nodes", [])),
|
||||
"edges": len(candidates.get("edges", [])),
|
||||
"attributes": len(candidates.get("attributes", [])),
|
||||
}
|
||||
print(
|
||||
f"ingested discovery snapshot {result['id']} for {result['repo_slug']} "
|
||||
f"({result['profile']}, {result['commit']}): "
|
||||
f"{counts['nodes']} node candidate(s), {counts['edges']} edge candidate(s), "
|
||||
f"{counts['attributes']} attribute candidate(s)"
|
||||
)
|
||||
return 0
|
||||
|
||||
|
||||
def _registry_accept_discovery(args: argparse.Namespace) -> int:
|
||||
payload = {
|
||||
"accepted_keys": args.accepted_key,
|
||||
"commit": args.commit,
|
||||
}
|
||||
if args.accept_review_state is not None:
|
||||
payload["accept_review_states"] = args.accept_review_state
|
||||
result = _registry_post(
|
||||
args.registry_url,
|
||||
f"/repositories/{args.repo_slug}/discovery-snapshots/{args.discovery_snapshot_id}/accept",
|
||||
payload,
|
||||
)
|
||||
if args.json:
|
||||
print(json.dumps(result, indent=2, sort_keys=True))
|
||||
else:
|
||||
graph_snapshot = result["graph_snapshot"]
|
||||
print(
|
||||
f"accepted discovery snapshot {args.discovery_snapshot_id} for {args.repo_slug}; "
|
||||
f"graph snapshot {graph_snapshot['id']} stored for {graph_snapshot['commit']}"
|
||||
)
|
||||
return 0
|
||||
|
||||
|
||||
def _scan_repo(args: argparse.Namespace) -> int:
|
||||
snapshot = scan_repo(
|
||||
ScanOptions(
|
||||
|
||||
Reference in New Issue
Block a user