Show More
@@ -17,6 +17,7 b' import socket' | |||
|
17 | 17 | from mercurial.i18n import _ |
|
18 | 18 | |
|
19 | 19 | from mercurial import ( |
|
20 | encoding, | |
|
20 | 21 | error, |
|
21 | 22 | pathutil, |
|
22 | 23 | pycompat, |
@@ -26,6 +27,10 b' from mercurial import (' | |||
|
26 | 27 | worker, |
|
27 | 28 | ) |
|
28 | 29 | |
|
30 | from mercurial.utils import ( | |
|
31 | stringutil, | |
|
32 | ) | |
|
33 | ||
|
29 | 34 | from ..largefiles import lfutil |
|
30 | 35 | |
|
31 | 36 | # 64 bytes for SHA256 |
@@ -231,6 +236,30 b' class local(object):' | |||
|
231 | 236 | False otherwise.""" |
|
232 | 237 | return self.cachevfs.exists(oid) or self.vfs.exists(oid) |
|
233 | 238 | |
|
239 | def _urlerrorreason(urlerror): | |
|
240 | '''Create a friendly message for the given URLError to be used in an | |
|
241 | LfsRemoteError message. | |
|
242 | ''' | |
|
243 | inst = urlerror | |
|
244 | ||
|
245 | if isinstance(urlerror.reason, Exception): | |
|
246 | inst = urlerror.reason | |
|
247 | ||
|
248 | if util.safehasattr(inst, 'reason'): | |
|
249 | try: # usually it is in the form (errno, strerror) | |
|
250 | reason = inst.reason.args[1] | |
|
251 | except (AttributeError, IndexError): | |
|
252 | # it might be anything, for example a string | |
|
253 | reason = inst.reason | |
|
254 | if isinstance(reason, pycompat.unicode): | |
|
255 | # SSLError of Python 2.7.9 contains a unicode | |
|
256 | reason = encoding.unitolocal(reason) | |
|
257 | return reason | |
|
258 | elif getattr(inst, "strerror", None): | |
|
259 | return encoding.strtolocal(inst.strerror) | |
|
260 | else: | |
|
261 | return stringutil.forcebytestr(urlerror) | |
|
262 | ||
|
234 | 263 | class _gitlfsremote(object): |
|
235 | 264 | |
|
236 | 265 | def __init__(self, repo, url): |
@@ -279,6 +308,11 b' class _gitlfsremote(object):' | |||
|
279 | 308 | } |
|
280 | 309 | hint = hints.get(ex.code, _('api=%s, action=%s') % (url, action)) |
|
281 | 310 | raise LfsRemoteError(_('LFS HTTP error: %s') % ex, hint=hint) |
|
311 | except util.urlerr.urlerror as ex: | |
|
312 | hint = (_('the "lfs.url" config may be used to override %s') | |
|
313 | % self.baseurl) | |
|
314 | raise LfsRemoteError(_('LFS error: %s') % _urlerrorreason(ex), | |
|
315 | hint=hint) | |
|
282 | 316 | try: |
|
283 | 317 | response = json.loads(rawjson) |
|
284 | 318 | except ValueError: |
@@ -409,6 +443,11 b' class _gitlfsremote(object):' | |||
|
409 | 443 | self.ui.debug('%s: %s\n' % (oid, ex.read())) |
|
410 | 444 | raise LfsRemoteError(_('HTTP error: %s (oid=%s, action=%s)') |
|
411 | 445 | % (ex, oid, action)) |
|
446 | except util.urlerr.urlerror as ex: | |
|
447 | hint = (_('attempted connection to %s') | |
|
448 | % util.urllibcompat.getfullurl(request)) | |
|
449 | raise LfsRemoteError(_('LFS error: %s') % _urlerrorreason(ex), | |
|
450 | hint=hint) | |
|
412 | 451 | |
|
413 | 452 | def _batch(self, pointers, localstore, action): |
|
414 | 453 | if action not in ['upload', 'download']: |
@@ -81,6 +81,11 b' Reasonable hint for a misconfigured blob' | |||
|
81 | 81 | (the "lfs.url" config may be used to override http://localhost:$HGPORT/missing) |
|
82 | 82 | [255] |
|
83 | 83 | |
|
84 | $ hg -R httpclone update default --config lfs.url=http://localhost:$HGPORT2/missing | |
|
85 | abort: LFS error: *onnection *refused*! (glob) | |
|
86 | (the "lfs.url" config may be used to override http://localhost:$HGPORT2/missing) | |
|
87 | [255] | |
|
88 | ||
|
84 | 89 | Blob URIs are correct when --prefix is used |
|
85 | 90 | |
|
86 | 91 | $ hg clone --debug http://localhost:$HGPORT/subdir/mount/point cloned2 |
General Comments 0
You need to be logged in to leave comments.
Login now