"""Real disposable Git proof; does not import owner app or test conftest.""" import ast from pathlib import Path import subprocess import sys import pytest SOURCE=Path(__file__).resolve().parents[1]/'scripts/consistency_check.py' def actual_writeback(): tree=ast.parse(SOURCE.read_text());nodes=[] for node in tree.body: if isinstance(node,ast.FunctionDef) and node.name in {'_git_identity_config','_git_commit_writeback'}: node.returns=None for arg in node.args.args+node.args.kwonlyargs:arg.annotation=None nodes.append(node) env=dict(subprocess=subprocess,sys=sys,Path=Path) exec(compile(ast.Module(body=nodes,type_ignores=[]),str(SOURCE),'exec'),env) return env['_git_commit_writeback'] def git(root,*args):return subprocess.check_output(['git','-C',str(root),*args]).decode().strip() @pytest.fixture def repo(tmp_path): root=tmp_path/'owner';root.mkdir();git(root,'init','-b','main');git(root,'config','user.name','Synthetic Test');git(root,'config','user.email','synthetic@example.invalid');git(root,'config','core.hooksPath','.git/hooks') for name in ['writeback.md','.custodian-brief.md','evidence.json']:(root/name).write_text('original\n') git(root,'add','.');git(root,'commit','-m','baseline') (root/'.custodian-brief.md').write_text('staged unrelated\n');git(root,'add','.custodian-brief.md');(root/'.custodian-brief.md').write_text('working unrelated\n') (root/'evidence.json').write_text('dirty evidence\n') return root def test_writeback_commits_only_target_preserves_unrelated_stage_and_worktree(repo): before_index=git(repo,'ls-files','--stage','.custodian-brief.md','evidence.json');before_head=git(repo,'rev-parse','HEAD') target=repo/'writeback.md';target.write_text('new status\n') assert actual_writeback()(str(repo),target,['synthetic status']) assert git(repo,'rev-parse','HEAD')!=before_head assert git(repo,'diff-tree','--no-commit-id','--name-only','-r','HEAD')=='writeback.md' assert git(repo,'show','HEAD:.custodian-brief.md')=='original' assert git(repo,'show',':.custodian-brief.md')=='staged unrelated' assert git(repo,'ls-files','--stage','.custodian-brief.md','evidence.json')==before_index assert (repo/'.custodian-brief.md').read_text()=='working unrelated\n' assert (repo/'evidence.json').read_text()=='dirty evidence\n' def test_noop_never_commits_unrelated_staged_change(repo): head=git(repo,'rev-parse','HEAD');index=git(repo,'ls-files','--stage') assert not actual_writeback()(str(repo),repo/'writeback.md',['no change']) assert git(repo,'rev-parse','HEAD')==head and git(repo,'ls-files','--stage')==index @pytest.mark.parametrize('name',['new writeback.md','-leading-dash.md']) def test_new_target_and_argument_boundary(repo,name): target=repo/name;target.write_text('new file\n') assert actual_writeback()(str(repo),target,['new synthetic target']) assert git(repo,'diff-tree','--no-commit-id','--name-only','-r','HEAD')==name assert git(repo,'show',':.custodian-brief.md')=='staged unrelated' def test_normal_hook_refusal_preserves_unrelated_state(repo): hook=repo/'.git/hooks/pre-commit';hook.write_text('#!/bin/sh\nexit 1\n');hook.chmod(0o755) head=git(repo,'rev-parse','HEAD');index=git(repo,'ls-files','--stage','.custodian-brief.md','evidence.json') target=repo/'writeback.md';target.write_text('new status\n') assert not actual_writeback()(str(repo),target,['refused synthetic change']) assert git(repo,'rev-parse','HEAD')==head assert git(repo,'ls-files','--stage','.custodian-brief.md','evidence.json')==index assert git(repo,'show',':.custodian-brief.md')=='staged unrelated'