[PATCH] commands: add 'setup' command to allow automatic hgrc configuration

Mathias De Maré mathias.demare at gmail.com
Thu Mar 12 12:15:55 CDT 2015


On Thu, Mar 12, 2015 at 6:07 PM, Mathias De Maré <mathias.demare at gmail.com>
wrote:

> # HG changeset patch
> # User Mathias De Maré <mathias.demare at gmail.com>
> # Date 1426162870 -3600
> #      Thu Mar 12 13:21:10 2015 +0100
> # Node ID 0de0fc66a20a5f0658a6c6f1f5de20d4705f3de1
> # Parent  7cf9a9e0cf893e7ae82dc576a03c843fd6640438
> commands: add 'setup' command to allow automatic hgrc configuration
>

Please ignore this patch, I pushed it too early, I'll be sending a new
version (with RFC flag and some changes).

>
> This is a proposal meant to easily set up new users with
> a good hgrc file. It's very basic (a combination of
> 'release early' and 'I don't have a lot of time').
> Comments are very much welcome.
>
> I wasn't too sure about using the first path
> listed in the userhgrc, not sure if that's the best approach.
>
> Some other ideas to throw out there:
> - Running 'setup' by default if a user does not have a .hgrc
>       and is using the terminal (possibly falls under moot?)
> - Perhaps having a global 'do you want to have a lot of sensible defaults
> set'
>   question could be useful as well.
> - Popping up a merge window in case a user already has a .hgrc.
>   This could allow the user to do the merge,
>   and avoids us having to mess with editing configs
>   (this was a very good idea by smf).
>
> diff --git a/mercurial/commands.py b/mercurial/commands.py
> --- a/mercurial/commands.py
> +++ b/mercurial/commands.py
> @@ -19,10 +19,12 @@
>  import merge as mergemod
>  import minirst, revset, fileset
>  import dagparser, context, simplemerge, graphmod, copies
> +import query
>  import random
>  import setdiscovery, treediscovery, dagutil, pvec, localrepo
>  import phases, obsolete, exchange, bundle2
>  import ui as uimod
> +import config as configmod
>
>  table = {}
>
> @@ -5615,6 +5617,50 @@
>          self.httpd.serve_forever()
>
>
> + at command('setup', [])
> +def setup(ui, repo):
> +    """run a setup to generate a Mercurial configuration
> +
> +    Answer a few questions to generate a basic Mercurial configuration.
> +
> +    Returns 0 on success.
> +    """
> +
> +    paths = scmutil.userrcpath()
> +    if os.path.isfile(paths[0]):
> +        if not query.binaryquery(repo,
> +                _('WARNING: you already have a ' \
> +                'Mercurial configuration file!\n' \
> +                'Are you sure you want to overwrite it ' \
> +                'with a new configuration?'),
> +            False):
> +            return
> +
> +    userconfig = configmod.config()
> +
> +    if query.binaryquery(repo,
> +            _('Would you like to configure your username? '), True):
> +        name = query.textquery(repo, _('Please enter your name: '))
> +        email = query.textquery(repo, _('Please enter your email adress:
> '))
> +        userconfig.set('ui', 'username', '%s <%s>' % (name, email))
> +    if query.binaryquery(repo, _('Would you like to enable ' \
> +            'some useful extensions by default, ' \
> +            'enhancing your experience?\n' \
> +            'The extensions to be enabled are: ' \
> +            'color, pager, progress'), True):
> +        userconfig.set('extensions', 'color', '')
> +        userconfig.set('extensions', 'pager', '')
> +        userconfig.set('pager', 'pager', 'less -FRX')
> +        userconfig.set('extensions', 'progress', '')
> +    if query.binaryquery(repo,
> +            'Would you like to use an extended diff format? ' \
> +            'If you are viewing changes, ' \
> +            'this allows you to easily see added/removed files.',
> +            True):
> +        userconfig.set('diff', 'git', True)
> +    userconfig.write(paths[0])
> +
> +
>  @command('^status|st',
>      [('A', 'all', None, _('show status of all files')),
>      ('m', 'modified', None, _('show only modified files')),
> diff --git a/mercurial/config.py b/mercurial/config.py
> --- a/mercurial/config.py
> +++ b/mercurial/config.py
> @@ -157,3 +157,13 @@
>          if not fp:
>              fp = util.posixfile(path)
>          self.parse(path, fp.read(), sections, remap, self.read)
> +
> +    def write(self, path, fp=None):
> +        if not fp:
> +            fp = util.posixfile(path, 'w')
> +        for section in self:
> +            d = self[section]
> +            fp.write('[%s]\n' % section)
> +            for key in d:
> +                fp.write('%s = %s\n' % (key, d[key]))
> +            fp.write('\n')
> diff --git a/mercurial/query.py b/mercurial/query.py
> new file mode 100644
> --- /dev/null
> +++ b/mercurial/query.py
> @@ -0,0 +1,42 @@
> +# query.py - user querying for mercurial
> +#
> +# Copyright 2015 Mathias De Maré <mathias.demare 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.
> +
> +def _generateresponsestr(responses, default):
> +    defaultidx = responses.index(default)
> +    if defaultidx >= 0 and len(responses[defaultidx]) > 0:
> +        responses[defaultidx] = responses[defaultidx].title()
> +    return '(%s)' % '/'.join(responses)
> +
> +def textquery(repo, question, emptyallowed=False):
> +    """Query the user using an open question"""
> +    repo.ui.write('%s\n' % question)
> +    while True:
> +        res = raw_input()
> +        if emptyallowed or len(res):
> +            return res
> +
> +def optionquery(repo, question, responses, default):
> +    """Query the user using question and a given set of parameters.
> +    Once a valid response is given, the query returns
> +    the match from the list of responses."""
> +    repo.ui.write('%s %s\n' % (question, _generateresponsestr(responses,
> default)))
> +    while True:
> +        res = raw_input()
> +        if not len(res) and default:
> +            return default
> +        for response in responses:
> +            if response.startswith(res):
> +                return response
> +
> +def binaryquery(repo, question, default=True):
> +    """Query the user using question and 'yes/no'"""
> +    if default:
> +        default = 'yes'
> +    else:
> +        default = 'no'
> +    res = optionquery(repo, question, ['yes', 'no'], default)
> +    return res == 'yes'
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://selenic.com/pipermail/mercurial-devel/attachments/20150312/3c9a7590/attachment.html>


More information about the Mercurial-devel mailing list