diff options
author | Steven Knight <knight@baldmt.com> | 2004-04-01 00:20:09 (GMT) |
---|---|---|
committer | Steven Knight <knight@baldmt.com> | 2004-04-01 00:20:09 (GMT) |
commit | 25b984647e137b2b63c2a32e791c95c7cc2fedae (patch) | |
tree | 4aa26bcf65008ce67efbda6e1e2db9d274883379 | |
parent | 36c526a3be47db75e1469de09da243ca66528998 (diff) | |
download | SCons-25b984647e137b2b63c2a32e791c95c7cc2fedae.zip SCons-25b984647e137b2b63c2a32e791c95c7cc2fedae.tar.gz SCons-25b984647e137b2b63c2a32e791c95c7cc2fedae.tar.bz2 |
Fix a bug in CVS checkouts when env.SourceCode() is called with a File, not a Directory.
-rw-r--r-- | src/CHANGES.txt | 4 | ||||
-rw-r--r-- | src/engine/SCons/Node/FS.py | 4 | ||||
-rw-r--r-- | src/engine/SCons/Node/FSTests.py | 23 | ||||
-rw-r--r-- | test/CVS.py | 63 |
4 files changed, 88 insertions, 6 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 648e910..1813fc3 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -37,6 +37,10 @@ RELEASE 0.96 - XXX - Fix a regression that prevented the Command() global function in 0.95 from working with command-line strings. + - Fix checking out a file from a source code management system when + the env.SourceCode() method was called with an individual file name + or node, not a directory name or node. + From Gary Oberbrunner: - Add a --debug=presub option to print actions prior to substitution. diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index 3bf2ee4..bb13afc 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -187,7 +187,7 @@ def CachePushFunc(target, source, env): return if not fs.isdir(cachedir): - fs.mkdir(cachedir) + fs.makedirs(cachedir) tempfile = cachefile+'.tmp' try: @@ -515,6 +515,8 @@ class Base(SCons.Node.Node): def set_src_builder(self, builder): """Set the source code builder for this node.""" self.sbuilder = builder + if not self.has_builder(): + self.builder_set(builder) def src_builder(self): """Fetch the source code builder for this node. diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py index 94280f7..b1999e0 100644 --- a/src/engine/SCons/Node/FSTests.py +++ b/src/engine/SCons/Node/FSTests.py @@ -1432,30 +1432,51 @@ class has_src_builderTestCase(unittest.TestCase): f4 = fs.File('f4', sub2) f5 = fs.File('f5', sub2) f6 = fs.File('f6', sub2) + f7 = fs.File('f7', sub2) h = f1.has_src_builder() assert not h, h + h = f1.has_builder() + assert not h, h b1 = Builder(fs.File) sub1.set_src_builder(b1) test.write(['sub1', 'f2'], "sub1/f2\n") - h = f1.has_src_builder() # cached from previous call + h = f1.has_src_builder() # cached from previous call + assert not h, h + h = f1.has_builder() # cached from previous call assert not h, h h = f2.has_src_builder() assert not h, h + h = f2.has_builder() + assert not h, h h = f3.has_src_builder() assert h, h + h = f3.has_builder() + assert h, h assert f3.builder is b1, f3.builder + f7.set_src_builder(b1) + test.write(['sub2', 'SCCS', 's.f5'], "sub2/SCCS/s.f5\n") test.write(['sub2', 'RCS', 'f6,v'], "sub2/RCS/f6,v\n") h = f4.has_src_builder() assert not h, h + h = f4.has_builder() + assert not h, h h = f5.has_src_builder() assert h, h + h = f5.has_builder() + assert h, h h = f6.has_src_builder() assert h, h + h = f6.has_builder() + assert h, h + h = f7.has_src_builder() + assert h, h + h = f7.has_builder() + assert h, h class prepareTestCase(unittest.TestCase): def runTest(self): diff --git a/test/CVS.py b/test/CVS.py index 2eed3d2..25d87e5 100644 --- a/test/CVS.py +++ b/test/CVS.py @@ -234,19 +234,74 @@ test.fail_test(not is_writable(test.workpath('work2', 'ccc.in'))) test.fail_test(not is_writable(test.workpath('work2', 'sub', 'ddd.in'))) test.fail_test(not is_writable(test.workpath('work2', 'sub', 'fff.in'))) -# Test CVS checkouts from a remote server (SourceForge). +# Test checking out specific file name(s), and expanding +# the repository name with a variable. test.subdir(['work3']) test.write(['work3', 'SConstruct'], """\ import os +def cat(env, source, target): + target = str(target[0]) + source = map(str, source) + f = open(target, "wb") + for src in source: + f.write(open(src, "rb").read()) + f.close() +env = Environment(ENV = { 'PATH' : os.environ['PATH'] }, + BUILDERS={'Cat':Builder(action=cat)}, + CVSROOT=r'%s') +env.Prepend(CVSFLAGS='-q') +env.Cat('aaa.out', 'aaa.in') +env.Cat('bbb.out', 'bbb.in') +env.Cat('ccc.out', 'ccc.in') +env.Cat('all', ['aaa.out', 'bbb.out', 'ccc.out']) +cvs = env.CVS('$CVSROOT', 'foo') +#env.SourceCode('.', cvs) +env.SourceCode('aaa.in', cvs) +env.SourceCode('bbb.in', cvs) +env.SourceCode('ccc.in', cvs) +""" % cvsroot) + +test.run(chdir = 'work3', + arguments = '.', + stdout = test.wrap_stdout(build_str = """\ +cvs -q -d %s co -d . foo/aaa.in +U ./aaa.in +cat("aaa.out", "aaa.in") +cvs -q -d %s co -d . foo/bbb.in +U ./bbb.in +cat("bbb.out", "bbb.in") +cvs -q -d %s co -d . foo/ccc.in +U ./ccc.in +cat("ccc.out", "ccc.in") +cat("all", ["aaa.out", "bbb.out", "ccc.out"]) +""" % (cvsroot, + cvsroot, + cvsroot))) + +test.must_match(['work3', 'aaa.out'], "import/aaa.in\n") +test.must_match(['work3', 'bbb.out'], "import/bbb.in\n") +test.must_match(['work3', 'ccc.out'], "import/ccc.in\n") +test.must_match(['work3', 'all'], "import/aaa.in\nimport/bbb.in\nimport/ccc.in\n") + +# Test CVS checkouts from a remote server (Tigris.org). +test.subdir(['work4']) + +test.write(['work4', 'SConstruct'], """\ +import os env = Environment(ENV = { 'PATH' : os.environ['PATH'] }) -env.SourceCode('.', env.CVS(':pserver:anonymous@cvs.sourceforge.net:/cvsroot/scons')) +# We used to use the SourceForge server, but SourceForge has restrictions +# that make them deny access on occasion. Leave the incantation here +# in case we need to use it again some day. +#cvs = env.CVS(':pserver:anonymous@cvs.sourceforge.net:/cvsroot/scons') +cvs = env.CVS(':pserver:anoncvs@cvs.tigris.org:/cvs') +env.SourceCode('.', cvs) env.Install('install', 'scons/SConstruct') """) -test.run(chdir = 'work3', arguments = '.') +test.run(chdir = 'work4', arguments = '.') -test.fail_test(not os.path.exists(test.workpath('work3', 'install', 'SConstruct'))) +test.fail_test(not os.path.exists(test.workpath('work4', 'install', 'SConstruct'))) test.pass_test() |