mirror of https://github.com/borgbackup/borg.git
version: Add version parsing and formating
This commit is contained in:
parent
58024c0b1b
commit
c580d9c173
|
@ -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)
|
Loading…
Reference in New Issue