changeset 12662:7285b2824fb7

ui.paths: expand paths directly in fixconfig (issue2373) var and home expansion should be done first.
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Sat, 09 Oct 2010 12:28:16 -0500
parents 6ed5ae6264c2
children 8269af351a64
files mercurial/ui.py tests/test-paths.t
diffstat 2 files changed, 24 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/ui.py	Sat Oct 09 11:55:25 2010 -0500
+++ b/mercurial/ui.py	Sat Oct 09 12:28:16 2010 -0500
@@ -98,12 +98,21 @@
         self.fixconfig(root=root)
 
     def fixconfig(self, root=None):
+        # expand vars and ~
         # translate paths relative to root (or home) into absolute paths
         root = root or os.getcwd()
         for c in self._tcfg, self._ucfg, self._ocfg:
             for n, p in c.items('paths'):
-                if p and "://" not in p and not os.path.isabs(p):
-                    c.set("paths", n, os.path.normpath(os.path.join(root, p)))
+                if not p:
+                    continue
+                if '%%' in p:
+                    self.warn(_("(deprecated '%%' in path %s=%s from %s)\n")
+                              % (n, p, self.configsource('paths', n)))
+                    p = p.replace('%%', '%')
+                p = util.expandpath(p)
+                if '://' not in p and not os.path.isabs(p):
+                        p = os.path.normpath(os.path.join(root, p))
+                c.set("paths", n, p)
 
         # update ui options
         self.debugflag = self.configbool('ui', 'debug')
@@ -300,24 +309,14 @@
             user = util.shortuser(user)
         return user
 
-    def _path(self, loc):
-        p = self.config('paths', loc)
-        if p:
-            if '%%' in p:
-                self.warn(_("(deprecated '%%' in path %s=%s from %s)\n") %
-                          (loc, p, self.configsource('paths', loc)))
-                p = p.replace('%%', '%')
-            p = util.expandpath(p)
-        return p
-
     def expandpath(self, loc, default=None):
         """Return repository location relative to cwd or from [paths]"""
         if "://" in loc or os.path.isdir(os.path.join(loc, '.hg')):
             return loc
 
-        path = self._path(loc)
+        path = self.config('paths', loc)
         if not path and default is not None:
-            path = self._path(default)
+            path = self.config('paths', default)
         return path or loc
 
     def pushbuffer(self):
--- a/tests/test-paths.t	Sat Oct 09 11:55:25 2010 -0500
+++ b/tests/test-paths.t	Sat Oct 09 12:28:16 2010 -0500
@@ -5,6 +5,7 @@
   $ cd a
   $ echo '[paths]' >> .hg/hgrc
   $ echo 'dupe = ../b' >> .hg/hgrc
+  $ echo 'expand = $SOMETHING/bar' >> .hg/hgrc
   $ hg in dupe
   comparing with $TESTTMP/b
   no changes found
@@ -14,3 +15,13 @@
   comparing with $TESTTMP/b
   no changes found
   [1]
+  $ cd a
+  $ hg paths
+  dupe = $TESTTMP/b
+  expand = $TESTTMP/a/$SOMETHING/bar
+  $ SOMETHING=foo hg paths
+  dupe = $TESTTMP/b
+  expand = $TESTTMP/a/foo/bar
+  $ SOMETHING=/foo hg paths
+  dupe = $TESTTMP/b
+  expand = /foo/bar