Mercurial > libervia-backend
diff src/tools/utils.py @ 1375:3a20312d4012
core: if we are in dev version and it's possible, repository data are now checked and added to SàT version
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 19 Mar 2015 19:47:01 +0100 |
parents | 1a759096ccbd |
children | 28fd9e838f8f |
line wrap: on
line diff
--- a/src/tools/utils.py Thu Mar 19 19:44:37 2015 +0100 +++ b/src/tools/utils.py Thu Mar 19 19:47:01 2015 +0100 @@ -20,10 +20,14 @@ """ various useful methods """ import unicodedata +import os.path +from sat.core.log import getLogger +log = getLogger(__name__) def clean_ustr(ustr): """Clean unicode string + remove special characters from unicode string""" def valid_chars(unicode_source): for char in unicode_source: @@ -32,3 +36,61 @@ yield char return ''.join(valid_chars(ustr)) +def getRepositoryData(as_string=True): + """Retrieve info on current mecurial repository + + @param as_string(bool): if True return a string, else return a dictionary + @return (unicode, dictionary): retrieved info in a nice string, + or a dictionary with retrieved data (key is not present if data is not found), + key can be: + - node: full revision number (40 bits) + - branch: branch name + - date: ISO 8601 format date + - tag: latest tag used in hierarchie + """ + from distutils.spawn import find_executable + import subprocess + import sat + KEYS=("node", "branch", "date", "tag") + sat_root = os.path.dirname(sat.__file__) + hg_path = find_executable('hg') + + if hg_path is not None: + os.chdir(sat_root) + try: + hg_data_raw = subprocess.check_output(["hg","parents","--template","{node}\n{branch}\n{date|isodate}\n{latesttag}"]) + except subprocess.CalledProcessError: + hg_data = {} + else: + hg_data = dict(zip(KEYS, hg_data_raw.split('\n'))) + try: + hg_data['modified'] = '+' in subprocess.check_output(["hg","id","-i"]) + except subprocess.CalledProcessError: + pass + + if not hg_data: + log.debug(u"Mercurial not available or working, trying to get data from dirstate") + os.chdir(os.path.relpath('..', sat_root)) + try: + with open('.hg/dirstate') as hg_dirstate: + hg_data['node'] = hg_dirstate.read(20).encode('hex') + except IOError: + log.warning(u"Can't access repository data") + + if as_string: + if not hg_data: + return u'repository data unknown' + strings = [u'rev', hg_data['node']] + try: + if hg_data['modified']: + strings.append(u"[M]") + except KeyError: + pass + try: + strings.extend([u'({branch} {date})'.format(**hg_data)]) + except KeyError: + pass + + return u' '.join(strings) + else: + return hg_data