| Index: gclient_scm.py
|
| diff --git a/gclient_scm.py b/gclient_scm.py
|
| index 0389f466203b86413e0253ab9095d4cd422fe8ad..238122fce653903fd38b9ab28d93d1030dc0fed7 100644
|
| --- a/gclient_scm.py
|
| +++ b/gclient_scm.py
|
| @@ -4,14 +4,12 @@
|
|
|
| """Gclient-specific SCM-specific operations."""
|
|
|
| -import collections
|
| import logging
|
| import os
|
| import posixpath
|
| import re
|
| import sys
|
| import tempfile
|
| -import threading
|
| import traceback
|
| import urlparse
|
|
|
| @@ -148,9 +146,6 @@ class GitWrapper(SCMWrapper):
|
| remote = 'origin'
|
|
|
| cache_dir = None
|
| - # If a given cache is used in a solution more than once, prevent multiple
|
| - # threads from updating it simultaneously.
|
| - cache_locks = collections.defaultdict(threading.Lock)
|
|
|
| def __init__(self, url=None, root_dir=None, relpath=None):
|
| """Removes 'git+' fake prefix from git URL."""
|
| @@ -352,10 +347,6 @@ class GitWrapper(SCMWrapper):
|
| self._FetchAndReset(revision, file_list, options)
|
| return_early = True
|
|
|
| - # Need to do this in the normal path as well as in the post-remote-switch
|
| - # path.
|
| - self._PossiblySwitchCache(url, options)
|
| -
|
| if return_early:
|
| return self._Capture(['rev-parse', '--verify', 'HEAD'])
|
|
|
| @@ -681,54 +672,6 @@ class GitWrapper(SCMWrapper):
|
| base_url = self.url
|
| return base_url[:base_url.rfind('/')] + url
|
|
|
| - @staticmethod
|
| - def _NormalizeGitURL(url):
|
| - '''Takes a git url, strips the scheme, and ensures it ends with '.git'.'''
|
| - idx = url.find('://')
|
| - if idx != -1:
|
| - url = url[idx+3:]
|
| - if not url.endswith('.git'):
|
| - url += '.git'
|
| - return url
|
| -
|
| - def _PossiblySwitchCache(self, url, options):
|
| - """Handles switching a repo from with-cache to direct, or vice versa.
|
| -
|
| - When we go from direct to with-cache, the remote url changes from the
|
| - 'real' url to the local file url (in cache_dir). Therefore, this function
|
| - assumes that |url| points to the correctly-switched-over local file url, if
|
| - we're in cache_mode.
|
| -
|
| - When we go from with-cache to direct, assume that the normal url-switching
|
| - code already flipped the remote over, and we just need to repack and break
|
| - the dependency to the cache.
|
| - """
|
| -
|
| - altfile = os.path.join(
|
| - self.checkout_path, '.git', 'objects', 'info', 'alternates')
|
| - if self.cache_dir:
|
| - if not os.path.exists(altfile):
|
| - try:
|
| - with open(altfile, 'w') as f:
|
| - f.write(os.path.join(url, 'objects'))
|
| - # pylint: disable=C0301
|
| - # This dance is necessary according to emperical evidence, also at:
|
| - # http://lists-archives.com/git/713652-retrospectively-add-alternates-to-a-repository.html
|
| - self._Run(['repack', '-ad'], options)
|
| - self._Run(['repack', '-adl'], options)
|
| - except Exception:
|
| - # If something goes wrong, try to remove the altfile so we'll go down
|
| - # this path again next time.
|
| - try:
|
| - os.remove(altfile)
|
| - except OSError as e:
|
| - print >> sys.stderr, "FAILED: os.remove('%s') -> %s" % (altfile, e)
|
| - raise
|
| - else:
|
| - if os.path.exists(altfile):
|
| - self._Run(['repack', '-a'], options)
|
| - os.remove(altfile)
|
| -
|
| def _CreateOrUpdateCache(self, url, options):
|
| """Make a new git mirror or update existing mirror for |url|, and return the
|
| mirror URI to clone from.
|
| @@ -737,60 +680,12 @@ class GitWrapper(SCMWrapper):
|
| """
|
| if not self.cache_dir:
|
| return url
|
| -
|
| - # Replace - with -- to avoid ambiguity. / with - to flatten folder structure
|
| - folder = os.path.join(
|
| - self.cache_dir,
|
| - self._NormalizeGitURL(url).replace('-', '--').replace('/', '-'))
|
| - altfile = os.path.join(folder, 'objects', 'info', 'alternates')
|
| -
|
| - # If we're bringing an old cache up to date or cloning a new cache, and the
|
| - # existing repo is currently a direct clone, use its objects to help out
|
| - # the fetch here.
|
| - checkout_objects = os.path.join(self.checkout_path, '.git', 'objects')
|
| - checkout_altfile = os.path.join(checkout_objects, 'info', 'alternates')
|
| - use_reference = (
|
| - os.path.exists(checkout_objects) and
|
| - not os.path.exists(checkout_altfile))
|
| -
|
| v = ['-v'] if options.verbose else []
|
| - filter_fn = lambda l: '[up to date]' not in l
|
| - with self.cache_locks[folder]:
|
| - gclient_utils.safe_makedirs(self.cache_dir)
|
| - if not os.path.exists(os.path.join(folder, 'config')):
|
| - gclient_utils.rmtree(folder)
|
| - cmd = ['clone'] + v + ['-c', 'core.deltaBaseCacheLimit=2g',
|
| - '--progress', '--bare']
|
| -
|
| - if use_reference:
|
| - cmd += ['--reference', os.path.abspath(self.checkout_path)]
|
| -
|
| - self._Run(cmd + [url, folder],
|
| - options, filter_fn=filter_fn, cwd=self.cache_dir, retry=True)
|
| - else:
|
| - # For now, assert that host/path/to/repo.git is identical. We may want
|
| - # to relax this restriction in the future to allow for smarter cache
|
| - # repo update schemes (such as pulling the same repo, but from a
|
| - # different host).
|
| - existing_url = self._Capture(['config', 'remote.%s.url' % self.remote],
|
| - cwd=folder)
|
| - assert self._NormalizeGitURL(existing_url) == self._NormalizeGitURL(url)
|
| -
|
| - if use_reference:
|
| - with open(altfile, 'w') as f:
|
| - f.write(os.path.abspath(checkout_objects))
|
| -
|
| - # Would normally use `git remote update`, but it doesn't support
|
| - # --progress, so use fetch instead.
|
| - self._Run(['fetch'] + v + ['--multiple', '--progress', '--all'],
|
| - options, filter_fn=filter_fn, cwd=folder, retry=True)
|
| -
|
| - # If the clone has an object dependency on the existing repo, break it
|
| - # with repack and remove the linkage.
|
| - if os.path.exists(altfile):
|
| - self._Run(['repack', '-a'], options, cwd=folder)
|
| - os.remove(altfile)
|
| - return folder
|
| + self._Run(['cache', 'populate'] + v +
|
| + ['--shallow', '--cache-dir', self.cache_dir, url],
|
| + options, cwd=self._root_dir, retry=True)
|
| + return self._Run(['cache', 'exists', '--cache-dir', self.cache_dir, url],
|
| + options).strip()
|
|
|
| def _Clone(self, revision, url, options):
|
| """Clone a git repository from the given URL.
|
| @@ -1044,7 +939,7 @@ class GitWrapper(SCMWrapper):
|
| stdout = kwargs.get('stdout', sys.stdout)
|
| stdout.write('\n________ running \'git %s\' in \'%s\'\n' % (
|
| ' '.join(args), kwargs['cwd']))
|
| - gclient_utils.CheckCallAndFilter(['git'] + args, **kwargs)
|
| + return gclient_utils.CheckCallAndFilter(['git'] + args, **kwargs)
|
|
|
|
|
| class SVNWrapper(SCMWrapper):
|
|
|