From 9a50ed9b7bbbdfb5d41ae19c13b0e48764a0cef0 Mon Sep 17 00:00:00 2001 From: Will Thames Date: Wed, 8 Aug 2012 19:18:51 +1000 Subject: [PATCH] Added git information to version string Running ansible --version now outputs git information when the repo lives in .git in the root of the ansible source (coping with the case where the git info is elsewhere is left as an exercise). This uses gitpython where installed, otherwise it interrogates the files in the .git directory to get the same information. The gitpython path could be removed, but then people might ask 'why did you do it like this when gitpython exists' --- lib/ansible/utils.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/ansible/utils.py b/lib/ansible/utils.py index b8db010a23..7ec03766f0 100644 --- a/lib/ansible/utils.py +++ b/lib/ansible/utils.py @@ -39,6 +39,12 @@ try: except ImportError: from md5 import md5 as _md5 +try: + import git + HAS_GIT = True +except ImportError: + HAS_GIT = False + ############################################################### # UTILITY FUNCTIONS FOR COMMAND LINE TOOLS ############################################################### @@ -287,6 +293,32 @@ def default(value, function): return function() return value +def _gitinfo(): + ''' returns a string containing git branch and commit id + using gitpython if installed and native file operations if not ''' + result = None + repo_path = os.path.join(os.path.dirname(__file__), '..', '..', '.git') + if os.path.exists(repo_path): + if HAS_GIT: + repo = git.Repo(repo_path) + head = repo.head + branch = head.reference.name + commit = head.commit.hexsha[:10] + else: + with open(os.path.join(repo_path, "HEAD")) as f: + branch = f.readline().split('/')[-1].rstrip("\n") + with open(os.path.join(repo_path, "refs", "heads", branch)) as f: + commit = f.readline()[:10] + result = "({0}) [{1}]".format(branch, commit) + return result + +def version(prog): + result = "{0} {1}".format(prog, __version__) + gitinfo = _gitinfo() + if gitinfo: + result = result + " {0}".format(gitinfo) + return result + #################################################################### # option handling code for /usr/bin/ansible and ansible-playbook # below this line @@ -301,7 +333,7 @@ class SortedOptParser(optparse.OptionParser): def base_parser(constants=C, usage="", output_opts=False, runas_opts=False, async_opts=False, connect_opts=False): ''' create an options parser for any ansible script ''' - parser = SortedOptParser(usage, version="%prog " + __version__) + parser = SortedOptParser(usage, version=version("%prog")) parser.add_option('-v','--verbose', default=False, action="store_true", help='verbose mode') parser.add_option('-f','--forks', dest='forks', default=constants.DEFAULT_FORKS, type='int',