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 128 129
|
# Helper functions for main conf.py Sphinx build configuration
import datetime
import re
import subprocess
def get_current_branch():
"""Return the current branch we are on or the branch that the detached head
is pointed to"""
current_branch = subprocess.check_output(
['git', 'rev-parse', '--abbrev-ref', "HEAD"]
).decode("utf-8").strip()
if current_branch == 'HEAD':
# This means we are operating in a detached head state, will need to
# parse out the branch that the commit is from.
# Decode "bytes" type to UTF-8 sting to avoid Python 3 error:
# "TypeError: a bytes-like object is required, not 'str'""
# https://docs.python.org/3/library/stdtypes.html#bytes.decode
branches = subprocess.check_output(['git', 'branch']).decode('utf-8').split('\n')
for branch in branches:
# Git marks the current branch, or in this case the branch
# we are currently detached from with an asterisk
if '*' in branch:
# Split on the remote/branch separator, grab the
# last entry in the list and then strip off the trailing
# parentheis
detached_from_branch = branch.split('/')[-1].replace(')', '')
return detached_from_branch
else:
# The assumption is that we are on a branch at this point. Return that.
return current_branch
def get_current_stable_version():
"""Return the current X.Y stable version number from the latest git tag"""
def get_latest_tag():
""""Helper function: Return the latest git tag"""
git_tag_output = subprocess.check_output(
['git', 'tag', '--list', "v*"]
).decode("utf-8").strip()
git_tag_list = re.sub('[A-Za-z]', '', git_tag_output).split('\n')
git_tag_list.sort(key=lambda s: [int(u) for u in s.split('.')])
# The latest tag is the last in the list
git_tag_latest = git_tag_list[-1]
return git_tag_latest
latest_tag = get_latest_tag()
# Return 'X.Y' from 'X.Y.Z'
return latest_tag[:-2]
def get_next_stable_version():
"""Return the next stable version"""
current_version = get_current_stable_version()
# Break apart 'x.y' value, increment y and then concatenate into 'x.y' again
next_version = "{}.{}".format(
int(current_version[:1]),
int(current_version[-2:]) + 1
)
return next_version
def get_current_commit_hash():
"""Return commit hash string"""
commit_hash = subprocess.check_output(['git', 'log', '--pretty=format:%h', 'HEAD', '-n1']).decode("utf-8")
return commit_hash
def get_release_string(release_type, release_string_detail, version):
"""Return a release string representing the type of build. Verbose for
dev builds and with sparse version info for release builds"""
if release_type == "dev":
# Used in dev builds
DATE = datetime.date.today()
TODAY = DATE.strftime('%Y%m%d')
# The detailed release string is too long for the rsyslog.com 'better'
# theme and perhaps too long for other themes as well, so we set the
# level to 'simple' by default (to be explicit) and
# allow overriding by command-line if desired.
if release_string_detail == "simple":
# 'rsyslog' prefix is already set via 'project' variable in conf.py
# HASH
# 'docs' string suffix is already ...
release_string = "{}".format(
get_current_commit_hash()
)
elif release_string_detail == "detailed":
# The verbose variation of the release string. This was previously
# the default when using the 'classic' theme, but proves to be
# too long when viewed using alternate themes. If requested
# via command-line override this format is used.
release_string = "{}-{}-{}-{}".format(
get_next_stable_version(),
get_current_branch(),
TODAY,
get_current_commit_hash()
)
else:
# This means that someone set a value that we do not
# have a format defined for. Return an error string instead
# to help make it clear what happened.
release_string = "invalid value for release_string_detail"
else:
release_string = "{}".format(version)
return release_string
|