| Index: tools/win/toolchain/get_toolchain_if_necessary.py
 | 
| diff --git a/tools/win/toolchain/get_toolchain_if_necessary.py b/tools/win/toolchain/get_toolchain_if_necessary.py
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..e93e6f029fa4352b3f9d39ec5242c25d18df6f97
 | 
| --- /dev/null
 | 
| +++ b/tools/win/toolchain/get_toolchain_if_necessary.py
 | 
| @@ -0,0 +1,75 @@
 | 
| +# Copyright 2013 The Chromium Authors. All rights reserved.
 | 
| +# Use of this source code is governed by a BSD-style license that can be
 | 
| +# found in the LICENSE file.
 | 
| +
 | 
| +import hashlib
 | 
| +import os
 | 
| +import subprocess
 | 
| +import sys
 | 
| +
 | 
| +
 | 
| +BASEDIR = os.path.dirname(os.path.abspath(__file__))
 | 
| +
 | 
| +
 | 
| +def CalculateHash(root):
 | 
| +  """Calculates the sha1 of the paths to all files in the given |root| and the
 | 
| +  contents of those files, and returns as a hex string."""
 | 
| +  assert not os.path.isabs(root)
 | 
| +  assert os.path.normpath(root) == root
 | 
| +  digest = hashlib.sha1()
 | 
| +  count = 0
 | 
| +  for root, dirs, files in os.walk(root):
 | 
| +    dirs.sort()
 | 
| +    for name in sorted(f.lower() for f in files):
 | 
| +      path = os.path.join(root, name)
 | 
| +      digest.update(path.lower())
 | 
| +      with open(path, 'rb') as f:
 | 
| +        digest.update(f.read())
 | 
| +  return digest.hexdigest()
 | 
| +
 | 
| +
 | 
| +def main():
 | 
| +  if sys.platform not in ('win32', 'cygwin'):
 | 
| +    return 0
 | 
| +
 | 
| +  if len(sys.argv) != 1:
 | 
| +    print >> sys.stderr, 'Unexpected arguments.'
 | 
| +    return 1
 | 
| +
 | 
| +  # Move to same location as .gclient. This is a no-op when run via gclient.
 | 
| +  os.chdir(os.path.normpath(os.path.join(BASEDIR, '..\\..\\..\\..')))
 | 
| +  toolchain_dir = 'src\\third_party\\win_toolchain'
 | 
| +  target_dir = os.path.join(toolchain_dir, 'files')
 | 
| +
 | 
| +  sha1path = os.path.join(toolchain_dir, 'toolchain.sha1')
 | 
| +  desired_hash = ''
 | 
| +  if os.path.isfile(sha1path):
 | 
| +    with open(sha1path, 'rb') as f:
 | 
| +      desired_hash = f.read().strip()
 | 
| +
 | 
| +  # If the current hash doesn't match what we want in the file, nuke and pave.
 | 
| +  # Note that this script is only run when a .sha1 file is updated (per DEPS)
 | 
| +  # so this relatively expensive step of hashing everything only happens when
 | 
| +  # the toolchain is updated.
 | 
| +  current_hash = CalculateHash(target_dir)
 | 
| +  if current_hash != desired_hash:
 | 
| +    print 'Windows toolchain out of date or doesn\'t exist, updating...'
 | 
| +    if os.path.isdir(target_dir):
 | 
| +      subprocess.check_call('rmdir /s/q "%s"' % target_dir, shell=True)
 | 
| +    subprocess.check_call([
 | 
| +        sys.executable,
 | 
| +        'src\\tools\\win\\toolchain\\toolchain2013.py',
 | 
| +        '--targetdir', target_dir])
 | 
| +
 | 
| +  current_hash = CalculateHash(target_dir)
 | 
| +  if current_hash != desired_hash:
 | 
| +    print >> sys.stderr, (
 | 
| +        'Got wrong hash after pulling a new toolchain. '
 | 
| +        'Wanted \'%s\', got \'%s\'.' % (
 | 
| +            desired_hash, current_hash))
 | 
| +    return 1
 | 
| +  return 0
 | 
| +
 | 
| +
 | 
| +if __name__ == '__main__':
 | 
| +  sys.exit(main())
 | 
| 
 |