Skip to content

Commit

Permalink
Add extra version info on dev installs (#623)
Browse files Browse the repository at this point in the history
* Add extra version info on dev installs

* Allow build tool to find version

---------

Co-authored-by: Korijn van Golen <[email protected]>
  • Loading branch information
almarklein and Korijn authored Oct 17, 2024
1 parent 8f849c1 commit d28f27f
Show file tree
Hide file tree
Showing 5 changed files with 120 additions and 8 deletions.
1 change: 1 addition & 0 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ jobs:
# Install sdist, but no test, because there is no wgpu-native lib now.
filename=$(ls dist/*.tar.gz)
pip install $filename
python -c "import wgpu; print(wgpu.__version__)"
pip uninstall -y wgpu
git reset --hard HEAD
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -143,12 +143,13 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -U -e .
pip install -U .
pip install -U pytest numpy psutil pyinstaller glfw
- name: Test PyInstaller
run: |
pushd $HOME
pyinstaller --version
pytest -v wgpu/__pyinstaller
pytest -v --pyargs wgpu.__pyinstaller
test-builds:
name: ${{ matrix.name }}
Expand Down Expand Up @@ -194,6 +195,7 @@ jobs:
run: |
python -m pip install --upgrade pip
pip install -U -e .[tests]
python -c "import wgpu; print(wgpu.__version__)"
- name: Unit tests
run: |
pytest -v tests
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ requires = ["requests", "hatchling"]
build-backend = "hatchling.build"

[tool.hatch.version]
path = "wgpu/__init__.py"
path = "wgpu/_version.py"

[tool.hatch.build.targets.sdist]
packages = ["wgpu"]
Expand Down
6 changes: 1 addition & 5 deletions wgpu/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
# ruff: noqa: F401, F403

from ._coreutils import logger
from ._version import __version__, version_info
from ._diagnostics import diagnostics, DiagnosticsBase
from .flags import *
from .enums import *
Expand All @@ -14,10 +15,5 @@
from . import backends
from . import resources


__version__ = "0.18.1"
version_info = tuple(map(int, __version__.split(".")))


# The API entrypoint, from wgpu.classes - gets replaced when a backend loads.
gpu = GPU() # noqa: F405
113 changes: 113 additions & 0 deletions wgpu/_version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
"""
Versioning: we use a hard-coded version number, because it's simple and always
works. For dev installs we add extra version info from Git.
"""

import logging
import subprocess
from pathlib import Path


# This is the reference version number, to be bumped before each release.
# The build system detects this definition when building a distribution.
__version__ = "0.18.1"

# Allow using nearly the same code in different projects
project_name = "wgpu"


logger = logging.getLogger(project_name.lower())

# Get whether this is a repo. If so, repo_dir is the path, otherwise repo_dir is None.
repo_dir = Path(__file__).parents[1]
repo_dir = repo_dir if repo_dir.joinpath(".git").is_dir() else None


def get_version():
"""Get the version string."""
if repo_dir:
return get_extended_version()
else:
return __version__


def get_extended_version():
"""Get an extended version string with information from git."""

release, post, labels = get_version_info_from_git()

# Sample first 3 parts of __version__
base_release = ".".join(__version__.split(".")[:3])

# Check release
if not release:
release = base_release
elif release != base_release:
logger.warning(
f"{project_name} version from git ({release}) and __version__ ({base_release}) don't match."
)

# Build the total version
version = release
if post and post != "0":
version += f".post{post}"
if labels:
version += "+" + ".".join(labels)

return version


def get_version_info_from_git():
"""Get (release, post, labels) from Git.
With `release` the version number from the latest tag, `post` the
number of commits since that tag, and `labels` a tuple with the
git-hash and optionally a dirty flag.
"""

# Call out to Git
command = [
"git",
"describe",
"--long",
"--always",
"--tags",
"--dirty",
"--first-parent",
]
try:
p = subprocess.run(command, cwd=repo_dir, capture_output=True)
except Exception as e:
logger.warning(f"Could not get {project_name} version: {e}")
p = None

# Parse the result into parts
if p is None:
parts = (None, None, "unknown")
else:
output = p.stdout.decode(errors="ignore")
if p.returncode:
stderr = p.stderr.decode(errors="ignore")
logger.warning(
f"Could not get {project_name} version.\n\nstdout: "
+ output
+ "\n\nstderr: "
+ stderr
)
parts = (None, None, "unknown")
else:
parts = output.strip().lstrip("v").split("-")
if len(parts) <= 2:
# No tags (and thus also no post). Only git hash and maybe 'dirty'
parts = (None, None, *parts)

# Return unpacked parts
release, post, *labels = parts
return release, post, labels


__version__ = get_version()

version_info = tuple(
int(i) if i.isnumeric() else i for i in __version__.split("+")[0].split(".")
)

0 comments on commit d28f27f

Please sign in to comment.