DrTrigon has submitted this change and it was merged.
Change subject: adopt version handling and output to transition from SVN to GIT (from compat) pywikibot/version.py sync-ed with compat again ......................................................................
adopt version handling and output to transition from SVN to GIT (from compat) pywikibot/version.py sync-ed with compat again
Change-Id: I54977388743f6b135ad296a3e3a46e1e519e81b2 --- M pywikibot/bot.py M pywikibot/version.py 2 files changed, 59 insertions(+), 23 deletions(-)
Approvals: DrTrigon: Verified; Looks good to me, approved Merlijn van Deen: Looks good to me, but someone else must approve jenkins-bot: Verified
diff --git a/pywikibot/bot.py b/pywikibot/bot.py index 3e7aa5b..fa7ee43 100644 --- a/pywikibot/bot.py +++ b/pywikibot/bot.py @@ -265,7 +265,7 @@ log(u'MODULES:') for item in sys.modules.keys(): ver = version.getfileversion('%s.py' % item.replace('.', '/')) - if ver and (ver[0] == u'$'): + if ver: log(u' %s' % ver)
# messages on bot discussion page? diff --git a/pywikibot/version.py b/pywikibot/version.py index 9d23b12..8d6de3f 100644 --- a/pywikibot/version.py +++ b/pywikibot/version.py @@ -10,8 +10,9 @@ __version__ = '$Id$'
import os -import time +import time, datetime import urllib +import subprocess
cache = None
@@ -29,44 +30,48 @@
def getversion(): - data = getversiondict() + data = dict(getversiondict()) # copy dict to prevent changes in 'chache' try: - rev2 = int(getversion_onlinerepo()) - rev1 = int(str(data['rev']).split()[0]) - data['cmp_ver'] = 'OUTDATED' if rev1 < rev2 else 'ok' + hsh2 = getversion_onlinerepo() + hsh1 = data['hsh'] + data['cmp_ver'] = 'OUTDATED' if hsh1 != hsh2 else 'ok' except Exception: data['cmp_ver'] = 'n/a' - return '%(tag)s (r%(rev)s, %(date)s, %(cmp_ver)s)' % data - + data['hsh'] = data['hsh'][:7] # make short hash from full hash + return '%(tag)s (r%(rev)s, %(hsh)s, %(date)s, %(cmp_ver)s)' % data
def getversiondict(): global cache if cache: return cache try: - (tag, rev, date) = getversion_svn() + (tag, rev, date, hsh) = getversion_git() except Exception: try: - (tag, rev, date) = getversion_nightly() + (tag, rev, date, hsh) = getversion_nightly() except Exception: try: version = getfileversion('pywikibot/__init__.py') if not version: # fall-back in case everything breaks (should not be used) import pywikibot - version = pywikibot.__version__ + version = getfileversion(pywikibot.__file__[:-1])
- id, file, rev, date, ts, author, dollar = version.split(' ') + file, hsh_short, date, ts = version.split(' ') tag = 'pywikibot/__init__.py' - date = time.strptime('%sT%s' % (date, ts), '%Y-%m-%dT%H:%M:%SZ') + rev = '-1 (unknown)' + ts = ts.split('.')[0] + date = time.strptime('%sT%s' % (date, ts), '%Y-%m-%dT%H:%M:%S') + hsh = hsh_short + ('?' * 33) # enhance the short hash w. '?' except: # nothing worked; version unknown (but suppress exceptions) # the value is most likely '$Id' + '$', it means that # wikipedia.py got imported without using svn at all - return dict(tag='', rev='-1 (unknown)', date='0 (unknown)') + return dict(tag='', rev='-1 (unknown)', date='0 (unknown)', + hsh='(unknown)')
datestring = time.strftime('%Y/%m/%d, %H:%M:%S', date) - cache = dict(tag=tag, rev=rev, date=datestring) + cache = dict(tag=tag, rev=rev, date=datestring, hsh=hsh) return cache
@@ -101,6 +106,32 @@ raise ParseError return (tag, rev, date)
+def getversion_git(path=None): + _program_dir = path or _get_program_dir() + #(try to use .git directory for new entries format) + #tag = subprocess.Popen('git config --get remote.origin.url', + # shell=True, + # stdout=subprocess.PIPE).stdout.read() + tag = open(os.path.join(_program_dir, '.git/config'), 'r').read() + s = tag.find('url = ', tag.find('[remote "origin"]')) + e = tag.find('\n', s) + tag = tag[(s+6):e] + t = tag.strip().split('/') + tag = '[%s] %s' % (t[0][:-1], '/'.join(t[3:])[:-4]) + info = subprocess.Popen("git log --pretty=format:'%ad|%an|%h|%H|%d' --abbrev-commit --date=iso -1 | cat -", + shell=True, + stdout=subprocess.PIPE).stdout.read() + info = info.split('|') + date = info[0][:-6] + date = time.strptime(date, '%Y-%m-%d %H:%M:%S') + rev = subprocess.Popen('git rev-list HEAD | wc -l', + shell=True, + stdout=subprocess.PIPE).stdout.read() + rev = int(rev.strip()) + hsh = info[3] # also stored in '.git/refs/heads/master' + if (not date or not tag or not rev) and not path: + raise ParseError + return (tag, rev, date, hsh)
def getversion_nightly(): data = open(os.path.join(wikipediatools.get_base_dir(), 'version')) @@ -109,19 +140,18 @@ rev = data.readline().strip() if not date or not tag or not rev: raise ParseError - return (tag, rev, date) - + return (tag, rev, date, '(unknown)')
def getversion_onlinerepo(repo=None): """ Retrieve revision number of framework online repository's svnroot """ - url = repo or 'http://svn.wikimedia.org/svnroot/pywikipedia/trunk/pywikipedia/' - rev = None + url = repo or 'https://git.wikimedia.org/feed/pywikibot/core' + hsh = None try: - buf = urllib.urlopen(url).read() - rev = buf.split(' ')[3][:-1] + buf = urllib.urlopen(url).readlines() + hsh = buf[13].split('/')[5][:-1] except: raise ParseError - return rev + return hsh
## Simple version comparison # @@ -134,10 +164,16 @@ """ _program_dir = _get_program_dir() __version__ = None + size, mtime = None, None fn = os.path.join(_program_dir, filename) if os.path.exists(fn): for line in open(fn, 'r').readlines(): if line.find('__version__') == 0: exec(line) break - return __version__ + stat = os.stat(fn) + mtime = datetime.datetime.fromtimestamp(stat.st_mtime).isoformat(' ') + if mtime and __version__: + return u'%s %s %s' % (filename, __version__[5:-1][:7], mtime) + else: + return None
pywikibot-commits@lists.wikimedia.org