Only lookup review server '/ssh_info' once per repo process
If the user has multiple projects to upload changes to, and they
are all going to the same review server, we only need to query the
'/ssh_info' data once.
Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/git_config.py b/git_config.py
index 4829e2d..1d45d92 100644
--- a/git_config.py
+++ b/git_config.py
@@ -24,6 +24,8 @@
R_TAGS = 'refs/tags/'
ID_RE = re.compile('^[0-9a-f]{40}$')
+REVIEW_CACHE = dict()
+
def IsId(rev):
return ID_RE.match(rev)
@@ -280,25 +282,37 @@
u += '/'
u += 'ssh_info'
- try:
- info = urlopen(u).read()
- if info == 'NOT_AVAILABLE':
- raise UploadError('Upload over ssh unavailable')
- if '<' in info:
- # Assume the server gave us some sort of HTML
- # response back, like maybe a login page.
- #
- raise UploadError('Cannot read %s:\n%s' % (u, info))
+ if u in REVIEW_CACHE:
+ info = REVIEW_CACHE[u]
+ self._review_protocol = info[0]
+ self._review_host = info[1]
+ self._review_port = info[2]
+ else:
+ try:
+ info = urlopen(u).read()
+ if info == 'NOT_AVAILABLE':
+ raise UploadError('Upload over ssh unavailable')
+ if '<' in info:
+ # Assume the server gave us some sort of HTML
+ # response back, like maybe a login page.
+ #
+ raise UploadError('Cannot read %s:\n%s' % (u, info))
- self._review_protocol = 'ssh'
- self._review_host = info.split(" ")[0]
- self._review_port = info.split(" ")[1]
+ self._review_protocol = 'ssh'
+ self._review_host = info.split(" ")[0]
+ self._review_port = info.split(" ")[1]
+ except HTTPError, e:
+ if e.code == 404:
+ self._review_protocol = 'http-post'
+ self._review_host = None
+ self._review_port = None
+ else:
+ raise UploadError('Cannot guess Gerrit version')
- except HTTPError, e:
- if e.code == 404:
- self._review_protocol = 'http-post'
- else:
- raise UploadError('Cannot guess Gerrit version')
+ REVIEW_CACHE[u] = (
+ self._review_protocol,
+ self._review_host,
+ self._review_port)
return self._review_protocol
def SshReviewUrl(self, userEmail):