Mercurial > libervia-backend
view 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 source
#!/usr/bin/python # -*- coding: utf-8 -*- # SAT: a jabber client # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jérôme Poisson (goffi@goffi.org) # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. """ 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: if unicodedata.category(char) == 'Cc' and char!='\n': continue 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