From 8fda22bd0b32eae993075f515cc102c40a87fc21 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Mon, 11 Mar 2013 00:58:21 +0000 Subject: [PATCH] [equo] monkey patch argparse.ArgumentParser to fix UTF-8 strings handling See bug 4049. --- client/solo/commands/_manage.py | 3 +-- client/solo/commands/cache.py | 3 +-- client/solo/commands/cleanup.py | 3 +-- client/solo/commands/command.py | 41 +++++++++++++++++++------------- client/solo/commands/conf.py | 3 +-- client/solo/commands/deptest.py | 3 +-- client/solo/commands/help.py | 2 +- client/solo/commands/hop.py | 3 +-- client/solo/commands/libtest.py | 3 +-- client/solo/commands/mask.py | 3 +-- client/solo/commands/match.py | 3 +-- client/solo/commands/notice.py | 3 +-- client/solo/commands/pkg.py | 3 +-- client/solo/commands/query.py | 3 +-- client/solo/commands/repo.py | 3 +-- client/solo/commands/rescue.py | 3 +-- client/solo/commands/search.py | 3 +-- client/solo/commands/security.py | 3 +-- client/solo/commands/status.py | 3 +-- client/solo/commands/ugc.py | 3 +-- client/solo/commands/unused.py | 3 +-- client/solo/commands/update.py | 3 +-- 22 files changed, 46 insertions(+), 57 deletions(-) diff --git a/client/solo/commands/_manage.py b/client/solo/commands/_manage.py index 914d3e64a..323eda2b2 100644 --- a/client/solo/commands/_manage.py +++ b/client/solo/commands/_manage.py @@ -11,7 +11,6 @@ """ import argparse import errno -import functools import os import shlex import subprocess @@ -61,7 +60,7 @@ class SoloManage(SoloCommand): nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._nsargs = nsargs return self._call_locked, [nsargs.func] diff --git a/client/solo/commands/cache.py b/client/solo/commands/cache.py index 5f7a6fa83..5b1a45694 100644 --- a/client/solo/commands/cache.py +++ b/client/solo/commands/cache.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import sys import argparse @@ -85,7 +84,7 @@ Manage Entropy Library Cache. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._nsargs = nsargs return self._call_locked, [nsargs.func] diff --git a/client/solo/commands/cleanup.py b/client/solo/commands/cleanup.py index ad255b122..5e3259282 100644 --- a/client/solo/commands/cleanup.py +++ b/client/solo/commands/cleanup.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import os import sys import argparse @@ -71,7 +70,7 @@ Remove downloaded packages and clean temporary directories. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] return self._call_locked, [self._cleanup] diff --git a/client/solo/commands/command.py b/client/solo/commands/command.py index 571a0182f..b142ad915 100644 --- a/client/solo/commands/command.py +++ b/client/solo/commands/command.py @@ -26,6 +26,31 @@ import entropy.tools from solo.utils import enlightenatom + +def _fix_argparse_print_help(): + """ + Fix argparse.ArgumentParser.print_help to always work + with UTF-8 characters and pipes. See bug 4049. + """ + class _Printer(object): + + @classmethod + def write(self, string): + print_generic(string) + + original_print_help = argparse.ArgumentParser.print_help + + def _print_help(zelf, file=None): + if file is None: + file = _Printer + return original_print_help(zelf, file=file) + + argparse.ArgumentParser.print_help = _print_help + + +_fix_argparse_print_help() + + class SoloCommand(object): """ Base class for Solo commands @@ -97,22 +122,6 @@ class SoloCommand(object): "--quiet", "-q", action="store_true", default=False, help=_("quiet output")) - def print_help(self, parser): - """ - ArgumentParser.print_help wrapper that properly handles - UTF-8 encoding in a fault-tolerant way. Also see bug #4049. - - @param parser: an ArgumentParser object - @type parser: argparse.ArgumentParser - """ - class _Printer(object): - - @classmethod - def write(self, string): - print_generic(string) - - parser.print_help(file=_Printer) - def parse(self): """ Parse the actual arguments and return diff --git a/client/solo/commands/conf.py b/client/solo/commands/conf.py index 1e23fa0f7..e55b4cc92 100644 --- a/client/solo/commands/conf.py +++ b/client/solo/commands/conf.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import os import errno import sys @@ -93,7 +92,7 @@ Manage package file updates. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._nsargs = nsargs return self._call_locked, [nsargs.func] diff --git a/client/solo/commands/deptest.py b/client/solo/commands/deptest.py index 666c2c124..8ec55574e 100644 --- a/client/solo/commands/deptest.py +++ b/client/solo/commands/deptest.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import sys import argparse import time @@ -78,7 +77,7 @@ Test system integrity by checking installed packages dependencies. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._ask = nsargs.ask self._quiet = nsargs.quiet diff --git a/client/solo/commands/help.py b/client/solo/commands/help.py index 0fb328b3a..a553ddaba 100644 --- a/client/solo/commands/help.py +++ b/client/solo/commands/help.py @@ -90,7 +90,7 @@ class SoloHelp(SoloCommand): aliases_str) desc = descriptor.get_description() group.add_argument(name, help=darkgreen(desc), action="store_true") - self.print_help(parser) + parser.print_help() if not self._args: return 1 return 0 diff --git a/client/solo/commands/hop.py b/client/solo/commands/hop.py index 6306458f5..aa83cc478 100644 --- a/client/solo/commands/hop.py +++ b/client/solo/commands/hop.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import sys import argparse @@ -68,7 +67,7 @@ Upgrade the System to a new branch. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._branch = nsargs.branch diff --git a/client/solo/commands/libtest.py b/client/solo/commands/libtest.py index 0d911dafe..8e94bf46a 100644 --- a/client/solo/commands/libtest.py +++ b/client/solo/commands/libtest.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import sys import argparse import time @@ -98,7 +97,7 @@ Test system integrity by looking for missing libraries. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._nsargs = nsargs return self._call_locked, [self._test] diff --git a/client/solo/commands/mask.py b/client/solo/commands/mask.py index 22935600d..9e9ed3c18 100644 --- a/client/solo/commands/mask.py +++ b/client/solo/commands/mask.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import sys import argparse @@ -78,7 +77,7 @@ class SoloMaskUnmask(SoloCommand): nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._packages = nsargs.packages self._pretend = nsargs.pretend diff --git a/client/solo/commands/match.py b/client/solo/commands/match.py index 8ad30c560..b8c533f91 100644 --- a/client/solo/commands/match.py +++ b/client/solo/commands/match.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import sys import argparse @@ -137,7 +136,7 @@ Match package names. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._quiet = nsargs.quiet self._verbose = nsargs.verbose diff --git a/client/solo/commands/notice.py b/client/solo/commands/notice.py index 762039b77..6cfbbbba2 100644 --- a/client/solo/commands/notice.py +++ b/client/solo/commands/notice.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import sys import argparse @@ -68,7 +67,7 @@ Read Repository Notice Board. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._nsargs = nsargs return self._call_unlocked, [self._reader] diff --git a/client/solo/commands/pkg.py b/client/solo/commands/pkg.py index 038d6b1eb..8d8a19f4d 100644 --- a/client/solo/commands/pkg.py +++ b/client/solo/commands/pkg.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import os import sys import argparse @@ -169,7 +168,7 @@ Execute advanced tasks on Entropy packages and the running system. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._nsargs = nsargs return self._call_locked, [nsargs.func] diff --git a/client/solo/commands/query.py b/client/solo/commands/query.py index ddd058c0b..df82a71b2 100644 --- a/client/solo/commands/query.py +++ b/client/solo/commands/query.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import os import sys import re @@ -328,7 +327,7 @@ Repository query tools. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._nsargs = nsargs return self._call_locked, [nsargs.func] diff --git a/client/solo/commands/repo.py b/client/solo/commands/repo.py index 805d7814d..475635029 100644 --- a/client/solo/commands/repo.py +++ b/client/solo/commands/repo.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import os import sys import argparse @@ -143,7 +142,7 @@ Manage Entropy Repositories. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._nsargs = nsargs return self._call_locked, [nsargs.func] diff --git a/client/solo/commands/rescue.py b/client/solo/commands/rescue.py index 2025ab5b2..faa38855f 100644 --- a/client/solo/commands/rescue.py +++ b/client/solo/commands/rescue.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import os import errno import sys @@ -149,7 +148,7 @@ Tools to rescue the running system. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._nsargs = nsargs return self._call_locked, [nsargs.func] diff --git a/client/solo/commands/search.py b/client/solo/commands/search.py index 4d7e152d8..89a81ee5a 100644 --- a/client/solo/commands/search.py +++ b/client/solo/commands/search.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import sys import argparse @@ -96,7 +95,7 @@ Search for packages. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._quiet = nsargs.quiet self._verbose = nsargs.verbose diff --git a/client/solo/commands/security.py b/client/solo/commands/security.py index b81aee556..16c606dcd 100644 --- a/client/solo/commands/security.py +++ b/client/solo/commands/security.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import os import sys import argparse @@ -189,7 +188,7 @@ System security tools. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._nsargs = nsargs return self._call_locked, [nsargs.func] diff --git a/client/solo/commands/status.py b/client/solo/commands/status.py index fd0d2cb91..a64a7502d 100644 --- a/client/solo/commands/status.py +++ b/client/solo/commands/status.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import sys import argparse @@ -68,7 +67,7 @@ Show Repositories status. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] return self._call_unlocked, [self._status] diff --git a/client/solo/commands/ugc.py b/client/solo/commands/ugc.py index 53f30474e..f781e3202 100644 --- a/client/solo/commands/ugc.py +++ b/client/solo/commands/ugc.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import os import sys import argparse @@ -172,7 +171,7 @@ Manage User Generate Content (votes, comments, files). nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._nsargs = nsargs return self._call_locked, [nsargs.func] diff --git a/client/solo/commands/unused.py b/client/solo/commands/unused.py index f3930ee4c..7afd9a945 100644 --- a/client/solo/commands/unused.py +++ b/client/solo/commands/unused.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import sys import argparse @@ -89,7 +88,7 @@ Report unused packages that could be removed. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._quiet = nsargs.quiet self._sortbysize = nsargs.sortbysize diff --git a/client/solo/commands/update.py b/client/solo/commands/update.py index 0e511354c..ffeacd9d8 100644 --- a/client/solo/commands/update.py +++ b/client/solo/commands/update.py @@ -9,7 +9,6 @@ B{Entropy Command Line Client}. """ -import functools import sys import argparse @@ -78,7 +77,7 @@ Update Entropy Repositories. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return functools.partial(self.print_help, parser), [] + return parser.print_help, [] self._force = nsargs.force self._repositories += nsargs.repo