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',