fix(server): pure-python fallback for version when git is not on PATH
The systemd service environment on the NixOS deploy host has a minimal PATH without git, so subprocess.run(['git', ...]) fails with FileNotFoundError and /api/version returned 'unknown'. Fall back to reading .git/HEAD directly (resolving the ref) and returning the short SHA. Loses tag/dirty detection, but unblocks the version badge in deployed environments. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
b4d76b0eca
commit
0872d545d5
1 changed files with 21 additions and 3 deletions
24
server.py
24
server.py
|
|
@ -28,15 +28,33 @@ logger = logging.getLogger(__name__)
|
||||||
# ── Version (computed once at startup) ───────────────────────────
|
# ── Version (computed once at startup) ───────────────────────────
|
||||||
|
|
||||||
def _compute_version() -> str:
|
def _compute_version() -> str:
|
||||||
"""Return `git describe --tags --always --dirty`, or 'unknown'."""
|
"""Return `git describe --tags --always --dirty`, with a pure-Python
|
||||||
|
fallback for environments where the `git` binary isn't on PATH
|
||||||
|
(e.g. minimal systemd service environments on NixOS).
|
||||||
|
"""
|
||||||
|
repo_root = pathlib.Path(__file__).parent
|
||||||
|
|
||||||
|
# Preferred: git describe (picks up tags + dirty state).
|
||||||
try:
|
try:
|
||||||
out = subprocess.run(
|
out = subprocess.run(
|
||||||
["git", "describe", "--tags", "--always", "--dirty"],
|
["git", "describe", "--tags", "--always", "--dirty"],
|
||||||
cwd=pathlib.Path(__file__).parent,
|
cwd=repo_root,
|
||||||
capture_output=True, text=True, timeout=2, check=True,
|
capture_output=True, text=True, timeout=2, check=True,
|
||||||
)
|
)
|
||||||
return out.stdout.strip() or "unknown"
|
if out.stdout.strip():
|
||||||
|
return out.stdout.strip()
|
||||||
except (subprocess.SubprocessError, FileNotFoundError, OSError):
|
except (subprocess.SubprocessError, FileNotFoundError, OSError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Fallback: resolve HEAD ourselves. No tags, no dirty detection, just SHA.
|
||||||
|
try:
|
||||||
|
head = (repo_root / ".git" / "HEAD").read_text().strip()
|
||||||
|
if head.startswith("ref: "):
|
||||||
|
sha = (repo_root / ".git" / head[5:]).read_text().strip()
|
||||||
|
else:
|
||||||
|
sha = head
|
||||||
|
return sha[:7] if sha else "unknown"
|
||||||
|
except OSError:
|
||||||
return "unknown"
|
return "unknown"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue