Skip to content

Commit 7396683

Browse files
Copilotmnriem
andauthored
fix: detect stale registry and reinstall git extension when directory missing
Co-authored-by: mnriem <15701806+mnriem@users.noreply.github.com> Agent-Logs-Url: https://github.com/github/spec-kit/sessions/d5cbfcf4-4651-4784-9234-c4a42a333438
1 parent a5466f0 commit 7396683

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

src/specify_cli/__init__.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,9 +1199,15 @@ def _install_bundled_git_extension(project_path: Path) -> bool:
11991199
from .extensions import ExtensionManager
12001200
manager = ExtensionManager(project_path)
12011201

1202-
# Skip if already installed (e.g. via preset)
1202+
# Skip if already installed (e.g. via preset), but only if the
1203+
# on-disk extension manifest still exists. This guards against
1204+
# stale/corrupted registry entries.
12031205
if manager.registry.is_installed("git"):
1204-
return True
1206+
ext_manifest = project_path / ".specify" / "extensions" / "git" / "extension.yml"
1207+
if ext_manifest.is_file():
1208+
return True
1209+
# Registry is stale — remove entry so reinstall can proceed
1210+
manager.registry.remove("git")
12051211

12061212
speckit_ver = get_speckit_version()
12071213
manager.install_from_directory(ext_source, speckit_ver)

tests/test_branch_numbering.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,33 @@ def test_git_extension_noop_when_already_installed(self, tmp_path: Path):
138138
# Only one entry in registry
139139
manager = ExtensionManager(project_dir)
140140
assert manager.registry.is_installed("git")
141+
142+
def test_git_extension_reinstalls_when_directory_missing(self, tmp_path: Path):
143+
"""_install_bundled_git_extension should reinstall if registry says installed but directory is gone."""
144+
import shutil
145+
from specify_cli import _install_bundled_git_extension
146+
from specify_cli.extensions import ExtensionManager
147+
148+
project_dir = tmp_path / "proj"
149+
(project_dir / ".specify").mkdir(parents=True)
150+
151+
# First install
152+
result1 = _install_bundled_git_extension(project_dir)
153+
assert result1 is True
154+
155+
ext_dir = project_dir / ".specify" / "extensions" / "git"
156+
assert ext_dir.is_dir()
157+
158+
# Simulate stale registry: delete extension directory but keep registry
159+
shutil.rmtree(ext_dir)
160+
assert not ext_dir.exists()
161+
162+
# Registry still says installed
163+
manager = ExtensionManager(project_dir)
164+
assert manager.registry.is_installed("git")
165+
166+
# Re-install should detect missing directory and reinstall
167+
result2 = _install_bundled_git_extension(project_dir)
168+
assert result2 is True
169+
assert ext_dir.is_dir(), "extension directory should be reinstalled"
170+
assert (ext_dir / "extension.yml").is_file(), "extension.yml should be reinstalled"

0 commit comments

Comments
 (0)