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'
This commit is contained in:
Will Thames 2012-08-08 19:18:51 +10:00 committed by willthames
parent f757d659cc
commit 9a50ed9b7b

View file

@ -39,6 +39,12 @@ try:
except ImportError: except ImportError:
from md5 import md5 as _md5 from md5 import md5 as _md5
try:
import git
HAS_GIT = True
except ImportError:
HAS_GIT = False
############################################################### ###############################################################
# UTILITY FUNCTIONS FOR COMMAND LINE TOOLS # UTILITY FUNCTIONS FOR COMMAND LINE TOOLS
############################################################### ###############################################################
@ -287,6 +293,32 @@ def default(value, function):
return function() return function()
return value 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 # option handling code for /usr/bin/ansible and ansible-playbook
# below this line # 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): 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 ''' ''' 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", parser.add_option('-v','--verbose', default=False, action="store_true",
help='verbose mode') help='verbose mode')
parser.add_option('-f','--forks', dest='forks', default=constants.DEFAULT_FORKS, type='int', parser.add_option('-f','--forks', dest='forks', default=constants.DEFAULT_FORKS, type='int',