diff options
author | Shawn O. Pearce <sop@google.com> | 2009-03-25 14:06:43 -0700 |
---|---|---|
committer | Shawn O. Pearce <sop@google.com> | 2009-03-25 14:06:43 -0700 |
commit | 146fe902b7dd4a7758a8748674aa1e5d3cac2592 (patch) | |
tree | fdaff71f1d24ff17e97743365b9dc347a05cf765 /git_config.py | |
parent | 722acefdc45a9d335793a79179c56c67f1dfed24 (diff) | |
download | git-repo-146fe902b7dd4a7758a8748674aa1e5d3cac2592.tar.gz |
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>
Diffstat (limited to 'git_config.py')
-rw-r--r-- | git_config.py | 52 |
1 files changed, 33 insertions, 19 deletions
diff --git a/git_config.py b/git_config.py index 4829e2d3..1d45d92f 100644 --- a/git_config.py +++ b/git_config.py | |||
@@ -24,6 +24,8 @@ R_HEADS = 'refs/heads/' | |||
24 | R_TAGS = 'refs/tags/' | 24 | R_TAGS = 'refs/tags/' |
25 | ID_RE = re.compile('^[0-9a-f]{40}$') | 25 | ID_RE = re.compile('^[0-9a-f]{40}$') |
26 | 26 | ||
27 | REVIEW_CACHE = dict() | ||
28 | |||
27 | def IsId(rev): | 29 | def IsId(rev): |
28 | return ID_RE.match(rev) | 30 | return ID_RE.match(rev) |
29 | 31 | ||
@@ -280,25 +282,37 @@ class Remote(object): | |||
280 | u += '/' | 282 | u += '/' |
281 | u += 'ssh_info' | 283 | u += 'ssh_info' |
282 | 284 | ||
283 | try: | 285 | if u in REVIEW_CACHE: |
284 | info = urlopen(u).read() | 286 | info = REVIEW_CACHE[u] |
285 | if info == 'NOT_AVAILABLE': | 287 | self._review_protocol = info[0] |
286 | raise UploadError('Upload over ssh unavailable') | 288 | self._review_host = info[1] |
287 | if '<' in info: | 289 | self._review_port = info[2] |
288 | # Assume the server gave us some sort of HTML | 290 | else: |
289 | # response back, like maybe a login page. | 291 | try: |
290 | # | 292 | info = urlopen(u).read() |
291 | raise UploadError('Cannot read %s:\n%s' % (u, info)) | 293 | if info == 'NOT_AVAILABLE': |
292 | 294 | raise UploadError('Upload over ssh unavailable') | |
293 | self._review_protocol = 'ssh' | 295 | if '<' in info: |
294 | self._review_host = info.split(" ")[0] | 296 | # Assume the server gave us some sort of HTML |
295 | self._review_port = info.split(" ")[1] | 297 | # response back, like maybe a login page. |
296 | 298 | # | |
297 | except HTTPError, e: | 299 | raise UploadError('Cannot read %s:\n%s' % (u, info)) |
298 | if e.code == 404: | 300 | |
299 | self._review_protocol = 'http-post' | 301 | self._review_protocol = 'ssh' |
300 | else: | 302 | self._review_host = info.split(" ")[0] |
301 | raise UploadError('Cannot guess Gerrit version') | 303 | self._review_port = info.split(" ")[1] |
304 | except HTTPError, e: | ||
305 | if e.code == 404: | ||
306 | self._review_protocol = 'http-post' | ||
307 | self._review_host = None | ||
308 | self._review_port = None | ||
309 | else: | ||
310 | raise UploadError('Cannot guess Gerrit version') | ||
311 | |||
312 | REVIEW_CACHE[u] = ( | ||
313 | self._review_protocol, | ||
314 | self._review_host, | ||
315 | self._review_port) | ||
302 | return self._review_protocol | 316 | return self._review_protocol |
303 | 317 | ||
304 | def SshReviewUrl(self, userEmail): | 318 | def SshReviewUrl(self, userEmail): |