aboutsummaryrefslogtreecommitdiffhomepage
path: root/version_parser.py
diff options
context:
space:
mode:
authorKiss György <w2lkm2n@gmail.com>2018-10-18 15:40:47 +0200
committerGuido Günther <agx@sigxcpu.org>2018-11-02 10:48:34 +0100
commit7bba657506130f05e5b5ee485fbabe7c39ff2b80 (patch)
tree5c9531e6a0b1df0ddd7fbe349bbea23d0fc37f3c /version_parser.py
parentcaa586a1650e18232096e530c97b5cbd7cab325e (diff)
setup.py: Fix gbp problem when installed with pip
when installed with "pip install gbp" it will be installed as version "0.0" because the released version doesn't have a debian/changelog file, so it will be installed with a warning: balabit-bbos-tools 1.0.0 has requirement gbp==0.9.8, but you'll have gbp 0.0 which is incompatible. and will cause an Exception when using gbp from a setuptools entrypoint script: File "/home/walkman/stew/projects/platform/source/balabit-os-tools/.venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 574, in _build_master ws.require(__requires__) File "/home/walkman/stew/projects/platform/source/balabit-os-tools/.venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 892, in require needed = self.resolve(parse_requirements(requirements)) File "/home/walkman/stew/projects/platform/source/balabit-os-tools/.venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 783, in resolve raise VersionConflict(dist, req).with_context(dependent_req) pkg_resources.ContextualVersionConflict: (gbp 0.0 (/home/walkman/stew/projects/platform/source/balabit-os-tools/.venv/lib/python3.6/site-packages), Requirement.parse('gbp==0.9.8'), {'requiresgbp'}) This is because pkg_resources checks every dependency version and if it doesn't match with the egg-info, it raises this Exception. Instead, we try to parse the debian/changelog first, then load the version, or if the debian/changelog file doesn't exists (this is the case at pip install) we read the gbp/version.py and parse the version from it. There is a "round trip check", which means the parsed version is written, then it will be read back immediately to see if there is any problem.
Diffstat (limited to 'version_parser.py')
-rw-r--r--version_parser.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/version_parser.py b/version_parser.py
new file mode 100644
index 00000000..793d77db
--- /dev/null
+++ b/version_parser.py
@@ -0,0 +1,42 @@
+import os
+import subprocess
+
+
+VERSION_PY_PATH = 'gbp/version.py'
+
+
+def _parse_changelog():
+ """Get version from debian changelog and write it to gbp/version.py"""
+ popen = subprocess.Popen('dpkg-parsechangelog', stdout=subprocess.PIPE)
+ out, ret = popen.communicate()
+ for line in out.decode('utf-8').split('\n'):
+ if line.startswith('Version:'):
+ version = line.split(' ')[1].strip()
+ return version
+
+ raise ValueError('Could not parse version from debian/changelog')
+
+
+def _save_version_py(version):
+ with open(VERSION_PY_PATH, 'w') as f:
+ f.write('"The current gbp version number"\n')
+ f.write('gbp_version = "%s"\n' % version)
+
+
+def _load_version():
+ with open(VERSION_PY_PATH, 'r') as f:
+ version_py = f.read()
+ version_py_globals = {}
+ exec(version_py, version_py_globals)
+ return version_py_globals['gbp_version']
+
+
+def parse_and_fetch_version():
+ if os.path.exists('debian/changelog'):
+ version = _parse_changelog()
+ _save_version_py(version)
+ # we could return with the version here, but instead we check that
+ # the file has been properly written and it can be loaded back
+
+ version = _load_version()
+ return version