diff options
author | Steven Knight <knight@baldmt.com> | 2003-03-30 16:55:46 (GMT) |
---|---|---|
committer | Steven Knight <knight@baldmt.com> | 2003-03-30 16:55:46 (GMT) |
commit | 786aa89ee387927f0ef142f3328b3c0eebb1da5a (patch) | |
tree | 8e8f86ec954f00dfba25179cb0257db9369c3b66 /src/engine | |
parent | d3ce17c54525be85011f667f584611cc02ee9a11 (diff) | |
download | SCons-786aa89ee387927f0ef142f3328b3c0eebb1da5a.zip SCons-786aa89ee387927f0ef142f3328b3c0eebb1da5a.tar.gz SCons-786aa89ee387927f0ef142f3328b3c0eebb1da5a.tar.bz2 |
Fix a bug when BuildDir(duplicate=0) is used with multiple SConscript files. (Charles Crain)
Diffstat (limited to 'src/engine')
-rw-r--r-- | src/engine/SCons/Node/FS.py | 20 | ||||
-rw-r--r-- | src/engine/SCons/Node/FSTests.py | 8 | ||||
-rw-r--r-- | src/engine/SCons/Script/SConscript.py | 20 | ||||
-rw-r--r-- | src/engine/SCons/Tool/Perforce.py | 13 |
4 files changed, 42 insertions, 19 deletions
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index 0afc3d8..f380f7e 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -557,10 +557,15 @@ class FS: to match. """ self.__setTopLevelDir() - if not dir is None: - self._cwd = dir - if change_os_dir: - os.chdir(dir.abspath) + curr=self._cwd + try: + if not dir is None: + self._cwd = dir + if change_os_dir: + os.chdir(dir.abspath) + except: + self._cwd = curr + raise def Entry(self, name, directory = None, create = 1, klass=None): """Lookup or create a generic Entry node with the specified name. @@ -640,6 +645,13 @@ class FS: n = self.__doLookup(clazz, name, d) if n.exists(): return n + if isinstance(n, Dir): + # If n is a Directory that has Repositories directly + # attached to it, then any of those is a valid Repository + # path. Return the first one that exists. + reps = filter(lambda x: x.exists(), n.getRepositories()) + if len(reps): + return reps[0] d = n.get_dir() name = n.name # Search repositories of all directories that this file is under. diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py index 0bba0ed..7836a13 100644 --- a/src/engine/SCons/Node/FSTests.py +++ b/src/engine/SCons/Node/FSTests.py @@ -378,6 +378,14 @@ class BuildDirTestCase(unittest.TestCase): test.unlink( "src/foo" ) test.unlink( "build/foo" ) + # Test against a former bug. Make sure we can get a repository + # path for the build directory itself! + fs=SCons.Node.FS.FS(test.workpath('work')) + test.subdir('work') + fs.BuildDir('build/var3', 'src', duplicate=0) + d1 = fs.Dir('build/var3') + assert d1.rdir() == fs.Dir('src'), str(d1.rdir()) + # verify the link creation attempts in file_link() class LinkSimulator : """A class to intercept os.[sym]link() calls and track them.""" diff --git a/src/engine/SCons/Script/SConscript.py b/src/engine/SCons/Script/SConscript.py index df86853..c0d82ce 100644 --- a/src/engine/SCons/Script/SConscript.py +++ b/src/engine/SCons/Script/SConscript.py @@ -191,7 +191,6 @@ def SConscript(*ls, **kw): results = [] for fn in files: stack.append(Frame(exports)) - old_dir = None old_sys_path = sys.path try: if fn == "-": @@ -202,7 +201,6 @@ def SConscript(*ls, **kw): else: f = default_fs.File(str(fn)) _file_ = None - old_dir = default_fs.getcwd() # Change directory to the top of the source # tree to make sure the os's cwd and the cwd of @@ -242,6 +240,7 @@ def SConscript(*ls, **kw): # default_fs.chdir(), because we still need to # interpret the stuff within the SConscript file # relative to where we are logically. + default_fs.chdir(ldir, change_os_dir=0) os.chdir(f.rfile().dir.abspath) # Append the SConscript directory to the beginning @@ -263,15 +262,14 @@ def SConscript(*ls, **kw): finally: sys.path = old_sys_path frame = stack.pop() - default_fs.chdir(frame.prev_dir) - if old_dir: - try: - default_fs.chdir(old_dir, change_os_dir=sconscript_chdir) - except OSError: - # There was no local directory, so chdir to the - # Repository directory. Like above, we do this - # directly. - os.chdir(old_dir.rdir().abspath) + try: + default_fs.chdir(frame.prev_dir, change_os_dir=sconscript_chdir) + except OSError: + # There was no local directory, so chdir to the + # Repository directory. Like above, we do this + # directly. + default_fs.chdir(frame.prev_dir, change_os_dir=0) + os.chdir(frame.prev_dir.rdir().abspath) results.append(frame.retval) diff --git a/src/engine/SCons/Tool/Perforce.py b/src/engine/SCons/Tool/Perforce.py index 7c1a2a7..2f9fb88 100644 --- a/src/engine/SCons/Tool/Perforce.py +++ b/src/engine/SCons/Tool/Perforce.py @@ -79,10 +79,15 @@ def generate(env, platform): if SCons.Util.can_read_reg: # If we can read the registry, add the path to Perforce to our environment. - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Perforce\\environment') - val, tok = SCons.Util.RegQueryValueEx(k, 'P4INSTROOT') - addPathIfNotExists(environ, 'PATH', val) + try: + k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, + 'Software\\Perforce\\environment') + val, tok = SCons.Util.RegQueryValueEx(k, 'P4INSTROOT') + addPathIfNotExists(environ, 'PATH', val) + except SCons.Util.RegError: + # Can't detect where Perforce is, hope the user has it set in the + # PATH. + pass def exists(env): return env.Detect('p4') |