Check out files from various source code systems properly.
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Sat, 22 Mar 2003 23:49:41 +0000 (23:49 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Sat, 22 Mar 2003 23:49:41 +0000 (23:49 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@618 fdb21ef1-2011-0410-befe-b5e4ea1792b1

doc/man/scons.1
src/engine/SCons/Node/FS.py
src/engine/SCons/Tool/BitKeeper.py
src/engine/SCons/Tool/CVS.py
src/engine/SCons/Tool/RCS.py
src/engine/SCons/Tool/SCCS.py
src/engine/SCons/Tool/Subversion.py
test/BitKeeper.py
test/CVS.py
test/RCS.py
test/SCCS.py

index bd0dce71a1d2787290d4dbe1f7d9df50022f67f7..711c0c0cff0fe088791ed2b5a0bbe23c98086615 100644 (file)
@@ -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
index 89566b2a9861283a6301ff74309b51e1eaf137d6..57fd1c29f076e5e4a546716eb98c18150689de38 100644 (file)
@@ -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
 
index 94e084fc99ad95914fc47e95fd7b8de9c882fb38..6d81eb08c84b5e0ed438cd6218c311af5ffc9a38 100644 (file)
@@ -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')
index c8b1f68c8a0137e26965f28a0c177a41f5a1b903..b8f6968411db192f8eb8c5c285e8a0a80cab5a46 100644 (file)
@@ -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')
index f6276c55c1f0355e14b4bd7c80a4e5937d258f01..2a7e9e4f0729a7397c56e49da959584079b0072f 100644 (file)
@@ -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')
index 1b5d4805e02854eca9b12c2390bf08ad4841cc73..b559feaf56c44866e2832285c0ea4c6a6627b4cd 100644 (file)
@@ -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')
index cec3eaf933d7cde58db423077bfae4e9ea9f3082..195af39779fb38f982bc335c1b8cabdb03ff34fe 100644 (file)
@@ -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')
index 0926b28f411865553f2effe493454ede663709e4..eb5c52c14a628bf9b35c67a3b6ba75d5242098f2 100644 (file)
@@ -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()
index bf1e830237235ee23794b9b8a094accd0cc3ab16..ff6963fefd5608cbbe10a9cfcbbd218f58b88fcf 100644 (file)
@@ -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()
index 52371566a083f54fd8c7ab118ca825c3b960c533..0dfc4bc0b401533f0fdcd127fac83f4408044609 100644 (file)
@@ -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()
index f309c70061945b3a7691066ea2a24d5b3e52b44c..3194f4f223ecb1dcb93656f5a97f846c1c1ef3be 100644 (file)
@@ -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()