From 1e9522e1a8f2957c4e1613650cfa0829bde34994 Mon Sep 17 00:00:00 2001 From: hao Date: Wed, 18 Mar 2026 11:26:00 -0700 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0:=201=20=E4=B8=AA=E6=96=87?= =?UTF-8?q?=E4=BB=B6=20-=202026-03-18=2011:26:00?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/intel/main.py | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/scripts/intel/main.py b/scripts/intel/main.py index a022ff2a..61040c17 100644 --- a/scripts/intel/main.py +++ b/scripts/intel/main.py @@ -70,6 +70,45 @@ def _merge_preserved_records( return preserved_advisories + advisories, preserved_triage + triage +def _merge_advisory_records( + advisories: List[AdvisoryRecord], + incoming: List[AdvisoryRecord], +) -> List[AdvisoryRecord]: + merged: Dict[str, AdvisoryRecord] = {item.canonical_id: item for item in advisories} + for item in incoming: + merged[item.canonical_id] = item + return sorted(merged.values(), key=lambda item: (item.system_id, item.canonical_id)) + + +def _merge_triage_records( + triage: List[Dict[str, Any]], + incoming: List[Dict[str, Any]], +) -> List[Dict[str, Any]]: + merged: Dict[str, Dict[str, Any]] = {} + for item in triage: + canonical_id = item.get("canonical_id") + if canonical_id: + merged[canonical_id] = item + for item in incoming: + canonical_id = item.get("canonical_id") + if canonical_id: + merged[canonical_id] = item + return sorted( + merged.values(), + key=lambda item: (item.get("system_id", ""), item.get("canonical_id", "")), + ) + + +def _merge_existing_registry( + advisories: List[AdvisoryRecord], + triage: List[Dict[str, Any]], +) -> tuple[List[AdvisoryRecord], List[Dict[str, Any]]]: + return ( + _merge_advisory_records(_load_existing_advisories(), advisories), + _merge_triage_records(_load_existing_triage(), triage), + ) + + def _load_existing_selection( full_source_map: Dict[str, Any], source_map: Dict[str, Any], @@ -202,10 +241,10 @@ def pipeline( advisories = route_advisories(source_map, advisories) if hotlane_only: advisories, triage = _select_hotlane(advisories, triage) + advisories, triage = _merge_existing_registry(advisories, triage) change_summary = _summarize_changes(advisories) render_map = source_map if len(source_map["systems"]) != len(full_source_map["systems"]): - advisories, triage = _merge_preserved_records(source_map, advisories, triage) render_map = full_source_map _write_outputs(render_map, advisories, triage, failures, change_summary) return advisories, triage, failures, change_summary