diff options
author | Steven Knight <knight@baldmt.com> | 2003-11-03 23:29:02 (GMT) |
---|---|---|
committer | Steven Knight <knight@baldmt.com> | 2003-11-03 23:29:02 (GMT) |
commit | 07f198d9c7859fa66f2da106390d075aff0f6fec (patch) | |
tree | 387b2d0018114bbc86c7cd916ee8987c77e5a6ee /src | |
parent | 32838fedb704da9ab0ab719d462290b13e2e4a7f (diff) | |
download | SCons-07f198d9c7859fa66f2da106390d075aff0f6fec.zip SCons-07f198d9c7859fa66f2da106390d075aff0f6fec.tar.gz SCons-07f198d9c7859fa66f2da106390d075aff0f6fec.tar.bz2 |
Sync CVS log from master Aegis repository.
Diffstat (limited to 'src')
-rw-r--r-- | src/engine/SCons/Node/FS.py | 62 | ||||
-rw-r--r-- | src/engine/SCons/Sig/SigTests.py | 36 | ||||
-rw-r--r-- | src/engine/SCons/Sig/__init__.py | 36 | ||||
-rw-r--r-- | src/script/sconsign.py | 9 |
4 files changed, 118 insertions, 25 deletions
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index a78a2c9..cffa2b5 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -41,6 +41,7 @@ import os.path import shutil import stat import string +import cStringIO import SCons.Action import SCons.Errors @@ -720,7 +721,7 @@ class FS: self._cwd = dir if change_os_dir: os.chdir(dir.abspath) - except: + except OSError: self._cwd = curr raise @@ -902,6 +903,17 @@ class FS: message = "building associated BuildDir targets: %s" % string.join(map(str, targets)) return targets, message +class DummyExecutor: + """Dummy executor class returned by Dir nodes to bamboozle SCons + into thinking we are an actual derived node, where our sources are + our directory entries.""" + def get_raw_contents(self): + return '' + def get_contents(self): + return '' + def get_timestamp(self): + return 0 + class Dir(Base): """A class for directories in a file system. """ @@ -924,12 +936,14 @@ class Dir(Base): self.abspath_ = self.abspath + os.sep self.repositories = [] self.srcdir = None + self.source_scanner = None self.entries = {} self.entries['.'] = self self.entries['..'] = self.dir self.cwd = self self.builder = 1 + self.searched = 0 self._sconsign = None self.build_dirs = [] @@ -1023,6 +1037,19 @@ class Dir(Base): self.all_children(scan)) def all_children(self, scan=1): + # Before we traverse our children, make sure we have created Nodes + # for any files that this directory contains. We need to do this + # so any change in a file in this directory will cause it to + # be out of date. + if not self.searched: + try: + for filename in os.listdir(self.abspath): + if filename != '.sconsign': + self.Entry(filename) + except OSError: + # Directory does not exist. No big deal + pass + self.searched = 1 keys = filter(lambda k: k != '.' and k != '..', self.entries.keys()) kids = map(lambda x, s=self: s.entries[x], keys) def c(one, two): @@ -1051,10 +1078,6 @@ class Dir(Base): """A directory does not get scanned.""" return None - def calc_signature(self, calc): - """A directory has no signature.""" - return None - def set_bsig(self, bsig): """A directory has no signature.""" bsig = None @@ -1064,9 +1087,12 @@ class Dir(Base): csig = None def get_contents(self): - """Return a fixed "contents" value of a directory.""" - return '' - + """Return aggregate contents of all our children.""" + contents = cStringIO.StringIO() + for kid in self.children(None): + contents.write(kid.get_contents()) + return contents.getvalue() + def prepare(self): pass @@ -1110,6 +1136,24 @@ class Dir(Base): return self.srcdir return Base.srcnode(self) + def get_executor(self, create=1): + """Fetch the action executor for this node. Create one if + there isn't already one, and requested to do so.""" + try: + executor = self.executor + except AttributeError: + executor = DummyExecutor() + self.executor = executor + return executor + + def get_timestamp(self): + """Return the latest timestamp from among our children""" + stamp = 0 + for kid in self.children(None): + if kid.get_timestamp() > stamp: + stamp = kid.get_timestamp() + return stamp + class File(Base): """A class for files in a file system. """ @@ -1432,7 +1476,7 @@ class File(Base): def rfile(self): try: return self._rfile - except: + except AttributeError: self._rfile = self if not self.exists(): n = self.fs.Rsearch(self.path, clazz=File, diff --git a/src/engine/SCons/Sig/SigTests.py b/src/engine/SCons/Sig/SigTests.py index c82d2c5..f297464 100644 --- a/src/engine/SCons/Sig/SigTests.py +++ b/src/engine/SCons/Sig/SigTests.py @@ -490,6 +490,41 @@ class SConsignDirFileTestCase(unittest.TestCase): assert f.get('foo') == (3, 1, 2) assert f.get_implicit('foo') == ['bar'] +class SConsignFileTestCase(unittest.TestCase): + + def runTest(self): + test = TestCmd.TestCmd(workdir = '') + file = test.workpath('sconsign_file') + + assert SCons.Sig.SConsign_db is None, SCons.Sig.SConsign_db + + SCons.Sig.SConsignFile(file) + + assert not SCons.Sig.SConsign_db is None, SCons.Sig.SConsign_db + + class Fake_DBM: + def open(self, name, mode): + self.name = name + self.mode = mode + return self + + fake_dbm = Fake_DBM() + + SCons.Sig.SConsignFile(file, fake_dbm) + + assert not SCons.Sig.SConsign_db is None, SCons.Sig.SConsign_db + assert not hasattr(fake_dbm, 'name'), fake_dbm + assert not hasattr(fake_dbm, 'mode'), fake_dbm + + SCons.Sig.SConsign_db = None + + SCons.Sig.SConsignFile(file, fake_dbm) + + assert not SCons.Sig.SConsign_db is None, SCons.Sig.SConsign_db + assert fake_dbm.name == file, fake_dbm.name + assert fake_dbm.mode == "c", fake_dbm.mode + + def suite(): suite = unittest.TestSuite() @@ -500,6 +535,7 @@ def suite(): suite.addTest(_SConsignTestCase()) suite.addTest(SConsignDBTestCase()) suite.addTest(SConsignDirFileTestCase()) + suite.addTest(SConsignFileTestCase()) return suite if __name__ == "__main__": diff --git a/src/engine/SCons/Sig/__init__.py b/src/engine/SCons/Sig/__init__.py index 298db66..a2ebd5c 100644 --- a/src/engine/SCons/Sig/__init__.py +++ b/src/engine/SCons/Sig/__init__.py @@ -51,10 +51,6 @@ sig_files = [] SConsign_db = None -# 1 means use build signature for derived source files -# 0 means use content signature for derived source files -build_signature = 1 - def write(): global sig_files for sig_file in sig_files: @@ -121,7 +117,7 @@ class _SConsign: """ try: return self.entries[filename] - except: + except (KeyError, AttributeError): return SConsignEntry() def set_entry(self, filename, entry): @@ -202,6 +198,8 @@ class SConsignDB(_SConsign): if type(self.entries) is not type({}): self.entries = {} raise TypeError + except KeyboardInterrupt: + raise except: SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, "Ignoring corrupt sconsign entry : %s"%self.dir.path) @@ -213,7 +211,11 @@ class SConsignDB(_SConsign): if self.dirty: global SConsign_db SConsign_db[self.dir.path] = cPickle.dumps(self.entries, 1) - SConsign_db.sync() + try: + SConsign_db.sync() + except AttributeError: + # Not all anydbm modules have sync() methods. + pass class SConsignDir(_SConsign): def __init__(self, fp=None, module=None): @@ -244,11 +246,13 @@ class SConsignDirFile(SConsignDir): try: fp = open(self.sconsign, 'rb') - except: + except IOError: fp = None try: SConsignDir.__init__(self, fp, module) + except KeyboardInterrupt: + raise except: SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, "Ignoring corrupt .sconsign file: %s"%self.sconsign) @@ -274,11 +278,11 @@ class SConsignDirFile(SConsignDir): try: file = open(temp, 'wb') fname = temp - except: + except IOError: try: file = open(self.sconsign, 'wb') fname = self.sconsign - except: + except IOError: return cPickle.dump(self.entries, file, 1) file.close() @@ -287,29 +291,31 @@ class SConsignDirFile(SConsignDir): mode = os.stat(self.sconsign)[0] os.chmod(self.sconsign, 0666) os.unlink(self.sconsign) - except: + except OSError: pass try: os.rename(fname, self.sconsign) - except: + except OSError: open(self.sconsign, 'wb').write(open(fname, 'rb').read()) os.chmod(self.sconsign, mode) try: os.unlink(temp) - except: + except OSError: pass SConsignForDirectory = SConsignDirFile -def SConsignFile(name): +def SConsignFile(name, dbm_module=None): """ Arrange for all signatures to be stored in a global .sconsign.dbm file. """ global SConsign_db if SConsign_db is None: - import anydbm - SConsign_db = anydbm.open(name, "c") + if dbm_module is None: + import anydbm + dbm_module = anydbm + SConsign_db = dbm_module.open(name, "c") global SConsignForDirectory SConsignForDirectory = SConsignDB diff --git a/src/script/sconsign.py b/src/script/sconsign.py index 015f1db..cc9e58d 100644 --- a/src/script/sconsign.py +++ b/src/script/sconsign.py @@ -80,6 +80,7 @@ if sys.platform == 'win32': # sys.prefix is (likely) C:\Python*; # check only C:\Python*. prefs.append(sys.prefix) + prefs.append(os.path.join(sys.prefix, 'Lib', 'site-packages')) else: # On other (POSIX) platforms, things are more complicated due to # the variety of path names and library locations. Try to be smart @@ -121,7 +122,13 @@ else: # check only /foo/lib/scons*. prefs.append(sys.prefix) - prefs = map(lambda x: os.path.join(x, 'lib'), prefs) + temp = map(lambda x: os.path.join(x, 'lib'), prefs) + temp.extend(map(lambda x: os.path.join(x, + 'lib', + 'python' + sys.version[:3], + 'site-packages'), + prefs)) + prefs = temp # Look first for 'scons-__version__' in all of our preference libs, # then for 'scons'. |