@@ -62,10 +62,30 @@ def fake_run_capture(command: list[str], *, cwd, timeout=10.0):
6262 if command == ["git" , "diff" , "--name-only" ]:
6363 return subprocess .CompletedProcess (command , 0 , stdout = "scripts/bootstrap.sh\n " , stderr = "" )
6464 if command == ["git" , "diff" , "--numstat" , "--" , "scripts/bootstrap.sh" ]:
65- return subprocess .CompletedProcess (command , 0 , stdout = "" , stderr = "" )
65+ return subprocess .CompletedProcess (command , 0 , stdout = "0 \t 0 \t scripts/bootstrap.sh \n " , stderr = "" )
6666 raise AssertionError (f"unexpected command: { command } " )
6767
6868 monkeypatch .setattr ("octopal.cli.main.shutil.which" , lambda _name : "/usr/bin/git" )
6969 monkeypatch .setattr ("octopal.cli.main._run_capture" , fake_run_capture )
7070
7171 assert _git_checkout_ready_for_update (tmp_path ) == (True , None )
72+
73+
74+ def test_git_checkout_ready_blocks_real_content_changes (monkeypatch , tmp_path ) -> None :
75+ (tmp_path / ".git" ).mkdir ()
76+
77+ def fake_run_capture (command : list [str ], * , cwd , timeout = 10.0 ):
78+ if command == ["git" , "status" , "--porcelain" ]:
79+ return subprocess .CompletedProcess (command , 0 , stdout = " M scripts/bootstrap.sh\n " , stderr = "" )
80+ if command == ["git" , "diff" , "--name-only" ]:
81+ return subprocess .CompletedProcess (command , 0 , stdout = "scripts/bootstrap.sh\n " , stderr = "" )
82+ if command == ["git" , "diff" , "--numstat" , "--" , "scripts/bootstrap.sh" ]:
83+ return subprocess .CompletedProcess (command , 0 , stdout = "3\t 1\t scripts/bootstrap.sh\n " , stderr = "" )
84+ raise AssertionError (f"unexpected command: { command } " )
85+
86+ monkeypatch .setattr ("octopal.cli.main.shutil.which" , lambda _name : "/usr/bin/git" )
87+ monkeypatch .setattr ("octopal.cli.main._run_capture" , fake_run_capture )
88+
89+ ok , reason = _git_checkout_ready_for_update (tmp_path )
90+ assert ok is False
91+ assert "scripts/bootstrap.sh" in str (reason )
0 commit comments