summaryrefslogtreecommitdiffstats
path: root/git_config.py
diff options
context:
space:
mode:
Diffstat (limited to 'git_config.py')
-rw-r--r--git_config.py43
1 files changed, 23 insertions, 20 deletions
diff --git a/git_config.py b/git_config.py
index 56cc6a24..a294a0b6 100644
--- a/git_config.py
+++ b/git_config.py
@@ -14,8 +14,9 @@
14# limitations under the License. 14# limitations under the License.
15 15
16from __future__ import print_function 16from __future__ import print_function
17import cPickle 17
18import os 18import os
19import pickle
19import re 20import re
20import subprocess 21import subprocess
21import sys 22import sys
@@ -24,14 +25,13 @@ try:
24except ImportError: 25except ImportError:
25 import dummy_threading as _threading 26 import dummy_threading as _threading
26import time 27import time
27try: 28
28 import urllib2 29from pyversion import is_python3
29except ImportError: 30if is_python3():
30 # For python3
31 import urllib.request 31 import urllib.request
32 import urllib.error 32 import urllib.error
33else: 33else:
34 # For python2 34 import urllib2
35 import imp 35 import imp
36 urllib = imp.new_module('urllib') 36 urllib = imp.new_module('urllib')
37 urllib.request = urllib2 37 urllib.request = urllib2
@@ -40,6 +40,10 @@ else:
40from signal import SIGTERM 40from signal import SIGTERM
41from error import GitError, UploadError 41from error import GitError, UploadError
42from trace import Trace 42from trace import Trace
43if is_python3():
44 from http.client import HTTPException
45else:
46 from httplib import HTTPException
43 47
44from git_command import GitCommand 48from git_command import GitCommand
45from git_command import ssh_sock 49from git_command import ssh_sock
@@ -262,7 +266,7 @@ class GitConfig(object):
262 Trace(': unpickle %s', self.file) 266 Trace(': unpickle %s', self.file)
263 fd = open(self._pickle, 'rb') 267 fd = open(self._pickle, 'rb')
264 try: 268 try:
265 return cPickle.load(fd) 269 return pickle.load(fd)
266 finally: 270 finally:
267 fd.close() 271 fd.close()
268 except EOFError: 272 except EOFError:
@@ -271,7 +275,7 @@ class GitConfig(object):
271 except IOError: 275 except IOError:
272 os.remove(self._pickle) 276 os.remove(self._pickle)
273 return None 277 return None
274 except cPickle.PickleError: 278 except pickle.PickleError:
275 os.remove(self._pickle) 279 os.remove(self._pickle)
276 return None 280 return None
277 281
@@ -279,13 +283,13 @@ class GitConfig(object):
279 try: 283 try:
280 fd = open(self._pickle, 'wb') 284 fd = open(self._pickle, 'wb')
281 try: 285 try:
282 cPickle.dump(cache, fd, cPickle.HIGHEST_PROTOCOL) 286 pickle.dump(cache, fd, pickle.HIGHEST_PROTOCOL)
283 finally: 287 finally:
284 fd.close() 288 fd.close()
285 except IOError: 289 except IOError:
286 if os.path.exists(self._pickle): 290 if os.path.exists(self._pickle):
287 os.remove(self._pickle) 291 os.remove(self._pickle)
288 except cPickle.PickleError: 292 except pickle.PickleError:
289 if os.path.exists(self._pickle): 293 if os.path.exists(self._pickle):
290 os.remove(self._pickle) 294 os.remove(self._pickle)
291 295
@@ -537,8 +541,8 @@ class Remote(object):
537 self.url = self._Get('url') 541 self.url = self._Get('url')
538 self.review = self._Get('review') 542 self.review = self._Get('review')
539 self.projectname = self._Get('projectname') 543 self.projectname = self._Get('projectname')
540 self.fetch = map(RefSpec.FromString, 544 self.fetch = list(map(RefSpec.FromString,
541 self._Get('fetch', all_keys=True)) 545 self._Get('fetch', all_keys=True)))
542 self._review_url = None 546 self._review_url = None
543 547
544 def _InsteadOf(self): 548 def _InsteadOf(self):
@@ -592,14 +596,11 @@ class Remote(object):
592 try: 596 try:
593 info_url = u + 'ssh_info' 597 info_url = u + 'ssh_info'
594 info = urllib.request.urlopen(info_url).read() 598 info = urllib.request.urlopen(info_url).read()
595 if '<' in info: 599 if info == 'NOT_AVAILABLE' or '<' in info:
596 # Assume the server gave us some sort of HTML 600 # If `info` contains '<', we assume the server gave us some sort
597 # response back, like maybe a login page. 601 # of HTML response back, like maybe a login page.
598 # 602 #
599 raise UploadError('%s: Cannot parse response' % info_url) 603 # Assume HTTP if SSH is not enabled or ssh_info doesn't look right.
600
601 if info == 'NOT_AVAILABLE':
602 # Assume HTTP if SSH is not enabled.
603 self._review_url = http_url + 'p/' 604 self._review_url = http_url + 'p/'
604 else: 605 else:
605 host, port = info.split() 606 host, port = info.split()
@@ -608,6 +609,8 @@ class Remote(object):
608 raise UploadError('%s: %s' % (self.review, str(e))) 609 raise UploadError('%s: %s' % (self.review, str(e)))
609 except urllib.error.URLError as e: 610 except urllib.error.URLError as e:
610 raise UploadError('%s: %s' % (self.review, str(e))) 611 raise UploadError('%s: %s' % (self.review, str(e)))
612 except HTTPException as e:
613 raise UploadError('%s: %s' % (self.review, e.__class__.__name__))
611 614
612 REVIEW_CACHE[u] = self._review_url 615 REVIEW_CACHE[u] = self._review_url
613 return self._review_url + self.projectname 616 return self._review_url + self.projectname
@@ -657,7 +660,7 @@ class Remote(object):
657 self._Set('url', self.url) 660 self._Set('url', self.url)
658 self._Set('review', self.review) 661 self._Set('review', self.review)
659 self._Set('projectname', self.projectname) 662 self._Set('projectname', self.projectname)
660 self._Set('fetch', map(str, self.fetch)) 663 self._Set('fetch', list(map(str, self.fetch)))
661 664
662 def _Set(self, key, value): 665 def _Set(self, key, value):
663 key = 'remote.%s.%s' % (self.name, key) 666 key = 'remote.%s.%s' % (self.name, key)