689
689
'BZR_EMAIL': None,
690
690
'BZREMAIL': None, # may still be present in the environment
692
'BZR_PROGRESS_BAR': None,
693
694
self.__old_env = {}
694
695
self.addCleanup(self._restoreEnvironment)
695
696
for name, value in new_env.iteritems():
696
697
self._captureVar(name, value)
699
699
def _captureVar(self, name, newvalue):
700
"""Set an environment variable, preparing it to be reset when finished."""
701
self.__old_env[name] = os.environ.get(name, None)
703
if name in os.environ:
706
os.environ[name] = newvalue
709
def _restoreVar(name, value):
711
if name in os.environ:
714
os.environ[name] = value
700
"""Set an environment variable, and reset it when finished."""
701
self.__old_env[name] = osutils.set_or_unset_env(name, newvalue)
716
703
def _restoreEnvironment(self):
717
704
for name, value in self.__old_env.iteritems():
718
self._restoreVar(name, value)
705
osutils.set_or_unset_env(name, value)
720
707
def tearDown(self):
721
708
self._runCleanups()
896
883
variables. A value of None will unset the env variable.
897
884
The values must be strings. The change will only occur in the
898
885
child, so you don't need to fix the environment after running.
886
:param universal_newlines: Convert CRLF => LF
900
888
env_changes = kwargs.get('env_changes', {})
901
892
def cleanup_environment():
902
893
for env_var, value in env_changes.iteritems():
904
del os.environ[env_var]
906
os.environ[env_var] = value
894
old_env[env_var] = osutils.set_or_unset_env(env_var, value)
896
def restore_environment():
897
for env_var, value in old_env.iteritems():
898
osutils.set_or_unset_env(env_var, value)
908
900
bzr_path = os.path.dirname(os.path.dirname(bzrlib.__file__))+'/bzr'
909
901
args = list(args)
910
process = Popen([sys.executable, bzr_path]+args,
911
stdout=PIPE, stderr=PIPE,
912
preexec_fn=cleanup_environment)
904
# win32 subprocess doesn't support preexec_fn
905
# so we will avoid using it on all platforms, just to
906
# make sure the code path is used, and we don't break on win32
907
cleanup_environment()
908
process = Popen([sys.executable, bzr_path]+args,
909
stdout=PIPE, stderr=PIPE)
911
restore_environment()
913
913
out = process.stdout.read()
914
914
err = process.stderr.read()
916
if kwargs.get('universal_newlines', False):
917
out = out.replace('\r\n', '\n')
918
err = err.replace('\r\n', '\n')
915
920
retcode = process.wait()
916
921
supplied_retcode = kwargs.get('retcode', 0)
917
922
if supplied_retcode is not None:
1059
self.test_dir = candidate_dir
1064
os.mkdir(candidate_dir)
1065
self.test_home_dir = candidate_dir + '/home'
1066
os.mkdir(self.test_home_dir)
1067
self.test_dir = candidate_dir + '/work'
1060
1068
os.mkdir(self.test_dir)
1061
1069
os.chdir(self.test_dir)
1063
os.environ['HOME'] = self.test_dir
1064
os.environ['APPDATA'] = self.test_dir
1071
os.environ['HOME'] = self.test_home_dir
1072
os.environ['APPDATA'] = self.test_home_dir
1065
1073
def _leaveDirectory():
1066
1074
os.chdir(_currentdir)
1067
1075
self.addCleanup(_leaveDirectory)
1106
1114
# On jam's machine, make_kernel_like_tree is:
1107
1115
# put: 4.5-7.5s (averaging 6s)
1108
1116
# append: 2.9-4.5s
1109
transport.append(urlutils.escape(name), StringIO(content))
1117
# put_non_atomic: 2.9-4.5s
1118
transport.put_bytes_non_atomic(urlutils.escape(name), content)
1111
1120
def build_tree_contents(self, shape):
1112
1121
build_tree_contents(shape)