diff options
| author | Yann E. MORIN <yann.morin.1998@free.fr> | 2014-07-01 20:14:24 +0200 | 
|---|---|---|
| committer | Jeremy Kerr <jk@ozlabs.org> | 2014-07-04 08:37:46 +0800 | 
| commit | 429ef9ba9dcc8f92b8362c1b0fca0916db05e84b (patch) | |
| tree | 8ee6eaa242961eb87b6375b0f24fbc99084802c9 | |
| parent | ce4e9c7096be1222592700cdad84cf35895159da (diff) | |
| download | patchwork-429ef9ba9dcc8f92b8362c1b0fca0916db05e84b.tar.bz2 patchwork-429ef9ba9dcc8f92b8362c1b0fca0916db05e84b.tar.xz  | |
pwclient: accept more than one project in ~/.pwclientrc
Currently, given the format of ~/.pwclientrc, pwclient can only
really act on a single project, as ~/pwclientrc can only contain
the configuration for a single project.
Although the -p options comes in handy to specify a project
different from the one configured in ~/.pwclientrc, this only works
if it is hosted on the same server. As soon as one needs to switch
server, it is necessary to edit ~/pwclientrc.
This can be quite inefficient when dealing with many projects, hosted
on different servers.
Change the format of ~/.pwclientrc so it is possible to define more
than one project, and for each project, specify an URL and credentials.
The new format is like:
    [options]
    default = project-A
    [project-A]
    url = http://my.patchwork.server/path/to/xmlrpc
    username = that-is-me
    password = secret
    [other-project]
    url = http://you.get/the/idea
    username = someone
    password = 1234
This has the advantage of not changing the options to pwclient, so
the user experience is unmodified.
If a ~/.pwclentrc exists in the old format, it is automatically
converted over to the new format, and the previous one is saved as
~/.pwclientrc.orig. Upon conversion, no action is made, pwclient just
exits (with return-code 1) to inform the user to review the conversion.
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
| -rwxr-xr-x | apps/patchwork/bin/pwclient | 69 | ||||
| -rw-r--r-- | templates/patchwork/pwclientrc | 16 | 
2 files changed, 63 insertions, 22 deletions
diff --git a/apps/patchwork/bin/pwclient b/apps/patchwork/bin/pwclient index 2104f59..dfbea30 100755 --- a/apps/patchwork/bin/pwclient +++ b/apps/patchwork/bin/pwclient @@ -28,6 +28,7 @@ import tempfile  import subprocess  import base64  import ConfigParser +import shutil  # Default Patchwork remote XML-RPC server URL  # This script will check the PW_XMLRPC_URL environment variable @@ -350,16 +351,6 @@ def main():      msgid_str = ""      url = DEFAULT_URL -    config = ConfigParser.ConfigParser() -    config.read([CONFIG_FILE]) - -    # grab settings from config files -    if config.has_option('base', 'url'): -        url = config.get('base', 'url') - -    if config.has_option('base', 'project'): -        project_str = config.get('base', 'project') -      for name, value in opts:          if name == '-s':              state_str = value @@ -389,17 +380,67 @@ def main():          sys.stderr.write("Too many arguments specified\n")          usage() +    # grab settings from config files +    config = ConfigParser.ConfigParser() +    config.read([CONFIG_FILE]) + +    if not config.has_section('options'): +        sys.stderr.write('~/.pwclientrc is in the old format. Migrating it...') + +        old_project = config.get('base','project') + +        new_config = ConfigParser.ConfigParser() +        new_config.add_section('options') + +        new_config.set('options','default',old_project) +        new_config.add_section(old_project) + +        new_config.set(old_project,'url',config.get('base','url')) +        if config.has_option('auth', 'username'): +            new_config.set(old_project,'username',config.get('auth','username')) +        if config.has_option('auth', 'password'): +            new_config.set(old_project,'password',config.get('auth','password')) + +        old_config_file = CONFIG_FILE + '.orig' +        shutil.copy2(CONFIG_FILE,old_config_file) + +        with open(CONFIG_FILE, 'wb') as fd: +            new_config.write(fd) + +        sys.stderr.write(' Done.\n') +        sys.stderr.write('Your old ~/.pwclientrc was saved to %s\n' % old_config_file) +        sys.stderr.write('and was converted to the new format. You may want to\n') +        sys.stderr.write('inspect it before continuing.\n') +        sys.exit(1) + +    if not project_str: +        try: +            project_str = config.get('options', 'default') +        except: +            sys.stderr.write("No default project configured in ~/.pwclientrc\n") +            usage() + +    if not config.has_section(project_str): +        sys.stderr.write("No section for project %s\n" % project_str) +        sys.exit(1) + +    if not config.has_option(project_str, 'url'): +        sys.stderr.write("No URL for project %s\n" % project_str) +        sys.exit(1) + +    url = config.get(project_str, 'url') +      (username, password) = (None, None)      transport = None      if action in auth_actions: -        if config.has_option('auth', 'username') and \ -                config.has_option('auth', 'password'): +        if config.has_option(project_str, 'username') and \ +                config.has_option(project_str, 'password'):              use_https = url.startswith('https')              transport = BasicHTTPAuthTransport( \ -                    config.get('auth', 'username'), -                    config.get('auth', 'password'), +                    config.get(project_str, 'username'), +                    config.get(project_str, 'password'),                      use_https)          else: diff --git a/templates/patchwork/pwclientrc b/templates/patchwork/pwclientrc index 436a28b..d331003 100644 --- a/templates/patchwork/pwclientrc +++ b/templates/patchwork/pwclientrc @@ -1,15 +1,15 @@  # Sample .pwclientrc file for the {{ project.linkname }} project,  # running on {{ site.domain }}.  # -# Save this file to ~/.pwclientrc -# -[base] -url: {{scheme}}://{{site.domain}}{% url 'patchwork.views.xmlrpc.xmlrpc' %} -project: {{ project.linkname }} +# Just append this file to your existing ~/.pwclientrc +# If you do not already have a ~/.pwclientrc, then copy this file to +# ~/.pwclientrc, and uncomment the following two lines: +# [options] +# default={{ project.linkname }} + +[{{ project.linkname }}] +url= {{scheme}}://{{site.domain}}{% url 'patchwork.views.xmlrpc.xmlrpc' %}  {% if user.is_authenticated %} -# Adding authentication parameters will allow you to use the 'update' -# command on patches that you are allowed to edit. -[auth]  username: {{ user.username }}  password: <add your patchwork password here>  {% endif %}  | 
