subrepo: try remapping subpaths using the "final" path
authorMartin Geisler <mg@aragost.com>
Thu, 22 Sep 2011 15:15:18 +0200
changeset 15150 91dc8878f888
parent 15149 eaec9cf91aea
child 15151 0d4f6e843b05
child 15160 b2d4400398f3
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.
mercurial/subrepo.py
tests/test-subrepo-paths.t
--- 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)
 
--- a/tests/test-subrepo-paths.t	Thu Sep 22 14:39:49 2011 +0200
+++ b/tests/test-subrepo-paths.t	Thu Sep 22 15:15:18 2011 +0200
@@ -1,19 +1,22 @@
   $ hg init outer
   $ cd outer
 
+  $ echo '[paths]' >> .hg/hgrc
+  $ echo 'default = http://example.net/' >> .hg/hgrc
+
 hg debugsub with no remapping
 
-  $ echo 'sub = http://example.net/libfoo' > .hgsub
+  $ echo 'sub = libfoo' > .hgsub
   $ hg add .hgsub
 
   $ hg debugsub
   path sub
-   source   http://example.net/libfoo
+   source   libfoo
    revision 
 
 hg debugsub with remapping
 
-  $ echo '[subpaths]' > .hg/hgrc
+  $ echo '[subpaths]' >> .hg/hgrc
   $ printf 'http://example.net/lib(.*) = C:\\libs\\\\1-lib\\\n' >> .hg/hgrc
 
   $ hg debugsub
@@ -30,6 +33,21 @@
    source   C:\libs\bar-lib\
    revision 
 
+test absolute source path -- testing with a URL is important since
+standard os.path.join wont treat that as an absolute path
+
+  $ echo 'abs = http://example.net/abs' > .hgsub
+  $ hg debugsub
+  path abs
+   source   http://example.net/abs
+   revision 
+
+  $ echo 'abs = /abs' > .hgsub
+  $ hg debugsub
+  path abs
+   source   /abs
+   revision 
+
 test bad subpaths pattern
 
   $ cat > .hg/hgrc <<EOF