| Index: recipe_modules/bot_update/resources/bot_update.py | 
| diff --git a/recipe_modules/bot_update/resources/bot_update.py b/recipe_modules/bot_update/resources/bot_update.py | 
| index 3211369667372e4ec45a6b52343120b69985a912..2fc8a1504decdbbe33cdfbd52782276687e60c48 100755 | 
| --- a/recipe_modules/bot_update/resources/bot_update.py | 
| +++ b/recipe_modules/bot_update/resources/bot_update.py | 
| @@ -465,6 +465,25 @@ def is_broken_repo_dir(repo_dir): | 
| return not path.exists(os.path.join(repo_dir, '.git', 'config')) | 
|  | 
|  | 
| +def _maybe_break_locks(checkout_path): | 
| +  """This removes all .lock files from this repo's .git directory. | 
| + | 
| +  In particular, this will cleanup index.lock files, as well as ref lock | 
| +  files. | 
| +  """ | 
| +  git_dir = os.path.join(checkout_path, '.git') | 
| +  for dirpath, _, filenames in os.walk(git_dir): | 
| +    for filename in filenames: | 
| +      if filename.endswith('.lock'): | 
| +        to_break = os.path.join(dirpath, filename) | 
| +        print 'breaking lock: %s' % to_break | 
| +        try: | 
| +          os.remove(to_break) | 
| +        except OSError as ex: | 
| +          print 'FAILED to break lock: %s: %s' % (to_break, ex) | 
| +          raise | 
| + | 
| + | 
| def git_checkout(solutions, revisions, shallow, refs, git_cache_dir): | 
| build_dir = os.getcwd() | 
| # Before we do anything, break all git_cache locks. | 
| @@ -518,6 +537,18 @@ def git_checkout(solutions, revisions, shallow, refs, git_cache_dir): | 
| refspec = '%s:%s' % (ref, ref.lstrip('+')) | 
| git('fetch', 'origin', refspec, cwd=sln_dir) | 
|  | 
| +        # Windows sometimes has trouble deleting files. | 
| +        # This can make git commands that rely on locks fail. | 
| +        # Try a few times in case Windows has trouble again (and again). | 
| +        if sys.platform.startswith('win'): | 
| +          tries = 3 | 
| +          while tries: | 
| +            try: | 
| +              _maybe_break_locks(sln_dir) | 
| +              break | 
| +            except Exception: | 
| +              tries -= 1 | 
| + | 
| revision = get_target_revision(name, url, revisions) or 'HEAD' | 
| force_revision(sln_dir, revision) | 
| done = True | 
|  |