[pypy-svn] pypy default: Added support for version info from both hg/git.

tav commits-noreply at bitbucket.org
Thu Mar 3 16:13:41 CET 2011


Author: tav <tav at espians.com>
Branch: 
Changeset: r42408:4568a57a31bf
Date: 2011-03-03 15:13 +0000
http://bitbucket.org/pypy/pypy/changeset/4568a57a31bf/

Log:	Added support for version info from both hg/git.

diff --git a/pypy/tool/udir.py b/pypy/tool/udir.py
--- a/pypy/tool/udir.py
+++ b/pypy/tool/udir.py
@@ -21,7 +21,7 @@
 import os, sys
 import py
 
-from pypy.tool.version import get_mercurial_info
+from pypy.tool.version import get_repo_version_info
 from py.path import local 
 
 PYPY_KEEP = int(os.environ.get('PYPY_USESSION_KEEP', '3'))
@@ -30,7 +30,7 @@
     if dir is not None:
         dir = local(dir)
     if basename is None:
-        info = get_mercurial_info()
+        info = get_repo_version_info()
         if info:
             project, hgtag, hgid = info
             basename = hgtag

diff --git a/pypy/module/sys/__init__.py b/pypy/module/sys/__init__.py
--- a/pypy/module/sys/__init__.py
+++ b/pypy/module/sys/__init__.py
@@ -63,7 +63,7 @@
         'version'               : 'version.get_version(space)',
         'pypy_version_info'     : 'version.get_pypy_version_info(space)',
         'subversion'            : 'version.get_subversion_info(space)',
-        '_mercurial'            : 'version.wrap_mercurial_info(space)',
+        '_mercurial'            : 'version.get_repo_info(space)',
         'hexversion'            : 'version.get_hexversion(space)',
 
         'displayhook'           : 'hook.displayhook', 

diff --git a/pypy/tool/test/test_version.py b/pypy/tool/test/test_version.py
--- a/pypy/tool/test/test_version.py
+++ b/pypy/tool/test/test_version.py
@@ -1,8 +1,8 @@
 import os, sys
 import py
-from pypy.tool.version import get_mercurial_info
+from pypy.tool.version import get_repo_version_info
 
-def test_get_mercurial_info():
-    assert get_mercurial_info(None)
-    assert get_mercurial_info(os.devnull) == ('PyPy', '?', '?')
-    assert get_mercurial_info(sys.executable) == ('PyPy', '?', '?')
+def test_get_repo_version_info():
+    assert get_repo_version_info(None)
+    assert get_repo_version_info(os.devnull) == ('PyPy', '?', '?')
+    assert get_repo_version_info(sys.executable) == ('PyPy', '?', '?')

diff --git a/pypy/module/sys/version.py b/pypy/module/sys/version.py
--- a/pypy/module/sys/version.py
+++ b/pypy/module/sys/version.py
@@ -28,7 +28,7 @@
 import pypy
 pypydir = os.path.dirname(os.path.abspath(pypy.__file__))
 del pypy
-from pypy.tool.version import get_mercurial_info
+from pypy.tool.version import get_repo_version_info
 
 import time as t
 gmtime = t.gmtime()
@@ -67,7 +67,7 @@
         CPYTHON_VERSION[0],
         CPYTHON_VERSION[1],
         CPYTHON_VERSION[2],
-        hg_universal_id(),
+        get_repo_version_info()[2],
         date,
         time,
         ver,
@@ -83,32 +83,22 @@
 
 def get_pypy_version_info(space):
     ver = PYPY_VERSION
-    #ver = ver[:-1] + (svn_revision(),)
     w_version_info = app.wget(space, "version_info")
     return space.call_function(w_version_info, space.wrap(ver))
 
 def get_subversion_info(space):
     return space.wrap(('PyPy', '', ''))
 
-
-def wrap_mercurial_info(space):
-    info = get_mercurial_info()
+def get_repo_info(space):
+    info = get_repo_version_info()
     if info:
-        project, hgtag, hgid = info
+        project, repo_tag, repo_version = info
         return space.newtuple([space.wrap(project),
-                               space.wrap(hgtag),
-                               space.wrap(hgid)])
+                               space.wrap(repo_tag),
+                               space.wrap(repo_version)])
     else:
         return space.w_None
 
-def hg_universal_id():
-    info = get_mercurial_info()
-    if info:
-        return info[2]
-    else:
-        return '?'
-
-
 def tuple2hex(ver):
     d = {'alpha':     0xA,
          'beta':      0xB,

diff --git a/pypy/tool/version.py b/pypy/tool/version.py
--- a/pypy/tool/version.py
+++ b/pypy/tool/version.py
@@ -4,23 +4,51 @@
 import pypy
 pypydir = os.path.dirname(os.path.abspath(pypy.__file__))
 
-def get_mercurial_info(hgexe=None):
-    '''Obtain Mercurial version information by invoking the 'hg' command.'''
+def get_repo_version_info(hgexe=None):
+    '''Obtain version information by invoking the 'hg' or 'git' commands.'''
     # TODO: support extracting from .hg_archival.txt
 
     default_retval = 'PyPy', '?', '?'
     pypyroot = os.path.abspath(os.path.join(pypydir, '..'))
-    if hgexe is None:
-        hgexe = py.path.local.sysfind('hg')
 
-    def maywarn(err):
+    def maywarn(err, repo_type='Mercurial'):
         if not err:
             return
 
         from pypy.tool.ansi_print import ansi_log
         log = py.log.Producer("version")
         py.log.setconsumer("version", ansi_log)
-        log.WARNING('Errors getting Mercurial information: %s' % err)
+        log.WARNING('Errors getting %s information: %s' % (repo_type, err))
+
+    # Try to see if we can get info from Git if hgexe is not specified.
+    if not hgexe:
+        if os.path.isdir(os.path.join(pypyroot, '.git')):
+            gitexe = py.path.local.sysfind('git')
+            if gitexe:
+                try:
+                    p = Popen(
+                        [str(gitexe), 'describe', '--tags', '--always'],
+                        stdout=PIPE, stderr=PIPE
+                        )
+                except OSError, e:
+                    maywarn(e, 'Git')
+                    return default_retval
+                if p.wait() != 0:
+                    maywarn(p.stderr.read(), 'Git')
+                    return default_retval
+                tag = p.stdout.read().strip()
+                p = Popen(
+                    [str(gitexe), 'rev-parse', 'HEAD'],
+                    stdout=PIPE, stderr=PIPE
+                    )
+                if p.wait() != 0:
+                    maywarn(p.stderr.read(), 'Git')
+                    return 'PyPy', tag, '?'
+                return 'PyPy', tag, p.stdout.read().strip()[:12]
+
+    # Fallback to trying Mercurial.
+    if hgexe is None:
+        hgexe = py.path.local.sysfind('hg')
 
     if not os.path.isdir(os.path.join(pypyroot, '.hg')):
         maywarn('Not running from a Mercurial repository!')


More information about the Pypy-commit mailing list