| Index: git_cache.py
|
| diff --git a/git_cache.py b/git_cache.py
|
| index 52e42c59274781f580491428b67afa4d6bf66280..9b7082ba9b660b0f8ec7d153d12ae02fea017277 100755
|
| --- a/git_cache.py
|
| +++ b/git_cache.py
|
| @@ -28,6 +28,7 @@ except NameError:
|
| class WinErr(Exception):
|
| pass
|
|
|
| +
|
| class LockError(Exception):
|
| pass
|
|
|
| @@ -151,6 +152,30 @@ class Mirror(object):
|
| self.mirror_path = os.path.join(self.GetCachePath(), self.basedir)
|
| self.print = print_func or print
|
|
|
| + @classmethod
|
| + def from_repo(cls, path=None):
|
| + """Returns Mirror if path is in a cached repo, else None."""
|
| + args = ['-C', path] if path else []
|
| + args = [cls.git_exe] + args + ['rev-parse', '--git-dir']
|
| + git_path = subprocess.check_output(args).strip()
|
| + alt_path = os.path.join(git_path, 'objects', 'info', 'alternates')
|
| +
|
| + if os.path.exists(alt_path):
|
| + with open(alt_path, 'rb') as alt:
|
| + mirror_path = alt.read().strip()
|
| + mirror_path = os.path.dirname(mirror_path)
|
| + cache_path = os.path.dirname(mirror_path)
|
| + if os.path.exists(mirror_path):
|
| + url = subprocess.check_output(
|
| + [cls.git_exe, '-C', mirror_path, 'config', 'remote.origin.url']
|
| + ).strip()
|
| +
|
| + # TODO(iannucci): cache_path should NOT be a class attribute. Maybe
|
| + # a `default_cache_path`, but not the actual path.
|
| + cls.SetCachePath(cache_path)
|
| +
|
| + return cls(url)
|
| +
|
| @staticmethod
|
| def UrlToCacheDir(url):
|
| """Convert a git url to a normalized form for the cache dir path."""
|
| @@ -222,7 +247,7 @@ class Mirror(object):
|
| refspec = '+refs/%s/*:refs/%s/*' % (ref, ref)
|
| self.RunGit(['config', '--add', 'remote.origin.fetch', refspec], cwd=cwd)
|
|
|
| - def bootstrap_repo(self, directory):
|
| + def bootstrap_repo(self, directory, verbose):
|
| """Bootstrap the repo from Google Stroage if possible."""
|
|
|
| python_fallback = False
|
| @@ -248,8 +273,10 @@ class Mirror(object):
|
| # Download zip file to a temporary directory.
|
| try:
|
| tempdir = tempfile.mkdtemp()
|
| - self.print('Downloading %s' % latest_checkout)
|
| - code, out, err = gsutil.check_call('cp', latest_checkout, tempdir)
|
| + if not verbose:
|
| + self.print('Downloading %s' % latest_checkout)
|
| + code, out, err = gsutil.check_call('cp', latest_checkout, tempdir,
|
| + verbose=verbose)
|
| if code:
|
| self.print('%s\n%s' % (out, err))
|
| return False
|
| @@ -287,7 +314,7 @@ class Mirror(object):
|
| return os.path.isfile(os.path.join(self.mirror_path, 'config'))
|
|
|
| def populate(self, depth=None, shallow=False, bootstrap=False,
|
| - verbose=False):
|
| + verbose=False, fetch_specs=()):
|
| if shallow and not depth:
|
| depth = 10000
|
| gclient_utils.safe_makedirs(self.GetCachePath())
|
| @@ -308,7 +335,8 @@ class Mirror(object):
|
| gclient_utils.rmtree(self.mirror_path)
|
| tempdir = tempfile.mkdtemp(
|
| suffix=self.basedir, dir=self.GetCachePath())
|
| - bootstrapped = not depth and bootstrap and self.bootstrap_repo(tempdir)
|
| + bootstrapped = (not depth and bootstrap and
|
| + self.bootstrap_repo(tempdir, verbose))
|
| if not bootstrapped:
|
| self.RunGit(['init', '--bare'], cwd=tempdir)
|
| else:
|
| @@ -320,7 +348,7 @@ class Mirror(object):
|
| rundir = tempdir or self.mirror_path
|
| self.config(rundir)
|
| fetch_cmd = ['fetch'] + v + d + ['origin']
|
| - fetch_specs = subprocess.check_output(
|
| + fetch_specs = fetch_specs or subprocess.check_output(
|
| [self.git_exe, 'config', '--get-all', 'remote.origin.fetch'],
|
| cwd=rundir).strip().splitlines()
|
| for spec in fetch_specs:
|
|
|