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
--
To view, visit
https://gerrit.wikimedia.org/r/77502
To unsubscribe, visit
https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I54977388743f6b135ad296a3e3a46e1e519e81b2
Gerrit-PatchSet: 3
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: DrTrigon <dr.trigon(a)surfeu.ch>
Gerrit-Reviewer: DrTrigon <dr.trigon(a)surfeu.ch>
Gerrit-Reviewer: Ladsgroup <ladsgroup(a)gmail.com>
Gerrit-Reviewer: Legoktm <legoktm.wikipedia(a)gmail.com>
Gerrit-Reviewer: Merlijn van Deen <valhallasw(a)arctus.nl>
Gerrit-Reviewer: jenkins-bot