summaryrefslogtreecommitdiffstats
path: root/apps/patchwork/bin/pwclient
diff options
context:
space:
mode:
authorYann E. MORIN <yann.morin.1998@free.fr>2014-07-01 20:14:24 +0200
committerJeremy Kerr <jk@ozlabs.org>2014-07-04 08:37:46 +0800
commit429ef9ba9dcc8f92b8362c1b0fca0916db05e84b (patch)
tree8ee6eaa242961eb87b6375b0f24fbc99084802c9 /apps/patchwork/bin/pwclient
parentce4e9c7096be1222592700cdad84cf35895159da (diff)
downloadpatchwork-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>
Diffstat (limited to 'apps/patchwork/bin/pwclient')
-rwxr-xr-xapps/patchwork/bin/pwclient69
1 files changed, 55 insertions, 14 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: