| OLD | NEW |
| 1 #!/bin/sh | 1 #!/bin/sh |
| 2 | 2 |
| 3 ## repo default configuration | 3 ## repo default configuration |
| 4 ## | 4 ## |
| 5 REPO_URL='http://git.chromium.org/external/repo.git' | 5 REPO_URL='https://code.google.com/p/git-repo/' |
| 6 REPO_REV='stable' | 6 REPO_REV='stable' |
| 7 | 7 |
| 8 # Copyright (C) 2008 Google Inc. | 8 # Copyright (C) 2008 Google Inc. |
| 9 # | 9 # |
| 10 # Licensed under the Apache License, Version 2.0 (the "License"); | 10 # Licensed under the Apache License, Version 2.0 (the "License"); |
| 11 # you may not use this file except in compliance with the License. | 11 # you may not use this file except in compliance with the License. |
| 12 # You may obtain a copy of the License at | 12 # You may obtain a copy of the License at |
| 13 # | 13 # |
| 14 # http://www.apache.org/licenses/LICENSE-2.0 | 14 # http://www.apache.org/licenses/LICENSE-2.0 |
| 15 # | 15 # |
| 16 # Unless required by applicable law or agreed to in writing, software | 16 # Unless required by applicable law or agreed to in writing, software |
| 17 # distributed under the License is distributed on an "AS IS" BASIS, | 17 # distributed under the License is distributed on an "AS IS" BASIS, |
| 18 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 18 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 19 # See the License for the specific language governing permissions and | 19 # See the License for the specific language governing permissions and |
| 20 # limitations under the License. | 20 # limitations under the License. |
| 21 | 21 |
| 22 magic='--calling-python-from-/bin/sh--' | 22 magic='--calling-python-from-/bin/sh--' |
| 23 """exec" python -E "$0" "$@" """#$magic" | 23 """exec" python -E "$0" "$@" """#$magic" |
| 24 if __name__ == '__main__': | 24 if __name__ == '__main__': |
| 25 import sys | 25 import sys |
| 26 if sys.argv[-1] == '#%s' % magic: | 26 if sys.argv[-1] == '#%s' % magic: |
| 27 del sys.argv[-1] | 27 del sys.argv[-1] |
| 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, 11) | 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) |
| 35 MAINTAINER_KEYS = """ | 35 MAINTAINER_KEYS = """ |
| 36 | 36 |
| 37 Repo Maintainer <repo@android.kernel.org> | 37 Repo Maintainer <repo@android.kernel.org> |
| 38 -----BEGIN PGP PUBLIC KEY BLOCK----- | 38 -----BEGIN PGP PUBLIC KEY BLOCK----- |
| 39 Version: GnuPG v1.4.2.2 (GNU/Linux) | 39 Version: GnuPG v1.4.2.2 (GNU/Linux) |
| 40 | 40 |
| 41 mQGiBEj3ugERBACrLJh/ZPyVSKeClMuznFIrsQ+hpNnmJGw1a9GXKYKk8qHPhAZf | 41 mQGiBEj3ugERBACrLJh/ZPyVSKeClMuznFIrsQ+hpNnmJGw1a9GXKYKk8qHPhAZf |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 S_manifests = 'manifests' # special manifest repository | 84 S_manifests = 'manifests' # special manifest repository |
| 85 REPO_MAIN = S_repo + '/main.py' # main script | 85 REPO_MAIN = S_repo + '/main.py' # main script |
| 86 | 86 |
| 87 | 87 |
| 88 import optparse | 88 import optparse |
| 89 import os | 89 import os |
| 90 import re | 90 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') |
| 97 | 98 |
| 98 extra_args = [] | 99 extra_args = [] |
| 99 init_optparse = optparse.OptionParser(usage="repo init -u url [options]") | 100 init_optparse = optparse.OptionParser(usage="repo init -u url [options]") |
| 100 | 101 |
| 101 # Logging | 102 # Logging |
| 102 group = init_optparse.add_option_group('Logging options') | 103 group = init_optparse.add_option_group('Logging options') |
| 103 group.add_option('-q', '--quiet', | 104 group.add_option('-q', '--quiet', |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 # | 181 # |
| 181 sys.exit(1) | 182 sys.exit(1) |
| 182 | 183 |
| 183 _CheckGitVersion() | 184 _CheckGitVersion() |
| 184 try: | 185 try: |
| 185 if _NeedSetupGnuPG(): | 186 if _NeedSetupGnuPG(): |
| 186 can_verify = _SetupGnuPG(opt.quiet) | 187 can_verify = _SetupGnuPG(opt.quiet) |
| 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 |
| 197 if can_verify and not opt.no_repo_verify: | 194 if can_verify and not opt.no_repo_verify: |
| 198 rev = _Verify(dst, branch, opt.quiet) | 195 rev = _Verify(dst, branch, opt.quiet) |
| 199 else: | 196 else: |
| 200 rev = 'refs/remotes/origin/%s^0' % branch | 197 rev = 'refs/remotes/origin/%s^0' % branch |
| 201 | 198 |
| 202 _Checkout(dst, branch, rev, opt.quiet) | 199 _Checkout(dst, branch, rev, opt.quiet) |
| 203 except CloneFailure: | 200 except CloneFailure: |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 | 290 |
| 294 | 291 |
| 295 def _SetConfig(local, name, value): | 292 def _SetConfig(local, name, value): |
| 296 """Set a git configuration option to the specified value. | 293 """Set a git configuration option to the specified value. |
| 297 """ | 294 """ |
| 298 cmd = [GIT, 'config', name, value] | 295 cmd = [GIT, 'config', name, value] |
| 299 if subprocess.Popen(cmd, cwd = local).wait() != 0: | 296 if subprocess.Popen(cmd, cwd = local).wait() != 0: |
| 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: |
| 315 proc.stderr.read() | 339 proc.stderr.read() |
| 316 proc.stderr.close() | 340 proc.stderr.close() |
| 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 |
| 323 """ | 403 """ |
| 324 try: | 404 try: |
| 325 os.mkdir(local) | 405 os.mkdir(local) |
| 326 except OSError, e: | 406 except OSError, e: |
| 327 print >>sys.stderr, \ | 407 print >>sys.stderr, \ |
| 328 'fatal: cannot make %s directory: %s' \ | 408 'fatal: cannot make %s directory: %s' \ |
| 329 % (local, e.strerror) | 409 % (local, e.strerror) |
| 330 raise CloneFailure() | 410 raise CloneFailure() |
| 331 | 411 |
| 332 cmd = [GIT, 'init', '--quiet'] | 412 cmd = [GIT, 'init', '--quiet'] |
| 333 try: | 413 try: |
| 334 proc = subprocess.Popen(cmd, cwd = local) | 414 proc = subprocess.Popen(cmd, cwd = local) |
| 335 except OSError, e: | 415 except OSError, e: |
| 336 print >>sys.stderr | 416 print >>sys.stderr |
| 337 print >>sys.stderr, "fatal: '%s' is not available" % GIT | 417 print >>sys.stderr, "fatal: '%s' is not available" % GIT |
| 338 print >>sys.stderr, 'fatal: %s' % e | 418 print >>sys.stderr, 'fatal: %s' % e |
| 339 print >>sys.stderr | 419 print >>sys.stderr |
| 340 print >>sys.stderr, 'Please make sure %s is installed'\ | 420 print >>sys.stderr, 'Please make sure %s is installed'\ |
| 341 ' and in your path.' % GIT | 421 ' and in your path.' % GIT |
| 342 raise CloneFailure() | 422 raise CloneFailure() |
| 343 if proc.wait() != 0: | 423 if proc.wait() != 0: |
| 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): |
| 355 """Verify the branch has been signed by a tag. | 438 """Verify the branch has been signed by a tag. |
| 356 """ | 439 """ |
| 357 cmd = [GIT, 'describe', 'origin/%s' % branch] | 440 cmd = [GIT, 'describe', 'origin/%s' % branch] |
| 358 proc = subprocess.Popen(cmd, | 441 proc = subprocess.Popen(cmd, |
| 359 stdout=subprocess.PIPE, | 442 stdout=subprocess.PIPE, |
| 360 stderr=subprocess.PIPE, | 443 stderr=subprocess.PIPE, |
| 361 cwd = cwd) | 444 cwd = cwd) |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 try: | 676 try: |
| 594 os.execv(main, me) | 677 os.execv(main, me) |
| 595 except OSError, e: | 678 except OSError, e: |
| 596 print >>sys.stderr, "fatal: unable to start %s" % main | 679 print >>sys.stderr, "fatal: unable to start %s" % main |
| 597 print >>sys.stderr, "fatal: %s" % e | 680 print >>sys.stderr, "fatal: %s" % e |
| 598 sys.exit(148) | 681 sys.exit(148) |
| 599 | 682 |
| 600 | 683 |
| 601 if __name__ == '__main__': | 684 if __name__ == '__main__': |
| 602 main(sys.argv[1:]) | 685 main(sys.argv[1:]) |
| OLD | NEW |