fix(evidence): support nested workspace roots
This commit is contained in:
@@ -1,10 +1,21 @@
|
|||||||
import json
|
import json
|
||||||
|
import subprocess
|
||||||
|
|
||||||
from typer.testing import CliRunner
|
from typer.testing import CliRunner
|
||||||
|
|
||||||
from tht.cli import app
|
from tht.cli import app
|
||||||
|
|
||||||
|
|
||||||
|
def test_evidence_authoring_accepts_a_canonical_workspace_inside_the_git_worktree(tmp_path):
|
||||||
|
from tht.cli.evidence_cmd import _canonical_worktree
|
||||||
|
|
||||||
|
subprocess.run(["git", "init", "--quiet", str(tmp_path)], check=True)
|
||||||
|
workspace_root = tmp_path / "psd-clinical"
|
||||||
|
workspace_root.mkdir()
|
||||||
|
|
||||||
|
assert _canonical_worktree(workspace_root) == workspace_root.resolve()
|
||||||
|
|
||||||
|
|
||||||
def test_evidence_authoring_commands_are_distinct_from_runtime_preprocessing():
|
def test_evidence_authoring_commands_are_distinct_from_runtime_preprocessing():
|
||||||
result = CliRunner().invoke(app, ["evidence", "--help"])
|
result = CliRunner().invoke(app, ["evidence", "--help"])
|
||||||
|
|
||||||
|
|||||||
@@ -23,9 +23,10 @@ evidence_app = typer.Typer(help="Prepare and validate workspace Evidence", no_ar
|
|||||||
|
|
||||||
|
|
||||||
def _canonical_worktree(workspace_root: Path) -> Path:
|
def _canonical_worktree(workspace_root: Path) -> Path:
|
||||||
if workspace_root.is_symlink():
|
requested = workspace_root.absolute()
|
||||||
raise typer.BadParameter("workspace-root must not be a symlink")
|
|
||||||
root = workspace_root.resolve()
|
root = workspace_root.resolve()
|
||||||
|
if workspace_root.is_symlink() or requested != root:
|
||||||
|
raise typer.BadParameter("workspace-root must not be a symlink")
|
||||||
result = subprocess.run(
|
result = subprocess.run(
|
||||||
["git", "rev-parse", "--show-toplevel"],
|
["git", "rev-parse", "--show-toplevel"],
|
||||||
cwd=root,
|
cwd=root,
|
||||||
@@ -33,8 +34,15 @@ def _canonical_worktree(workspace_root: Path) -> Path:
|
|||||||
capture_output=True,
|
capture_output=True,
|
||||||
text=True,
|
text=True,
|
||||||
)
|
)
|
||||||
if result.returncode != 0 or Path(result.stdout.strip()).resolve() != root:
|
if result.returncode != 0:
|
||||||
raise typer.BadParameter("workspace-root must be the root of a canonical Git worktree")
|
raise typer.BadParameter("workspace-root must be inside a canonical Git worktree")
|
||||||
|
git_root = Path(result.stdout.strip()).resolve()
|
||||||
|
try:
|
||||||
|
root.relative_to(git_root)
|
||||||
|
except ValueError as error:
|
||||||
|
raise typer.BadParameter(
|
||||||
|
"workspace-root must be inside a canonical Git worktree",
|
||||||
|
) from error
|
||||||
return root
|
return root
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user