73 lines
3.0 KiB
Python
73 lines
3.0 KiB
Python
"""Ordinary evidence fixture: owns synthetic Git checkout and artifacts."""
|
|
import json
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
from pathlib import Path
|
|
from harness.tests._support.paths import ROOT
|
|
|
|
SCRIPT = ROOT / "harness/agents/impl/skills/gitea-issue-rework/scripts/evidence_manifest.py"
|
|
|
|
def run_git(cwd, *args):
|
|
return subprocess.run(["git", *args], cwd=cwd, text=True, capture_output=True, check=True)
|
|
|
|
class EvidenceManifestFixture:
|
|
def setup(self):
|
|
try:
|
|
self._setup()
|
|
except BaseException:
|
|
self.cleanup()
|
|
raise
|
|
return self
|
|
|
|
def cleanup(self):
|
|
if hasattr(self, 'tmp'):
|
|
self.tmp.cleanup()
|
|
|
|
def _setup(self):
|
|
self.tmp = tempfile.TemporaryDirectory(dir=os.environ.get('TMPDIR', '/opt/data/cache/scratch'))
|
|
self.root = Path(self.tmp.name)
|
|
self.contract = self.root / 'harness/operations/repository-cache.md'
|
|
self.contract.parent.mkdir(parents=True)
|
|
self.contract.write_text('# Repository cache 운영 지침\n')
|
|
self.repo = self.root / 'repositories/owner/project/worktrees/issue-1/checkout'
|
|
self.artifacts = self.repo.parent / 'verification/run-a'
|
|
self.repo.mkdir(parents=True)
|
|
self.artifacts.mkdir(parents=True)
|
|
for path in (self.root / 'repositories', *self.repo.parents):
|
|
if path == self.root:
|
|
break
|
|
path.chmod(448)
|
|
self.repo.chmod(448)
|
|
self.artifacts.parent.chmod(448)
|
|
self.artifacts.chmod(448)
|
|
run_git(self.repo, 'init', '-q')
|
|
run_git(self.repo, 'config', 'user.email', 'test@example.invalid')
|
|
run_git(self.repo, 'config', 'user.name', 'Test')
|
|
(self.repo / 'input.txt').write_text('hello\n')
|
|
run_git(self.repo, 'add', 'input.txt')
|
|
run_git(self.repo, 'commit', '-qm', 'initial')
|
|
|
|
def invoke(self, *args, env=None):
|
|
op, *rest = args
|
|
common = [] if op == 'validate-legacy' else ['--contract-path', str(self.contract), '--artifact-root', str(self.artifacts)]
|
|
return subprocess.run([sys.executable, str(SCRIPT), str(op), *common, *map(str, rest)], cwd=self.repo, text=True, capture_output=True, env=env)
|
|
|
|
def plan(self, commands=None, **extra):
|
|
if commands is None:
|
|
commands = [{'id': 'check', 'purpose': 'show input', 'argv': ['git', 'show', 'HEAD:input.txt'], 'expected_exit_code': 0, 'claims': ['output']}]
|
|
data = {'hash_paths': ['input.txt'], 'commands': [dict({'timeout_seconds': 5}, **command) for command in commands]}
|
|
data.update(extra)
|
|
p = self.artifacts / 'plan.json'
|
|
p.write_text(json.dumps(data))
|
|
p.chmod(384)
|
|
return p
|
|
|
|
def run_manifest(self, plan=None):
|
|
if plan is None:
|
|
plan = self.plan()
|
|
out = self.artifacts / 'manifest.json'
|
|
result = self.invoke('run', '--repo-root', self.repo, '--plan', plan.name, '--output', 'manifest.json')
|
|
return (result, out)
|