Reland: git_cache.py: Clobber git repos if the config is corrupt

Reland of: https://codereview.chromium.org/2049463003/

See https://build.chromium.org/p/tryserver.chromium.win/builders/win10_chromium_x64_rel_ng_exp/builds/1801/steps/bot_update/logs/stdio
[Mirror] https://luci-logdog.appspot.com/v/?s=chromium%2Fbb%2Ftryserver.chromium.win%2Fwin10_chromium_x64_rel_ng_exp%2F1801%2F%2B%2Frecipes%2Fsteps%2Fbot_update%2F0%2Fstdout

Sometimes repos become corrupt and bot_update fails spectacularly.  This usually happens due to the process being interrupted during a fetch. Git
cache should be able to recover from this by clobbering.

BUG=

Review-Url: https://codereview.chromium.org/2045243004
diff --git a/git_cache.py b/git_cache.py
index 753ccde..60dfa1c 100755
--- a/git_cache.py
+++ b/git_cache.py
@@ -38,7 +38,7 @@
 class LockError(Exception):
   pass
 
-class RefsHeadsFailedToFetch(Exception):
+class ClobberNeeded(Exception):
   pass
 
 class Lockfile(object):
@@ -246,7 +246,11 @@
       cwd = self.mirror_path
 
     # Don't run git-gc in a daemon.  Bad things can happen if it gets killed.
-    self.RunGit(['config', 'gc.autodetach', '0'], cwd=cwd)
+    try:
+      self.RunGit(['config', 'gc.autodetach', '0'], cwd=cwd)
+    except subprocess.CalledProcessError:
+      # Hard error, need to clobber.
+      raise ClobberNeeded()
 
     # Don't combine pack files into one big pack file.  It's really slow for
     # repositories, and there's no way to track progress and make sure it's
@@ -407,7 +411,7 @@
         self.RunGit(fetch_cmd + [spec], cwd=rundir, retry=True)
       except subprocess.CalledProcessError:
         if spec == '+refs/heads/*:refs/heads/*':
-          raise RefsHeadsFailedToFetch
+          raise ClobberNeeded()  # Corrupted cache.
         logging.warn('Fetch of %s failed' % spec)
 
   def populate(self, depth=None, shallow=False, bootstrap=False,
@@ -426,7 +430,7 @@
       tempdir = self._ensure_bootstrapped(depth, bootstrap)
       rundir = tempdir or self.mirror_path
       self._fetch(rundir, verbose, depth)
-    except RefsHeadsFailedToFetch:
+    except ClobberNeeded:
       # This is a major failure, we need to clean and force a bootstrap.
       gclient_utils.rmtree(rundir)
       self.print(GIT_CACHE_CORRUPT_MESSAGE)