mercurial/ui.py
changeset 46826 83b0a5c0dfec
parent 46825 4821cb414a5c
child 46827 1ecf082386b7
--- a/mercurial/ui.py	Sun Mar 21 16:31:42 2021 +0100
+++ b/mercurial/ui.py	Thu Mar 18 12:02:01 2021 +0100
@@ -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.