From a1e59c352fbc9ea81cf00a2a42a14eba8426bc38 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Fri, 8 Mar 2013 12:55:59 +0100 Subject: [PATCH] [server] fix --help output when redirected through pipes, fix bug 4049 --- server/eit/commands/add.py | 3 ++- server/eit/commands/branch.py | 3 ++- server/eit/commands/bump.py | 3 ++- server/eit/commands/checkout.py | 3 ++- server/eit/commands/cleanup.py | 3 ++- server/eit/commands/command.py | 18 +++++++++++++++++- server/eit/commands/commit.py | 3 ++- server/eit/commands/cp.py | 3 ++- server/eit/commands/deps.py | 3 ++- server/eit/commands/files.py | 3 ++- server/eit/commands/graph.py | 3 ++- server/eit/commands/init.py | 3 ++- server/eit/commands/inject.py | 3 ++- server/eit/commands/key.py | 3 ++- server/eit/commands/list.py | 3 ++- server/eit/commands/lock.py | 3 ++- server/eit/commands/log.py | 3 ++- server/eit/commands/match.py | 3 ++- server/eit/commands/merge.py | 3 ++- server/eit/commands/mv.py | 3 ++- server/eit/commands/notice.py | 3 ++- server/eit/commands/own.py | 3 ++- server/eit/commands/pkgmove.py | 3 ++- server/eit/commands/pull.py | 3 ++- server/eit/commands/push.py | 3 ++- server/eit/commands/query.py | 3 ++- server/eit/commands/remote.py | 3 ++- server/eit/commands/remove.py | 3 ++- server/eit/commands/repack.py | 3 ++- server/eit/commands/repo.py | 3 ++- server/eit/commands/reset.py | 3 ++- server/eit/commands/revgraph.py | 3 ++- server/eit/commands/search.py | 3 ++- server/eit/commands/status.py | 3 ++- server/eit/commands/test.py | 3 ++- 35 files changed, 85 insertions(+), 35 deletions(-) diff --git a/server/eit/commands/add.py b/server/eit/commands/add.py index 36f406a00..a2892eec7 100644 --- a/server/eit/commands/add.py +++ b/server/eit/commands/add.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools from entropy.i18n import _ @@ -62,7 +63,7 @@ Entropy package scope is given by the following tuple: try: nsargs = parser.parse_args(self._args) except IOError as err: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] # setup atoms variable before spawning commit self._ask = not nsargs.quick diff --git a/server/eit/commands/branch.py b/server/eit/commands/branch.py index 6125c5984..383d7b5fb 100644 --- a/server/eit/commands/branch.py +++ b/server/eit/commands/branch.py @@ -12,6 +12,7 @@ import os import sys import argparse +import functools from entropy.i18n import _, ngettext from entropy.output import bold, purple, darkgreen, blue, teal @@ -90,7 +91,7 @@ over just use the *--no-copy* switch. try: nsargs = parser.parse_args(self._args) except IOError: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._from_branch = nsargs.frombranch self._to_branch = nsargs.branch diff --git a/server/eit/commands/bump.py b/server/eit/commands/bump.py index a83f6bc12..56c0042d6 100644 --- a/server/eit/commands/bump.py +++ b/server/eit/commands/bump.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.output import darkgreen, blue from entropy.i18n import _ @@ -101,7 +102,7 @@ will be accepted and new repository data will be uploaded. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._sync = nsargs.sync return self._call_locked, [self._bump, nsargs.repo] diff --git a/server/eit/commands/checkout.py b/server/eit/commands/checkout.py index 3d093592c..e96c0e7ee 100644 --- a/server/eit/commands/checkout.py +++ b/server/eit/commands/checkout.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools from entropy.output import darkgreen, blue from entropy.i18n import _ @@ -94,7 +95,7 @@ another branch, iuse *eit branch*. try: nsargs = parser.parse_args(self._args) except IOError as err: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] return self._call_locked, [self._checkout, nsargs.repo] diff --git a/server/eit/commands/cleanup.py b/server/eit/commands/cleanup.py index b713e55b4..cae72ec51 100644 --- a/server/eit/commands/cleanup.py +++ b/server/eit/commands/cleanup.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools from entropy.output import darkgreen, blue, purple from entropy.i18n import _ @@ -114,7 +115,7 @@ This commands makes possible to manually force a cleanup. try: nsargs = parser.parse_args(self._args) except IOError as err: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._ask = not nsargs.quick if nsargs.days is not None: diff --git a/server/eit/commands/command.py b/server/eit/commands/command.py index 2bdeca401..38e961402 100644 --- a/server/eit/commands/command.py +++ b/server/eit/commands/command.py @@ -10,7 +10,7 @@ """ from entropy.i18n import _ -from entropy.output import darkgreen, print_error +from entropy.output import darkgreen, print_error, print_generic from entropy.exceptions import PermissionDenied from entropy.server.interfaces import Server from entropy.core.settings.base import SystemSettings @@ -48,6 +48,22 @@ class EitCommand(object): """ raise NotImplementedError() + 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/server/eit/commands/commit.py b/server/eit/commands/commit.py index ad8717592..78b6954f8 100644 --- a/server/eit/commands/commit.py +++ b/server/eit/commands/commit.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools from entropy.i18n import _ from entropy.output import darkgreen, teal, brown, \ @@ -116,7 +117,7 @@ If you would like to selectively add certain packages, please see try: nsargs = parser.parse_args(self._args) except IOError as err: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._interactive = nsargs.interactive if not self._interactive: diff --git a/server/eit/commands/cp.py b/server/eit/commands/cp.py index f41c4378d..017e32426 100644 --- a/server/eit/commands/cp.py +++ b/server/eit/commands/cp.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools from entropy.output import darkgreen, blue, brown, bold, red, purple, teal from entropy.i18n import _ @@ -112,7 +113,7 @@ Copy packages from source repository to destination repository. try: nsargs = parser.parse_args(self._args) except IOError as err: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._source = nsargs.source[0] self._dest = nsargs.dest[0] diff --git a/server/eit/commands/deps.py b/server/eit/commands/deps.py index 17ac517e6..2a645bb52 100644 --- a/server/eit/commands/deps.py +++ b/server/eit/commands/deps.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.i18n import _ from entropy.const import etpConst @@ -70,7 +71,7 @@ non-permanent way. try: nsargs = parser.parse_args(self._args) except IOError: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._packages += nsargs.packages return self._call_locked, [self._deps, nsargs.inrepo] diff --git a/server/eit/commands/files.py b/server/eit/commands/files.py index 78cbfdaaf..175eb8482 100644 --- a/server/eit/commands/files.py +++ b/server/eit/commands/files.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.i18n import _ from entropy.output import bold, purple, darkgreen, blue, brown, teal @@ -71,7 +72,7 @@ package owners), please use *eit own*. try: nsargs = parser.parse_args(self._args) except IOError: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._quiet = nsargs.quiet self._packages += nsargs.packages diff --git a/server/eit/commands/graph.py b/server/eit/commands/graph.py index 827b24537..327dd1240 100644 --- a/server/eit/commands/graph.py +++ b/server/eit/commands/graph.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.i18n import _ @@ -74,7 +75,7 @@ For a reverse dependency graph, please see *eit revgraph*. try: nsargs = parser.parse_args(self._args) except IOError: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._quiet = nsargs.quiet self._packages += nsargs.packages diff --git a/server/eit/commands/init.py b/server/eit/commands/init.py index a0f9656e6..ad7570676 100644 --- a/server/eit/commands/init.py +++ b/server/eit/commands/init.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools from entropy.i18n import _ from entropy.output import darkgreen, teal @@ -102,7 +103,7 @@ So, please setup your repository there and only then run *eit init *. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._ask = not nsargs.quick return self._call_locked, [self._init, nsargs.repo[0]] diff --git a/server/eit/commands/inject.py b/server/eit/commands/inject.py index b1a1c8daf..39fc21166 100644 --- a/server/eit/commands/inject.py +++ b/server/eit/commands/inject.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools from entropy.i18n import _ from entropy.output import teal, purple @@ -75,7 +76,7 @@ repositories as much as you can. try: nsargs = parser.parse_args(self._args) except IOError: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._packages += nsargs.packages return self._call_locked, [self._inject, nsargs.to] diff --git a/server/eit/commands/key.py b/server/eit/commands/key.py index 85f3cdcea..66ab029a7 100644 --- a/server/eit/commands/key.py +++ b/server/eit/commands/key.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.output import blue, purple, darkgreen, bold, brown, teal, \ darkred @@ -118,7 +119,7 @@ package and repository files through *gnupg*. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._nsargs = nsargs return self._call_locked, [nsargs.func, nsargs.repo] diff --git a/server/eit/commands/list.py b/server/eit/commands/list.py index 4f91f6562..02d453691 100644 --- a/server/eit/commands/list.py +++ b/server/eit/commands/list.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.i18n import _ from entropy.output import brown, teal, purple, darkgreen @@ -76,7 +77,7 @@ If you wonder what's inside a repository, you've found the right tool. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._quiet = nsargs.quiet self._verbose = nsargs.verbose diff --git a/server/eit/commands/lock.py b/server/eit/commands/lock.py index 27611f86f..2565fce5f 100644 --- a/server/eit/commands/lock.py +++ b/server/eit/commands/lock.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.i18n import _ from entropy.output import darkgreen, brown, purple, blue, darkred @@ -123,7 +124,7 @@ repositories. try: nsargs = parser.parse_args(self._args) except IOError: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._client = nsargs.client self._repository_id = nsargs.repo[0] diff --git a/server/eit/commands/log.py b/server/eit/commands/log.py index c6c74f1ea..984413989 100644 --- a/server/eit/commands/log.py +++ b/server/eit/commands/log.py @@ -13,6 +13,7 @@ import sys import os import subprocess import argparse +import functools from entropy.i18n import _ @@ -59,7 +60,7 @@ This commands opens repository ChangeLog.bz2 using *bzless*. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] return self._call_locked, [self._log, nsargs.repo] diff --git a/server/eit/commands/match.py b/server/eit/commands/match.py index 56fc48f6b..1d47ce9c0 100644 --- a/server/eit/commands/match.py +++ b/server/eit/commands/match.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.i18n import _ from entropy.output import purple @@ -70,7 +71,7 @@ If you are interested in a simple text search, please see *eit search*. try: nsargs = parser.parse_args(self._args) except IOError: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._quiet = nsargs.quiet self._packages += nsargs.packages diff --git a/server/eit/commands/merge.py b/server/eit/commands/merge.py index 89f45390d..d59a77903 100644 --- a/server/eit/commands/merge.py +++ b/server/eit/commands/merge.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools from entropy.i18n import _ @@ -75,7 +76,7 @@ back in. This tool does exactly this. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._ask = not nsargs.quick self._merge_branch = nsargs.branch diff --git a/server/eit/commands/mv.py b/server/eit/commands/mv.py index fbc1ebbde..777c45719 100644 --- a/server/eit/commands/mv.py +++ b/server/eit/commands/mv.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools from entropy.i18n import _ @@ -68,7 +69,7 @@ then is removed from source. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._source = nsargs.source self._dest = nsargs.dest diff --git a/server/eit/commands/notice.py b/server/eit/commands/notice.py index b01516e1e..1fbe9c3b6 100644 --- a/server/eit/commands/notice.py +++ b/server/eit/commands/notice.py @@ -13,6 +13,7 @@ import sys import os import errno import argparse +import functools import tempfile import codecs @@ -86,7 +87,7 @@ list notice-board titles for user consumption. try: nsargs = parser.parse_args(self._args) except IOError: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._repository_id = nsargs.repo return self._call_locked, [nsargs.func, self._repository_id] diff --git a/server/eit/commands/own.py b/server/eit/commands/own.py index fd42d671b..f144cdb51 100644 --- a/server/eit/commands/own.py +++ b/server/eit/commands/own.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools from entropy.i18n import _ from entropy.output import purple, darkgreen, teal, bold @@ -81,7 +82,7 @@ please use *eit files*. try: nsargs = parser.parse_args(self._args) except IOError: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._quiet = nsargs.quiet self._quiet = nsargs.quiet diff --git a/server/eit/commands/pkgmove.py b/server/eit/commands/pkgmove.py index 9825cf92a..123a5c598 100644 --- a/server/eit/commands/pkgmove.py +++ b/server/eit/commands/pkgmove.py @@ -13,6 +13,7 @@ import sys import os import errno import argparse +import functools import tempfile import codecs @@ -104,7 +105,7 @@ doing. try: nsargs = parser.parse_args(self._args) except IOError: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._repository_id = nsargs.repo return self._call_locked, [self._pkgmove, self._repository_id] diff --git a/server/eit/commands/pull.py b/server/eit/commands/pull.py index 40fb181b5..03da9aa05 100644 --- a/server/eit/commands/pull.py +++ b/server/eit/commands/pull.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools import tempfile import codecs @@ -123,7 +124,7 @@ repository) by pulling updated data. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._ask = not nsargs.quick self._all = nsargs.all diff --git a/server/eit/commands/push.py b/server/eit/commands/push.py index 7fae3b4bf..de9a07506 100644 --- a/server/eit/commands/push.py +++ b/server/eit/commands/push.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools import tempfile import codecs @@ -133,7 +134,7 @@ repository) by pushing updated data. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._ask = not nsargs.quick self._all = nsargs.all diff --git a/server/eit/commands/query.py b/server/eit/commands/query.py index b6f872a74..8a927b60d 100644 --- a/server/eit/commands/query.py +++ b/server/eit/commands/query.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.output import purple, darkgreen, bold, brown, teal from entropy.const import etpConst @@ -144,7 +145,7 @@ tools. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._repository_id = nsargs.inrepo self._quiet = nsargs.quiet diff --git a/server/eit/commands/remote.py b/server/eit/commands/remote.py index 1c9818055..2995f7a12 100644 --- a/server/eit/commands/remote.py +++ b/server/eit/commands/remote.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools import codecs from entropy.const import etpConst @@ -83,7 +84,7 @@ Manage (add, remove, list) configured repositories. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._nsargs = nsargs return self._call_locked, [nsargs.func, None] diff --git a/server/eit/commands/remove.py b/server/eit/commands/remove.py index c18c0a3d7..aaa39cc1e 100644 --- a/server/eit/commands/remove.py +++ b/server/eit/commands/remove.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.i18n import _ from entropy.output import purple, darkgreen, brown, teal @@ -72,7 +73,7 @@ Remove a package from repository. It's no-brainer actually. try: nsargs = parser.parse_args(self._args) except IOError: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._ask = not nsargs.quick self._nodeps = nsargs.nodeps diff --git a/server/eit/commands/repack.py b/server/eit/commands/repack.py index bdc57e1bd..8567eaabc 100644 --- a/server/eit/commands/repack.py +++ b/server/eit/commands/repack.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.i18n import _ @@ -57,7 +58,7 @@ The package must be already available in the queried repository. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] # setup atoms variable before spawning commit self._packages = nsargs.packages[:] diff --git a/server/eit/commands/repo.py b/server/eit/commands/repo.py index 78ee687f3..06495264a 100644 --- a/server/eit/commands/repo.py +++ b/server/eit/commands/repo.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools from entropy.i18n import _ from entropy.output import darkgreen, teal @@ -57,7 +58,7 @@ Show current repository, its branch and configured mirrors. parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] return self._call_locked, [self._void, None] def _void(self, entropy_server): diff --git a/server/eit/commands/reset.py b/server/eit/commands/reset.py index 251608cdf..ff38df796 100644 --- a/server/eit/commands/reset.py +++ b/server/eit/commands/reset.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.i18n import _ from entropy.output import darkgreen @@ -104,7 +105,7 @@ re-fetching the remote version available on mirrors. nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._local = nsargs.local self._ask = not nsargs.quick diff --git a/server/eit/commands/revgraph.py b/server/eit/commands/revgraph.py index a2ebccf91..67dfce889 100644 --- a/server/eit/commands/revgraph.py +++ b/server/eit/commands/revgraph.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.i18n import _ @@ -77,7 +78,7 @@ For a direct dependency graph, please see *eit graph*. try: nsargs = parser.parse_args(self._args) except IOError: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._quiet = nsargs.quiet self._packages += nsargs.packages diff --git a/server/eit/commands/search.py b/server/eit/commands/search.py index e4a355d4d..3f5552b64 100644 --- a/server/eit/commands/search.py +++ b/server/eit/commands/search.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.i18n import _ from entropy.output import purple @@ -77,7 +78,7 @@ If you are interested in dependency string matching, please see try: nsargs = parser.parse_args(self._args) except IOError: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._quiet = nsargs.quiet self._packages += nsargs.packages diff --git a/server/eit/commands/status.py b/server/eit/commands/status.py index 5aa1f74c1..d972eeefc 100644 --- a/server/eit/commands/status.py +++ b/server/eit/commands/status.py @@ -12,6 +12,7 @@ import sys import os import argparse +import functools from entropy.const import etpConst from entropy.i18n import _ @@ -97,7 +98,7 @@ Show repository status (such as: *configured mirrors*, nsargs = parser.parse_args(self._args) except IOError as err: sys.stderr.write("%s\n" % (err,)) - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] return self._call_locked, [self._status, nsargs.repo] diff --git a/server/eit/commands/test.py b/server/eit/commands/test.py index dc19ea386..556a53c25 100644 --- a/server/eit/commands/test.py +++ b/server/eit/commands/test.py @@ -11,6 +11,7 @@ """ import sys import argparse +import functools from entropy.i18n import _ from entropy.output import teal, purple @@ -106,7 +107,7 @@ Toolset containing all the Entropy Server built-in QA tests available. try: nsargs = parser.parse_args(self._args) except IOError as err: - return parser.print_help, [] + return functools.partial(self.print_help, parser), [] self._nsargs = nsargs return self._call_locked, [nsargs.func, None]