1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
"""Adapted from https://github.com/pygame/pygameweb/blob/master/pygameweb/builds/update_version_from_git.py
For updating the version from git.
__init__.py contains a __version__ field.
Update that.
If the user supplies "patch" as a CLi argument, we want to bump the existing patch version
If the user supplied the full version as a CLI argument, we want to use that version.
Otherwise,
If we are on master, we want to update the version as a pre-release.
git describe --tags
With these:
__init__.py
__version__= '0.0.2'
git describe --tags
0.0.1-22-g729a5ae
We want this:
__init__.py
__version__= '0.0.2.dev22.g729a5ae'
Get the branch/tag name with this.
git symbolic-ref -q --short HEAD || git describe --tags --exact-match
"""
import re
import subprocess
import sys
from pathlib import Path
from packaging.version import Version
_INIT_FILE = Path("django_prometheus/__init__.py")
def migrate_source_attribute(attr, to_this, target_file):
"""Updates __magic__ attributes in the source file"""
new_file = []
found = False
lines = target_file.read_text().splitlines()
for line in lines:
if line.startswith(attr):
found = True
line = to_this
new_file.append(line)
if found:
target_file.write_text("\n".join(new_file))
def migrate_version(new_version):
"""Updates __version__ in the init file"""
print(f"migrate to version: {new_version}")
migrate_source_attribute("__version__", to_this=f'__version__ = "{new_version}"\n', target_file=_INIT_FILE)
def is_master_branch():
cmd = "git rev-parse --abbrev-ref HEAD"
tag_branch = subprocess.check_output(cmd, shell=True)
return tag_branch in [b"master\n"]
def get_git_version_info():
cmd = "git describe --tags"
ver_str = subprocess.check_output(cmd, shell=True)
ver, commits_since, githash = ver_str.decode().strip().split("-")
return Version(ver), int(commits_since), githash
def prerelease_version():
"""Return what the prerelease version should be.
https://packaging.python.org/tutorials/distributing-packages/#pre-release-versioning
0.0.2.dev22
"""
ver, commits_since, githash = get_git_version_info()
initpy_ver = get_version()
assert initpy_ver > ver, "the django_prometheus/__init__.py version should be newer than the last tagged release."
return f"{initpy_ver.major}.{initpy_ver.minor}.{initpy_ver.micro}.dev{commits_since}"
def get_version():
"""Returns version from django_prometheus/__init__.py"""
version_file = _INIT_FILE.read_text()
version_match = re.search(r'^__version__ = [\'"]([^\'"]*)[\'"]', version_file, re.MULTILINE)
if not version_match:
raise RuntimeError("Unable to find version string.")
initpy_ver = version_match.group(1)
assert len(initpy_ver.split(".")) in [3, 4], "django_prometheus/__init__.py version should be like 0.0.2.dev"
return Version(initpy_ver)
def increase_patch_version(old_version):
""":param old_version: 2.0.1
:return: 2.0.2.dev
"""
return f"{old_version.major}.{old_version.minor}.{old_version.micro + 1}.dev"
def release_version_correct():
"""Makes sure the:
- prerelease verion for master is correct.
- release version is correct for tags.
"""
print("update for a pre release version")
assert is_master_branch(), "No non-master deployments yet"
new_version = prerelease_version()
print(f"updating version in __init__.py to {new_version}")
assert len(new_version.split(".")) >= 4, "django_prometheus/__init__.py version should be like 0.0.2.dev"
migrate_version(new_version)
if __name__ == "__main__":
new_version = None
if len(sys.argv) == 1:
release_version_correct()
elif len(sys.argv) == 2:
for _, arg in enumerate(sys.argv):
new_version = arg
if new_version == "patch":
new_version = increase_patch_version(get_version())
migrate_version(new_version)
else:
print(
"Invalid usage. Supply 0 or 1 arguments. "
"Argument can be either a version '1.2.3' or 'patch' "
"if you want to increase the patch-version (1.2.3 -> 1.2.4.dev)",
)
|