diff options
Diffstat (limited to 'repo')
| -rwxr-xr-x | repo | 103 |
1 files changed, 93 insertions, 10 deletions
| @@ -28,7 +28,7 @@ if __name__ == '__main__': | |||
| 28 | del magic | 28 | del magic |
| 29 | 29 | ||
| 30 | # increment this whenever we make important changes to this script | 30 | # increment this whenever we make important changes to this script |
| 31 | VERSION = (1, 12) | 31 | VERSION = (1, 13) |
| 32 | 32 | ||
| 33 | # increment this if the MAINTAINER_KEYS block is modified | 33 | # increment this if the MAINTAINER_KEYS block is modified |
| 34 | KEYRING_VERSION = (1,0) | 34 | KEYRING_VERSION = (1,0) |
| @@ -91,6 +91,7 @@ import re | |||
| 91 | import readline | 91 | import readline |
| 92 | import subprocess | 92 | import subprocess |
| 93 | import sys | 93 | import sys |
| 94 | import urllib2 | ||
| 94 | 95 | ||
| 95 | home_dot_repo = os.path.expanduser('~/.repoconfig') | 96 | home_dot_repo = os.path.expanduser('~/.repoconfig') |
| 96 | gpg_dir = os.path.join(home_dot_repo, 'gnupg') | 97 | gpg_dir = os.path.join(home_dot_repo, 'gnupg') |
| @@ -187,10 +188,6 @@ def _Init(args): | |||
| 187 | else: | 188 | else: |
| 188 | can_verify = True | 189 | can_verify = True |
| 189 | 190 | ||
| 190 | if not opt.quiet: | ||
| 191 | print >>sys.stderr, 'Getting repo ...' | ||
| 192 | print >>sys.stderr, ' from %s' % url | ||
| 193 | |||
| 194 | dst = os.path.abspath(os.path.join(repodir, S_repo)) | 191 | dst = os.path.abspath(os.path.join(repodir, S_repo)) |
| 195 | _Clone(url, dst, opt.quiet) | 192 | _Clone(url, dst, opt.quiet) |
| 196 | 193 | ||
| @@ -300,15 +297,42 @@ def _SetConfig(local, name, value): | |||
| 300 | raise CloneFailure() | 297 | raise CloneFailure() |
| 301 | 298 | ||
| 302 | 299 | ||
| 303 | def _Fetch(local, quiet, *args): | 300 | def _InitHttp(): |
| 301 | handlers = [] | ||
| 302 | |||
| 303 | mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() | ||
| 304 | try: | ||
| 305 | import netrc | ||
| 306 | n = netrc.netrc() | ||
| 307 | for host in n.hosts: | ||
| 308 | p = n.hosts[host] | ||
| 309 | mgr.add_password(None, 'http://%s/' % host, p[0], p[2]) | ||
| 310 | mgr.add_password(None, 'https://%s/' % host, p[0], p[2]) | ||
| 311 | except: | ||
| 312 | pass | ||
| 313 | handlers.append(urllib2.HTTPBasicAuthHandler(mgr)) | ||
| 314 | |||
| 315 | if 'http_proxy' in os.environ: | ||
| 316 | url = os.environ['http_proxy'] | ||
| 317 | handlers.append(urllib2.ProxyHandler({'http': url, 'https': url})) | ||
| 318 | if 'REPO_CURL_VERBOSE' in os.environ: | ||
| 319 | handlers.append(urllib2.HTTPHandler(debuglevel=1)) | ||
| 320 | handlers.append(urllib2.HTTPSHandler(debuglevel=1)) | ||
| 321 | urllib2.install_opener(urllib2.build_opener(*handlers)) | ||
| 322 | |||
| 323 | def _Fetch(url, local, src, quiet): | ||
| 324 | if not quiet: | ||
| 325 | print >>sys.stderr, 'Get %s' % url | ||
| 326 | |||
| 304 | cmd = [GIT, 'fetch'] | 327 | cmd = [GIT, 'fetch'] |
| 305 | if quiet: | 328 | if quiet: |
| 306 | cmd.append('--quiet') | 329 | cmd.append('--quiet') |
| 307 | err = subprocess.PIPE | 330 | err = subprocess.PIPE |
| 308 | else: | 331 | else: |
| 309 | err = None | 332 | err = None |
| 310 | cmd.extend(args) | 333 | cmd.append(src) |
| 311 | cmd.append('origin') | 334 | cmd.append('+refs/heads/*:refs/remotes/origin/*') |
| 335 | cmd.append('refs/tags/*:refs/tags/*') | ||
| 312 | 336 | ||
| 313 | proc = subprocess.Popen(cmd, cwd = local, stderr = err) | 337 | proc = subprocess.Popen(cmd, cwd = local, stderr = err) |
| 314 | if err: | 338 | if err: |
| @@ -317,6 +341,62 @@ def _Fetch(local, quiet, *args): | |||
| 317 | if proc.wait() != 0: | 341 | if proc.wait() != 0: |
| 318 | raise CloneFailure() | 342 | raise CloneFailure() |
| 319 | 343 | ||
| 344 | def _DownloadBundle(url, local, quiet): | ||
| 345 | if not url.endswith('/'): | ||
| 346 | url += '/' | ||
| 347 | url += 'clone.bundle' | ||
| 348 | |||
| 349 | proc = subprocess.Popen( | ||
| 350 | [GIT, 'config', '--get-regexp', 'url.*.insteadof'], | ||
| 351 | cwd = local, | ||
| 352 | stdout = subprocess.PIPE) | ||
| 353 | for line in proc.stdout: | ||
| 354 | m = re.compile(r'^url\.(.*)\.insteadof (.*)$').match(line) | ||
| 355 | if m: | ||
| 356 | new_url = m.group(1) | ||
| 357 | old_url = m.group(2) | ||
| 358 | if url.startswith(old_url): | ||
| 359 | url = new_url + url[len(old_url):] | ||
| 360 | break | ||
| 361 | proc.stdout.close() | ||
| 362 | proc.wait() | ||
| 363 | |||
| 364 | if not url.startswith('http:') and not url.startswith('https:'): | ||
| 365 | return False | ||
| 366 | |||
| 367 | dest = open(os.path.join(local, '.git', 'clone.bundle'), 'w+b') | ||
| 368 | try: | ||
| 369 | try: | ||
| 370 | r = urllib2.urlopen(url) | ||
| 371 | except urllib2.HTTPError, e: | ||
| 372 | if e.code == 404: | ||
| 373 | return False | ||
| 374 | print >>sys.stderr, 'fatal: Cannot get %s' % url | ||
| 375 | print >>sys.stderr, 'fatal: HTTP error %s' % e.code | ||
| 376 | raise CloneFailure() | ||
| 377 | except urllib2.URLError, e: | ||
| 378 | print >>sys.stderr, 'fatal: Cannot get %s' % url | ||
| 379 | print >>sys.stderr, 'fatal: error %s' % e.reason | ||
| 380 | raise CloneFailure() | ||
| 381 | try: | ||
| 382 | if not quiet: | ||
| 383 | print >>sys.stderr, 'Get %s' % url | ||
| 384 | while True: | ||
| 385 | buf = r.read(8192) | ||
| 386 | if buf == '': | ||
| 387 | return True | ||
| 388 | dest.write(buf) | ||
| 389 | finally: | ||
| 390 | r.close() | ||
| 391 | finally: | ||
| 392 | dest.close() | ||
| 393 | |||
| 394 | def _ImportBundle(local): | ||
| 395 | path = os.path.join(local, '.git', 'clone.bundle') | ||
| 396 | try: | ||
| 397 | _Fetch(local, local, path, True) | ||
| 398 | finally: | ||
| 399 | os.remove(path) | ||
| 320 | 400 | ||
| 321 | def _Clone(url, local, quiet): | 401 | def _Clone(url, local, quiet): |
| 322 | """Clones a git repository to a new subdirectory of repodir | 402 | """Clones a git repository to a new subdirectory of repodir |
| @@ -344,11 +424,14 @@ def _Clone(url, local, quiet): | |||
| 344 | print >>sys.stderr, 'fatal: could not create %s' % local | 424 | print >>sys.stderr, 'fatal: could not create %s' % local |
| 345 | raise CloneFailure() | 425 | raise CloneFailure() |
| 346 | 426 | ||
| 427 | _InitHttp() | ||
| 347 | _SetConfig(local, 'remote.origin.url', url) | 428 | _SetConfig(local, 'remote.origin.url', url) |
| 348 | _SetConfig(local, 'remote.origin.fetch', | 429 | _SetConfig(local, 'remote.origin.fetch', |
| 349 | '+refs/heads/*:refs/remotes/origin/*') | 430 | '+refs/heads/*:refs/remotes/origin/*') |
| 350 | _Fetch(local, quiet) | 431 | if _DownloadBundle(url, local, quiet): |
| 351 | _Fetch(local, quiet, '--tags') | 432 | _ImportBundle(local) |
| 433 | else: | ||
| 434 | _Fetch(url, local, 'origin', quiet) | ||
| 352 | 435 | ||
| 353 | 436 | ||
| 354 | def _Verify(cwd, branch, quiet): | 437 | def _Verify(cwd, branch, quiet): |
