From c580d9c173162b0c632a70f94e3c1ca422ab5cce Mon Sep 17 00:00:00 2001 From: Martin Hostettler Date: Thu, 10 Nov 2016 08:55:19 +0100 Subject: [PATCH] version: Add version parsing and formating --- src/borg/version.py | 49 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/borg/version.py diff --git a/src/borg/version.py b/src/borg/version.py new file mode 100644 index 000000000..4eb0c77d5 --- /dev/null +++ b/src/borg/version.py @@ -0,0 +1,49 @@ +import re + + +def parse_version(version): + """ + simplistic parser for setuptools_scm versions + + supports final versions and alpha ('a'), beta ('b') and rc versions. It just discards commits since last tag + and git revision hash. + + Output is a version tuple containing integers. It ends with one or two elements that ensure that relational + operators yield correct relations for alpha, beta and rc versions too. For final versions the last element + is a -1, for prerelease versions the last two elements are a smaller negative number and the number of e.g. + the beta. + + Note, this sorts version 1.0 before 1.0.0. + + This version format is part of the remote protocol, don‘t change in breaking ways. + """ + + parts = version.split('+')[0].split('.') + if parts[-1].startswith('dev'): + del parts[-1] + version = [int(segment) for segment in parts[:-1]] + + prerelease = re.fullmatch('([0-9]+)(a|b|rc)([0-9]+)', parts[-1]) + if prerelease: + version_type = {'a': -4, 'b': -3, 'rc': -2}[prerelease.group(2)] + version += [int(prerelease.group(1)), version_type, int(prerelease.group(3))] + else: + version += [int(parts[-1]), -1] + + return tuple(version) + + +def format_version(version): + """a reverse for parse_version (obviously without the dropped information)""" + f = [] + it = iter(version) + while True: + part = next(it) + if part >= 0: + f += str(part) + elif part == -1: + break + else: + f[-1] = f[-1] + {-2: 'rc', -3: 'b', -4: 'a'}[part] + str(next(it)) + break + return '.'.join(f)