diff mercurial/subrepo.py @ 15150:91dc8878f888

subrepo: try remapping subpaths using the "final" path Before, the right-hand side of a .hgsub entry was used, as is, to match the left-hand side of a subpaths entry. This turned out to be less useful than expected since a .hgsub file with src/foo = src/foo has little context to do remapping on. The new idea is therefore to prefix the parent repo path *before* the remapping takes place. If the parent repository path (as defined by _abssource) is http://example.net/parent then the remapping for the above .hgsub entry will be done on the expanded path: http://example.net/parent/src/foo If this expanded path is not changed by the remapping, then we remap src/foo alone. This is the old behavior where the right-hand side is remapped without context.
author Martin Geisler <mg@aragost.com>
date Thu, 22 Sep 2011 15:15:18 +0200
parents eaec9cf91aea
children 6dc67dced8c1
line wrap: on
line diff
--- a/mercurial/subrepo.py	Thu Sep 22 14:39:49 2011 +0200
+++ b/mercurial/subrepo.py	Thu Sep 22 15:15:18 2011 +0200
@@ -74,6 +74,23 @@
                 raise util.Abort(_('missing ] in subrepo source'))
             kind, src = src.split(']', 1)
             kind = kind[1:]
+            src = src.lstrip() # strip any extra whitespace after ']'
+
+        if not util.url(src).isabs():
+            parent = _abssource(ctx._repo, abort=False)
+            if parent:
+                parent = util.url(parent)
+                parent.path = posixpath.join(parent.path or '', src)
+                parent.path = posixpath.normpath(parent.path)
+                joined = str(parent)
+                # Remap the full joined path and use it if it changes,
+                # else remap the original source.
+                remapped = remap(joined)
+                if remapped == joined:
+                    src = remap(src)
+                else:
+                    src = remapped
+
         src = remap(src)
         state[path] = (src.strip(), rev.get(path, ''), kind)