319 and path[:1] == b'/' |
319 and path[:1] == b'/' |
320 and path[1:2].isalpha() |
320 and path[1:2].isalpha() |
321 and path[2:6].lower() == b'%3a/' |
321 and path[2:6].lower() == b'%3a/' |
322 ): |
322 ): |
323 path = path[:2] + b':/' + path[6:] |
323 path = path[:2] + b':/' + path[6:] |
324 path = urlreq.url2pathname(path) |
324 # pycompat.fsdecode() / pycompat.fsencode() are used so that bytes |
|
325 # in the URL roundtrip correctly on Unix. urlreq.url2pathname() on |
|
326 # py3 will decode percent-encoded bytes using the utf-8 encoding |
|
327 # and the "replace" error handler. This means that it will not |
|
328 # preserve non-UTF-8 bytes (https://bugs.python.org/issue40983). |
|
329 # url.open() uses the reverse function (urlreq.pathname2url()) and |
|
330 # has a similar problem |
|
331 # (https://bz.mercurial-scm.org/show_bug.cgi?id=6357). It makes |
|
332 # sense to solve both problems together and handle all file URLs |
|
333 # consistently. For now, we warn. |
|
334 unicodepath = urlreq.url2pathname(pycompat.fsdecode(path)) |
|
335 if pycompat.ispy3 and u'\N{REPLACEMENT CHARACTER}' in unicodepath: |
|
336 ui.warn( |
|
337 _( |
|
338 b'on Python 3, we currently do not support non-UTF-8 ' |
|
339 b'percent-encoded bytes in file URLs for Subversion ' |
|
340 b'repositories\n' |
|
341 ) |
|
342 ) |
|
343 path = pycompat.fsencode(unicodepath) |
325 except ValueError: |
344 except ValueError: |
326 proto = b'file' |
345 proto = b'file' |
327 path = os.path.abspath(url) |
346 path = os.path.abspath(url) |
328 if proto == b'file': |
347 if proto == b'file': |
329 path = util.pconvert(path) |
348 path = util.pconvert(path) |