fix: make sandboxed sessions usable for real git workflows
Address three integration gaps found in review: - Bind ~/.gitconfig read-only in the sandbox base layer so `git commit` finds user.name/email inside the jail (spec §3). - Bind a worktree session's repo common .git dir writable: the worktree's real gitdir lives at <repo>/.git/worktrees/<branch>, outside the bound cwd, so git was broken in sandboxed worktree sessions. - doctor now gates on sandbox.is_available() (the single source of truth shared with the New Session dialog) rather than a raw shutil.which, so it agrees with the service on non-Linux platforms (spec §6). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -102,3 +102,22 @@ def test_wrap_skips_missing_binds(tmp_path):
|
||||
["sh"], tmp_path, SandboxPolicy(fs="rw", net=True), [Bind(missing)]
|
||||
)
|
||||
assert str(missing) not in args
|
||||
|
||||
|
||||
def test_wrap_binds_gitconfig_readonly_when_present(tmp_path, monkeypatch):
|
||||
"""~/.gitconfig is bound read-only so `git commit` works inside the jail."""
|
||||
home = tmp_path / "home"
|
||||
home.mkdir()
|
||||
gitconfig = home / ".gitconfig"
|
||||
gitconfig.write_text("[user]\n\tname = Test\n")
|
||||
monkeypatch.setattr(sandbox.Path, "home", classmethod(lambda cls: home))
|
||||
args = sandbox.wrap(["sh"], tmp_path, SandboxPolicy(fs="rw", net=True), [])
|
||||
assert (str(gitconfig), str(gitconfig)) in _split(args, "--ro-bind")
|
||||
|
||||
|
||||
def test_wrap_skips_gitconfig_when_absent(tmp_path, monkeypatch):
|
||||
home = tmp_path / "home"
|
||||
home.mkdir()
|
||||
monkeypatch.setattr(sandbox.Path, "home", classmethod(lambda cls: home))
|
||||
args = sandbox.wrap(["sh"], tmp_path, SandboxPolicy(fs="rw", net=True), [])
|
||||
assert str(home / ".gitconfig") not in args
|
||||
|
||||
Reference in New Issue
Block a user