annotate mercurial/repo.py @ 11109:a2bc2f2d77a9

subrepo: normalize path part of URLs so that pulling subrepos from webdir works For a "all projects at root" repo layout eg: /main /sub Where subrepos are used such that a clone of main has this layout: ./main/ ./main/.hgsub ./main/sub/ And the .hgsub content is: sub = ../sub This allows a pull from a hgweb where main and sub are exposed at the root (or same directory level) The current code doesn't normalize the path component of a pull url. this results in trying to pull from http://server.com/hg/main/../sub Current hgweb implementation doesn't reduce the path component so this results in a 404 error though everything is setup logically. This patch adresses this 404 error on the puller side normalizing the URLs used for pulling sub repos. For this example, the URL would be reduced to http://server.com/hg/sub Fix + test
author Edouard Gomez <ed.gomez@free.fr>
date Sat, 01 May 2010 23:05:19 +0200
parents 25e572394f5c
children ff1044230bca
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1089
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents:
diff changeset
1 # repo.py - repository base classes for mercurial
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents:
diff changeset
2 #
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3930
diff changeset
3 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
2859
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2612
diff changeset
4 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
1089
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents:
diff changeset
5 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 7873
diff changeset
6 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9436
diff changeset
7 # GNU General Public License version 2 or any later version.
1089
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents:
diff changeset
8
5455
08d6e8754388 import gettext since '_' is used
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5259
diff changeset
9 from i18n import _
7873
4a4c7f6a5912 cleanup: drop unused imports
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7637
diff changeset
10 import error
5455
08d6e8754388 import gettext since '_' is used
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5259
diff changeset
11
2612
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1089
diff changeset
12 class repository(object):
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1089
diff changeset
13 def capable(self, name):
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1089
diff changeset
14 '''tell whether repo supports named capability.
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1089
diff changeset
15 return False if not supported.
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1089
diff changeset
16 if boolean capability, return True.
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1089
diff changeset
17 if string capability, return string.'''
5259
65dc707606ed Push capability checking into protocol-level code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4635
diff changeset
18 if name in self.capabilities:
65dc707606ed Push capability checking into protocol-level code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4635
diff changeset
19 return True
2612
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1089
diff changeset
20 name_eq = name + '='
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1089
diff changeset
21 for cap in self.capabilities:
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1089
diff changeset
22 if cap.startswith(name_eq):
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1089
diff changeset
23 return cap[len(name_eq):]
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1089
diff changeset
24 return False
5259
65dc707606ed Push capability checking into protocol-level code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4635
diff changeset
25
65dc707606ed Push capability checking into protocol-level code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4635
diff changeset
26 def requirecap(self, name, purpose):
65dc707606ed Push capability checking into protocol-level code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4635
diff changeset
27 '''raise an exception if the given capability is not present'''
65dc707606ed Push capability checking into protocol-level code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4635
diff changeset
28 if not self.capable(name):
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 6526
diff changeset
29 raise error.CapabilityError(
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 6526
diff changeset
30 _('cannot %s; remote repository does not '
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 6526
diff changeset
31 'support the %r capability') % (purpose, name))
6311
a079cf630065 Add default local() and cancopy() methods to repository base class
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 5455
diff changeset
32
a079cf630065 Add default local() and cancopy() methods to repository base class
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 5455
diff changeset
33 def local(self):
a079cf630065 Add default local() and cancopy() methods to repository base class
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 5455
diff changeset
34 return False
a079cf630065 Add default local() and cancopy() methods to repository base class
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 5455
diff changeset
35
a079cf630065 Add default local() and cancopy() methods to repository base class
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 5455
diff changeset
36 def cancopy(self):
a079cf630065 Add default local() and cancopy() methods to repository base class
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 5455
diff changeset
37 return self.local()
6526
cfeeac24fc1e repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents: 6312
diff changeset
38
cfeeac24fc1e repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents: 6312
diff changeset
39 def rjoin(self, path):
cfeeac24fc1e repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents: 6312
diff changeset
40 url = self.url()
cfeeac24fc1e repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents: 6312
diff changeset
41 if url.endswith('/'):
cfeeac24fc1e repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents: 6312
diff changeset
42 return url + path
9436
96379c93ba6f improve code readability
Andrey Somov <py4fun@gmail.com>
parents: 8225
diff changeset
43 else:
96379c93ba6f improve code readability
Andrey Somov <py4fun@gmail.com>
parents: 8225
diff changeset
44 return url + '/' + path