60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
Erzeugt _build_info.py mit Build-Zeitstempel, Git-Commit, Branch und Dirty-Status.
|
||
|
||
Aufruf: python aza_build_stamp.py
|
||
Ergebnis: _build_info.py im selben Verzeichnis
|
||
"""
|
||
|
||
import datetime
|
||
import os
|
||
import subprocess
|
||
import sys
|
||
|
||
|
||
def _run_git(*args: str) -> str:
|
||
try:
|
||
r = subprocess.run(
|
||
["git"] + list(args),
|
||
capture_output=True, text=True, timeout=5,
|
||
cwd=os.path.dirname(os.path.abspath(__file__)),
|
||
)
|
||
return r.stdout.strip() if r.returncode == 0 else ""
|
||
except Exception:
|
||
return ""
|
||
|
||
|
||
def generate() -> dict:
|
||
now = datetime.datetime.now()
|
||
info = {
|
||
"BUILD_TIME": now.strftime("%Y-%m-%d %H:%M:%S"),
|
||
"BUILD_TIMESTAMP": now.strftime("%Y%m%d_%H%M%S"),
|
||
"GIT_COMMIT": _run_git("rev-parse", "--short=8", "HEAD"),
|
||
"GIT_BRANCH": _run_git("rev-parse", "--abbrev-ref", "HEAD"),
|
||
"GIT_DIRTY": bool(_run_git("status", "--porcelain")),
|
||
}
|
||
return info
|
||
|
||
|
||
def write_module(info: dict, path: str | None = None):
|
||
if path is None:
|
||
path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "_build_info.py")
|
||
|
||
lines = [
|
||
'# Auto-generated by aza_build_stamp.py – DO NOT EDIT',
|
||
f'BUILD_TIME = "{info["BUILD_TIME"]}"',
|
||
f'BUILD_TIMESTAMP = "{info["BUILD_TIMESTAMP"]}"',
|
||
f'GIT_COMMIT = "{info["GIT_COMMIT"]}"',
|
||
f'GIT_BRANCH = "{info["GIT_BRANCH"]}"',
|
||
f'GIT_DIRTY = {info["GIT_DIRTY"]}',
|
||
]
|
||
with open(path, "w", encoding="utf-8") as f:
|
||
f.write("\n".join(lines) + "\n")
|
||
print(f"[BUILD-STAMP] {path} geschrieben ({info['BUILD_TIME']}, {info['GIT_COMMIT']}, dirty={info['GIT_DIRTY']})")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
info = generate()
|
||
write_module(info)
|