changeset 301:57c45df381f1

added source-version function, close ticket #44
author James Bergstra <bergstrj@iro.umontreal.ca>
date Tue, 10 Jun 2008 11:01:00 -0400
parents 7c5e5356cb11
children 675d92789941
files __init__.py
diffstat 1 files changed, 52 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/__init__.py	Mon Jun 09 13:37:22 2008 -0400
+++ b/__init__.py	Tue Jun 10 11:01:00 2008 -0400
@@ -3,3 +3,55 @@
 
 from lookup_list import LookupList
 
+
+
+import subprocess as _subprocess
+import imp as _imp
+def __src_version__():
+    """Return compact identifier of module code.
+
+    @return: compact identifier of module code.
+    @rtype: string
+
+    @note: This function tries to establish that the source files and the repo
+    are syncronized.  It raises an Exception if there are un-tracked '.py'
+    files, or if there are un-committed modifications.  This implementation uses
+    "hg id" to establish this.  The code returned by "hg id" is not affected by
+    hg pull, but pulling might remove the " tip" string which might have
+    appeared.  This implementation ignores the  " tip" information, and only
+    uses the code.
+
+    @note: This implementation is assumes that the import directory is under
+    version control by mercurial.
+
+    """
+    #print 'name:', __name__
+    location = _imp.find_module(__name__)[1]
+    #print 'location:', location
+
+    status = _subprocess.Popen(('hg','st'),cwd=location,stdout=_subprocess.PIPE).communicate()[0]
+    #status_codes = [line[0] for line in  if line and line[0] != '?']
+    for line in status.split('\n'):
+        if not line: continue
+        if line[0] != '?':
+            raise Exception('Uncommitted modification to "%s" in %s (%s)'
+                    %(line[2:], __name__,location))
+        if line[0] == '?' and line[-3:] == '.py':
+            raise Exception('Untracked file "%s" in %s (%s)'
+                    %(line[2:], __name__, location))
+
+    hg_id = _subprocess.Popen(('hg','id'),cwd=location,stdout=_subprocess.PIPE).communicate()[0]
+
+    #This asserts my understanding of hg id return values
+    # There is mention in the doc that it might return two parent hash codes
+    # but I've never seen it, and I dont' know what it means or how it is
+    # formatted.
+    tokens = hg_id.split(' ')
+    assert len(tokens) <= 2
+    assert len(tokens) >= 1
+    assert tokens[0][-1] != '+' # the trailing + indicates uncommitted changes
+    if len(tokens) == 2:
+        assert tokens[1] == 'tip'
+
+    return tokens[0]
+