summaryrefslogtreecommitdiffstats
path: root/source/conf_helpers.py
diff options
context:
space:
mode:
Diffstat (limited to 'source/conf_helpers.py')
-rw-r--r--source/conf_helpers.py129
1 files changed, 129 insertions, 0 deletions
diff --git a/source/conf_helpers.py b/source/conf_helpers.py
new file mode 100644
index 0000000..202c0bf
--- /dev/null
+++ b/source/conf_helpers.py
@@ -0,0 +1,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