gabriel / musehub public
backfill_history_from_snapshots.py python
59 lines 2.0 KB
Raw
sha256:3ff9c9863a9891bdcde71b4a43228f66d0493e38b7cc1d09fe9eb7de774046b2 feat: add repair-commit wire endpoint (API parity with repa… Opus 4.8 minor ⚠ breaking 1 day ago
1 """Backfill symbol history entries inferred from snapshot diffs.
2
3 For every commit whose files were never indexed via structured_delta, this
4 script diffs adjacent snapshot manifests and creates history rows with
5 op in (insert, replace, delete, move).
6
7 Usage:
8 docker exec musehub python3 /app/deploy/backfill_history_from_snapshots.py --dry-run
9 docker exec musehub python3 /app/deploy/backfill_history_from_snapshots.py
10 docker exec musehub python3 /app/deploy/backfill_history_from_snapshots.py --repo-id <id>
11 """
12 from __future__ import annotations
13
14 import argparse
15 import asyncio
16 import sys
17 import time
18
19 from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
20 from sqlalchemy.orm import sessionmaker
21
22 from musehub.db.database import get_database_url
23 from musehub.services.musehub_symbol_indexer import backfill_history_from_snapshots
24
25
26 async def run(repo_id: str | None, dry_run: bool) -> None:
27 engine = create_async_engine(get_database_url(), echo=False)
28 async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
29
30 async with async_session() as session:
31 t0 = time.monotonic()
32 count = await backfill_history_from_snapshots(
33 session, repo_id=repo_id, dry_run=dry_run
34 )
35 if not dry_run:
36 await session.commit()
37 elapsed = time.monotonic() - t0
38
39 verb = "Would create" if dry_run else "Created"
40 scope = f" for repo {repo_id}" if repo_id else " across all repos"
41 print(f"{verb} {count} history entries{scope} in {elapsed:.1f}s")
42
43
44 def main() -> None:
45 parser = argparse.ArgumentParser(description=__doc__)
46 parser.add_argument("--dry-run", action="store_true")
47 parser.add_argument("--repo-id", default=None)
48 parser.add_argument("-q", "--quiet", action="store_true")
49 args = parser.parse_args()
50
51 if args.quiet:
52 import logging
53 logging.disable(logging.CRITICAL)
54
55 asyncio.run(run(args.repo_id, args.dry_run))
56
57
58 if __name__ == "__main__":
59 main()
File History 1 commit
sha256:3ff9c9863a9891bdcde71b4a43228f66d0493e38b7cc1d09fe9eb7de774046b2 feat: add repair-commit wire endpoint (API parity with repa… Opus 4.8 minor 1 day ago