| Index: win_toolchain/get_toolchain_if_necessary.py | 
| diff --git a/win_toolchain/get_toolchain_if_necessary.py b/win_toolchain/get_toolchain_if_necessary.py | 
| index c41ccc5a1f9c720c9f59f956f9c66afab4ef0284..0a589ec7d4551c000f081f7e14d55baac7d3788f 100755 | 
| --- a/win_toolchain/get_toolchain_if_necessary.py | 
| +++ b/win_toolchain/get_toolchain_if_necessary.py | 
| @@ -128,7 +128,7 @@ def HaveSrcInternalAccess(): | 
| def LooksLikeGoogler(): | 
| """Checks for a USERDOMAIN environment variable of 'GOOGLE', which | 
| probably implies the current user is a Googler.""" | 
| -  return os.environ.get('USERDOMAIN').upper() == 'GOOGLE' | 
| +  return os.environ.get('USERDOMAIN', '').upper() == 'GOOGLE' | 
|  | 
|  | 
| def CanAccessToolchainBucket(): | 
| @@ -190,6 +190,15 @@ def DownloadUsingGsutil(filename): | 
| return temp_dir, target_path | 
|  | 
|  | 
| +def RmDir(path): | 
| +  """Deletes path and all the files it contains.""" | 
| +  if sys.platform != 'win32': | 
| +    shutil.rmtree(path, ignore_errors=True) | 
| +  else: | 
| +    # shutil.rmtree() doesn't delete read-only files on Windows. | 
| +    subprocess.check_call('rmdir /s/q "%s"' % path, shell=True) | 
| + | 
| + | 
| def DoTreeMirror(target_dir, tree_sha1): | 
| """In order to save temporary space on bots that do not have enough space to | 
| download ISOs, unpack them, and copy to the target location, the whole tree | 
| @@ -200,7 +209,7 @@ def DoTreeMirror(target_dir, tree_sha1): | 
| with zipfile.ZipFile(local_zip, 'r', zipfile.ZIP_DEFLATED, True) as zf: | 
| zf.extractall(target_dir) | 
| if temp_dir: | 
| -    subprocess.check_call('rmdir /s/q "%s"' % temp_dir, shell=True) | 
| +    RmDir(temp_dir) | 
|  | 
|  | 
| def main(): | 
| @@ -222,6 +231,7 @@ def main(): | 
| cmd.extend(['--output-json', winpath(options.output_json)]) | 
| cmd.extend(args) | 
| sys.exit(subprocess.call(cmd)) | 
| +  assert sys.platform != 'cygwin' | 
|  | 
| # We assume that the Pro hash is the first one. | 
| desired_hashes = args | 
| @@ -263,12 +273,13 @@ def main(): | 
| print('  desired_hashes: %s' % ', '.join(desired_hashes)) | 
| sys.stdout.flush() | 
| DelayBeforeRemoving(target_dir) | 
| -    # This stays resident and will make the rmdir below fail. | 
| -    with open(os.devnull, 'wb') as nul: | 
| -      subprocess.call(['taskkill', '/f', '/im', 'mspdbsrv.exe'], | 
| -                      stdin=nul, stdout=nul, stderr=nul) | 
| +    if sys.platform == 'win32': | 
| +      # This stays resident and will make the rmdir below fail. | 
| +      with open(os.devnull, 'wb') as nul: | 
| +        subprocess.call(['taskkill', '/f', '/im', 'mspdbsrv.exe'], | 
| +                        stdin=nul, stdout=nul, stderr=nul) | 
| if os.path.isdir(target_dir): | 
| -      subprocess.check_call('rmdir /s/q "%s"' % target_dir, shell=True) | 
| +      RmDir(target_dir) | 
|  | 
| DoTreeMirror(target_dir, desired_hashes[0]) | 
|  | 
|  |