mirror of
https://github.com/github/spec-kit.git
synced 2026-03-24 06:13:08 +00:00
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
This commit is contained in:
committed by
GitHub
parent
a5466f08de
commit
7396683bfb
@@ -1199,9 +1199,15 @@ def _install_bundled_git_extension(project_path: Path) -> bool:
|
||||
from .extensions import ExtensionManager
|
||||
manager = ExtensionManager(project_path)
|
||||
|
||||
# Skip if already installed (e.g. via preset)
|
||||
# Skip if already installed (e.g. via preset), but only if the
|
||||
# on-disk extension manifest still exists. This guards against
|
||||
# stale/corrupted registry entries.
|
||||
if manager.registry.is_installed("git"):
|
||||
return True
|
||||
ext_manifest = project_path / ".specify" / "extensions" / "git" / "extension.yml"
|
||||
if ext_manifest.is_file():
|
||||
return True
|
||||
# Registry is stale — remove entry so reinstall can proceed
|
||||
manager.registry.remove("git")
|
||||
|
||||
speckit_ver = get_speckit_version()
|
||||
manager.install_from_directory(ext_source, speckit_ver)
|
||||
|
||||
@@ -138,3 +138,33 @@ class TestGitExtensionAutoInstall:
|
||||
# Only one entry in registry
|
||||
manager = ExtensionManager(project_dir)
|
||||
assert manager.registry.is_installed("git")
|
||||
|
||||
def test_git_extension_reinstalls_when_directory_missing(self, tmp_path: Path):
|
||||
"""_install_bundled_git_extension should reinstall if registry says installed but directory is gone."""
|
||||
import shutil
|
||||
from specify_cli import _install_bundled_git_extension
|
||||
from specify_cli.extensions import ExtensionManager
|
||||
|
||||
project_dir = tmp_path / "proj"
|
||||
(project_dir / ".specify").mkdir(parents=True)
|
||||
|
||||
# First install
|
||||
result1 = _install_bundled_git_extension(project_dir)
|
||||
assert result1 is True
|
||||
|
||||
ext_dir = project_dir / ".specify" / "extensions" / "git"
|
||||
assert ext_dir.is_dir()
|
||||
|
||||
# Simulate stale registry: delete extension directory but keep registry
|
||||
shutil.rmtree(ext_dir)
|
||||
assert not ext_dir.exists()
|
||||
|
||||
# Registry still says installed
|
||||
manager = ExtensionManager(project_dir)
|
||||
assert manager.registry.is_installed("git")
|
||||
|
||||
# Re-install should detect missing directory and reinstall
|
||||
result2 = _install_bundled_git_extension(project_dir)
|
||||
assert result2 is True
|
||||
assert ext_dir.is_dir(), "extension directory should be reinstalled"
|
||||
assert (ext_dir / "extension.yml").is_file(), "extension.yml should be reinstalled"
|
||||
|
||||
Reference in New Issue
Block a user