D10263: path: introduce a `path://` syntax to reference other path name
marmoute (Pierre-Yves David)
phabricator at mercurial-scm.org
Wed Mar 24 08:52:53 UTC 2021
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.
REVISION SUMMARY
This make it easier for a path to reuse the same location of another path with different parameter. This is useful to create path "alias" with common config option.
This will become very useful to create path that reference a list of other path.
This changeset focus on implemented the basic feature, future changesets will
deal with various error management (and associated testing).
REPOSITORY
rHG Mercurial
BRANCH
default
REVISION DETAIL
https://phab.mercurial-scm.org/D10263
AFFECTED FILES
mercurial/ui.py
tests/test-paths.t
CHANGE DETAILS
diff --git a/tests/test-paths.t b/tests/test-paths.t
--- a/tests/test-paths.t
+++ b/tests/test-paths.t
@@ -211,3 +211,126 @@
000000000000
$ cd ..
+
+Testing path referencing other paths
+====================================
+
+basic setup
+-----------
+
+ $ ls -1
+ a
+ b
+ gpath1
+ suboptions
+ $ hg init chained_path
+ $ cd chained_path
+ $ cat << EOF > .hg/hgrc
+ > [paths]
+ > default=../a
+ > other_default=path://default
+ > path_with_branch=../branchy#foo
+ > other_branch=path://path_with_branch
+ > other_branched=path://path_with_branch#default
+ > pushdest=../push-dest
+ > pushdest:pushrev=default
+ > pushdest2=path://pushdest
+ > pushdest-overwrite=path://pushdest
+ > pushdest-overwrite:pushrev=foo
+ > EOF
+
+ $ hg init ../branchy
+ $ hg init ../push-dest
+ $ hg debugbuilddag -R ../branchy '.:base+3<base at foo+5'
+ $ hg log -G -T '{branch}\n' -R ../branchy
+ o foo
+ |
+ o foo
+ |
+ o foo
+ |
+ o foo
+ |
+ o foo
+ |
+ | o default
+ | |
+ | o default
+ | |
+ | o default
+ |/
+ o default
+
+
+ $ hg paths
+ default = $TESTTMP/a
+ gpath1 = http://hg.example.com/
+ other_branch = $TESTTMP/branchy#foo
+ other_branched = $TESTTMP/branchy#default
+ other_default = $TESTTMP/a
+ path_with_branch = $TESTTMP/branchy#foo
+ pushdest = $TESTTMP/push-dest
+ pushdest:pushrev = default
+ pushdest-overwrite = $TESTTMP/push-dest
+ pushdest-overwrite:pushrev = foo
+ pushdest2 = $TESTTMP/push-dest
+ pushdest2:pushrev = default
+
+test basic chaining
+-------------------
+
+ $ hg path other_default
+ $TESTTMP/a
+ $ hg pull default
+ pulling from $TESTTMP/a
+ no changes found
+ $ hg pull other_default
+ pulling from $TESTTMP/a
+ no changes found
+
+test inheritance of the #fragment part
+--------------------------------------
+
+ $ hg pull path_with_branch
+ pulling from $TESTTMP/branchy
+ adding changesets
+ adding manifests
+ adding file changes
+ added 6 changesets with 0 changes to 0 files
+ new changesets 1ea73414a91b:bcebb50b77de
+ (run 'hg update' to get a working copy)
+ $ hg pull other_branch
+ pulling from $TESTTMP/branchy
+ no changes found
+ $ hg pull other_branched
+ pulling from $TESTTMP/branchy
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 0 changes to 0 files (+1 heads)
+ new changesets 66f7d451a68b:2dc09a01254d
+ (run 'hg heads' to see heads)
+
+test inheritance of the suboptions
+----------------------------------
+
+ $ hg push pushdest
+ pushing to $TESTTMP/push-dest
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 0 changes to 0 files
+ $ hg push pushdest2
+ pushing to $TESTTMP/push-dest
+ searching for changes
+ no changes found
+ [1]
+ $ hg push pushdest-overwrite --new-branch
+ pushing to $TESTTMP/push-dest
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 0 changes to 0 files (+1 heads)
diff --git a/mercurial/ui.py b/mercurial/ui.py
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -2197,6 +2197,9 @@
loc, sub_opts = ui.configsuboptions(b'paths', name)
self[name] = path(ui, name, rawloc=loc, suboptions=sub_opts)
+ for name, p in sorted(self.items()):
+ p.chain_path(ui, self)
+
def getpath(self, ui, name, default=None):
"""Return a ``path`` from a string, falling back to default.
@@ -2331,6 +2334,22 @@
self._apply_suboptions(ui, sub_opts)
+ def chain_path(self, ui, paths):
+ if self.url.scheme == b'path':
+ assert self.url.path is None
+ subpath = paths[self.url.host]
+ self.url = subpath.url
+ self.rawloc = subpath.rawloc
+ self.loc = subpath.loc
+ if self.branch is None:
+ self.branch = subpath.branch
+ else:
+ base = self.rawloc.rsplit(b'#', 1)[0]
+ self.rawloc = b'%s#%s' % (base, self.branch)
+ suboptions = subpath._all_sub_opts.copy()
+ suboptions.update(self._own_sub_opts)
+ self._apply_suboptions(ui, suboptions)
+
def _validate_path(self):
# When given a raw location but not a symbolic name, validate the
# location is valid.
To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel
More information about the Mercurial-devel
mailing list