Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .git_archival.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node: $Format:%H$
node-date: $Format:%cI$
describe-name: $Format:%(describe:tags=true,abbrev=9,match=*[0-9]*)$
66 changes: 66 additions & 0 deletions generate_version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#!/usr/bin/env python3

import os
import subprocess

from datetime import datetime
from typing import Optional


def git_describe() -> subprocess.CompletedProcess:
return subprocess.run(
["git", "describe", "--abbrev=9", "--tags", "--match=*[0-9]*"],
text=True,
capture_output=True,
)


def version_from_git_describe(desc: str, timestamp: Optional[datetime] = None) -> str:
desc = desc.removeprefix("v").strip()
version, *rest = desc.split("-", maxsplit=2)
# we're directly on a tag
if not rest:
return version

# guess next version
version_parts = [int(v) for v in version.split(".")]
version_parts.append(version_parts.pop() + 1)

# dev tailer
commits_since_tag, commit = rest
t = timestamp or datetime.now()
trailer = f".dev{commits_since_tag}+{commit}.d{t:%Y%m%d}"

return ".".join(str(v) for v in version_parts) + trailer


def read_git_archival_txt() -> dict[str, str]:
content = open(".git_archival.txt").read()

Check warning

Code scanning / CodeQL

File is not always closed Warning

File is opened but is not closed.
return {key.rstrip(":"): val for line in content.splitlines()}


def version_from_archival_txt(info: dict[str, str], timestamp: Optional[datetime] = None) -> str:
desc = info['describe-name']

t = timestamp or datetime.fromisoformat(info['node-date'])
return version_from_git_describe(desc, timestamp=t)


def main() -> str:
# if SOURCE_DATE_EPOCH is set, we're going to use it as the timestamp
sde = None
if (t := os.environ.get("SOURCE_DATE_EPOCH")) is not None:
sde = datetime.fromtimestamp(int(t))

p = git_describe()
if p.returncode == 0:
return version_from_git_describe(p.stdout, timestamp=sde)
elif p.returncode == 128: # not a git repo
info = read_git_archival_txt()
return version_from_archival_txt(info, timestamp=sde)

return "unknown"


if __name__ == "__main__":
print(main())
2 changes: 1 addition & 1 deletion meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
project(
'python-systemd',
'c',
version: '236',
version: run_command(meson.project_source_root() / 'generate_version.py', check: true).stdout().strip(),
license: 'LGPL-2.1-or-later',
default_options: ['warning_level=2', 'c_std=c99'],
meson_version: '>= 1.8.0',
Expand Down
Loading