summaryrefslogtreecommitdiffstats
path: root/git_config.py
diff options
context:
space:
mode:
Diffstat (limited to 'git_config.py')
-rw-r--r--git_config.py97
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
26import urllib2 26import urllib2
27 27
28from signal import SIGTERM 28from signal import SIGTERM
29from urllib2 import urlopen, HTTPError
30from error import GitError, UploadError 29from error import GitError, UploadError
31from trace import Trace 30from 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
490URI_SCP = re.compile(r'^([^@:]*@?[^:/]{1,}):') 490URI_SCP = re.compile(r'^([^@:]*@?[^:/]{1,}):')
491URI_ALL = re.compile(r'^([a-z][a-z+]*)://([^@/]*@?[^/]*)/') 491URI_ALL = re.compile(r'^([a-z][a-z+-]*)://([^@/]*@?[^/]*)/')
492
493def GetSchemeFromUrl(url):
494 m = URI_ALL.match(url)
495 if m:
496 return m.group(1)
497 return None
492 498
493def _preconnect(url): 499def _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.