Files
dev-intel-poc/simulate_merge.py

110 lines
3.3 KiB
Python
Raw Normal View History

"""Simulate a merge: modify a file, regenerate its doc, mark downstream stale."""
import sys
import os
import time
from pathlib import Path
# Load .env if present
_env_file = Path(__file__).parent / ".env"
if _env_file.exists():
for line in _env_file.read_text().splitlines():
line = line.strip()
if line and not line.startswith("#") and "=" in line:
key, _, val = line.partition("=")
os.environ.setdefault(key.strip(), val.strip())
sys.path.insert(0, os.path.dirname(__file__))
from db import GraphDB
from docgen import generate_file_doc
REPO_DIR = os.environ.get("REPO_DIR", os.path.join(os.path.dirname(__file__), "repos", "target"))
def simulate_merge(file_path: str, new_content: str = None):
db = GraphDB()
print(f"\n{'='*60}")
print(f"Simulating merge: {file_path}")
print(f"{'='*60}")
# Get current doc (before)
f = db.get_file(file_path)
if not f:
print(f"ERROR: File {file_path} not found in graph")
db.close()
return
print(f"\n[BEFORE] Documentation for {file_path}:")
print(f" {f['documentation'][:300]}")
# Read file content (or use provided)
if new_content is None:
full_path = os.path.join(REPO_DIR, file_path)
if os.path.exists(full_path):
with open(full_path) as fh:
original = fh.read()
new_content = original + """
// EnableTracing adds distributed request tracing with correlation IDs
// across the middleware chain. Each request gets a unique trace ID propagated
// through all handlers for end-to-end debugging in microservice architectures.
func (e *Echo) EnableTracing(correlationHeader string) {
e.tracingEnabled = true
e.correlationHeader = correlationHeader
}
"""
else:
print(f"ERROR: File not found on disk: {full_path}")
db.close()
return
# Regenerate doc for changed file
print(f"\n[MERGE] Regenerating documentation for {file_path}...")
new_doc = generate_file_doc(file_path, new_content)
commit_hash = f"sim-{int(time.time())}"
db.update_file_doc(file_path, new_doc, commit_hash)
print(f"\n[AFTER] Documentation for {file_path}:")
print(f" {new_doc[:300]}")
# Mark downstream stale
print(f"\n[CASCADE] Marking downstream as stale...")
db.mark_relationships_stale(file_path)
repo = db.get_repo()
if repo:
db.mark_repo_stale(repo["name"])
print(f" Repo '{repo['name']}' marked stale")
stats = db.get_stats()
print(f" Stale relationships: {stats['stale_relationships']}")
print(f"\n{'='*60}")
print("Merge simulation complete.")
print(f" File doc: REGENERATED (fresh)")
print(f" Relationships: STALE (awaiting refresh)")
print(f" Repo doc: STALE (awaiting refresh)")
print(f"\nRun: python refresh_stale.py")
print(f"Or ask Claude Code — stale docs show [STALE] indicator.")
print(f"{'='*60}")
db.close()
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: python simulate_merge.py <file_path>")
print("Example: python simulate_merge.py echo.go")
sys.exit(1)
target = sys.argv[1]
content = None
if len(sys.argv) > 2:
with open(sys.argv[2]) as f:
content = f.read()
simulate_merge(target, content)