mirror of
https://github.com/github/spec-kit.git
synced 2026-03-24 14:23:09 +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
|
from .extensions import ExtensionManager
|
||||||
manager = ExtensionManager(project_path)
|
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"):
|
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()
|
speckit_ver = get_speckit_version()
|
||||||
manager.install_from_directory(ext_source, speckit_ver)
|
manager.install_from_directory(ext_source, speckit_ver)
|
||||||
|
|||||||
@@ -138,3 +138,33 @@ class TestGitExtensionAutoInstall:
|
|||||||
# Only one entry in registry
|
# Only one entry in registry
|
||||||
manager = ExtensionManager(project_dir)
|
manager = ExtensionManager(project_dir)
|
||||||
assert manager.registry.is_installed("git")
|
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