[PATCH 4 of 4] setup: set the version string consistently for both archive and in-place builds

Gilles Moris gilles.moris at free.fr
Tue Oct 6 03:18:31 CDT 2009


 setup.py |  72 ++++++++++++++++++++++++------------
 1 files changed, 48 insertions(+), 24 deletions(-)


# HG changeset patch
# User Gilles Moris <gilles.moris at free.fr>
# Date 1249977954 -7200
# Node ID 64e24cd73ef8f9d54a40770ecfcb29ab842c6630
# Parent  bbaf3c703c77f2756c27a8b39a3824be9a13ccc4
setup: set the version string consistently for both archive and in-place builds

If the rev is not based on a tag, this includes mention to the latest tag and the
distance to it.

diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -97,6 +97,22 @@
 except ImportError:
     pass
 
+def runcmd(cmd):
+    p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+                         stderr=subprocess.PIPE, env=env)
+    out, err = p.communicate()
+    # If root is executing setup.py, but the repository is owned by
+    # another user (as in "sudo python setup.py install") we will get
+    # trust warnings since the .hg/hgrc file is untrusted. That is
+    # fine, we don't want to load it anyway.
+    err = [e for e in err.splitlines()
+           if not e.startswith('Not trusting file')]
+    if err:
+        sys.stderr.write('warning: could not establish Mercurial '
+                         'version:\n%s\n' % '\n'.join(err))
+        return ''
+    return out
+
 version = None
 
 if os.path.isdir('.hg'):
@@ -112,39 +128,47 @@
         # under Windows. Otherwise, the subprocess will fail with
         # error 0xc0150004. See: http://bugs.python.org/issue3440
         env['SystemRoot'] = os.environ['SystemRoot']
+
     cmd = [sys.executable, 'hg', 'id', '-i', '-t']
+    l = runcmd(cmd).split()
+    while len(l) > 1 and l[-1][0].isalpha(): # remove non-numbered tags
+        l.pop()
 
-    p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
-                         stderr=subprocess.PIPE, env=env)
-    out, err = p.communicate()
+    latesttag = ''
+    if len(l) == 1: # no tag found for that rev
+        # then search for latest tag
+        cmd = [sys.executable, 'hg', 'parents', '--template',
+               ' [{latesttag}+{latesttagdistance}]']
+        latesttag = runcmd(cmd)
 
-    # If root is executing setup.py, but the repository is owned by
-    # another user (as in "sudo python setup.py install") we will get
-    # trust warnings since the .hg/hgrc file is untrusted. That is
-    # fine, we don't want to load it anyway.
-    err = [e for e in err.splitlines()
-           if not e.startswith('Not trusting file')]
-    if err:
-        sys.stderr.write('warning: could not establish Mercurial '
-                         'version:\n%s\n' % '\n'.join(err))
-    else:
-        l = out.split()
-        while len(l) > 1 and l[-1][0].isalpha(): # remove non-numbered tags
-            l.pop()
-        if l:
-            version = l[-1] # latest tag or revision number
-            if l[0].endswith('+') and len(l) > 1:
-                # for an unclean working directory based on a tag, we also
-                # need a '+'
-                version += '+'
-            if version.endswith('+'):
-                version += time.strftime('%Y%m%d')
+    if l:
+        version = l[-1] # latest tag or revision number
+        if l[0].endswith('+') and len(l) > 1:
+            # for an dirty working directory based on a tag, we also
+            # need a '+'
+            version += '+'
+        if version.endswith('+'):
+            version += time.strftime('%Y%m%d')
+        version += latesttag
 elif os.path.exists('.hg_archival.txt'):
     hgarchival = open('.hg_archival.txt')
+    latesttag = latesttagdistance = None
     for line in hgarchival:
         if line.startswith('node:'):
             version = line.split(':')[1].strip()[:12]
+        if line.startswith('tag:'):
+            version = line.split(':')[1].strip()
+            # stop on the first tag we find
             break
+        # otherwise, try to fallback to the latest tag
+        if line.startswith('latesttag:'):
+            latesttag = line.split(':', 1)[1].strip()
+        if line.startswith('latesttagdistance:'):
+            latesttagdistance = line.split(':')[1].strip()
+    if latesttag and latesttagdistance:
+        # note that if distance is 0, it will not enter, which is expected
+        version += _(' [%s+%s]') % \
+                   (latesttag, latesttagdistance)
 
 if version:
     f = open("mercurial/__version__.py", "w")


More information about the Mercurial-devel mailing list