summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2003-03-22 23:49:41 (GMT)
committerSteven Knight <knight@baldmt.com>2003-03-22 23:49:41 (GMT)
commit904be3fe063b4ad64bccd63909ecc3dbffc549d7 (patch)
treed0d1706e890a9f605caa088621956ef637939453
parentbf40333ce747dbb66388dc9cb40e5ce741cb0055 (diff)
downloadSCons-904be3fe063b4ad64bccd63909ecc3dbffc549d7.zip
SCons-904be3fe063b4ad64bccd63909ecc3dbffc549d7.tar.gz
SCons-904be3fe063b4ad64bccd63909ecc3dbffc549d7.tar.bz2
Check out files from various source code systems properly.
-rw-r--r--doc/man/scons.195
-rw-r--r--src/engine/SCons/Node/FS.py2
-rw-r--r--src/engine/SCons/Tool/BitKeeper.py17
-rw-r--r--src/engine/SCons/Tool/CVS.py8
-rw-r--r--src/engine/SCons/Tool/RCS.py10
-rw-r--r--src/engine/SCons/Tool/SCCS.py7
-rw-r--r--src/engine/SCons/Tool/Subversion.py12
-rw-r--r--test/BitKeeper.py316
-rw-r--r--test/CVS.py35
-rw-r--r--test/RCS.py46
-rw-r--r--test/SCCS.py42
11 files changed, 393 insertions, 197 deletions
diff --git a/doc/man/scons.1 b/doc/man/scons.1
index bd0dce7..711c0c0 100644
--- a/doc/man/scons.1
+++ b/doc/man/scons.1
@@ -1396,42 +1396,17 @@ env.Append(CCFLAGS = ' -g', FOO = ['foo.yyy'])
.EE
.TP
-.RI BitKeeper( repository ", " module )
+.RI BitKeeper( )
A factory function that
returns a Builder object
to be used to fetch source files
-from the specified
-BitKeeper
-.IR repository .
+using BitKeeper.
The returned Builder
is intended to be passed to the
.B SourceCode
function.
-
-The optional specified
-.I module
-will be added to the beginning
-of all repository path names;
-this can be used, in essence,
-to strip initial directory names
-from the repository path names,
-so that you only have to
-replicate part of the repository
-directory hierarchy in your
-local build directory:
-
.ES
-# Will fetch foo/bar/src.c
-# from /usr/local/BKsources/foo/bar/src.c.
-env.SourceCode('.', env.BitKeeper('/usr/local/BKsources'))
-
-# Will fetch bar/src.c
-# from /usr/local/BKsources/foo/bar/src.c.
-env.SourceCode('.', env.BitKeeper('/usr/local/BKsources', 'foo'))
-
-# Will fetch src.c
-# from /usr/local/BKsources/foo/bar/src.c.
-env.SourceCode('.', env.BitKeeper('/usr/local/BKsources', 'foo/bar'))
+env.SourceCode('.', env.BitKeeper())
.EE
.TP
@@ -1890,11 +1865,17 @@ are included on this command line.
The BitKeeper executable.
.IP BITKEEPERCOM
-The command line used to
-fetch source files from a BitKeeper repository.
+The command line for
+fetching source files using BitKEeper.
+
+.IP BITKEEPERGET
+The command ($BITKEEPER) and subcommand
+for fetching source files using BitKeeper.
-.IP BITKEEPERFLAGS
-General options that are passed to BitKeeper.
+.IP BITKEEPERGETFLAGS
+Options that are passed to the BitKeeper
+.B get
+subcommand.
.IP BUILDERS
A dictionary mapping the names of the builders
@@ -1945,15 +1926,6 @@ SCons also treats
(upper case) files
as C files.
-.IP CO
-The RCS "checkout" executable,
-used to fetch source files from RCS.
-See the related variables
-.B RCSCOM
-and
-.BR RCSFLAGS ,
-below.
-
.IP _concat
A function used to produce variables like $_CPPINCFLAGS. It takes six
arguments: a prefix to concatenate onto each element, a list of elements, a
@@ -2033,12 +2005,23 @@ env = Environment(CCCOM="my_compiler $_CPPINCFLAGS -c -o $TARGET $SOURCE")
.IP CVS
The CVS executable.
+.IP CVSCOFLAGS
+Options that are passed to the CVS checkout subcommand.
+
.IP CVSCOM
The command line used to
fetch source files from a CVS repository.
.IP CVSFLAGS
General options that are passed to CVS.
+By default, this is set to
+"-d $CVSREPOSITORY"
+to specify from where the files must be fetched.
+
+.IP CVSREPOSITORY
+The path to the CVS repository.
+This is referenced in the default
+$CVSFLAGS value.
.IP CXX
The C++ compiler.
@@ -2492,17 +2475,21 @@ The flags passed to the resource compiler by the RES builder.
.IP RCS
The RCS executable.
Note that this variable is not actually used
-to fetch source files from RCS;
+for the command to fetch source files from RCS;
see the
-.B CO
-construction variable, above.
+.B RCS_CO
+construction variable, below.
-.IP RCSCOM
+.IP RCS_CO
+The RCS "checkout" executable,
+used to fetch source files from RCS.
+
+.IP RCS_COCOM
The command line used to
-fetch source files from RCS.
+fetch (checkout) source files from RCS.
-.IP RCSFLAGS
-General options that are passed to RCS.
+.IP RCS_COFLAGS
+Options that are passed to the $RCS_CO command.
.IP RDirs
A function that converts a file name into a list of Dir instances by
@@ -2521,6 +2508,12 @@ fetch source files from SCCS.
.IP SCCSFLAGS
General options that are passed to SCCS.
+.IP SCCSGETFLAGS
+Options that are passed specifically to the SCCS "get" subcommand.
+This can be set, for example, to
+.I -e
+to check out editable files from SCCS.
+
.IP SHCC
The C compiler used for generating shared-library objects.
@@ -2622,15 +2615,15 @@ is that arguments to the command.
is a dictionary of the environment variables
in which the command should be executed.
-.IP SUBVERSION
+.IP SVN
The Subversion executable (usually named
.BR svn ).
-.IP SUBVERSIONCOM
+.IP SVNCOM
The command line used to
fetch source files from a Subversion repository.
-.IP SUBVERSIONFLAGS
+.IP SVNFLAGS
General options that are passed to Subversion.
.IP TAR
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py
index 89566b2..57fd1c2 100644
--- a/src/engine/SCons/Node/FS.py
+++ b/src/engine/SCons/Node/FS.py
@@ -176,7 +176,7 @@ def get_DefaultRCSBuilder():
if DefaultRCSBuilder is None:
import SCons.Builder
import SCons.Defaults
- DefaultRCSBuilder = SCons.Builder.Builder(action = '$RCSCOM',
+ DefaultRCSBuilder = SCons.Builder.Builder(action = '$RCS_COCOM',
env = SCons.Defaults._default_env)
return DefaultRCSBuilder
diff --git a/src/engine/SCons/Tool/BitKeeper.py b/src/engine/SCons/Tool/BitKeeper.py
index 94e084f..6d81eb0 100644
--- a/src/engine/SCons/Tool/BitKeeper.py
+++ b/src/engine/SCons/Tool/BitKeeper.py
@@ -42,21 +42,16 @@ def generate(env, platform):
"""Add a Builder factory function and construction variables for
BitKeeper to an Environment."""
- def BitKeeperFactory(repos, module='', env=env):
+ def BitKeeperFactory(env=env):
""" """
- # fail if repos is not an absolute path name?
- if module != '':
- module = os.path.join(module, '')
- return SCons.Builder.Builder(action = "$BITKEEPERCOM",
- env = env,
- overrides = {'BKREPOSITORY':repos,
- 'BKMODULE':module})
+ return SCons.Builder.Builder(action = "$BITKEEPERCOM", env = env)
setattr(env, 'BitKeeper', BitKeeperFactory)
- env['BITKEEPER'] = 'bk'
- env['BITKEEPERFLAGS'] = ''
- env['BITKEEPERCOM'] = '$BITKEEPER get $BITKEEPERFLAGS -p $BKREPOSITORY/$BKMODULE$TARGET > $TARGET'
+ env['BITKEEPER'] = 'bk'
+ env['BITKEEPERGET'] = '$BITKEEPER get'
+ env['BITKEEPERGETFLAGS'] = ''
+ env['BITKEEPERCOM'] = '$BITKEEPERGET $BITKEEPERGETFLAGS $TARGET'
def exists(env):
return env.Detect('bk')
diff --git a/src/engine/SCons/Tool/CVS.py b/src/engine/SCons/Tool/CVS.py
index c8b1f68..b8f6968 100644
--- a/src/engine/SCons/Tool/CVS.py
+++ b/src/engine/SCons/Tool/CVS.py
@@ -46,6 +46,7 @@ def generate(env, platform):
# fail if repos is not an absolute path name?
if module != '':
module = os.path.join(module, '')
+ env['CVSCOM'] = '$CVS $CVSFLAGS co $CVSCOFLAGS -p $CVSMODULE$TARGET > $TARGET'
return SCons.Builder.Builder(action = '$CVSCOM',
env = env,
overrides = {'CVSREPOSITORY':repos,
@@ -53,9 +54,10 @@ def generate(env, platform):
setattr(env, 'CVS', CVSFactory)
- env['CVS'] = 'cvs'
- env['CVSFLAGS'] = ''
- env['CVSCOM'] = '$CVS $CVSFLAGS -d $CVSREPOSITORY co -p $CVSMODULE$TARGET > $TARGET'
+ env['CVS'] = 'cvs'
+ env['CVSFLAGS'] = '-d $CVSREPOSITORY'
+ env['CVSCOFLAGS'] = ''
+ env['CVSCOM'] = '$CVS $CVSFLAGS co $CVSCOFLAGS $TARGET'
def exists(env):
return env.Detect('cvs')
diff --git a/src/engine/SCons/Tool/RCS.py b/src/engine/SCons/Tool/RCS.py
index f6276c5..2a7e9e4 100644
--- a/src/engine/SCons/Tool/RCS.py
+++ b/src/engine/SCons/Tool/RCS.py
@@ -41,14 +41,14 @@ def generate(env, platform):
def RCSFactory(env=env):
""" """
- return SCons.Builder.Builder(action = '$RCSCOM', env = env)
+ return SCons.Builder.Builder(action = '$RCS_COCOM', env = env)
setattr(env, 'RCS', RCSFactory)
- env['CO'] = 'co'
- env['RCS'] = 'rcs'
- env['RCSFLAGS'] = ''
- env['RCSCOM'] = '$CO $RCSFLAGS $TARGET'
+ env['RCS'] = 'rcs'
+ env['RCS_CO'] = 'co'
+ env['RCS_COFLAGS'] = ''
+ env['RCS_COCOM'] = '$RCS_CO $RCS_COFLAGS $TARGET'
def exists(env):
return env.Detect('rcs')
diff --git a/src/engine/SCons/Tool/SCCS.py b/src/engine/SCons/Tool/SCCS.py
index 1b5d480..b559fea 100644
--- a/src/engine/SCons/Tool/SCCS.py
+++ b/src/engine/SCons/Tool/SCCS.py
@@ -45,9 +45,10 @@ def generate(env, platform):
setattr(env, 'SCCS', SCCSFactory)
- env['SCCS'] = 'sccs'
- env['SCCSFLAGS'] = ''
- env['SCCSCOM'] = '$SCCS $SCCSFLAGS get $TARGET'
+ env['SCCS'] = 'sccs'
+ env['SCCSFLAGS'] = ''
+ env['SCCSGETFLAGS'] = ''
+ env['SCCSCOM'] = '$SCCS $SCCSFLAGS get $SCCSGETFLAGS $TARGET'
def exists(env):
return env.Detect('sccs')
diff --git a/src/engine/SCons/Tool/Subversion.py b/src/engine/SCons/Tool/Subversion.py
index cec3eaf..195af39 100644
--- a/src/engine/SCons/Tool/Subversion.py
+++ b/src/engine/SCons/Tool/Subversion.py
@@ -46,16 +46,16 @@ def generate(env, platform):
# fail if repos is not an absolute path name?
if module != '':
module = os.path.join(module, '')
- return SCons.Builder.Builder(action = '$SUBVERSIONCOM',
+ return SCons.Builder.Builder(action = '$SVNCOM',
env = env,
- overrides = {'SUBVERSIONREPOSITORY':repos,
- 'SUBVERSIONMODULE':module})
+ overrides = {'SVNREPOSITORY':repos,
+ 'SVNMODULE':module})
setattr(env, 'Subversion', SubversionFactory)
- env['SUBVERSION'] = 'svn'
- env['SUBVERSIONFLAGS'] = ''
- env['SUBVERSIONCOM'] = '$SUBVERSION $SUBVERSIONFLAGS cat $SUBVERSIONREPOSITORY/$SUBVERSIONMODULE$TARGET > $TARGET'
+ env['SVN'] = 'svn'
+ env['SVNFLAGS'] = ''
+ env['SVNCOM'] = '$SVN $SVNFLAGS cat $SVNREPOSITORY/$SVNMODULE$TARGET > $TARGET'
def exists(env):
return env.Detect('svn')
diff --git a/test/BitKeeper.py b/test/BitKeeper.py
index 0926b28..eb5c52c 100644
--- a/test/BitKeeper.py
+++ b/test/BitKeeper.py
@@ -29,6 +29,7 @@ Test fetching source files from BitKeeper.
"""
import os
+import stat
import TestSCons
@@ -39,6 +40,10 @@ if not bk:
print "Could not find BitKeeper, skipping test(s)."
test.pass_test(1)
+def is_writable(file):
+ mode = os.stat(file)[stat.ST_MODE]
+ return mode & stat.S_IWUSR
+
try:
login = os.getlogin()
except AttributeError:
@@ -51,16 +56,202 @@ host = os.uname()[1]
email = "%s@%s" % (login, host)
-test.subdir('BitKeeper', 'import', ['import', 'sub'], 'work1', 'work2')
+test.subdir('BK', 'import', ['import', 'sub'])
-# Set up the BitKeeper repository.
-bkroot = test.workpath('BitKeeper')
-bk_conf = test.workpath('bk.conf')
+# Test using BitKeeper to fetch from SCCS/s.file files.
+sccs = test.where_is('sccs')
+if not sccs:
+ print "Could not find SCCS, skipping sub-test of BitKeeper using SCCS files."
+else:
+ test.subdir('work1',
+ ['work1', 'SCCS'],
+ ['work1', 'sub'],
+ ['work1', 'sub', 'SCCS'])
+
+ for file in ['aaa.in', 'bbb.in', 'ccc.in']:
+ test.write(['work1', file], "work1/%s\n" % file)
+ args = "create %s" % file
+ test.run(chdir = 'work1', program = sccs, arguments = args, stderr = None)
+ test.unlink(['work1', file])
+ test.unlink(['work1', ','+file])
+
+ test.write(['work1', 'sub', 'SConscript'], """\
+Import("env")
+env.Cat('ddd.out', 'ddd.in')
+env.Cat('eee.out', 'eee.in')
+env.Cat('fff.out', 'fff.in')
+env.Cat('all', ['ddd.out', 'eee.out', 'fff.out'])
+""")
+ args = "create SConscript"
+ test.run(chdir = 'work1/sub', program = sccs, arguments = args, stderr = None)
+ test.unlink(['work1', 'sub', 'SConscript'])
+ test.unlink(['work1', 'sub', ',SConscript'])
+
+ for file in ['ddd.in', 'eee.in', 'fff.in']:
+ test.write(['work1', 'sub', file], "work1/sub/%s\n" % file)
+ args = "create %s" % file
+ test.run(chdir = 'work1/sub', program = sccs, arguments = args, stderr = None)
+ test.unlink(['work1', 'sub', file])
+ test.unlink(['work1', 'sub', ','+file])
+ test.write(['work1', 'SConstruct'], """
+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(BUILDERS={'Cat':Builder(action=cat)},
+ BITKEEPERGETFLAGS='-e')
+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'])
+env.SourceCode('.', env.BitKeeper())
+SConscript('sub/SConscript', "env")
+""")
+
+ test.write(['work1', 'bbb.in'], "checked-out work1/bbb.in\n")
+
+ test.write(['work1', 'sub', 'eee.in'], "checked-out work1/sub/eee.in\n")
+
+ test.run(chdir = 'work1',
+ arguments = '.',
+ stdout = test.wrap_stdout(read_str = """\
+bk get -e sub/SConscript
+""",
+ build_str = """\
+bk get -e aaa.in
+cat("aaa.out", "aaa.in")
+cat("bbb.out", "bbb.in")
+bk get -e ccc.in
+cat("ccc.out", "ccc.in")
+cat("all", ["aaa.out", "bbb.out", "ccc.out"])
+bk get -e sub/ddd.in
+cat("sub/ddd.out", "sub/ddd.in")
+cat("sub/eee.out", "sub/eee.in")
+bk get -e sub/fff.in
+cat("sub/fff.out", "sub/fff.in")
+cat("sub/all", ["sub/ddd.out", "sub/eee.out", "sub/fff.out"])
+"""),
+ stderr = """\
+sub/SConscript 1.1 -> 1.2: 5 lines
+aaa.in 1.1 -> 1.2: 1 lines
+ccc.in 1.1 -> 1.2: 1 lines
+sub/ddd.in 1.1 -> 1.2: 1 lines
+sub/fff.in 1.1 -> 1.2: 1 lines
+""")
+
+ test.fail_test(test.read(['work1', 'all']) != "work1/aaa.in\nchecked-out work1/bbb.in\nwork1/ccc.in\n")
+
+ test.fail_test(not is_writable(test.workpath('work1', 'sub', 'SConscript')))
+ test.fail_test(not is_writable(test.workpath('work1', 'aaa.in')))
+ test.fail_test(not is_writable(test.workpath('work1', 'ccc.in')))
+ test.fail_test(not is_writable(test.workpath('work1', 'sub', 'ddd.in')))
+ test.fail_test(not is_writable(test.workpath('work1', 'sub', 'fff.in')))
+
+# Test using BitKeeper to fetch from RCS/file,v files.
+rcs = test.where_is('rcs')
+ci = test.where_is('ci')
+if not rcs:
+ print "Could not find RCS,\nskipping sub-test of BitKeeper using RCS files."
+elif not ci:
+ print "Could not find the RCS ci command,\nskipping sub-test of BitKeeper using RCS files."
+else:
+ test.subdir('work2',
+ ['work2', 'RCS'],
+ ['work2', 'sub'],
+ ['work2', 'sub', 'RCS'])
+
+ for file in ['aaa.in', 'bbb.in', 'ccc.in']:
+ test.write(['work2', file], "work2/%s\n" % file)
+ args = "-f -t%s %s" % (file, file)
+ test.run(chdir = 'work2', program = ci, arguments = args, stderr = None)
+
+ test.write(['work2', 'sub', 'SConscript'], """\
+Import("env")
+env.Cat('ddd.out', 'ddd.in')
+env.Cat('eee.out', 'eee.in')
+env.Cat('fff.out', 'fff.in')
+env.Cat('all', ['ddd.out', 'eee.out', 'fff.out'])
+""")
+ args = "-f -tsub/SConscript sub/SConscript"
+ test.run(chdir = 'work2', program = ci, arguments = args, stderr = None)
+
+ for file in ['ddd.in', 'eee.in', 'fff.in']:
+ test.write(['work2', 'sub', file], "work2/sub/%s\n" % file)
+ args = "-f -tsub/%s sub/%s" % (file, file)
+ test.run(chdir = 'work2', program = ci, arguments = args, stderr = None)
+
+ test.no_result(os.path.exists(test.workpath('work2', 'aaa.in')))
+ test.no_result(os.path.exists(test.workpath('work2', 'bbb.in')))
+ test.no_result(os.path.exists(test.workpath('work2', 'ccc.in')))
+
+ test.no_result(os.path.exists(test.workpath('work2', 'sub', 'SConscript')))
+
+ test.no_result(os.path.exists(test.workpath('work2', 'sub', 'ddd.in')))
+ test.no_result(os.path.exists(test.workpath('work2', 'sub', 'eee.in')))
+ test.no_result(os.path.exists(test.workpath('work2', 'sub', 'fff.in')))
+
+ test.write(['work2', 'SConstruct'], """\
+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(BUILDERS={'Cat':Builder(action=cat)},
+ BITKEEPERGET='$BITKEEPER co',
+ BITKEEPERGETFLAGS='-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'])
+env.SourceCode('.', env.BitKeeper())
+SConscript('sub/SConscript', "env")
+""")
+
+ test.write(['work2', 'bbb.in'], "checked-out work2/bbb.in\n")
+
+ test.write(['work2', 'sub', 'eee.in'], "checked-out work2/sub/eee.in\n")
+
+ test.run(chdir = 'work2',
+ arguments = '.',
+ stdout = test.wrap_stdout(read_str = """\
+bk co -q sub/SConscript
+""",
+ build_str = """\
+bk co -q aaa.in
+cat("aaa.out", "aaa.in")
+cat("bbb.out", "bbb.in")
+bk co -q ccc.in
+cat("ccc.out", "ccc.in")
+cat("all", ["aaa.out", "bbb.out", "ccc.out"])
+bk co -q sub/ddd.in
+cat("sub/ddd.out", "sub/ddd.in")
+cat("sub/eee.out", "sub/eee.in")
+bk co -q sub/fff.in
+cat("sub/fff.out", "sub/fff.in")
+cat("sub/all", ["sub/ddd.out", "sub/eee.out", "sub/fff.out"])
+"""))
+
+ test.fail_test(test.read(['work2', 'all']) != "work2/aaa.in\nchecked-out work2/bbb.in\nwork2/ccc.in\n")
+
+ test.fail_test(test.read(['work2', 'sub', 'all']) != "work2/sub/ddd.in\nchecked-out work2/sub/eee.in\nwork2/sub/fff.in\n")
+
+ test.fail_test(is_writable(test.workpath('work2', 'sub', 'SConscript')))
+ test.fail_test(is_writable(test.workpath('work2', 'aaa.in')))
+ test.fail_test(is_writable(test.workpath('work2', 'ccc.in')))
+ test.fail_test(is_writable(test.workpath('work2', 'sub', 'ddd.in')))
+ test.fail_test(is_writable(test.workpath('work2', 'sub', 'fff.in')))
+
+# Set up a "pure" BitKeeper hierarchy.
# BitKeeper's licensing restrictions require a configuration file that
# specifies you're not using it multi-user. This seems to be the
# minimal configuration that satisfies these requirements.
-test.write(bk_conf, """\
+test.write('bk.conf', """\
description:test project 'foo'
logging:none
email:%s
@@ -72,10 +263,6 @@ single_host:%s
# shut up and not prompt us to accept the license.
os.environ['BK_LICENSE'] = 'ACCEPTED'
-test.run(chdir = bkroot,
- program = bk,
- arguments = 'setup -f -c %s foo' % bk_conf)
-
test.write(['import', 'aaa.in'], "import/aaa.in\n")
test.write(['import', 'bbb.in'], "import/bbb.in\n")
test.write(['import', 'ccc.in'], "import/ccc.in\n")
@@ -92,12 +279,18 @@ test.write(['import', 'sub', 'ddd.in'], "import/sub/ddd.in\n")
test.write(['import', 'sub', 'eee.in'], "import/sub/eee.in\n")
test.write(['import', 'sub', 'fff.in'], "import/sub/fff.in\n")
+# Test transparent source file checkouts using BitKeeper, by overriding
+# the 'SCCS' construction variable in the default Environment.
+work3 = test.workpath('work3')
+
+test.run(program = bk,
+ arguments = 'setup -f -c bk.conf work3')
+
test.run(chdir = 'import',
program = bk,
- arguments = 'import -q -f -tplain . %s/foo' % bkroot)
+ arguments = 'import -q -f -tplain . %s' % test.workpath('work3'))
-# Test the most straightforward BitKeeper checkouts, using the module name.
-test.write(['work1', 'SConstruct'], """
+test.write(['work3', 'SConstruct'], """
def cat(env, source, target):
target = str(target[0])
source = map(str, source)
@@ -105,98 +298,55 @@ def cat(env, source, target):
for src in source:
f.write(open(src, "rb").read())
f.close()
+_default_env['SCCS'] = r'%s'
env = Environment(BUILDERS={'Cat':Builder(action=cat)})
-env.Cat('aaa.out', 'foo/aaa.in')
-env.Cat('bbb.out', 'foo/bbb.in')
-env.Cat('ccc.out', 'foo/ccc.in')
-env.Cat('all', ['aaa.out', 'bbb.out', 'ccc.out'])
-env.SourceCode('.', env.BitKeeper(r'%s'))
-SConscript('foo/sub/SConscript', "env")
-""" % bkroot)
-
-test.subdir(['work1', 'foo'])
-test.write(['work1', 'foo', 'bbb.in'], "work1/foo/bbb.in\n")
-
-test.subdir(['work1', 'foo', 'sub'])
-test.write(['work1', 'foo', 'sub', 'eee.in'], "work1/foo/sub/eee.in\n")
-
-test.run(chdir = 'work1',
- arguments = '.',
- stdout = test.wrap_stdout(read_str = """\
-bk get -p %s/foo/sub/SConscript > foo/sub/SConscript
-""" % (bkroot),
- build_str = """\
-bk get -p %s/foo/aaa.in > foo/aaa.in
-cat("aaa.out", "foo/aaa.in")
-cat("bbb.out", "foo/bbb.in")
-bk get -p %s/foo/ccc.in > foo/ccc.in
-cat("ccc.out", "foo/ccc.in")
-cat("all", ["aaa.out", "bbb.out", "ccc.out"])
-bk get -p %s/foo/sub/ddd.in > foo/sub/ddd.in
-cat("foo/sub/ddd.out", "foo/sub/ddd.in")
-cat("foo/sub/eee.out", "foo/sub/eee.in")
-bk get -p %s/foo/sub/fff.in > foo/sub/fff.in
-cat("foo/sub/fff.out", "foo/sub/fff.in")
-cat("foo/sub/all", ["foo/sub/ddd.out", "foo/sub/eee.out", "foo/sub/fff.out"])
-""" % (bkroot, bkroot, bkroot, bkroot)),
- stderr = """\
-%s/foo/sub/SConscript 1.1: 5 lines
-%s/foo/aaa.in 1.1: 1 lines
-%s/foo/ccc.in 1.1: 1 lines
-%s/foo/sub/ddd.in 1.1: 1 lines
-%s/foo/sub/fff.in 1.1: 1 lines
-""" % (bkroot, bkroot, bkroot, bkroot, bkroot))
-
-test.fail_test(test.read(['work1', 'all']) != "import/aaa.in\nwork1/foo/bbb.in\nimport/ccc.in\n")
-
-test.fail_test(test.read(['work1', 'foo', 'sub', 'all']) != "import/sub/ddd.in\nwork1/foo/sub/eee.in\nimport/sub/fff.in\n")
-
-# Test BitKeeper checkouts when the module name is specified.
-test.write(['work2', 'SConstruct'], """
-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(BUILDERS={'Cat':Builder(action=cat)},
- BITKEEPERFLAGS='-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'])
-env.SourceCode('.', env.BitKeeper(r'%s', 'foo'))
SConscript('sub/SConscript', "env")
-""" % bkroot)
+""" % bk)
-test.write(['work2', 'bbb.in'], "work2/bbb.in\n")
+test.write(['work3', 'bbb.in'], "work3/bbb.in\n")
-test.subdir(['work2', 'sub'])
-test.write(['work2', 'sub', 'eee.in'], "work2/sub/eee.in\n")
+test.subdir(['work3', 'sub'])
+test.write(['work3', 'sub', 'eee.in'], "work3/sub/eee.in\n")
-test.run(chdir = 'work2',
+test.run(chdir = 'work3',
arguments = '.',
stdout = test.wrap_stdout(read_str = """\
-bk get -q -p %s/foo/sub/SConscript > sub/SConscript
-""" % (bkroot),
+%s get sub/SConscript
+""" % bk,
build_str = """\
-bk get -q -p %s/foo/aaa.in > aaa.in
+%s get aaa.in
cat("aaa.out", "aaa.in")
cat("bbb.out", "bbb.in")
-bk get -q -p %s/foo/ccc.in > ccc.in
+%s get ccc.in
cat("ccc.out", "ccc.in")
cat("all", ["aaa.out", "bbb.out", "ccc.out"])
-bk get -q -p %s/foo/sub/ddd.in > sub/ddd.in
+%s get sub/ddd.in
cat("sub/ddd.out", "sub/ddd.in")
cat("sub/eee.out", "sub/eee.in")
-bk get -q -p %s/foo/sub/fff.in > sub/fff.in
+%s get sub/fff.in
cat("sub/fff.out", "sub/fff.in")
cat("sub/all", ["sub/ddd.out", "sub/eee.out", "sub/fff.out"])
-""" % (bkroot, bkroot, bkroot, bkroot)))
+""" % (bk, bk, bk, bk)),
+ stderr = """\
+sub/SConscript 1.1: 5 lines
+aaa.in 1.1: 1 lines
+ccc.in 1.1: 1 lines
+sub/ddd.in 1.1: 1 lines
+sub/fff.in 1.1: 1 lines
+""")
+
+test.fail_test(test.read(['work3', 'all']) != "import/aaa.in\nwork3/bbb.in\nimport/ccc.in\n")
-test.fail_test(test.read(['work2', 'all']) != "import/aaa.in\nwork2/bbb.in\nimport/ccc.in\n")
+test.fail_test(test.read(['work3', 'sub', 'all']) != "import/sub/ddd.in\nwork3/sub/eee.in\nimport/sub/fff.in\n")
-test.fail_test(test.read(['work2', 'sub', 'all']) != "import/sub/ddd.in\nwork2/sub/eee.in\nimport/sub/fff.in\n")
+test.fail_test(is_writable(test.workpath('work3', 'sub', 'SConscript')))
+test.fail_test(is_writable(test.workpath('work3', 'aaa.in')))
+test.fail_test(is_writable(test.workpath('work3', 'ccc.in')))
+test.fail_test(is_writable(test.workpath('work3', 'sub', 'ddd.in')))
+test.fail_test(is_writable(test.workpath('work3', 'sub', 'fff.in')))
test.pass_test()
diff --git a/test/CVS.py b/test/CVS.py
index bf1e830..ff6963f 100644
--- a/test/CVS.py
+++ b/test/CVS.py
@@ -29,6 +29,7 @@ Test fetching source files from CVS.
"""
import os
+import stat
import TestSCons
@@ -39,6 +40,10 @@ if not cvs:
print "Could not find CVS, skipping test(s)."
test.pass_test(1)
+def is_writable(file):
+ mode = os.stat(file)[stat.ST_MODE]
+ return mode & stat.S_IWUSR
+
test.subdir('CVS', 'import', ['import', 'sub'], 'work1', 'work2')
# Set up the CVS repository.
@@ -76,8 +81,8 @@ def cat(env, source, target):
for src in source:
f.write(open(src, "rb").read())
f.close()
-env = Environment(BUILDERS={'Cat':Builder(action=cat)},
- CVSFLAGS='-Q')
+env = Environment(BUILDERS={'Cat':Builder(action=cat)})
+env.Prepend(CVSFLAGS='-Q ')
env.Cat('aaa.out', 'foo/aaa.in')
env.Cat('bbb.out', 'foo/bbb.in')
env.Cat('ccc.out', 'foo/ccc.in')
@@ -95,19 +100,19 @@ test.write(['work1', 'foo', 'sub', 'eee.in'], "work1/foo/sub/eee.in\n")
test.run(chdir = 'work1',
arguments = '.',
stdout = test.wrap_stdout(read_str = """\
-cvs -Q -d %s co -p foo/sub/SConscript > foo/sub/SConscript
+cvs -Q -d %s co foo/sub/SConscript
""" % (cvsroot),
build_str = """\
-cvs -Q -d %s co -p foo/aaa.in > foo/aaa.in
+cvs -Q -d %s co foo/aaa.in
cat("aaa.out", "foo/aaa.in")
cat("bbb.out", "foo/bbb.in")
-cvs -Q -d %s co -p foo/ccc.in > foo/ccc.in
+cvs -Q -d %s co foo/ccc.in
cat("ccc.out", "foo/ccc.in")
cat("all", ["aaa.out", "bbb.out", "ccc.out"])
-cvs -Q -d %s co -p foo/sub/ddd.in > foo/sub/ddd.in
+cvs -Q -d %s co foo/sub/ddd.in
cat("foo/sub/ddd.out", "foo/sub/ddd.in")
cat("foo/sub/eee.out", "foo/sub/eee.in")
-cvs -Q -d %s co -p foo/sub/fff.in > foo/sub/fff.in
+cvs -Q -d %s co foo/sub/fff.in
cat("foo/sub/fff.out", "foo/sub/fff.in")
cat("foo/sub/all", ["foo/sub/ddd.out", "foo/sub/eee.out", "foo/sub/fff.out"])
""" % (cvsroot, cvsroot, cvsroot, cvsroot)))
@@ -116,6 +121,12 @@ test.fail_test(test.read(['work1', 'all']) != "import/aaa.in\nwork1/foo/bbb.in\n
test.fail_test(test.read(['work1', 'foo', 'sub', 'all']) != "import/sub/ddd.in\nwork1/foo/sub/eee.in\nimport/sub/fff.in\n")
+test.fail_test(not is_writable(test.workpath('work1', 'foo', 'sub', 'SConscript')))
+test.fail_test(not is_writable(test.workpath('work1', 'foo', 'aaa.in')))
+test.fail_test(not is_writable(test.workpath('work1', 'foo', 'ccc.in')))
+test.fail_test(not is_writable(test.workpath('work1', 'foo', 'sub', 'ddd.in')))
+test.fail_test(not is_writable(test.workpath('work1', 'foo', 'sub', 'fff.in')))
+
# Test CVS checkouts when the module name is specified.
test.write(['work2', 'SConstruct'], """
def cat(env, source, target):
@@ -125,8 +136,8 @@ def cat(env, source, target):
for src in source:
f.write(open(src, "rb").read())
f.close()
-env = Environment(BUILDERS={'Cat':Builder(action=cat)},
- CVSFLAGS='-q')
+env = Environment(BUILDERS={'Cat':Builder(action=cat)})
+env.Prepend(CVSFLAGS='-q ')
env.Cat('aaa.out', 'aaa.in')
env.Cat('bbb.out', 'bbb.in')
env.Cat('ccc.out', 'ccc.in')
@@ -164,4 +175,10 @@ test.fail_test(test.read(['work2', 'all']) != "import/aaa.in\nwork2/bbb.in\nimpo
test.fail_test(test.read(['work2', 'sub', 'all']) != "import/sub/ddd.in\nwork2/sub/eee.in\nimport/sub/fff.in\n")
+test.fail_test(not is_writable(test.workpath('work2', 'sub', 'SConscript')))
+test.fail_test(not is_writable(test.workpath('work2', 'aaa.in')))
+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.pass_test()
diff --git a/test/RCS.py b/test/RCS.py
index 5237156..0dfc4bc 100644
--- a/test/RCS.py
+++ b/test/RCS.py
@@ -29,6 +29,7 @@ Test fetching source files from RCS.
"""
import os.path
+import stat
import TestSCons
@@ -44,7 +45,11 @@ if not ci:
print "Could not find `ci' command, skipping test(s)."
test.pass_test(1)
-# Test explicit checkouts from local RCS files
+def is_writable(file):
+ mode = os.stat(file)[stat.ST_MODE]
+ return mode & stat.S_IWUSR
+
+# Test explicit checkouts from local RCS files.
test.subdir('work1', ['work1', 'sub'])
for file in ['aaa.in', 'bbb.in', 'ccc.in']:
@@ -86,7 +91,7 @@ def cat(env, source, target):
f.write(open(src, "rb").read())
f.close()
env = Environment(BUILDERS={'Cat':Builder(action=cat)},
- RCSFLAGS='-q')
+ RCS_COFLAGS='-q')
env.Cat('aaa.out', 'aaa.in')
env.Cat('bbb.out', 'bbb.in')
env.Cat('ccc.out', 'ccc.in')
@@ -123,6 +128,12 @@ test.fail_test(test.read(['work1', 'all']) != "work1/aaa.in\nchecked-out work1/b
test.fail_test(test.read(['work1', 'sub', 'all']) != "work1/sub/ddd.in\nchecked-out work1/sub/eee.in\nwork1/sub/fff.in\n")
+test.fail_test(is_writable(test.workpath('work1', 'sub', 'SConscript')))
+test.fail_test(is_writable(test.workpath('work1', 'aaa.in')))
+test.fail_test(is_writable(test.workpath('work1', 'ccc.in')))
+test.fail_test(is_writable(test.workpath('work1', 'sub', 'ddd.in')))
+test.fail_test(is_writable(test.workpath('work1', 'sub', 'fff.in')))
+
# Test transparent RCS checkouts from an RCS subdirectory.
test.subdir('work2', ['work2', 'RCS'],
['work2', 'sub'], ['work2', 'sub', 'RCS'])
@@ -165,8 +176,8 @@ def cat(env, source, target):
for src in source:
f.write(open(src, "rb").read())
f.close()
-env = Environment(BUILDERS={'Cat':Builder(action=cat)},
- RCSFLAGS='-q')
+_default_env['RCS_COFLAGS'] = '-l'
+env = Environment(BUILDERS={'Cat':Builder(action=cat)})
env.Cat('aaa.out', 'aaa.in')
env.Cat('bbb.out', 'bbb.in')
env.Cat('ccc.out', 'ccc.in')
@@ -181,37 +192,37 @@ test.write(['work2', 'sub', 'eee.in'], "checked-out work2/sub/eee.in\n")
test.run(chdir = 'work2',
arguments = '.',
stdout = test.wrap_stdout(read_str = """\
-co sub/SConscript
+co -l sub/SConscript
""",
build_str = """\
-co aaa.in
+co -l aaa.in
cat("aaa.out", "aaa.in")
cat("bbb.out", "bbb.in")
-co ccc.in
+co -l ccc.in
cat("ccc.out", "ccc.in")
cat("all", ["aaa.out", "bbb.out", "ccc.out"])
-co sub/ddd.in
+co -l sub/ddd.in
cat("sub/ddd.out", "sub/ddd.in")
cat("sub/eee.out", "sub/eee.in")
-co sub/fff.in
+co -l sub/fff.in
cat("sub/fff.out", "sub/fff.in")
cat("sub/all", ["sub/ddd.out", "sub/eee.out", "sub/fff.out"])
"""),
stderr = """\
sub/RCS/SConscript,v --> sub/SConscript
-revision 1.1
+revision 1.1 (locked)
done
RCS/aaa.in,v --> aaa.in
-revision 1.1
+revision 1.1 (locked)
done
RCS/ccc.in,v --> ccc.in
-revision 1.1
+revision 1.1 (locked)
done
sub/RCS/ddd.in,v --> sub/ddd.in
-revision 1.1
+revision 1.1 (locked)
done
sub/RCS/fff.in,v --> sub/fff.in
-revision 1.1
+revision 1.1 (locked)
done
""")
@@ -219,4 +230,11 @@ test.fail_test(test.read(['work2', 'all']) != "work2/aaa.in\nchecked-out work2/b
test.fail_test(test.read(['work2', 'sub', 'all']) != "work2/sub/ddd.in\nchecked-out work2/sub/eee.in\nwork2/sub/fff.in\n")
+test.fail_test(not is_writable(test.workpath('work2', 'sub', 'SConscript')))
+test.fail_test(not is_writable(test.workpath('work2', 'aaa.in')))
+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.pass_test()
diff --git a/test/SCCS.py b/test/SCCS.py
index f309c70..3194f4f 100644
--- a/test/SCCS.py
+++ b/test/SCCS.py
@@ -28,6 +28,9 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
Test fetching source files from SCCS.
"""
+import os
+import stat
+
import TestSCons
test = TestSCons.TestSCons()
@@ -37,6 +40,10 @@ if not sccs:
print "Could not find SCCS, skipping test(s)."
test.pass_test(1)
+def is_writable(file):
+ mode = os.stat(file)[stat.ST_MODE]
+ return mode & stat.S_IWUSR
+
# Test explicit checkouts from local SCCS files.
test.subdir('work1', ['work1', 'sub'])
@@ -74,7 +81,8 @@ def cat(env, source, target):
for src in source:
f.write(open(src, "rb").read())
f.close()
-env = Environment(BUILDERS={'Cat':Builder(action=cat)})
+env = Environment(BUILDERS={'Cat':Builder(action=cat)},
+ SCCSGETFLAGS='-e')
env.Cat('aaa.out', 'aaa.in')
env.Cat('bbb.out', 'bbb.in')
env.Cat('ccc.out', 'ccc.in')
@@ -90,32 +98,38 @@ test.write(['work1', 'sub', 'eee.in'], "checked-out work1/sub/eee.in\n")
test.run(chdir = 'work1',
arguments = '.',
stdout = test.wrap_stdout(read_str = """\
-sccs get sub/SConscript
+sccs get -e sub/SConscript
""",
build_str = """\
-sccs get aaa.in
+sccs get -e aaa.in
cat("aaa.out", "aaa.in")
cat("bbb.out", "bbb.in")
-sccs get ccc.in
+sccs get -e ccc.in
cat("ccc.out", "ccc.in")
cat("all", ["aaa.out", "bbb.out", "ccc.out"])
-sccs get sub/ddd.in
+sccs get -e sub/ddd.in
cat("sub/ddd.out", "sub/ddd.in")
cat("sub/eee.out", "sub/eee.in")
-sccs get sub/fff.in
+sccs get -e sub/fff.in
cat("sub/fff.out", "sub/fff.in")
cat("sub/all", ["sub/ddd.out", "sub/eee.out", "sub/fff.out"])
"""),
stderr = """\
-sub/SConscript 1.1: 5 lines
-aaa.in 1.1: 1 lines
-ccc.in 1.1: 1 lines
-sub/ddd.in 1.1: 1 lines
-sub/fff.in 1.1: 1 lines
+sub/SConscript 1.1 -> 1.2: 5 lines
+aaa.in 1.1 -> 1.2: 1 lines
+ccc.in 1.1 -> 1.2: 1 lines
+sub/ddd.in 1.1 -> 1.2: 1 lines
+sub/fff.in 1.1 -> 1.2: 1 lines
""")
test.fail_test(test.read(['work1', 'all']) != "work1/aaa.in\nchecked-out work1/bbb.in\nwork1/ccc.in\n")
+test.fail_test(not is_writable(test.workpath('work1', 'sub', 'SConscript')))
+test.fail_test(not is_writable(test.workpath('work1', 'aaa.in')))
+test.fail_test(not is_writable(test.workpath('work1', 'ccc.in')))
+test.fail_test(not is_writable(test.workpath('work1', 'sub', 'ddd.in')))
+test.fail_test(not is_writable(test.workpath('work1', 'sub', 'fff.in')))
+
# Test transparent checkouts from SCCS files in an SCCS subdirectory.
test.subdir('work2', ['work2', 'SCCS'],
['work2', 'sub'], ['work2', 'sub', 'SCCS'])
@@ -195,4 +209,10 @@ sub/fff.in 1.1: 1 lines
test.fail_test(test.read(['work2', 'all']) != "work2/aaa.in\nchecked-out work2/bbb.in\nwork2/ccc.in\n")
+test.fail_test(is_writable(test.workpath('work2', 'sub', 'SConscript')))
+test.fail_test(is_writable(test.workpath('work2', 'aaa.in')))
+test.fail_test(is_writable(test.workpath('work2', 'ccc.in')))
+test.fail_test(is_writable(test.workpath('work2', 'sub', 'ddd.in')))
+test.fail_test(is_writable(test.workpath('work2', 'sub', 'fff.in')))
+
test.pass_test()