Mercurial > libervia-backend
view src/tools/utils.py @ 1501:cb1b0fe10415
frontends (xmlui): fixed a bug in xmlui resulting in a bad dialog creation (parameters were lost, including profile)
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 27 Aug 2015 17:59:01 +0200 |
parents | 934e402c90bf |
children | 566908d483f6 |
line wrap: on
line source
#!/usr/bin/python # -*- coding: utf-8 -*- # SAT: a jabber client # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 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(module, as_string=True): """Retrieve info on current mecurial repository @param module: module to look for (e.g. sat, libervia) @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 KEYS=("node", "node_short", "branch", "date", "tag") repos_root = os.path.dirname(module.__file__) hg_path = find_executable('hg') if hg_path is not None: os.chdir(repos_root) try: hg_data_raw = subprocess.check_output(["hg","log", "-r", "-1", "--template","{node}\n{node|short}\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 else: hg_data = {} if not hg_data: log.debug(u"Mercurial not available or working, trying to get data from dirstate") os.chdir(os.path.relpath('..', repos_root)) try: with open('.hg/dirstate') as hg_dirstate: hg_data['node'] = hg_dirstate.read(20).encode('hex') hg_data['node_short'] = hg_data['node'][:12] 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_short']] 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