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 | |
| 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>
| -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): |
