fix: reuse cached config profile git mounts
- Reuse valid deterministic git mount clones on repeated starts - Remove incomplete clone destinations before retrying - Add regression coverage for cached and partial clones - Document OpenSpec change fix-config-profile-git-mount-clone-reuse Quality gates: pytest (13 passed), ruff, mypy
This commit is contained in:
@@ -283,16 +283,27 @@ def clone_git_repo(
|
||||
url_hash = hashlib.md5(f"{remote_url}:{branch_segment}".encode()).hexdigest()[:12]
|
||||
repo_name = remote_url.split("/")[-1].replace(".git", "") or "repo"
|
||||
clone_dir = os.path.join(clone_parent, "git-mounts", f"{repo_name}-{url_hash}")
|
||||
repo_path = clone_repository(
|
||||
remote_url,
|
||||
None, # No SSH key for now - can be added later
|
||||
clone_dir,
|
||||
branch or "main",
|
||||
project_name=project_name,
|
||||
)
|
||||
clone_name = _slugify_directory_name(project_name) if project_name else "repo-clone"
|
||||
repo_path = os.path.join(clone_dir, clone_name)
|
||||
|
||||
if not os.path.exists(repo_path):
|
||||
if os.path.isdir(os.path.join(repo_path, ".git")):
|
||||
# Reuse the deterministic per-repository cache on repeated starts.
|
||||
try:
|
||||
pull_repository_updates(repo_path, remote_url)
|
||||
logger.debug("Pulled updates for git mount %s", remote_url)
|
||||
except Exception as exc:
|
||||
logger.warning("Failed to pull updates for %s: %s", remote_url, exc)
|
||||
else:
|
||||
try:
|
||||
# A failed clone can leave its destination behind. Remove only the
|
||||
# computed clone path so the next start can retry cleanly.
|
||||
if os.path.lexists(repo_path):
|
||||
logger.warning("Removing incomplete git mount clone at %s", repo_path)
|
||||
if os.path.isdir(repo_path) and not os.path.islink(repo_path):
|
||||
shutil.rmtree(repo_path)
|
||||
else:
|
||||
os.unlink(repo_path)
|
||||
|
||||
os.makedirs(clone_dir, exist_ok=True)
|
||||
repo_path = clone_repository(
|
||||
remote_url,
|
||||
@@ -305,13 +316,6 @@ def clone_git_repo(
|
||||
except Exception as exc:
|
||||
logger.warning("Clone failed for git mount %s: %s", remote_url, exc)
|
||||
raise
|
||||
else:
|
||||
# Repo exists - pull latest updates
|
||||
try:
|
||||
pull_repository_updates(repo_path, remote_url)
|
||||
logger.debug("Pulled updates for git mount %s", remote_url)
|
||||
except Exception as exc:
|
||||
logger.warning("Failed to pull updates for %s: %s", remote_url, exc)
|
||||
|
||||
# Handle branch checkout if specified
|
||||
if branch and repo_path:
|
||||
|
||||
Reference in New Issue
Block a user