Index: git_cache.py |
diff --git a/git_cache.py b/git_cache.py |
index 9ade6746363eb9455327ec97483fa7581ab950d6..92332808fe0758d46cd4a8170667280a16051926 100755 |
--- a/git_cache.py |
+++ b/git_cache.py |
@@ -22,6 +22,9 @@ from download_from_google_storage import Gsutil |
import gclient_utils |
import subcommand |
+# Analogous to gc.autopacklimit git config. |
+GC_AUTOPACKLIMIT = 50 |
+ |
try: |
# pylint: disable=E0602 |
WinErr = WindowsError |
@@ -226,8 +229,20 @@ class Mirror(object): |
def config(self, cwd=None): |
if cwd is None: |
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) |
+ |
+ # 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 |
+ # not stuck. |
+ self.RunGit(['config', 'gc.autopacklimit', '0'], cwd=cwd) |
+ |
+ # Allocate more RAM for cache-ing delta chains, for better performance |
+ # of "Resolving deltas". |
self.RunGit(['config', 'core.deltaBaseCacheLimit', |
gclient_utils.DefaultDeltaBaseCacheLimit()], cwd=cwd) |
+ |
self.RunGit(['config', 'remote.origin.url', self.url], cwd=cwd) |
self.RunGit(['config', '--replace-all', 'remote.origin.fetch', |
'+refs/heads/*:refs/heads/*'], cwd=cwd) |
@@ -319,13 +334,32 @@ class Mirror(object): |
with Lockfile(self.mirror_path): |
# Setup from scratch if the repo is new or is in a bad state. |
tempdir = None |
- if not os.path.exists(os.path.join(self.mirror_path, 'config')): |
- gclient_utils.rmtree(self.mirror_path) |
+ config_file = os.path.join(self.mirror_path, 'config') |
+ pack_dir = os.path.join(self.mirror_path, 'objects', 'pack') |
+ pack_files = [] |
+ if os.path.isdir(pack_dir): |
+ pack_files = [f for f in os.listdir(pack_dir) if f.endswith('.pack')] |
+ |
+ should_bootstrap = (not os.path.exists(config_file) or |
+ len(pack_files) > GC_AUTOPACKLIMIT) |
+ if should_bootstrap: |
tempdir = tempfile.mkdtemp( |
suffix=self.basedir, dir=self.GetCachePath()) |
bootstrapped = not depth and bootstrap and self.bootstrap_repo(tempdir) |
- if not bootstrapped: |
+ if bootstrapped: |
+ # Bootstrap succeeded; delete previous cache, if any. |
+ gclient_utils.rmtree(self.mirror_path) |
+ elif not os.path.exists(config_file): |
+ # Bootstrap failed, no previous cache; start with a bare git dir. |
self.RunGit(['init', '--bare'], cwd=tempdir) |
+ else: |
+ # Bootstrap failed, previous cache exists; warn and continue. |
+ logging.warn( |
+ 'Git cache has a lot of pack files (%d). Tried to re-bootstrap ' |
+ 'but failed. Continuing with non-optimized repository.' |
+ % len(pack_files)) |
+ gclient_utils.rmtree(tempdir) |
+ tempdir = None |
else: |
if depth and os.path.exists(os.path.join(self.mirror_path, 'shallow')): |
logging.warn( |