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 <[email protected]>
Gerrit-Reviewer: DrTrigon <[email protected]>
Gerrit-Reviewer: Ladsgroup <[email protected]>
Gerrit-Reviewer: Legoktm <[email protected]>
Gerrit-Reviewer: Merlijn van Deen <[email protected]>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
Pywikibot-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikibot-commits

Reply via email to