fix(gitstore): resolve staged paths relative to workspace
This commit is contained in:
@@ -113,7 +113,10 @@ class GitStore:
|
|||||||
p.write_text("", encoding="utf-8")
|
p.write_text("", encoding="utf-8")
|
||||||
|
|
||||||
# Initial commit
|
# Initial commit
|
||||||
porcelain.add(str(self._workspace), paths=[".gitignore"] + self._tracked_files)
|
porcelain.add(
|
||||||
|
str(self._workspace),
|
||||||
|
paths=self._staging_paths(".gitignore", *self._tracked_files),
|
||||||
|
)
|
||||||
porcelain.commit(
|
porcelain.commit(
|
||||||
str(self._workspace),
|
str(self._workspace),
|
||||||
message=b"init: nanobot memory store",
|
message=b"init: nanobot memory store",
|
||||||
@@ -146,7 +149,7 @@ class GitStore:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
msg_bytes = message.encode("utf-8") if isinstance(message, str) else message
|
msg_bytes = message.encode("utf-8") if isinstance(message, str) else message
|
||||||
porcelain.add(str(self._workspace), paths=self._tracked_files)
|
porcelain.add(str(self._workspace), paths=self._staging_paths(*self._tracked_files))
|
||||||
sha_bytes = porcelain.commit(
|
sha_bytes = porcelain.commit(
|
||||||
str(self._workspace),
|
str(self._workspace),
|
||||||
message=msg_bytes,
|
message=msg_bytes,
|
||||||
@@ -164,6 +167,10 @@ class GitStore:
|
|||||||
|
|
||||||
# -- internal helpers ------------------------------------------------------
|
# -- internal helpers ------------------------------------------------------
|
||||||
|
|
||||||
|
def _staging_paths(self, *paths: str) -> list[str]:
|
||||||
|
"""Return absolute paths so Dulwich resolves them inside this workspace."""
|
||||||
|
return [str((self._workspace / path).resolve()) for path in paths]
|
||||||
|
|
||||||
def _resolve_sha(self, short_sha: str) -> bytes | None:
|
def _resolve_sha(self, short_sha: str) -> bytes | None:
|
||||||
"""Resolve a short SHA prefix to the full SHA bytes."""
|
"""Resolve a short SHA prefix to the full SHA bytes."""
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -225,6 +225,21 @@ class TestNestedRepoProtection:
|
|||||||
assert result is True
|
assert result is True
|
||||||
assert (workspace / ".git").is_dir()
|
assert (workspace / ".git").is_dir()
|
||||||
|
|
||||||
|
def test_staging_paths_are_resolved_from_workspace(self, tmp_path, monkeypatch):
|
||||||
|
"""Git operations should not depend on the process working directory."""
|
||||||
|
workspace = tmp_path / "workspace"
|
||||||
|
workspace.mkdir()
|
||||||
|
monkeypatch.chdir(tmp_path)
|
||||||
|
|
||||||
|
git = GitStore(workspace, tracked_files=["MEMORY.md"])
|
||||||
|
|
||||||
|
assert git.init() is True
|
||||||
|
assert len(git.log()) == 1
|
||||||
|
|
||||||
|
(workspace / "MEMORY.md").write_text("updated\n", encoding="utf-8")
|
||||||
|
assert git.auto_commit("update memory") is not None
|
||||||
|
assert len(git.log()) == 2
|
||||||
|
|
||||||
def test_init_refuses_inside_git_worktree(self, tmp_path):
|
def test_init_refuses_inside_git_worktree(self, tmp_path):
|
||||||
"""init() should refuse when the parent checkout is a git worktree."""
|
"""init() should refuse when the parent checkout is a git worktree."""
|
||||||
repo = tmp_path / "repo"
|
repo = tmp_path / "repo"
|
||||||
|
|||||||
Reference in New Issue
Block a user