diff --git a/.gitignore b/.gitignore index 5afdf67..4e74cac 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,4 @@ target/ .idea MANIFEST Version.py +version.h diff --git a/src/gitversionbuilder/__main__.py b/src/gitversionbuilder/__main__.py index b34fb96..1964594 100755 --- a/src/gitversionbuilder/__main__.py +++ b/src/gitversionbuilder/__main__.py @@ -16,12 +16,13 @@ def run_main(): parser.add_argument('--version', action='version', version=Version.VERSION_STRING) parser.add_argument('--lang', choices=['cpp', 'python'], required=True) parser.add_argument('--dir', default='.') + parser.add_argument('--buildnum', default='1') parser.add_argument('file') args = parser.parse_args() print("Creating git version information from %s" % args.dir) - main.create_version_file(git_directory=args.dir, output_file=args.file, lang=args.lang) + main.create_version_file(git_directory=args.dir, output_file=args.file, lang=args.lang, buildnum=args.buildnum) if __name__ == '__main__': diff --git a/src/gitversionbuilder/main.py b/src/gitversionbuilder/main.py index a7dfa6d..f3606e4 100644 --- a/src/gitversionbuilder/main.py +++ b/src/gitversionbuilder/main.py @@ -5,8 +5,9 @@ def get_version(git_directory): return versioninforeader.from_git(git_directory) -def create_version_file(git_directory, output_file, lang): +def create_version_file(git_directory, output_file, lang, buildnum = '1'): version_info = get_version(git_directory) + version_info.buildnum = buildnum output = _output(version_info, lang=lang) _write_to_file(output_file, output) diff --git a/src/gitversionbuilder/versioninfo.py b/src/gitversionbuilder/versioninfo.py index a551b74..95f980e 100644 --- a/src/gitversionbuilder/versioninfo.py +++ b/src/gitversionbuilder/versioninfo.py @@ -28,6 +28,9 @@ def __init__(self, git_tag_name, git_commits_since_tag, git_commit_id, git_tag_e self.git_tag_exists = git_tag_exists self.modified_since_commit = modified_since_commit self.is_dev = modified_since_commit or (not git_tag_exists) or (git_commits_since_tag != 0) + self.last_commit_data = "" + self.branch_name = "dev" + self.buildnum=1 def interpret_tag_name(self): matched = re.match("^v?([0-9]+(?:\.[0-9]+)*)(?:-?((alpha|beta|rc|pre|m)[0-9]?|stable|final))?$", @@ -49,7 +52,7 @@ def version_string(self): if self.git_commits_since_tag > 0: if result != "": result += "." - result += "dev%d+rev%s" % (self.git_commits_since_tag, self.git_commit_id) + result += "%s%d+rev%s" % (self.branch_name, self.git_commits_since_tag, self.git_commit_id) if self.modified_since_commit: result += "-modified" return result diff --git a/src/gitversionbuilder/versioninfooutputter.py b/src/gitversionbuilder/versioninfooutputter.py index c8ccf4f..20719eb 100644 --- a/src/gitversionbuilder/versioninfooutputter.py +++ b/src/gitversionbuilder/versioninfooutputter.py @@ -32,7 +32,7 @@ def _format_tag_interpretation(self, version_info): return "" else: formatted_version_components = self.version_components_formatter(tag_interpretation.version_components) - return self.tag_interpretation_formatter(tag_interpretation, formatted_version_components) + return self.tag_interpretation_formatter(tag_interpretation, formatted_version_components, version_info.buildnum) # ---------------------------------------- @@ -47,23 +47,28 @@ def main_formatter(self, version_info, other_variables): // DO NOT MODIFY! // --------------------------------------------------- -#pragma once #ifndef MESSMER_GITVERSION_VERSION_H #define MESSMER_GITVERSION_VERSION_H -namespace version { - constexpr const char *VERSION_STRING = "%s"; - constexpr const char *GIT_TAG_NAME = "%s"; - constexpr const unsigned int GIT_COMMITS_SINCE_TAG = %d; - constexpr const char *GIT_COMMIT_ID = "%s"; - constexpr bool MODIFIED_SINCE_COMMIT = %s; - constexpr bool IS_DEV_VERSION = %s; +#define VERSION_STRING "%s" +#define GIT_TAG_NAME "%s" +#define GIT_BRANCH_NAME "%s" +#define GIT_COMMITS_SINCE_TAG "%d" +#define GIT_COMMIT_ID "%s" +#define GIT_LAST_COMMIT_DATE "%s" +#define MODIFIED_SINCE_COMMIT %s +#define IS_DEV_VERSION %s %s -} #endif -""" % (version_info.version_string, version_info.git_tag_name, version_info.git_commits_since_tag, - version_info.git_commit_id, str(version_info.modified_since_commit).lower(), str(version_info.is_dev).lower(), +""" % (version_info.version_string, + version_info.git_tag_name, + version_info.branch_name, + version_info.git_commits_since_tag, + version_info.git_commit_id, + version_info.last_commit_data, + str(version_info.modified_since_commit).lower(), + str(version_info.is_dev).lower(), other_variables) def is_stable_formatter(self, is_stable): @@ -71,11 +76,20 @@ def is_stable_formatter(self, is_stable): constexpr bool IS_STABLE_VERSION = %s; """ % str(is_stable).lower() - def tag_interpretation_formatter(self, tag_interpretation, version_components): + def tag_interpretation_formatter(self, tag_interpretation, version_components, buildnum): return """ constexpr const char *VERSION_COMPONENTS[] = %s; constexpr const char *VERSION_TAG = "%s"; -""" % (version_components, tag_interpretation.version_tag) + #define VER_MAJOR %s + #define VER_MINOR %s + #define VER_BUG_FIX %s + #define VER_BUILD_NUM %s +""" % (version_components, + tag_interpretation.version_tag, + tag_interpretation.version_components[0], + tag_interpretation.version_components[1], + tag_interpretation.version_components[2], + buildnum) def version_components_formatter(self, version_components): return "{\"" + "\", \"".join(version_components) + "\"}" @@ -108,7 +122,7 @@ def is_stable_formatter(self, is_stable): IS_STABLE_VERSION = %s """ % is_stable - def tag_interpretation_formatter(self, tag_interpretation, version_components): + def tag_interpretation_formatter(self, tag_interpretation, version_components, buildnum=1): return """ VERSION_COMPONENTS = %s VERSION_TAG = "%s" diff --git a/src/gitversionbuilder/versioninforeader.py b/src/gitversionbuilder/versioninforeader.py index 434195e..c4cbd4a 100644 --- a/src/gitversionbuilder/versioninforeader.py +++ b/src/gitversionbuilder/versioninforeader.py @@ -1,6 +1,7 @@ import subprocess import os import re +import tempfile from gitversionbuilder import versioninfo, utils from gitversionbuilder.utils import isstring @@ -11,7 +12,12 @@ def from_git(git_directory): with open(os.devnull, 'w') as devnull: version_string = subprocess.check_output(["git", "describe", "--tags", "--long", "--abbrev=7"], stderr=devnull).decode() - return _parse_git_version(version_string, _is_modified_since_commit_in_cwd()) + version = _parse_git_version(version_string, _is_modified_since_commit_in_cwd()) + + version.last_commit_data = subprocess.check_output(["git", "log", "--date=iso", "-1", "--format=%cd"], + stderr=devnull).decode().strip() + version.branch_name = _branch_name_in_cwd() + return version except subprocess.CalledProcessError: # If there is no git tag, then the commits_since_tag returned by git is wrong # (because they consider the branch HEAD the tag and there are 0 commits since the branch head). @@ -21,7 +27,7 @@ def from_git(git_directory): # There is no git tag, but there are commits branch_name = _branch_name_in_cwd() commit_id = _commit_id_in_cwd() - return versioninfo.VersionInfo(git_tag_name=branch_name, + version = versioninfo.VersionInfo(git_tag_name=branch_name, git_commits_since_tag=total_num_commits, git_commit_id=commit_id, git_tag_exists=False, @@ -30,16 +36,20 @@ def from_git(git_directory): # There are no commits yet branch_name = "HEAD" commit_id = "0" - return versioninfo.VersionInfo(git_tag_name=branch_name, + version = versioninfo.VersionInfo(git_tag_name=branch_name, git_commits_since_tag=total_num_commits, git_commit_id=commit_id, git_tag_exists=False, modified_since_commit=_cwd_is_not_empty()) + with open(os.devnull, 'w') as devnull: + version.last_commit_data = subprocess.check_output(["git", "log", "--date=iso", "-1", "--format=%cd"], + stderr=devnull).decode().strip() + return version def _total_number_of_commits_in_cwd(): try: - with open('/dev/null', 'w') as devnull: + with tempfile.TemporaryFile() as devnull: return int(subprocess.check_output(["git", "rev-list", "HEAD", "--count"], stderr=devnull)) except subprocess.CalledProcessError: return 0 @@ -91,7 +101,7 @@ def __str__(self): def _parse_git_version(git_version_string, modified_since_commit): assert(isstring(git_version_string)) - matched = re.match("^([a-zA-Z0-9\.\-/]+)-([0-9]+)-g([0-9a-f]+)$", git_version_string) + matched = re.match("^([a-zA-Z0-9\.\-\/_]+)-([0-9]+)-g([0-9a-f]+)$", git_version_string) if matched: tag = matched.group(1) commits_since_tag = int(matched.group(2))