| Index: repo | 
| =================================================================== | 
| --- repo	(revision 109734) | 
| +++ repo	(working copy) | 
| @@ -2,7 +2,7 @@ | 
|  | 
| ## repo default configuration | 
| ## | 
| -REPO_URL='http://git.chromium.org/external/repo.git' | 
| +REPO_URL='https://code.google.com/p/git-repo/' | 
| REPO_REV='stable' | 
|  | 
| # Copyright (C) 2008 Google Inc. | 
| @@ -28,7 +28,7 @@ | 
| del magic | 
|  | 
| # increment this whenever we make important changes to this script | 
| -VERSION = (1, 11) | 
| +VERSION = (1, 13) | 
|  | 
| # increment this if the MAINTAINER_KEYS block is modified | 
| KEYRING_VERSION = (1,0) | 
| @@ -91,6 +91,7 @@ | 
| import readline | 
| import subprocess | 
| import sys | 
| +import urllib2 | 
|  | 
| home_dot_repo = os.path.expanduser('~/.repoconfig') | 
| gpg_dir = os.path.join(home_dot_repo, 'gnupg') | 
| @@ -187,10 +188,6 @@ | 
| else: | 
| can_verify = True | 
|  | 
| -    if not opt.quiet: | 
| -      print >>sys.stderr, 'Getting repo ...' | 
| -      print >>sys.stderr, '   from %s' % url | 
| - | 
| dst = os.path.abspath(os.path.join(repodir, S_repo)) | 
| _Clone(url, dst, opt.quiet) | 
|  | 
| @@ -300,15 +297,42 @@ | 
| raise CloneFailure() | 
|  | 
|  | 
| -def _Fetch(local, quiet, *args): | 
| +def _InitHttp(): | 
| +  handlers = [] | 
| + | 
| +  mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() | 
| +  try: | 
| +    import netrc | 
| +    n = netrc.netrc() | 
| +    for host in n.hosts: | 
| +      p = n.hosts[host] | 
| +      mgr.add_password(None, 'http://%s/'  % host, p[0], p[2]) | 
| +      mgr.add_password(None, 'https://%s/' % host, p[0], p[2]) | 
| +  except: | 
| +    pass | 
| +  handlers.append(urllib2.HTTPBasicAuthHandler(mgr)) | 
| + | 
| +  if 'http_proxy' in os.environ: | 
| +    url = os.environ['http_proxy'] | 
| +    handlers.append(urllib2.ProxyHandler({'http': url, 'https': url})) | 
| +  if 'REPO_CURL_VERBOSE' in os.environ: | 
| +    handlers.append(urllib2.HTTPHandler(debuglevel=1)) | 
| +    handlers.append(urllib2.HTTPSHandler(debuglevel=1)) | 
| +  urllib2.install_opener(urllib2.build_opener(*handlers)) | 
| + | 
| +def _Fetch(url, local, src, quiet): | 
| +  if not quiet: | 
| +    print >>sys.stderr, 'Get %s' % url | 
| + | 
| cmd = [GIT, 'fetch'] | 
| if quiet: | 
| cmd.append('--quiet') | 
| err = subprocess.PIPE | 
| else: | 
| err = None | 
| -  cmd.extend(args) | 
| -  cmd.append('origin') | 
| +  cmd.append(src) | 
| +  cmd.append('+refs/heads/*:refs/remotes/origin/*') | 
| +  cmd.append('refs/tags/*:refs/tags/*') | 
|  | 
| proc = subprocess.Popen(cmd, cwd = local, stderr = err) | 
| if err: | 
| @@ -317,7 +341,63 @@ | 
| if proc.wait() != 0: | 
| raise CloneFailure() | 
|  | 
| +def _DownloadBundle(url, local, quiet): | 
| +  if not url.endswith('/'): | 
| +    url += '/' | 
| +  url += 'clone.bundle' | 
|  | 
| +  proc = subprocess.Popen( | 
| +    [GIT, 'config', '--get-regexp', 'url.*.insteadof'], | 
| +    cwd = local, | 
| +    stdout = subprocess.PIPE) | 
| +  for line in proc.stdout: | 
| +    m = re.compile(r'^url\.(.*)\.insteadof (.*)$').match(line) | 
| +    if m: | 
| +      new_url = m.group(1) | 
| +      old_url = m.group(2) | 
| +      if url.startswith(old_url): | 
| +        url = new_url + url[len(old_url):] | 
| +        break | 
| +  proc.stdout.close() | 
| +  proc.wait() | 
| + | 
| +  if not url.startswith('http:') and not url.startswith('https:'): | 
| +    return False | 
| + | 
| +  dest = open(os.path.join(local, '.git', 'clone.bundle'), 'w+b') | 
| +  try: | 
| +    try: | 
| +      r = urllib2.urlopen(url) | 
| +    except urllib2.HTTPError, e: | 
| +      if e.code == 404: | 
| +        return False | 
| +      print >>sys.stderr, 'fatal: Cannot get %s' % url | 
| +      print >>sys.stderr, 'fatal: HTTP error %s' % e.code | 
| +      raise CloneFailure() | 
| +    except urllib2.URLError, e: | 
| +      print >>sys.stderr, 'fatal: Cannot get %s' % url | 
| +      print >>sys.stderr, 'fatal: error %s' % e.reason | 
| +      raise CloneFailure() | 
| +    try: | 
| +      if not quiet: | 
| +        print >>sys.stderr, 'Get %s' % url | 
| +      while True: | 
| +        buf = r.read(8192) | 
| +        if buf == '': | 
| +          return True | 
| +        dest.write(buf) | 
| +    finally: | 
| +      r.close() | 
| +  finally: | 
| +    dest.close() | 
| + | 
| +def _ImportBundle(local): | 
| +  path = os.path.join(local, '.git', 'clone.bundle') | 
| +  try: | 
| +    _Fetch(local, local, path, True) | 
| +  finally: | 
| +    os.remove(path) | 
| + | 
| def _Clone(url, local, quiet): | 
| """Clones a git repository to a new subdirectory of repodir | 
| """ | 
| @@ -344,11 +424,14 @@ | 
| print >>sys.stderr, 'fatal: could not create %s' % local | 
| raise CloneFailure() | 
|  | 
| +  _InitHttp() | 
| _SetConfig(local, 'remote.origin.url', url) | 
| _SetConfig(local, 'remote.origin.fetch', | 
| '+refs/heads/*:refs/remotes/origin/*') | 
| -  _Fetch(local, quiet) | 
| -  _Fetch(local, quiet, '--tags') | 
| +  if _DownloadBundle(url, local, quiet): | 
| +    _ImportBundle(local) | 
| +  else: | 
| +    _Fetch(url, local, 'origin', quiet) | 
|  | 
|  | 
| def _Verify(cwd, branch, quiet): | 
|  |