684
684
'BZR_EMAIL': None,
685
685
'BZREMAIL': None, # may still be present in the environment
687
'BZR_PROGRESS_BAR': None,
688
689
self.__old_env = {}
689
690
self.addCleanup(self._restoreEnvironment)
690
691
for name, value in new_env.iteritems():
691
692
self._captureVar(name, value)
694
694
def _captureVar(self, name, newvalue):
695
"""Set an environment variable, preparing it to be reset when finished."""
696
self.__old_env[name] = os.environ.get(name, None)
698
if name in os.environ:
701
os.environ[name] = newvalue
704
def _restoreVar(name, value):
706
if name in os.environ:
709
os.environ[name] = value
695
"""Set an environment variable, and reset it when finished."""
696
self.__old_env[name] = osutils.set_or_unset_env(name, newvalue)
711
698
def _restoreEnvironment(self):
712
699
for name, value in self.__old_env.iteritems():
713
self._restoreVar(name, value)
700
osutils.set_or_unset_env(name, value)
715
702
def tearDown(self):
716
703
self._runCleanups()
891
878
variables. A value of None will unset the env variable.
892
879
The values must be strings. The change will only occur in the
893
880
child, so you don't need to fix the environment after running.
881
:param universal_newlines: Convert CRLF => LF
895
883
env_changes = kwargs.get('env_changes', {})
896
887
def cleanup_environment():
897
888
for env_var, value in env_changes.iteritems():
899
if env_var in os.environ:
900
del os.environ[env_var]
902
os.environ[env_var] = value
889
old_env[env_var] = osutils.set_or_unset_env(env_var, value)
891
def restore_environment():
892
for env_var, value in old_env.iteritems():
893
osutils.set_or_unset_env(env_var, value)
904
895
bzr_path = os.path.dirname(os.path.dirname(bzrlib.__file__))+'/bzr'
905
896
args = list(args)
906
process = Popen([sys.executable, bzr_path]+args,
907
stdout=PIPE, stderr=PIPE,
908
preexec_fn=cleanup_environment)
899
# win32 subprocess doesn't support preexec_fn
900
# so we will avoid using it on all platforms, just to
901
# make sure the code path is used, and we don't break on win32
902
cleanup_environment()
903
process = Popen([sys.executable, bzr_path]+args,
904
stdout=PIPE, stderr=PIPE)
906
restore_environment()
909
908
out = process.stdout.read()
910
909
err = process.stderr.read()
911
if kwargs.get('universal_newlines', False):
912
out = out.replace('\r\n', '\n')
913
err = err.replace('\r\n', '\n')
911
915
retcode = process.wait()
912
916
supplied_retcode = kwargs.get('retcode', 0)
913
917
if supplied_retcode is not None: