diff options
| author | Steven Knight <knight@baldmt.com> | 2002-09-15 01:45:17 (GMT) |
|---|---|---|
| committer | Steven Knight <knight@baldmt.com> | 2002-09-15 01:45:17 (GMT) |
| commit | b04744713085a486615cbef5f489dc522988fb36 (patch) | |
| tree | 2bac76ddc5252e4e37c6f5df0738278d1b2aa6d5 /src/engine/SCons | |
| parent | 37d6dd7bf93de0e1cbd5382cd7687ff5294183ec (diff) | |
| download | SCons-b04744713085a486615cbef5f489dc522988fb36.zip SCons-b04744713085a486615cbef5f489dc522988fb36.tar.gz SCons-b04744713085a486615cbef5f489dc522988fb36.tar.bz2 | |
Provide a Scanner hook to allow file scans to be avoided when it isn't necessary.
Diffstat (limited to 'src/engine/SCons')
| -rw-r--r-- | src/engine/SCons/Scanner/ScannerTests.py | 16 | ||||
| -rw-r--r-- | src/engine/SCons/Scanner/__init__.py | 20 |
2 files changed, 33 insertions, 3 deletions
diff --git a/src/engine/SCons/Scanner/ScannerTests.py b/src/engine/SCons/Scanner/ScannerTests.py index fce4078..2d0e47a 100644 --- a/src/engine/SCons/Scanner/ScannerTests.py +++ b/src/engine/SCons/Scanner/ScannerTests.py @@ -124,6 +124,21 @@ class ScannerHashTestCase(ScannerTestBase, unittest.TestCase): self.failUnless(hash(dict.keys()[0]) == hash(None), "did not hash Scanner base class as expected") +class ScannerCheckTestCase(unittest.TestCase): + "Test the Scanner.Base class __hash__() method" + def setUp(self): + self.checked = {} + def runTest(self): + def my_scan(filename, env, target, *args): + return [] + def check(node, s=self): + s.checked[node] = 1 + return 1 + s = SCons.Scanner.Base(my_scan, "Check", scan_check = check) + scanned = s.scan('x', DummyEnvironment(), DummyTarget()) + self.failUnless(self.checked['x'] == 1, + "did not call check function") + def suite(): suite = unittest.TestSuite() suite.addTest(ScannerPositionalTestCase()) @@ -131,6 +146,7 @@ def suite(): suite.addTest(ScannerPositionalArgumentTestCase()) suite.addTest(ScannerKeywordArgumentTestCase()) suite.addTest(ScannerHashTestCase()) + suite.addTest(ScannerCheckTestCase()) return suite if __name__ == "__main__": diff --git a/src/engine/SCons/Scanner/__init__.py b/src/engine/SCons/Scanner/__init__.py index 28159c9..dc10648 100644 --- a/src/engine/SCons/Scanner/__init__.py +++ b/src/engine/SCons/Scanner/__init__.py @@ -52,7 +52,8 @@ class Base: name = "NONE", argument = _null, skeys = [], - node_factory = SCons.Node.FS.default_fs.File): + node_factory = SCons.Node.FS.default_fs.File, + scan_check = None): """ Construct a new scanner object given a scanner function. @@ -77,7 +78,7 @@ class Base: Examples: s = Scanner(my_scanner_function) - + s = Scanner(function = my_scanner_function) s = Scanner(function = my_scanner_function, argument = 'foo') @@ -94,6 +95,7 @@ class Base: self.argument = argument self.skeys = skeys self.node_factory = node_factory + self.scan_check = scan_check def scan(self, node, env, target): """ @@ -102,6 +104,8 @@ class Base: environment that will be passed to the scanner function. A list of direct dependency nodes for the specified node will be returned. """ + if self.scan_check and not self.scan_check(node): + return [] if not self.argument is _null: list = self.function(node, env, target, self.argument) @@ -123,7 +127,17 @@ class Base: def __hash__(self): return hash(None) -class Recursive(Base): +class RExists(Base): + """ + Scan a node only if it exists (locally or in a Repository). + """ + def __init__(self, *args, **kw): + def rexists_check(node): + return node.rexists() + kw['scan_check'] = rexists_check + apply(Base.__init__, (self,) + args, kw) + +class Recursive(RExists): """ The class for recursive dependency scanning. This will re-scan any new files returned by each call to the |
