[PATCH 2/3] pwclient: Handle servers that barf on users with no name
Doug Anderson
dianders at chromium.org
Tue Dec 4 09:18:33 EST 2012
OK, NAK-ing my own patch. :(
Apparently a change I made right before I sent this out broke things.
See below...
On Mon, Dec 3, 2012 at 11:54 AM, Doug Anderson <dianders at chromium.org> wrote:
> When working with pwclient I found that the xmlrpc server will barf
> sometimes if a user has no real name. The server code should be
> fixed, but also fix the client to handle this more gracefully.
>
> Signed-off-by: Doug Anderson <dianders at chromium.org>
> ---
> apps/patchwork/bin/pwclient | 36 +++++++++++++++++++++++++++++++++++-
> 1 files changed, 35 insertions(+), 1 deletions(-)
>
> diff --git a/apps/patchwork/bin/pwclient b/apps/patchwork/bin/pwclient
> index e642195..382b480 100755
> --- a/apps/patchwork/bin/pwclient
> +++ b/apps/patchwork/bin/pwclient
> @@ -36,6 +36,40 @@ import ConfigParser
> DEFAULT_URL = "http://patchwork/xmlrpc/"
> CONFIG_FILES = [os.path.expanduser('~/.pwclientrc')]
>
> +class ServerWithFixes(xmlrpclib.Server):
> + """Wrapper for xmlrpclib.Server that handles some server issues.
> +
> + This class adds workarounds for commands that might fail on some versions
> + of patchwork servers out there. As servers are fixed then workaround
> + can be removed.
> + """
> + def person_get(self, person_id):
> + """Fix person_get() to handle people with no real name.
> +
> + It appears that if you have a person with no real name then it makes
> + the server barf (it tries to marshall None but allow_none is False).
> + If we find this we'll try to grok some info about the user from patches
> + that he/she sent.
> +
> + As an example, the submitter of:
> + https://patchwork.kernel.org/patch/1668321/
> + """
> + try:
> + self.__getattr__("person_get")(person_id)
Ack. Forgot "return" here. :(
> + except xmlrpclib.Fault, e:
> + # If it's not the fault we're expecting, pass it on.
> + if e.faultString != ("<type 'exceptions.TypeError'>:cannot marshal "
> + "None unless allow_none is enabled"):
> + raise
> +
> + # Create a fake person by grabbing the email from one of the patches
> + patch_list = self.patch_list({'submitter_id': person_id,
> + 'max_count': 1})
> + return {
> + 'name': '',
> + 'email': patch_list[0]['submitter']
> + }
> +
> class Filter:
> """Filter for selecting patches."""
> def __init__(self):
> @@ -417,7 +451,7 @@ def main():
> filt.add("msgid", msgid_str)
>
> try:
> - rpc = xmlrpclib.Server(url, transport = transport)
> + rpc = ServerWithFixes(url, transport = transport)
> except:
> sys.stderr.write("Unable to connect to %s\n" % url)
> sys.exit(1)
> --
> 1.7.7.3
>
More information about the Patchwork
mailing list