You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.3 KiB

#!/usr/bin/env python
#
# Rebuilds the version using git describe
#
from sys import exit
from subprocess import Popen, check_call, PIPE
from os.path import join, dirname, abspath, exists
from os import name as os_name
from sys import argv, exit
import re
if os_name == 'nt':
EX_OK = 0
EX_USAGE = 64
EX_IOERR = 74
else:
from os import EX_IOERR, EX_OK, EX_USAGE
def main(args):
root = dirname(dirname(abspath(__file__)))
git_path = join(root, '.git')
hg_path = join(root, '.hg')
txt = ""
error_txt= ""
if exists(git_path):
try:
proc = Popen(['git', 'describe', '--always', '--dirty'], stdout=PIPE, stderr=PIPE, cwd=root)
txt_b, error_txt_b = proc.communicate()
txt = txt_b.decode("UTF-8").strip().lower()
error_txt = "%d: %s" % (proc.returncode, error_txt_b.decode("UTF-8").strip().lower())
except:
print("Failed to retrieve version from git")
exit(EX_IOERR)
elif exists(hg_path):
try:
check_call(['hg', 'gexport'])
proc0 = Popen(['hg', '--config', 'defaults.log=', 'log', '-r', '.', '--template', '{gitnode}'], stdout=PIPE, stderr=PIPE, cwd=root)
node_b, error_txt_b = proc0.communicate()
node = node_b.decode("UTF-8")
error_txt = "%d: %s" % (proc0.returncode, error_txt_b.decode("UTF-8").strip().lower())
proc1 = Popen(['git', '--git-dir=.hg/git', 'describe', '--long', '--tags', '--always', node], stdout=PIPE, stderr=PIPE, cwd=root)
txt_b, error_txt_b = proc1.communicate()
txt = txt_b.decode("UTF-8").lower()
error_txt += ", %d: %s" % (proc1.returncode, error_txt_b.decode("UTF-8").strip().lower())
except:
print("Failed to retrieve version from hg")
exit(EX_IOERR)
else:
print("Unknown version control system in '%s'." % root)
exit(EX_USAGE)
version_pattern = re.compile(r"""
^
( #1: full match
uncrustify-
(\d+\.\d+(\.\d+)?) #2: version 0.64.2 (,#3 optional 3rd nr)
( #4: additional version info (long string format)
-(\d+) #5: tag commit distance
-g(\w{7,}) #g-prefix + #6: commithash
)?
|
(\w{7,}) #7: commithash only format (last N commits pulled and no tag available)
)
(-(dirty))? #9: optional dirty specifier (#8,)
$
""", re.X)
r_match = version_pattern.match(txt)
if r_match is None:
print("Regex version match failed on: '%s' (%s)" % (txt, error_txt))
exit(EX_IOERR)
if r_match.group(2) is not None:
string_groups = [r_match.group(2)]
if r_match.group(5) is not None and r_match.group(6) is not None:
string_groups.append(r_match.group(5))
string_groups.append(r_match.group(6))
else:
string_groups = [r_match.group(7)]
if r_match.group(9) is not None:
string_groups.append(r_match.group(9))
for g in string_groups:
if g is None:
print("Unexpected empty regex group")
exit(EX_IOERR)
print("%s" % "-".join(string_groups))
return EX_OK
if __name__ == "__main__":
main(argv[1:])