Mercurial > pylearn
changeset 308:9ebc960260c5
init of version.py
author | James Bergstra <bergstrj@iro.umontreal.ca> |
---|---|
date | Tue, 10 Jun 2008 20:02:25 -0400 |
parents | 29c5ad01e9ce |
children | 923de30457f0 |
files | __init__.py version.py |
diffstat | 2 files changed, 71 insertions(+), 63 deletions(-) [+] |
line wrap: on
line diff
--- a/__init__.py Tue Jun 10 18:33:15 2008 -0400 +++ b/__init__.py Tue Jun 10 20:02:25 2008 -0400 @@ -1,70 +1,10 @@ import filetensor import nnet_ops +import version 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. - - """ - # - # NOTE - # - # If you find bugs in this function, please update the __src_version__ - # function in theano, pylearn, and email either theano-dev or pylearn-dev so - # that people can update their experiment dirs (the output of this function - # is meant to be hard-coded in external files). - # + #todo - this is vulnerable to the bug in theano ticket #160 + return version.src_version(__name__) - if not hasattr(__src_version__, 'rval'): - #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\n' - - __src_version__.rval = tokens[0] - - return __src_version__.rval - -
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/version.py Tue Jun 10 20:02:25 2008 -0400 @@ -0,0 +1,68 @@ +import subprocess as _subprocess +import imp as _imp + +_cache = {} + +def src_version(module_name): + """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. + + """ + # + # NOTE + # + # If you find bugs in this function, please update the __src_version__ + # function in theano, pylearn, and email either theano-dev or pylearn-dev so + # that people can update their experiment dirs (the output of this function + # is meant to be hard-coded in external files). + # + + if module_name not in _cache: + + location = _imp.find_module(module_name)[1] + #print 'location:', location + + status = _subprocess.Popen(('hg','st'),cwd=location,stdout=_subprocess.PIPE).communicate()[0] + #TODO: check that the process return code is 0 (ticket #45) + + #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\n' + + _cache[module_name] = tokens[0] + + return _cache[module_name] + +