# HG changeset patch # User James Bergstra # Date 1213110060 14400 # Node ID 57c45df381f1cfc9edd61a0a0c40b5c69e72b201 # Parent 7c5e5356cb1184b9c6e6f03692f3cfee01d87578 added source-version function, close ticket #44 diff -r 7c5e5356cb11 -r 57c45df381f1 __init__.py --- 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] +