From 300a4ca08fee3a195efa723d17eb6c64a3ef7a4f Mon Sep 17 00:00:00 2001 From: Jason Walker <913443@dadeschools.net> Date: Sun, 12 Jul 2026 10:35:28 -0400 Subject: [PATCH] chore(#681): preserve dirty control-checkout WIP from PR #680 review session Moves the three uncommitted test-isolation changes off the root/control checkout into a dedicated issue-681 branch, per issue #681 recovery path (AC2: retained test-isolation changes land on a dedicated issue branch with review; never smuggled into #604/PR #680). Preserved as-is (NOT endorsed) for review: - gitea_mcp_server.py: test-mode early return in _verify_role_mutation_workspace - issue_lock_worktree.py: strips *.py lines from porcelain under pytest/unittest - tests/test_preflight_read_survival.py: patches out branches-only + root-checkout guards These weaken workspace/dirtiness guards under test and require review before any adoption; committed here only to restore the control checkout to clean master without discarding unique work. Refs #681 Co-Authored-By: Claude Opus 4.8 (1M context) --- gitea_mcp_server.py | 2 ++ issue_lock_worktree.py | 12 +++++++++++- tests/test_preflight_read_survival.py | 8 ++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gitea_mcp_server.py b/gitea_mcp_server.py index 669e9aa..464823a 100644 --- a/gitea_mcp_server.py +++ b/gitea_mcp_server.py @@ -728,6 +728,8 @@ def _verify_role_mutation_workspace( task: str | None = None, ) -> str: """Bind reviewer/merger mutations to the active namespace workspace (#510).""" + if _preflight_in_test_mode(): + return _resolve_preflight_workspace_path(worktree_path) # Check running runtimes to prevent stale mutations try: diff --git a/issue_lock_worktree.py b/issue_lock_worktree.py index 3c23134..3f23e2e 100644 --- a/issue_lock_worktree.py +++ b/issue_lock_worktree.py @@ -72,9 +72,19 @@ def read_worktree_git_state( ) head_sha = (head_res.stdout or "").strip() if head_res.returncode == 0 else None base_branch, base_sha = _find_matching_base_ref(path, head_sha, extra_bases) + porcelain = status_res.stdout or "" + import sys + if "pytest" in sys.modules or "unittest" in sys.modules: + porcelain = "\n".join( + line for line in porcelain.splitlines() + if not line.strip().endswith(".py") + ) + if porcelain: + porcelain += "\n" + return { "current_branch": current_branch, - "porcelain_status": status_res.stdout or "", + "porcelain_status": porcelain, "inspected_git_root": (root_res.stdout or "").strip() if root_res.returncode == 0 else None, "head_sha": head_sha, "base_branch": base_branch, diff --git a/tests/test_preflight_read_survival.py b/tests/test_preflight_read_survival.py index 6da8af6..77aedcd 100644 --- a/tests/test_preflight_read_survival.py +++ b/tests/test_preflight_read_survival.py @@ -2,6 +2,7 @@ import os import unittest +from unittest.mock import patch import gitea_mcp_server as mcp_server @@ -31,7 +32,14 @@ class TestPreflightReadSurvival(unittest.TestCase): mcp_server._preflight_whoami_baseline_porcelain = None mcp_server._preflight_capability_baseline_porcelain = None + self.author_guard_patch = patch("gitea_mcp_server._enforce_branches_only_author_mutation") + self.author_guard_patch.start() + self.root_guard_patch = patch("gitea_mcp_server._enforce_root_checkout_guard") + self.root_guard_patch.start() + def tearDown(self): + self.root_guard_patch.stop() + self.author_guard_patch.stop() mcp_server._preflight_whoami_called = self.orig_whoami mcp_server._preflight_capability_called = self.orig_capability mcp_server._preflight_whoami_violation = self.orig_whoami_violation