[PATCH 1 of 2] paths: Command editable remote paths

Augie Fackler durin42 at gmail.com
Tue Nov 15 08:27:12 CST 2011


On Nov 13, 2011, at 2:31 PM, Victor Suba wrote:

> # HG changeset patch
> # User Victor Suba <vosuba at gmail.com>
> # Date 1321177468 28800
> # Node ID 64efea9f1a8cc6caf370b3967d2b22ac36e9e5de
> # Parent  1bb0a5b02da9ef3505bfb4ac02b2d51cf220220f
> paths: Command editable remote paths.
> 
> diff -r 1bb0a5b02da9 -r 64efea9f1a8c mercurial/commands.py
> --- a/mercurial/commands.py	Thu Nov 10 17:06:30 2011 -0600
> +++ b/mercurial/commands.py	Sun Nov 13 01:44:28 2011 -0800
> @@ -9,7 +9,7 @@
> from lock import release
> from i18n import _, gettext
> import os, re, difflib, time, tempfile, errno
> -import hg, scmutil, util, revlog, extensions, copies, error, bookmarks
> +import hg, scmutil, util, revlog, extensions, copies, error, bookmarks, pathsutil
> import patch, help, url, encoding, templatekw, discovery
> import archival, changegroup, cmdutil, hbisect
> import sshserver, hgweb, hgweb.server, commandserver
> @@ -4120,9 +4120,14 @@
>             displayer.show(repo[n])
>     displayer.close()
> 
> - at command('paths', [], _('[NAME]'))
> -def paths(ui, repo, search=None):
> -    """show aliases for remote repositories
> + at command('paths',
> +    [('f', 'force', False, _('force')),
> +     ('d', 'delete', False, _('delete a given path')),
> +     ('r', 'rename', '', _('rename a given path'), _('NAME'))],
> +    _('hg paths [-f] [-d] [-m NAME] [NAME] [URL]'))

I'm not sure how this is better than editing .hg/hgrc. This is a specialized form of being able to specify configuration settings at the command line, and we've always rejected such functionality because everyone that uses Mercurial should already be comfortable editing a text file.

> +def paths(ui, repo, name=None, url=None, force=False, delete=False,
> +            rename=None):
> +    """show, create or modify aliases for remote repositories
> 
>     Show definition of symbolic path name NAME. If no name is given,
>     show definition of all available names.
> @@ -4149,16 +4154,52 @@
> 
>     Returns 0 on success.
>     """
> -    if search:
> -        for name, path in ui.configitems("paths"):
> -            if name == search:
> -                ui.status("%s\n" % util.hidepassword(path))
> -                return
> -        if not ui.quiet:
> -            ui.warn(_("not found!\n"))
> -        return 1
> +    if name:
> +        if url or rename or delete:
> +            if not name:
> +                raise util.Abort(_("path NAME is missing"))
> +            
> +            if name in [x[0] for x in ui.configitems("paths")]:
> +                raise util.Abort(_("path '%s' exists in [paths] and can't be modified") % name)
> +            if rename in [x[0] for x in ui.configitems("paths")]:
> +                raise util.Abort(_("path '%s' exists in [paths] and can't be modified") % rename)
> +            
> +            if rename:
> +                if rename in ui._paths:
> +                    if (name in ui._paths) and not force:
> +                        raise util.Abort(_("path '%s' already exists "
> +                                            "(use -f to force)") % name)
> +                    url = ui._paths[rename]
> +                    del ui._paths[rename]
> +                    ui._paths[name] = url
> +                    ui.writePaths()
> +                    return 0
> +                else:
> +                    raise util.Abort(_("path '%s' is not defined.\n") % rename)
> +            elif delete:
> +                if name in ui._paths:
> +                    del ui._paths[name]
> +                    ui.writePaths()
> +                    return 0
> +                else:
> +                    raise util.Abort(_("path '%s' is not defined.\n") % name)
> +            elif url:
> +                if (name in ui._paths) and not force:
> +                    raise util.Abort(_("path '%s' already exists "
> +                                        "(use -f to force)") % name)
> +                ui._paths[name] = url
> +                ui.writePaths()
> +                return 0
> +        else:
> +            for pname, path in ui.allpaths():
> +                if pname == name:
> +                    ui.status("%s\n" % util.hidepassword(path))
> +                    return
> +            if not ui.quiet:
> +                ui.warn(_("not found!\n"))
> +            return 1
>     else:
> -        for name, path in ui.configitems("paths"):
> +        for name, path in ui.allpaths():
>             if ui.quiet:
>                 ui.write("%s\n" % name)
>             else:
> diff -r 1bb0a5b02da9 -r 64efea9f1a8c mercurial/pathsutil.py
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/mercurial/pathsutil.py	Sun Nov 13 01:44:28 2011 -0800
> @@ -0,0 +1,37 @@
> +# Managed remote paths implementation
> +#
> +# Copyright 2011 Victor Suba Miura <vosuba at gmail.com>
> +#
> +# This software may be used and distributed according to the terms of the
> +# GNU General Public License version 2 or any later version.
> +
> +import os
> +import util
> +
> +def read():
> +    paths = {}
> +    try:
> +        fp = open(".hg/paths")
> +    except IOError:
> +        return paths
> +    
> +    for line in fp.readlines():
> +        line = line.strip()
> +        if not line:
> +            continue
> +        if ' ' not in line:
> +            repo.ui.warn(_('malformed line in .hg/paths: %r\n') % line)
> +            continue
> +        path, url = line.split(' ', 1)
> +        paths[path] = url
> +        
> +    fp.close()
> +    return paths
> +        
> +def write(paths):
> +    fp = open(".hg/paths", "w")
> +    for path, url in paths.items():
> +        fp.write("%s %s\n" % (path, url))
> +    fp.close()
> +
> +
> diff -r 1bb0a5b02da9 -r 64efea9f1a8c mercurial/ui.py
> --- a/mercurial/ui.py	Thu Nov 10 17:06:30 2011 -0600
> +++ b/mercurial/ui.py	Sun Nov 13 01:44:28 2011 -0800
> @@ -6,7 +6,7 @@
> # GNU General Public License version 2 or any later version.
> 
> from i18n import _
> -import errno, getpass, os, socket, sys, tempfile, traceback
> +import errno, getpass, os, socket, sys, tempfile, traceback, pathsutil
> import config, scmutil, util, error
> 
> class ui(object):
> @@ -42,7 +42,12 @@
>             # we always trust global config files
>             for f in scmutil.rcpath():
>                 self.readconfig(f, trust=True)
> +        
> +        self._paths = pathsutil.read()
> 
> +    def writePaths(self):
> +        pathsutil.write(self._paths)
> +        
>     def copy(self):
>         return self.__class__(self)
> 
> @@ -411,13 +416,26 @@
>         if not self.verbose:
>             user = util.shortuser(user)
>         return user
> -
> +    
> +    def allpaths(self):
> +        """Gather paths from hgrc config, and .hg/paths and return sorted list"""
> +        paths = {}
> +        for alias, url in self.configitems("paths"):
> +            paths[alias] = url
> +        for alias, url in self._paths.items():
> +            if alias not in paths:
> +                paths[alias] = url
> +                
> +        return [(alias, paths[alias]) for alias in sorted(paths.keys())]
> +    
>     def expandpath(self, loc, default=None):
>         """Return repository location relative to cwd or from [paths]"""
>         if util.hasscheme(loc) or os.path.isdir(os.path.join(loc, '.hg')):
>             return loc
> 
>         path = self.config('paths', loc)
> +        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
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list