diff options
Diffstat (limited to 'git_config.py')
-rw-r--r-- | git_config.py | 97 |
1 files changed, 46 insertions, 51 deletions
diff --git a/git_config.py b/git_config.py index ff815e35..eb532d02 100644 --- a/git_config.py +++ b/git_config.py | |||
@@ -26,7 +26,6 @@ import time | |||
26 | import urllib2 | 26 | import urllib2 |
27 | 27 | ||
28 | from signal import SIGTERM | 28 | from signal import SIGTERM |
29 | from urllib2 import urlopen, HTTPError | ||
30 | from error import GitError, UploadError | 29 | from error import GitError, UploadError |
31 | from trace import Trace | 30 | from trace import Trace |
32 | 31 | ||
@@ -80,14 +79,6 @@ class GitConfig(object): | |||
80 | else: | 79 | else: |
81 | self._pickle = pickleFile | 80 | self._pickle = pickleFile |
82 | 81 | ||
83 | def ClearCache(self): | ||
84 | if os.path.exists(self._pickle): | ||
85 | os.remove(self._pickle) | ||
86 | self._cache_dict = None | ||
87 | self._section_dict = None | ||
88 | self._remotes = {} | ||
89 | self._branches = {} | ||
90 | |||
91 | def Has(self, name, include_defaults = True): | 82 | def Has(self, name, include_defaults = True): |
92 | """Return true if this configuration file has the key. | 83 | """Return true if this configuration file has the key. |
93 | """ | 84 | """ |
@@ -206,6 +197,15 @@ class GitConfig(object): | |||
206 | except KeyError: | 197 | except KeyError: |
207 | return False | 198 | return False |
208 | 199 | ||
200 | def UrlInsteadOf(self, url): | ||
201 | """Resolve any url.*.insteadof references. | ||
202 | """ | ||
203 | for new_url in self.GetSubSections('url'): | ||
204 | old_url = self.GetString('url.%s.insteadof' % new_url) | ||
205 | if old_url is not None and url.startswith(old_url): | ||
206 | return new_url + url[len(old_url):] | ||
207 | return url | ||
208 | |||
209 | @property | 209 | @property |
210 | def _sections(self): | 210 | def _sections(self): |
211 | d = self._section_dict | 211 | d = self._section_dict |
@@ -488,7 +488,13 @@ def close_ssh(): | |||
488 | _master_keys_lock = None | 488 | _master_keys_lock = None |
489 | 489 | ||
490 | URI_SCP = re.compile(r'^([^@:]*@?[^:/]{1,}):') | 490 | URI_SCP = re.compile(r'^([^@:]*@?[^:/]{1,}):') |
491 | URI_ALL = re.compile(r'^([a-z][a-z+]*)://([^@/]*@?[^/]*)/') | 491 | URI_ALL = re.compile(r'^([a-z][a-z+-]*)://([^@/]*@?[^/]*)/') |
492 | |||
493 | def GetSchemeFromUrl(url): | ||
494 | m = URI_ALL.match(url) | ||
495 | if m: | ||
496 | return m.group(1) | ||
497 | return None | ||
492 | 498 | ||
493 | def _preconnect(url): | 499 | def _preconnect(url): |
494 | m = URI_ALL.match(url) | 500 | m = URI_ALL.match(url) |
@@ -521,7 +527,7 @@ class Remote(object): | |||
521 | self.projectname = self._Get('projectname') | 527 | self.projectname = self._Get('projectname') |
522 | self.fetch = map(lambda x: RefSpec.FromString(x), | 528 | self.fetch = map(lambda x: RefSpec.FromString(x), |
523 | self._Get('fetch', all=True)) | 529 | self._Get('fetch', all=True)) |
524 | self._review_protocol = None | 530 | self._review_url = None |
525 | 531 | ||
526 | def _InsteadOf(self): | 532 | def _InsteadOf(self): |
527 | globCfg = GitConfig.ForUser() | 533 | globCfg = GitConfig.ForUser() |
@@ -548,9 +554,8 @@ class Remote(object): | |||
548 | connectionUrl = self._InsteadOf() | 554 | connectionUrl = self._InsteadOf() |
549 | return _preconnect(connectionUrl) | 555 | return _preconnect(connectionUrl) |
550 | 556 | ||
551 | @property | 557 | def ReviewUrl(self, userEmail): |
552 | def ReviewProtocol(self): | 558 | if self._review_url is None: |
553 | if self._review_protocol is None: | ||
554 | if self.review is None: | 559 | if self.review is None: |
555 | return None | 560 | return None |
556 | 561 | ||
@@ -559,57 +564,47 @@ class Remote(object): | |||
559 | u = 'http://%s' % u | 564 | u = 'http://%s' % u |
560 | if u.endswith('/Gerrit'): | 565 | if u.endswith('/Gerrit'): |
561 | u = u[:len(u) - len('/Gerrit')] | 566 | u = u[:len(u) - len('/Gerrit')] |
562 | if not u.endswith('/ssh_info'): | 567 | if u.endswith('/ssh_info'): |
563 | if not u.endswith('/'): | 568 | u = u[:len(u) - len('/ssh_info')] |
564 | u += '/' | 569 | if not u.endswith('/'): |
565 | u += 'ssh_info' | 570 | u += '/' |
571 | http_url = u | ||
566 | 572 | ||
567 | if u in REVIEW_CACHE: | 573 | if u in REVIEW_CACHE: |
568 | info = REVIEW_CACHE[u] | 574 | self._review_url = REVIEW_CACHE[u] |
569 | self._review_protocol = info[0] | 575 | elif 'REPO_HOST_PORT_INFO' in os.environ: |
570 | self._review_host = info[1] | 576 | host, port = os.environ['REPO_HOST_PORT_INFO'].split() |
571 | self._review_port = info[2] | 577 | self._review_url = self._SshReviewUrl(userEmail, host, port) |
578 | REVIEW_CACHE[u] = self._review_url | ||
572 | else: | 579 | else: |
573 | try: | 580 | try: |
574 | info = urlopen(u).read() | 581 | info_url = u + 'ssh_info' |
575 | if info == 'NOT_AVAILABLE': | 582 | info = urllib2.urlopen(info_url).read() |
576 | raise UploadError('%s: SSH disabled' % self.review) | ||
577 | if '<' in info: | 583 | if '<' in info: |
578 | # Assume the server gave us some sort of HTML | 584 | # Assume the server gave us some sort of HTML |
579 | # response back, like maybe a login page. | 585 | # response back, like maybe a login page. |
580 | # | 586 | # |
581 | raise UploadError('%s: Cannot parse response' % u) | 587 | raise UploadError('%s: Cannot parse response' % info_url) |
582 | 588 | ||
583 | self._review_protocol = 'ssh' | 589 | if info == 'NOT_AVAILABLE': |
584 | self._review_host = info.split(" ")[0] | 590 | # Assume HTTP if SSH is not enabled. |
585 | self._review_port = info.split(" ")[1] | 591 | self._review_url = http_url + 'p/' |
586 | except urllib2.URLError, e: | ||
587 | raise UploadError('%s: %s' % (self.review, e.reason[1])) | ||
588 | except HTTPError, e: | ||
589 | if e.code == 404: | ||
590 | self._review_protocol = 'http-post' | ||
591 | self._review_host = None | ||
592 | self._review_port = None | ||
593 | else: | 592 | else: |
594 | raise UploadError('Upload over ssh unavailable') | 593 | host, port = info.split() |
594 | self._review_url = self._SshReviewUrl(userEmail, host, port) | ||
595 | except urllib2.HTTPError, e: | ||
596 | raise UploadError('%s: %s' % (self.review, str(e))) | ||
597 | except urllib2.URLError, e: | ||
598 | raise UploadError('%s: %s' % (self.review, str(e))) | ||
595 | 599 | ||
596 | REVIEW_CACHE[u] = ( | 600 | REVIEW_CACHE[u] = self._review_url |
597 | self._review_protocol, | 601 | return self._review_url + self.projectname |
598 | self._review_host, | ||
599 | self._review_port) | ||
600 | return self._review_protocol | ||
601 | 602 | ||
602 | def SshReviewUrl(self, userEmail): | 603 | def _SshReviewUrl(self, userEmail, host, port): |
603 | if self.ReviewProtocol != 'ssh': | ||
604 | return None | ||
605 | username = self._config.GetString('review.%s.username' % self.review) | 604 | username = self._config.GetString('review.%s.username' % self.review) |
606 | if username is None: | 605 | if username is None: |
607 | username = userEmail.split("@")[0] | 606 | username = userEmail.split('@')[0] |
608 | return 'ssh://%s@%s:%s/%s' % ( | 607 | return 'ssh://%s@%s:%s/' % (username, host, port) |
609 | username, | ||
610 | self._review_host, | ||
611 | self._review_port, | ||
612 | self.projectname) | ||
613 | 608 | ||
614 | def ToLocal(self, rev): | 609 | def ToLocal(self, rev): |
615 | """Convert a remote revision string to something we have locally. | 610 | """Convert a remote revision string to something we have locally. |