Mercurial > libervia-backend
changeset 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 | 0befb14ecf62 |
children | 28fd9e838f8f |
files | src/bridge/bridge_constructor/bridge_template.ini src/core/sat_main.py src/memory/memory.py src/tools/utils.py |
diffstat | 4 files changed, 84 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/bridge/bridge_constructor/bridge_template.ini Thu Mar 19 19:44:37 2015 +0100 +++ b/src/bridge/bridge_constructor/bridge_template.ini Thu Mar 19 19:47:01 2015 +0100 @@ -160,7 +160,7 @@ category=core sig_in= sig_out=s -doc=Get "Salut à Toi" version +doc=Get "Salut à Toi" full version [getProfileName] type=method
--- a/src/core/sat_main.py Thu Mar 19 19:44:37 2015 +0100 +++ b/src/core/sat_main.py Thu Mar 19 19:47:01 2015 +0100 @@ -33,6 +33,7 @@ from sat.memory.memory import Memory from sat.memory.crypto import PasswordHasher from sat.tools import trigger +from sat.tools import utils from sat.stdui import ui_contact_list, ui_profile_manager from glob import glob from uuid import uuid4 @@ -46,6 +47,7 @@ sat_id = 0 +__version__ = C.APP_VERSION def sat_next_id(): @@ -57,9 +59,24 @@ class SAT(service.Service): @property - def __version__(self): + def version(self): + """Return the short version of SàT""" return C.APP_VERSION + @property + def full_version(self): + """Return the full version of SàT (with extra data when in development mode)""" + version = self.version + if version[-1] == 'D': + # we are in debug version, we add extra data + try: + return self._version_cache + except AttributeError: + self._version_cache = u"{} ({})".format(version, utils.getRepositoryData()) + return self._version_cache + else: + return version + def get_next_id(self): return sat_next_id() @@ -80,7 +97,7 @@ log.error(u"Bridge can't be initialised, can't start SàT core") sys.exit(1) self.bridge.register("getReady", lambda: self._initialised) - self.bridge.register("getVersion", lambda: C.APP_VERSION) + self.bridge.register("getVersion", lambda: self.full_version) self.bridge.register("getProfileName", self.memory.getProfileName) self.bridge.register("getProfilesList", self.memory.getProfilesList) self.bridge.register("getEntityData", lambda jid_, keys, profile: self.memory.getEntityData(jid.JID(jid_), keys, profile)) @@ -253,7 +270,7 @@ current.fallBack.setHandlerParent(current) current.versionHandler = xmpp.SatVersionHandler(C.APP_NAME_FULL, - C.APP_VERSION) + self.full_version) current.versionHandler.setHandlerParent(current) current.identityHandler = xmpp.SatIdentityHandler()
--- a/src/memory/memory.py Thu Mar 19 19:44:37 2015 +0100 +++ b/src/memory/memory.py Thu Mar 19 19:47:01 2015 +0100 @@ -226,7 +226,7 @@ fixLocalDir(False) # XXX: tmp update code, will be removed in the future self.config = self.parseMainConf() database_file = os.path.expanduser(os.path.join(self.getConfig('', 'local_dir'), C.SAVEFILE_DATABASE)) - self.storage = SqliteStorage(database_file, host.__version__) + self.storage = SqliteStorage(database_file, host.version) PersistentDict.storage = self.storage self.params = Params(host, self.storage) log.info(_("Loading default params template"))
--- 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