[PATCH 2 of 2] paths: Added 'force-alias' option in ui.expandpaths()

Victor Suba vosuba at gmail.com
Sun Nov 13 14:31:52 CST 2011


# HG changeset patch
# User Victor Suba <vosuba at gmail.com>
# Date 1321214772 28800
# Node ID fcf006b1cfce252573d0e461595cd61fa366e56b
# Parent  64efea9f1a8cc6caf370b3967d2b22ac36e9e5de
paths: Added 'force-alias' option in ui.expandpaths()
to force creation of a path alias if one doesn't already
exist.  Applied it as default to "hg pull", "hg incoming"
and "hg identify".

diff -r 64efea9f1a8c -r fcf006b1cfce mercurial/commands.py
--- a/mercurial/commands.py	Sun Nov 13 01:44:28 2011 -0800
+++ b/mercurial/commands.py	Sun Nov 13 12:06:12 2011 -0800
@@ -3283,7 +3283,9 @@
     revs = []
 
     if source:
-        source, branches = hg.parseurl(ui.expandpath(source))
+        pathinfo = {'force-alias': True}
+        source = ui.expandpath(source, pathinfo=pathinfo)
+        source, branches = hg.parseurl(source)
         repo = hg.peer(ui, {}, source)
         revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
 
@@ -3649,7 +3651,9 @@
         raise util.Abort(_('cannot combine --bundle and --subrepos'))
 
     if opts.get('bookmarks'):
-        source, branches = hg.parseurl(ui.expandpath(source),
+        pathinfo = {'force-alias': True}
+        source = ui.expandpath(source, pathinfo=pathinfo)
+        source, branches = hg.parseurl(source,
                                        opts.get('branch'))
         other = hg.peer(repo, opts, source)
         if 'bookmarks' not in other.listkeys('namespaces'):
@@ -4255,7 +4259,9 @@
 
     Returns 0 on success, 1 if an update had unresolved files.
     """
-    source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
+    pathinfo = {'force-alias': True}
+    source = ui.expandpath(source, pathinfo=pathinfo)
+    source, branches = hg.parseurl(source, opts.get('branch'))
     other = hg.peer(repo, opts, source)
     ui.status(_('pulling from %s\n') % util.hidepassword(source))
     revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
diff -r 64efea9f1a8c -r fcf006b1cfce mercurial/hg.py
--- a/mercurial/hg.py	Sun Nov 13 01:44:28 2011 -0800
+++ b/mercurial/hg.py	Sun Nov 13 12:06:12 2011 -0800
@@ -441,7 +441,9 @@
         (remoterepo, incomingchangesetlist, displayer) parameters,
     and is supposed to contain only code that can't be unified.
     """
-    source, branches = parseurl(ui.expandpath(source), opts.get('branch'))
+    pathinfo = {'force-alias': True}
+    source = ui.expandpath(source, pathinfo=pathinfo)
+    source, branches = parseurl(source, opts.get('branch'))
     other = peer(repo, opts, source)
     ui.status(_('comparing with %s\n') % util.hidepassword(source))
     revs, checkout = addbranchrevs(repo, other, branches, opts.get('rev'))
diff -r 64efea9f1a8c -r fcf006b1cfce mercurial/ui.py
--- a/mercurial/ui.py	Sun Nov 13 01:44:28 2011 -0800
+++ b/mercurial/ui.py	Sun Nov 13 12:06:12 2011 -0800
@@ -428,17 +428,56 @@
                 
         return [(alias, paths[alias]) for alias in sorted(paths.keys())]
     
-    def expandpath(self, loc, default=None):
+    def reversepath(self, path, forceAlias):
+        """Reverse search from path to path alias, and if there isn't anything
+        create  a new alias"""
+        seen = set()
+        for alias, url in self.configitems("paths"):
+            if path == url:
+                return alias
+            seen.add(alias)
+        for alias, url in self._paths.items():
+            if path == url:
+                return alias
+            seen.add(alias)
+        
+        if forceAlias:
+            i = 0
+            while True:
+                alias = 'remote%d' % i
+                if alias not in seen:
+                    self._paths[alias] = path
+                    self.writePaths()
+                    self.status(_("created new path alias '%s' -> '%s'\n" % (alias, util.hidepassword(path))))
+                    return alias
+                i += 1
+        else:
+            return None
+        
+
+    def expandpath(self, loc, default=None, pathinfo={}):
         """Return repository location relative to cwd or from [paths]"""
+        #ToDo: Teach expandpath about the url#branch format
         if util.hasscheme(loc) or os.path.isdir(os.path.join(loc, '.hg')):
-            return loc
+            pathinfo['alias'] = self.reversepath(loc, pathinfo.get('force-alias', False))
 
         path = self.config('paths', loc)
-        if not path:
-            path = self._paths.get(loc, None)
+        if not path: path = self._paths.get(loc, None)
         if not path and default is not None:
             path = self.config('paths', default)
-        return path or loc
+            if path:
+                loc = default
+            
+        if path:
+            # Update the path alias in .hg/paths if it's not there
+            if self._paths.get(loc, None) != path:
+                self._paths[loc] = path
+                self.writePaths()
+            pathinfo['alias'] = loc
+            return path
+        else:
+            pathinfo['alias'] = self.reversepath(loc, pathinfo.get('force-alias', False))
+            return loc
 
     def pushbuffer(self):
         self._buffers.append([])


More information about the Mercurial-devel mailing list