diff --git a/popt-1.16-help.patch b/popt-1.16-help.patch new file mode 100644 index 0000000..85fd5ce --- /dev/null +++ b/popt-1.16-help.patch @@ -0,0 +1,107 @@ +Patch initially by Miloslav Trmač and revised by Akira Tagoh + for popt <= 1.16 which fixes the problem that help messages +for --help and --usage seem not translatable. There already was some i18n support +for autohelp in popt.c, but not in popthelp.c, where it actually matters. + +See https://bugzilla.redhat.com/show_bug.cgi?id=734434 for further details, please. + +This patch was proposed to upstream: http://rpm5.org/community/popt-devel/0287.html + +--- popt-1.16/popthelp.c 2009-08-28 09:06:33.000000000 +0900 ++++ popt-1.16/popthelp.c.help 2014-01-08 12:04:00.888260244 +0900 +@@ -89,7 +89,7 @@ static struct poptOption poptHelpOptions + { "defaults", '\0', POPT_ARG_NONE, &show_option_defaults, 0, + N_("Display option defaults in message"), NULL }, + #endif +- { "", '\0', 0, NULL, 0, N_("Terminate options"), NULL }, ++ { NULL, '\0', 0, NULL, 0, N_("Terminate options"), NULL }, + POPT_TABLEEND + } ; + +@@ -527,8 +527,11 @@ static size_t maxArgWidth(const struct p + if (opt != NULL) + while (opt->longName || opt->shortName || opt->arg) { + if (poptArgType(opt) == POPT_ARG_INCLUDE_TABLE) { +- if (opt->arg) /* XXX program error */ +- len = maxArgWidth(opt->arg, translation_domain); ++ void * arg = opt->arg; ++ /* XXX sick hack to preserve pretense of ABI. */ ++ if (arg == poptHelpOptions) arg = poptHelpOptionsI18N; ++ if (arg) /* XXX program error */ ++ len = maxArgWidth(arg, translation_domain); + if (len > max) max = len; + } else if (!F_ISSET(opt, DOC_HIDDEN)) { + len = sizeof(" ")-1; +@@ -619,19 +622,22 @@ static void singleTableHelp(poptContext + + if (table != NULL) + for (opt = table; opt->longName || opt->shortName || opt->arg; opt++) { ++ void * arg = opt->arg; + if (poptArgType(opt) != POPT_ARG_INCLUDE_TABLE) + continue; +- sub_transdom = getTableTranslationDomain(opt->arg); ++ /* XXX sick hack to preserve pretense of ABI. */ ++ if (arg == poptHelpOptions) arg = poptHelpOptionsI18N; ++ sub_transdom = getTableTranslationDomain(arg); + if (sub_transdom == NULL) + sub_transdom = translation_domain; + + /* If no popt aliases/execs, skip poptAliasOption processing. */ +- if (opt->arg == poptAliasOptions && !(con->numAliases || con->numExecs)) ++ if (arg == poptAliasOptions && !(con->numAliases || con->numExecs)) + continue; + if (opt->descrip) + xx = POPT_fprintf(fp, "\n%s\n", D_(sub_transdom, opt->descrip)); + +- singleTableHelp(con, fp, opt->arg, columns, sub_transdom); ++ singleTableHelp(con, fp, arg, columns, sub_transdom); + } + } + +@@ -808,22 +814,25 @@ static size_t singleTableUsage(poptConte + translation_domain = (const char *)opt->arg; + } else + if (poptArgType(opt) == POPT_ARG_INCLUDE_TABLE) { ++ void * arg = opt->arg; ++ /* XXX sick hack to preserve pretense of ABI. */ ++ if (arg == poptHelpOptions) arg = poptHelpOptionsI18N; + if (done) { + int i = 0; + if (done->opts != NULL) + for (i = 0; i < done->nopts; i++) { + const void * that = done->opts[i]; +- if (that == NULL || that != opt->arg) ++ if (that == NULL || that != arg) + /*@innercontinue@*/ continue; + /*@innerbreak@*/ break; + } + /* Skip if this table has already been processed. */ +- if (opt->arg == NULL || i < done->nopts) ++ if (arg == NULL || i < done->nopts) + continue; + if (done->opts != NULL && done->nopts < done->maxopts) +- done->opts[done->nopts++] = (const void *) opt->arg; ++ done->opts[done->nopts++] = (const void *) arg; + } +- columns->cur = singleTableUsage(con, fp, columns, opt->arg, ++ columns->cur = singleTableUsage(con, fp, columns, arg, + translation_domain, done); + } else + if ((opt->longName || opt->shortName) && !F_ISSET(opt, DOC_HIDDEN)) { +@@ -864,9 +873,13 @@ static size_t showShortOptions(const str + if (!strchr(s, opt->shortName) && isprint((int)opt->shortName) + && opt->shortName != ' ') + s[strlen(s)] = opt->shortName; +- } else if (poptArgType(opt) == POPT_ARG_INCLUDE_TABLE) +- if (opt->arg) /* XXX program error */ +- len = showShortOptions(opt->arg, fp, s); ++ } else if (poptArgType(opt) == POPT_ARG_INCLUDE_TABLE) { ++ void * arg = opt->arg; ++ /* XXX sick hack to preserve pretense of ABI. */ ++ if (arg == poptHelpOptions) arg = poptHelpOptionsI18N; ++ if (arg) /* XXX program error */ ++ len = showShortOptions(arg, fp, s); ++ } + } + + /* On return to top level, print the short options, return print length. */ diff --git a/popt.spec b/popt.spec index 2748ba7..f0351e3 100644 --- a/popt.spec +++ b/popt.spec @@ -1,7 +1,7 @@ Summary: C library for parsing command line parameters Name: popt Version: 1.16 -Release: 1%{?dist} +Release: 2%{?dist} License: MIT Group: System Environment/Libraries URL: http://www.rpm5.org/ @@ -9,6 +9,7 @@ Source: http://www.rpm5.org/files/%{name}/%{name}-%{version}.tar.gz Patch0: popt-1.16-pkgconfig.patch Patch1: popt-1.16-execfail.patch Patch2: popt-1.16-man-page.patch +Patch3: popt-1.16-help.patch BuildRequires: gettext BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -46,6 +47,7 @@ Install it if you need to link statically with libpopt. %patch0 -p1 -b .pkgconfig %patch1 -p1 -b .execfail %patch2 -p1 -b .man-page +%patch3 -p1 -b .help %build %if 0%{?fedora} < 17 && 0%{?rhel} < 7 @@ -110,6 +112,9 @@ make check %{_libdir}/libpopt.a %changelog +* Wed Jan 08 2014 Robert Scheck 1.16-2 +- Added patch to have --help and --usage translatable (#734434) + * Sun Nov 24 2013 Robert Scheck 1.16-1 - Upgrade to 1.16 (#448286, #999377) - Tight run-time dependencies between sub-packages via %%{?_isa}