generated from coulomb/repo-seed
Workplan consistency optimization
This commit is contained in:
@@ -570,6 +570,20 @@ def _api_patch(api_base: str, path: str, body: dict) -> Any:
|
||||
return {"_error": str(exc)}
|
||||
|
||||
|
||||
def _api_put(api_base: str, path: str, body: dict) -> Any:
|
||||
if not _HAS_HTTPX:
|
||||
return {"_error": "httpx is not installed"}
|
||||
if not path.endswith("/"):
|
||||
path += "/"
|
||||
try:
|
||||
with _httpx.Client(base_url=api_base, timeout=30.0, follow_redirects=True) as c:
|
||||
r = c.put(path, json=body)
|
||||
r.raise_for_status()
|
||||
return r.json()
|
||||
except Exception as exc:
|
||||
return {"_error": str(exc)}
|
||||
|
||||
|
||||
def _api_post(api_base: str, path: str, body: dict) -> Any:
|
||||
if not _HAS_HTTPX:
|
||||
return {"_error": "httpx is not installed"}
|
||||
@@ -1263,9 +1277,46 @@ def check_repo(api_base: str, repo_slug: str, repo_path_override: str | None = N
|
||||
# workstream from the file, leaving the first as an invisible orphan.
|
||||
_check_ghost_duplicates(api_base, workplan_infos, file_ws_ids, report)
|
||||
|
||||
_sync_workplan_bindings(api_base, repo_slug, workplan_infos, repo_dir, report)
|
||||
|
||||
return report
|
||||
|
||||
|
||||
def _sync_workplan_bindings(
|
||||
api_base: str,
|
||||
repo_slug: str,
|
||||
workplan_infos: list[tuple[Path, dict, str]],
|
||||
repo_dir: Path,
|
||||
report: ConsistencyReport,
|
||||
) -> None:
|
||||
bindings: list[dict[str, Any]] = []
|
||||
for wp_file, meta, _ in workplan_infos:
|
||||
ws_id = str(meta.get("state_hub_workstream_id", "")).strip().strip('"')
|
||||
if not ws_id:
|
||||
continue
|
||||
archived = wp_file.parent.name == "archived"
|
||||
file_status = normalise_workstream_status(str(meta.get("status", "")).strip())
|
||||
bindings.append(
|
||||
{
|
||||
"workplan_id": ws_id,
|
||||
"filename": wp_file.name,
|
||||
"relative_path": workplan_display_path(repo_dir, wp_file),
|
||||
"repo_slug": repo_slug,
|
||||
"archived": archived,
|
||||
"status": file_status or None,
|
||||
}
|
||||
)
|
||||
if not bindings:
|
||||
return
|
||||
result = _api_put(api_base, "/workplans/index/bindings", {"bindings": bindings})
|
||||
if isinstance(result, dict) and "_error" in result:
|
||||
report.fixes_applied.append(f"bindings WARN: {result['_error']}")
|
||||
elif isinstance(result, dict):
|
||||
report.fixes_applied.append(
|
||||
f"bindings: synced {result.get('updated', 0)}/{result.get('received', len(bindings))}"
|
||||
)
|
||||
|
||||
|
||||
def _check_orphan_db(
|
||||
api_base: str,
|
||||
repo_id: str,
|
||||
|
||||
Reference in New Issue
Block a user