gettext fails to build from source: https://bugzilla.redhat.com/show_bug.cgi?id=1674958
This commit is contained in:
parent
7f499dbd3e
commit
2b1ba2ed02
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
/gettext-0.*.tar.xz
|
|
@ -1,9 +0,0 @@
|
|||||||
#requires bison
|
|
||||||
#requires libtool
|
|
||||||
|
|
||||||
mcd $BUILDDIR/gettext
|
|
||||||
|
|
||||||
$SRC/gettext-*/configure $TCONFIGARGS --disable-static --enable-shared --with-pic-=yes --disable-csharp --disable-rpath
|
|
||||||
|
|
||||||
make $J
|
|
||||||
make $J install
|
|
1
dead.package
Normal file
1
dead.package
Normal file
@ -0,0 +1 @@
|
|||||||
|
gettext fails to build from source: https://bugzilla.redhat.com/show_bug.cgi?id=1674958
|
@ -1,47 +0,0 @@
|
|||||||
commit bd2c6ca2b7ae0be02d4bb85db79def454f3153fb
|
|
||||||
Author: rpm-build <rpm-build>
|
|
||||||
AuthorDate: Wed Dec 21 12:50:54 2016 +0100
|
|
||||||
Commit: rpm-build <rpm-build>
|
|
||||||
CommitDate: Wed Dec 21 12:52:36 2016 +0100
|
|
||||||
|
|
||||||
disable-gettext-runtime-test-lock.patch
|
|
||||||
|
|
||||||
diff --git a/gettext-runtime/tests/Makefile.am b/gettext-runtime/tests/Makefile.am
|
|
||||||
index 88a0684..3a27b79 100644
|
|
||||||
--- a/gettext-runtime/tests/Makefile.am
|
|
||||||
+++ b/gettext-runtime/tests/Makefile.am
|
|
||||||
@@ -19,7 +19,7 @@
|
|
||||||
AUTOMAKE_OPTIONS = 1.11 gnits no-dependencies color-tests subdir-objects
|
|
||||||
EXTRA_DIST =
|
|
||||||
|
|
||||||
-TESTS = test-lock
|
|
||||||
+TESTS =
|
|
||||||
|
|
||||||
AM_CPPFLAGS = \
|
|
||||||
-I.. \
|
|
||||||
diff --git a/gettext-runtime/tests/Makefile.in b/gettext-runtime/tests/Makefile.in
|
|
||||||
index 4327733..5879146 100644
|
|
||||||
--- a/gettext-runtime/tests/Makefile.in
|
|
||||||
+++ b/gettext-runtime/tests/Makefile.in
|
|
||||||
@@ -86,7 +86,7 @@ PRE_UNINSTALL = :
|
|
||||||
POST_UNINSTALL = :
|
|
||||||
build_triplet = @build@
|
|
||||||
host_triplet = @host@
|
|
||||||
-TESTS = test-lock$(EXEEXT)
|
|
||||||
+TESTS =
|
|
||||||
check_PROGRAMS = test-lock$(EXEEXT)
|
|
||||||
subdir = tests
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
|
||||||
diff --git a/gettext-tools/gnulib-tests/Makefile.in b/gettext-tools/gnulib-tests/Makefile.in
|
|
||||||
index 26becd9..4b9d0e4 100644
|
|
||||||
--- a/gettext-tools/gnulib-tests/Makefile.in
|
|
||||||
+++ b/gettext-tools/gnulib-tests/Makefile.in
|
|
||||||
@@ -143,7 +143,7 @@ TESTS = test-set-mode-acl.sh test-set-mode-acl-1.sh \
|
|
||||||
test-isnanl-nolibm$(EXEEXT) test-isnanl$(EXEEXT) \
|
|
||||||
test-iswblank$(EXEEXT) test-langinfo$(EXEEXT) \
|
|
||||||
test-linkedhash_list$(EXEEXT) test-locale$(EXEEXT) \
|
|
||||||
- test-localename$(EXEEXT) test-lock$(EXEEXT) \
|
|
||||||
+ test-localename$(EXEEXT) \
|
|
||||||
test-log10$(EXEEXT) test-lseek.sh test-lstat$(EXEEXT) \
|
|
||||||
test-malloca$(EXEEXT) test-math$(EXEEXT) test-mbrtowc1.sh \
|
|
||||||
test-mbrtowc2.sh test-mbrtowc3.sh test-mbrtowc4.sh \
|
|
@ -1,43 +0,0 @@
|
|||||||
From a0cab23332a254e3500cac2a3a984472d02180e5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Bruno Haible <bruno@clisp.org>
|
|
||||||
Date: Fri, 9 Dec 2016 21:04:31 +0100
|
|
||||||
Subject: [PATCH] Fix crash of xgettext with --its option.
|
|
||||||
|
|
||||||
* gettext-tools/src/xgettext.c (main): Free contents of its_dirs only when it
|
|
||||||
was initialized. Fixes bug introduced on 2016-05-16.
|
|
||||||
---
|
|
||||||
gettext-tools/src/xgettext.c | 11 +++++++----
|
|
||||||
1 file changed, 7 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gettext-tools/src/xgettext.c b/gettext-tools/src/xgettext.c
|
|
||||||
index f848d76d1..a80ee51ac 100644
|
|
||||||
--- a/gettext-tools/src/xgettext.c
|
|
||||||
+++ b/gettext-tools/src/xgettext.c
|
|
||||||
@@ -330,7 +330,7 @@ main (int argc, char *argv[])
|
|
||||||
bool sort_by_msgid = false;
|
|
||||||
bool sort_by_filepos = false;
|
|
||||||
char **dirs;
|
|
||||||
- char **its_dirs;
|
|
||||||
+ char **its_dirs = NULL;
|
|
||||||
char *explicit_its_filename = NULL;
|
|
||||||
const char *file_name;
|
|
||||||
const char *files_from = NULL;
|
|
||||||
@@ -1016,9 +1016,12 @@ warning: file '%s' extension '%s' is unknown; will try C"), filename, extension)
|
|
||||||
if (its_locating_rules)
|
|
||||||
locating_rule_list_free (its_locating_rules);
|
|
||||||
|
|
||||||
- for (i = 0; its_dirs[i] != NULL; i++)
|
|
||||||
- free (its_dirs[i]);
|
|
||||||
- free (its_dirs);
|
|
||||||
+ if (its_dirs != NULL)
|
|
||||||
+ {
|
|
||||||
+ for (i = 0; its_dirs[i] != NULL; i++)
|
|
||||||
+ free (its_dirs[i]);
|
|
||||||
+ free (its_dirs);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
exit (EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.14.3
|
|
||||||
|
|
@ -1,445 +0,0 @@
|
|||||||
From dce3a16e5e9368245735e29bf498dcd5e3e474a4 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Daiki Ueno <ueno@gnu.org>
|
|
||||||
Date: Thu, 15 Sep 2016 13:57:24 +0200
|
|
||||||
Subject: [PATCH] xgettext: Fix crash with *.po file input
|
|
||||||
|
|
||||||
When xgettext was given two *.po files with the same msgid_plural, it
|
|
||||||
crashed with double-free. Problem reported by Davlet Panech in:
|
|
||||||
http://lists.gnu.org/archive/html/bug-gettext/2016-09/msg00001.html
|
|
||||||
|
|
||||||
praiskup:
|
|
||||||
- I dropped the testsuite part, otherwise we'd have to 'autoreconf -vif' the
|
|
||||||
sources
|
|
||||||
- I'm patching manually the po-gram-gen.c file to avoid 'bison' BR
|
|
||||||
|
|
||||||
diff --git a/gettext-tools/src/po-gram-gen.y b/gettext-tools/src/po-gram-gen.y
|
|
||||||
index becf5e607..4428e7725 100644
|
|
||||||
--- a/gettext-tools/src/po-gram-gen.y
|
|
||||||
+++ b/gettext-tools/src/po-gram-gen.y
|
|
||||||
@@ -221,14 +221,11 @@ message
|
|
||||||
check_obsolete ($1, $3);
|
|
||||||
check_obsolete ($1, $4);
|
|
||||||
if (!$1.obsolete || pass_obsolete_entries)
|
|
||||||
- {
|
|
||||||
- do_callback_message ($1.ctxt, string2, &$1.pos, $3.string,
|
|
||||||
- $4.rhs.msgstr, $4.rhs.msgstr_len, &$4.pos,
|
|
||||||
- $1.prev_ctxt,
|
|
||||||
- $1.prev_id, $1.prev_id_plural,
|
|
||||||
- $1.obsolete);
|
|
||||||
- free ($3.string);
|
|
||||||
- }
|
|
||||||
+ do_callback_message ($1.ctxt, string2, &$1.pos, $3.string,
|
|
||||||
+ $4.rhs.msgstr, $4.rhs.msgstr_len, &$4.pos,
|
|
||||||
+ $1.prev_ctxt,
|
|
||||||
+ $1.prev_id, $1.prev_id_plural,
|
|
||||||
+ $1.obsolete);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
free_message_intro ($1);
|
|
||||||
diff --git a/gettext-tools/src/read-catalog.c b/gettext-tools/src/read-catalog.c
|
|
||||||
index 571d18e1b..6af6d2025 100644
|
|
||||||
--- a/gettext-tools/src/read-catalog.c
|
|
||||||
+++ b/gettext-tools/src/read-catalog.c
|
|
||||||
@@ -397,6 +397,8 @@ default_add_message (default_catalog_reader_ty *this,
|
|
||||||
appropriate. */
|
|
||||||
mp = message_alloc (msgctxt, msgid, msgid_plural, msgstr, msgstr_len,
|
|
||||||
msgstr_pos);
|
|
||||||
+ if (msgid_plural != NULL)
|
|
||||||
+ free (msgid_plural);
|
|
||||||
mp->prev_msgctxt = prev_msgctxt;
|
|
||||||
mp->prev_msgid = prev_msgid;
|
|
||||||
mp->prev_msgid_plural = prev_msgid_plural;
|
|
||||||
diff --git a/gettext-tools/src/po-gram-gen.c b/gettext-tools/src/po-gram-gen.c
|
|
||||||
--- a/gettext-tools/src/po-gram-gen.c
|
|
||||||
+++ b/gettext-tools/src/po-gram-gen.c
|
|
||||||
@@ -1,8 +1,8 @@
|
|
||||||
-/* A Bison parser, made by GNU Bison 3.0.4. */
|
|
||||||
+/* A Bison parser, made by GNU Bison 3.0.5. */
|
|
||||||
|
|
||||||
/* Bison implementation for Yacc-like parsers in C
|
|
||||||
|
|
||||||
- Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
|
|
||||||
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
@@ -44,7 +44,7 @@
|
|
||||||
#define YYBISON 1
|
|
||||||
|
|
||||||
/* Bison version. */
|
|
||||||
-#define YYBISON_VERSION "3.0.4"
|
|
||||||
+#define YYBISON_VERSION "3.0.5"
|
|
||||||
|
|
||||||
/* Skeleton name. */
|
|
||||||
#define YYSKELETON_NAME "yacc.c"
|
|
||||||
@@ -568,9 +568,9 @@
|
|
||||||
static const yytype_uint16 yyrline[] =
|
|
||||||
{
|
|
||||||
0, 169, 169, 171, 172, 173, 174, 179, 187, 195,
|
|
||||||
- 216, 240, 249, 258, 269, 278, 292, 301, 315, 321,
|
|
||||||
- 332, 338, 350, 361, 372, 376, 391, 414, 422, 434,
|
|
||||||
- 442
|
|
||||||
+ 216, 237, 246, 255, 266, 275, 289, 298, 312, 318,
|
|
||||||
+ 329, 335, 347, 358, 369, 373, 388, 411, 419, 431,
|
|
||||||
+ 439
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -1054,6 +1054,7 @@
|
|
||||||
case N: \
|
|
||||||
yyformat = S; \
|
|
||||||
break
|
|
||||||
+ default: /* Avoid compiler warnings. */
|
|
||||||
YYCASE_(0, YY_("syntax error"));
|
|
||||||
YYCASE_(1, YY_("syntax error, unexpected %s"));
|
|
||||||
YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
|
|
||||||
@@ -1370,23 +1371,23 @@
|
|
||||||
switch (yyn)
|
|
||||||
{
|
|
||||||
case 7:
|
|
||||||
-#line 180 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 180 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
po_callback_comment_dispatcher ((yyvsp[0].string).string);
|
|
||||||
}
|
|
||||||
-#line 1378 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1379 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 8:
|
|
||||||
-#line 188 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 188 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
po_callback_domain ((yyvsp[0].string).string);
|
|
||||||
}
|
|
||||||
-#line 1386 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1387 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 9:
|
|
||||||
-#line 196 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 196 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
char *string2 = string_list_concat_destroy (&(yyvsp[-2].stringlist).stringlist);
|
|
||||||
char *string4 = string_list_concat_destroy (&(yyvsp[0].stringlist).stringlist);
|
|
||||||
@@ -1407,11 +1408,11 @@
|
|
||||||
free (string4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-#line 1411 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1412 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 10:
|
|
||||||
-#line 217 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 217 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
char *string2 = string_list_concat_destroy (&(yyvsp[-2].stringlist).stringlist);
|
|
||||||
|
|
||||||
@@ -1419,14 +1420,11 @@
|
|
||||||
check_obsolete ((yyvsp[-3].message_intro), (yyvsp[-1].string));
|
|
||||||
check_obsolete ((yyvsp[-3].message_intro), (yyvsp[0].rhs));
|
|
||||||
if (!(yyvsp[-3].message_intro).obsolete || pass_obsolete_entries)
|
|
||||||
- {
|
|
||||||
- do_callback_message ((yyvsp[-3].message_intro).ctxt, string2, &(yyvsp[-3].message_intro).pos, (yyvsp[-1].string).string,
|
|
||||||
- (yyvsp[0].rhs).rhs.msgstr, (yyvsp[0].rhs).rhs.msgstr_len, &(yyvsp[0].rhs).pos,
|
|
||||||
- (yyvsp[-3].message_intro).prev_ctxt,
|
|
||||||
- (yyvsp[-3].message_intro).prev_id, (yyvsp[-3].message_intro).prev_id_plural,
|
|
||||||
- (yyvsp[-3].message_intro).obsolete);
|
|
||||||
- free ((yyvsp[-1].string).string);
|
|
||||||
- }
|
|
||||||
+ do_callback_message ((yyvsp[-3].message_intro).ctxt, string2, &(yyvsp[-3].message_intro).pos, (yyvsp[-1].string).string,
|
|
||||||
+ (yyvsp[0].rhs).rhs.msgstr, (yyvsp[0].rhs).rhs.msgstr_len, &(yyvsp[0].rhs).pos,
|
|
||||||
+ (yyvsp[-3].message_intro).prev_ctxt,
|
|
||||||
+ (yyvsp[-3].message_intro).prev_id, (yyvsp[-3].message_intro).prev_id_plural,
|
|
||||||
+ (yyvsp[-3].message_intro).obsolete);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
free_message_intro ((yyvsp[-3].message_intro));
|
|
||||||
@@ -1435,11 +1433,11 @@
|
|
||||||
free ((yyvsp[0].rhs).rhs.msgstr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-#line 1439 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1437 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 11:
|
|
||||||
-#line 241 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 238 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-2].message_intro), (yyvsp[-1].stringlist));
|
|
||||||
check_obsolete ((yyvsp[-2].message_intro), (yyvsp[0].string));
|
|
||||||
@@ -1448,11 +1446,11 @@
|
|
||||||
string_list_destroy (&(yyvsp[-1].stringlist).stringlist);
|
|
||||||
free ((yyvsp[0].string).string);
|
|
||||||
}
|
|
||||||
-#line 1452 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1450 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 12:
|
|
||||||
-#line 250 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 247 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-2].message_intro), (yyvsp[-1].stringlist));
|
|
||||||
check_obsolete ((yyvsp[-2].message_intro), (yyvsp[0].rhs));
|
|
||||||
@@ -1461,22 +1459,22 @@
|
|
||||||
string_list_destroy (&(yyvsp[-1].stringlist).stringlist);
|
|
||||||
free ((yyvsp[0].rhs).rhs.msgstr);
|
|
||||||
}
|
|
||||||
-#line 1465 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1463 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 13:
|
|
||||||
-#line 259 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 256 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-1].message_intro), (yyvsp[0].stringlist));
|
|
||||||
po_gram_error_at_line (&(yyvsp[-1].message_intro).pos, _("missing 'msgstr' section"));
|
|
||||||
free_message_intro ((yyvsp[-1].message_intro));
|
|
||||||
string_list_destroy (&(yyvsp[0].stringlist).stringlist);
|
|
||||||
}
|
|
||||||
-#line 1476 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1474 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 14:
|
|
||||||
-#line 270 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 267 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
(yyval.message_intro).prev_ctxt = NULL;
|
|
||||||
(yyval.message_intro).prev_id = NULL;
|
|
||||||
@@ -1485,11 +1483,11 @@
|
|
||||||
(yyval.message_intro).pos = (yyvsp[0].string).pos;
|
|
||||||
(yyval.message_intro).obsolete = (yyvsp[0].string).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1489 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1487 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 15:
|
|
||||||
-#line 279 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 276 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-1].prev), (yyvsp[0].string));
|
|
||||||
(yyval.message_intro).prev_ctxt = (yyvsp[-1].prev).ctxt;
|
|
||||||
@@ -1499,11 +1497,11 @@
|
|
||||||
(yyval.message_intro).pos = (yyvsp[0].string).pos;
|
|
||||||
(yyval.message_intro).obsolete = (yyvsp[0].string).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1503 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1501 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 16:
|
|
||||||
-#line 293 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 290 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-1].string), (yyvsp[0].stringlist));
|
|
||||||
(yyval.prev).ctxt = (yyvsp[-1].string).string;
|
|
||||||
@@ -1512,11 +1510,11 @@
|
|
||||||
(yyval.prev).pos = (yyvsp[-1].string).pos;
|
|
||||||
(yyval.prev).obsolete = (yyvsp[-1].string).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1516 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1514 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 17:
|
|
||||||
-#line 302 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 299 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-2].string), (yyvsp[-1].stringlist));
|
|
||||||
check_obsolete ((yyvsp[-2].string), (yyvsp[0].string));
|
|
||||||
@@ -1526,21 +1524,21 @@
|
|
||||||
(yyval.prev).pos = (yyvsp[-2].string).pos;
|
|
||||||
(yyval.prev).obsolete = (yyvsp[-2].string).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1530 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1528 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 18:
|
|
||||||
-#line 316 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 313 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
(yyval.string).string = NULL;
|
|
||||||
(yyval.string).pos = (yyvsp[0].pos).pos;
|
|
||||||
(yyval.string).obsolete = (yyvsp[0].pos).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1540 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1538 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 19:
|
|
||||||
-#line 322 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 319 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-2].pos), (yyvsp[-1].stringlist));
|
|
||||||
check_obsolete ((yyvsp[-2].pos), (yyvsp[0].pos));
|
|
||||||
@@ -1548,21 +1546,21 @@
|
|
||||||
(yyval.string).pos = (yyvsp[0].pos).pos;
|
|
||||||
(yyval.string).obsolete = (yyvsp[0].pos).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1552 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1550 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 20:
|
|
||||||
-#line 333 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 330 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
(yyval.string).string = NULL;
|
|
||||||
(yyval.string).pos = (yyvsp[0].pos).pos;
|
|
||||||
(yyval.string).obsolete = (yyvsp[0].pos).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1562 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1560 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 21:
|
|
||||||
-#line 339 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 336 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-2].pos), (yyvsp[-1].stringlist));
|
|
||||||
check_obsolete ((yyvsp[-2].pos), (yyvsp[0].pos));
|
|
||||||
@@ -1570,11 +1568,11 @@
|
|
||||||
(yyval.string).pos = (yyvsp[0].pos).pos;
|
|
||||||
(yyval.string).obsolete = (yyvsp[0].pos).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1574 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1572 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 22:
|
|
||||||
-#line 351 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 348 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-1].pos), (yyvsp[0].stringlist));
|
|
||||||
plural_counter = 0;
|
|
||||||
@@ -1582,30 +1580,30 @@
|
|
||||||
(yyval.string).pos = (yyvsp[-1].pos).pos;
|
|
||||||
(yyval.string).obsolete = (yyvsp[-1].pos).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1586 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1584 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 23:
|
|
||||||
-#line 362 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 359 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-1].pos), (yyvsp[0].stringlist));
|
|
||||||
(yyval.string).string = string_list_concat_destroy (&(yyvsp[0].stringlist).stringlist);
|
|
||||||
(yyval.string).pos = (yyvsp[-1].pos).pos;
|
|
||||||
(yyval.string).obsolete = (yyvsp[-1].pos).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1597 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1595 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 24:
|
|
||||||
-#line 373 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 370 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
(yyval.rhs) = (yyvsp[0].rhs);
|
|
||||||
}
|
|
||||||
-#line 1605 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1603 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 25:
|
|
||||||
-#line 377 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 374 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-1].rhs), (yyvsp[0].rhs));
|
|
||||||
(yyval.rhs).rhs.msgstr = XNMALLOC ((yyvsp[-1].rhs).rhs.msgstr_len + (yyvsp[0].rhs).rhs.msgstr_len, char);
|
|
||||||
@@ -1617,11 +1615,11 @@
|
|
||||||
(yyval.rhs).pos = (yyvsp[-1].rhs).pos;
|
|
||||||
(yyval.rhs).obsolete = (yyvsp[-1].rhs).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1621 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1619 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 26:
|
|
||||||
-#line 392 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 389 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-4].pos), (yyvsp[-3].pos));
|
|
||||||
check_obsolete ((yyvsp[-4].pos), (yyvsp[-2].number));
|
|
||||||
@@ -1640,11 +1638,11 @@
|
|
||||||
(yyval.rhs).pos = (yyvsp[-4].pos).pos;
|
|
||||||
(yyval.rhs).obsolete = (yyvsp[-4].pos).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1644 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1642 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 27:
|
|
||||||
-#line 415 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 412 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
string_list_init (&(yyval.stringlist).stringlist);
|
|
||||||
string_list_append (&(yyval.stringlist).stringlist, (yyvsp[0].string).string);
|
|
||||||
@@ -1652,11 +1650,11 @@
|
|
||||||
(yyval.stringlist).pos = (yyvsp[0].string).pos;
|
|
||||||
(yyval.stringlist).obsolete = (yyvsp[0].string).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1656 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1654 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 28:
|
|
||||||
-#line 423 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 420 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-1].stringlist), (yyvsp[0].string));
|
|
||||||
(yyval.stringlist).stringlist = (yyvsp[-1].stringlist).stringlist;
|
|
||||||
@@ -1665,11 +1663,11 @@
|
|
||||||
(yyval.stringlist).pos = (yyvsp[-1].stringlist).pos;
|
|
||||||
(yyval.stringlist).obsolete = (yyvsp[-1].stringlist).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1669 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1667 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 29:
|
|
||||||
-#line 435 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 432 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
string_list_init (&(yyval.stringlist).stringlist);
|
|
||||||
string_list_append (&(yyval.stringlist).stringlist, (yyvsp[0].string).string);
|
|
||||||
@@ -1677,11 +1675,11 @@
|
|
||||||
(yyval.stringlist).pos = (yyvsp[0].string).pos;
|
|
||||||
(yyval.stringlist).obsolete = (yyvsp[0].string).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1681 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1679 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 30:
|
|
||||||
-#line 443 "po-gram-gen.y" /* yacc.c:1646 */
|
|
||||||
+#line 440 "po-gram-gen.y" /* yacc.c:1648 */
|
|
||||||
{
|
|
||||||
check_obsolete ((yyvsp[-1].stringlist), (yyvsp[0].string));
|
|
||||||
(yyval.stringlist).stringlist = (yyvsp[-1].stringlist).stringlist;
|
|
||||||
@@ -1690,11 +1688,11 @@
|
|
||||||
(yyval.stringlist).pos = (yyvsp[-1].stringlist).pos;
|
|
||||||
(yyval.stringlist).obsolete = (yyvsp[-1].stringlist).obsolete;
|
|
||||||
}
|
|
||||||
-#line 1694 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1692 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
-#line 1698 "po-gram-gen.c" /* yacc.c:1646 */
|
|
||||||
+#line 1696 "po-gram-gen.c" /* yacc.c:1648 */
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
/* User semantic actions sometimes alter yychar, and that requires
|
|
||||||
--
|
|
||||||
2.19.1
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
|||||||
Index: gettext-0.19.8.1/gettext-tools/misc/po-mode.el
|
|
||||||
===================================================================
|
|
||||||
--- gettext-0.19.8.1.orig/gettext-tools/misc/po-mode.el
|
|
||||||
+++ gettext-0.19.8.1/gettext-tools/misc/po-mode.el
|
|
||||||
@@ -3518,10 +3518,12 @@ Write to your team? ('n' if writing to
|
|
||||||
(re-search-forward
|
|
||||||
(concat "^" (regexp-quote mail-header-separator) "\n"))
|
|
||||||
(save-excursion
|
|
||||||
- (insert-buffer-substring buffer)
|
|
||||||
- (shell-command-on-region
|
|
||||||
- (region-beginning) (region-end)
|
|
||||||
- (concat po-gzip-uuencode-command " " name ".gz") t t))))))
|
|
||||||
+ (save-restriction
|
|
||||||
+ (narrow-to-region (point) (point))
|
|
||||||
+ (insert-buffer-substring buffer)
|
|
||||||
+ (shell-command-on-region
|
|
||||||
+ (point-min) (point-max)
|
|
||||||
+ (concat po-gzip-uuencode-command " " name ".gz") t t)))))))
|
|
||||||
(message ""))
|
|
||||||
|
|
||||||
(defun po-confirm-and-quit ()
|
|
1040
gettext.spec
1040
gettext.spec
File diff suppressed because it is too large
Load Diff
45
msghack.1
45
msghack.1
@ -1,45 +0,0 @@
|
|||||||
.TH MSGHACK "1" "June 2013" "msghack" "User Commands"
|
|
||||||
.SH NAME
|
|
||||||
msghack \- alter PO files in ways
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B msghack
|
|
||||||
[\fIOPTION\fR] \fIfile.po \fR[\fIref.po\fR]
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
This program can be used to alter .po files in ways no sane mind would think about.
|
|
||||||
.TP
|
|
||||||
\fB\-o\fR
|
|
||||||
result will be written to FILE
|
|
||||||
.TP
|
|
||||||
\fB\-\-invert\fR
|
|
||||||
invert a po file by switching msgid and msgstr
|
|
||||||
.TP
|
|
||||||
\fB\-\-master\fR
|
|
||||||
join any number of files in a master\-formatted catalog
|
|
||||||
.TP
|
|
||||||
\fB\-\-empty\fR
|
|
||||||
empty the contents of the .po file, creating a .pot
|
|
||||||
.TP
|
|
||||||
\fB\-\-append\fR
|
|
||||||
append entries from ref.po that don't exist in file.po
|
|
||||||
.PP
|
|
||||||
Note: It is just a replacement of msghack for backward support.
|
|
||||||
.PP
|
|
||||||
This program can be used to alter .po files in ways no sane mind would think about.
|
|
||||||
.TP
|
|
||||||
\fB\-o\fR
|
|
||||||
result will be written to FILE
|
|
||||||
.TP
|
|
||||||
\fB\-\-invert\fR
|
|
||||||
invert a po file by switching msgid and msgstr
|
|
||||||
.TP
|
|
||||||
\fB\-\-master\fR
|
|
||||||
join any number of files in a master\-formatted catalog
|
|
||||||
.TP
|
|
||||||
\fB\-\-empty\fR
|
|
||||||
empty the contents of the .po file, creating a .pot
|
|
||||||
.TP
|
|
||||||
\fB\-\-append\fR
|
|
||||||
append entries from ref.po that don't exist in file.po
|
|
||||||
.PP
|
|
||||||
Note: It is just a replacement of msghack for backward support.
|
|
417
msghack.py
417
msghack.py
@ -1,417 +0,0 @@
|
|||||||
#!/usr/bin/python3
|
|
||||||
## -*- coding: utf-8 -*-
|
|
||||||
## Copyright (C) 2001, 2004, 2008, 2012 Red Hat, Inc.
|
|
||||||
## Copyright (C) 2001 Trond Eivind Glomsrød <teg@redhat.com>
|
|
||||||
|
|
||||||
## This program is free software: you can redistribute it and/or modify
|
|
||||||
## it under the terms of the GNU General Public License as published by
|
|
||||||
## the Free Software Foundation, either version 3 of the License, or
|
|
||||||
## (at your option) any later version.
|
|
||||||
|
|
||||||
## This program is distributed in the hope that it will be useful,
|
|
||||||
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
## GNU General Public License for more details.
|
|
||||||
|
|
||||||
## You should have received a copy of the GNU General Public License
|
|
||||||
## along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
"""
|
|
||||||
A msghack replacement
|
|
||||||
"""
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
class GTMessage:
|
|
||||||
"""
|
|
||||||
A class containing a message, its msgid and various references pointing at it
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self,id=None,message=None,refs=[]):
|
|
||||||
"""
|
|
||||||
The constructor for the GTMessage class
|
|
||||||
@self The object instance
|
|
||||||
@message The message
|
|
||||||
@id The messageid associated with the object
|
|
||||||
"""
|
|
||||||
self._message=message.strip()
|
|
||||||
self._id=id.strip()
|
|
||||||
self._refs=[]
|
|
||||||
for ref in refs:
|
|
||||||
self._refs.append(ref)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
"""
|
|
||||||
Return a string representation of the object
|
|
||||||
@self The object instance
|
|
||||||
"""
|
|
||||||
res=""
|
|
||||||
for ref in self._refs:
|
|
||||||
res=res+ref+"\n"
|
|
||||||
res=res+"msgid %s\nmsgstr %s\n" % (self._id,self._message)
|
|
||||||
return res
|
|
||||||
|
|
||||||
def invertedStrings(self):
|
|
||||||
"""
|
|
||||||
Returns a string representation, but with msgid and msgstr inverted.
|
|
||||||
Note: Don't invert the "" string
|
|
||||||
@self The object instance
|
|
||||||
"""
|
|
||||||
res=""
|
|
||||||
for ref in self._refs:
|
|
||||||
res=res+ref+"\n"
|
|
||||||
if not self._id=="\"\"":
|
|
||||||
res=res+"msgid %s\nmsgstr %s\n" % (self._message,self._id)
|
|
||||||
else:
|
|
||||||
res=res+"msgid %s\nmsgstr %s\n" % (self._id,self._message)
|
|
||||||
return res
|
|
||||||
|
|
||||||
def emptyMsgStrings(self):
|
|
||||||
"""
|
|
||||||
Return a string representation of the object, but leave the msgstr
|
|
||||||
empty - create a pot file from a po file
|
|
||||||
Note: Won't remove the "" string
|
|
||||||
@self The object instance
|
|
||||||
"""
|
|
||||||
res=""
|
|
||||||
for ref in self._refs:
|
|
||||||
res=res+ref+"\n"
|
|
||||||
if not self._id=="\"\"":
|
|
||||||
res=res+"msgid %s\nmsgstr \"\"\n" % (self._id)
|
|
||||||
else:
|
|
||||||
res=res+"msgid %s\nmsgstr %s\n" % (self._id,self._message)
|
|
||||||
return res
|
|
||||||
|
|
||||||
def compareMessage(self,msg):
|
|
||||||
"""
|
|
||||||
Return if the messages have identical msgids, 0 otherwise
|
|
||||||
@self The object instance
|
|
||||||
@msg The message to compare to
|
|
||||||
"""
|
|
||||||
|
|
||||||
if self._id == msg._id:
|
|
||||||
return 1
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
class GTMasterMessage:
|
|
||||||
"""
|
|
||||||
A class containing a message, its msgid and various references pointing at it
|
|
||||||
The difference between GTMessage and GTMasterMessage is that this class
|
|
||||||
can do less operations, but is able to store multiple msgstrs with identifiers
|
|
||||||
(usually language, like 'msgst(no)'
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self,id=None,refs=[]):
|
|
||||||
"""
|
|
||||||
The constructor for the GTMessage class
|
|
||||||
@self The object instance
|
|
||||||
@id The messageid associated with the object
|
|
||||||
"""
|
|
||||||
self._id=id
|
|
||||||
self._refs=[]
|
|
||||||
self._messages=[]
|
|
||||||
for ref in refs:
|
|
||||||
self._refs.append(ref)
|
|
||||||
|
|
||||||
def addMessage(self,message,identifier):
|
|
||||||
"""
|
|
||||||
Add a new message and identifier to the GTMasterMessage object
|
|
||||||
@self The object instance
|
|
||||||
@message The message to append
|
|
||||||
@identifier The identifier of the message
|
|
||||||
"""
|
|
||||||
self._messages.append((identifier,message))
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
"""
|
|
||||||
Return a string representation of the object
|
|
||||||
@self The object instance
|
|
||||||
"""
|
|
||||||
res=""
|
|
||||||
for ref in self._refs:
|
|
||||||
res=res+ref+"\n"
|
|
||||||
res=res+"msgid %s\n" % self._id
|
|
||||||
for message in self._messages:
|
|
||||||
res=res+"msgstr(%s) %s\n" %(message[0],message[1])
|
|
||||||
res=res+"\n"
|
|
||||||
return res
|
|
||||||
|
|
||||||
class GTFile:
|
|
||||||
"""
|
|
||||||
A class containing the GTMessages contained in a file
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self,filename):
|
|
||||||
"""
|
|
||||||
The constructor of the GTMFile class
|
|
||||||
@self The object instance
|
|
||||||
@filename The file to initialize from
|
|
||||||
"""
|
|
||||||
self._filename=filename
|
|
||||||
self._messages=[]
|
|
||||||
self.readFile(filename)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
"""
|
|
||||||
Return a string representation of the object
|
|
||||||
@self The object instance
|
|
||||||
"""
|
|
||||||
res=""
|
|
||||||
for message in self._messages:
|
|
||||||
res=res+str(message)+"\n"
|
|
||||||
return res
|
|
||||||
|
|
||||||
def invertedStrings(self):
|
|
||||||
"""
|
|
||||||
Return a string representation of the object, with msgid and msgstr
|
|
||||||
swapped. Will remove duplicates...
|
|
||||||
@self The object instance
|
|
||||||
"""
|
|
||||||
|
|
||||||
msght={}
|
|
||||||
msgar=[]
|
|
||||||
|
|
||||||
for message in self._messages:
|
|
||||||
if message._id=='""' and len(msgar)==0:
|
|
||||||
msgar.append(GTMessage(message._id,message._message,message._refs))
|
|
||||||
continue
|
|
||||||
msg=GTMessage(message._message,message._id,message._refs)
|
|
||||||
if msg._id not in msght:
|
|
||||||
msght[msg._id]=msg
|
|
||||||
msgar.append(msg)
|
|
||||||
else:
|
|
||||||
msg2=msght[msg._id]
|
|
||||||
for ref in msg._refs:
|
|
||||||
msg2._refs.append(ref)
|
|
||||||
res=""
|
|
||||||
for message in msgar:
|
|
||||||
res=res+str(message)+"\n"
|
|
||||||
return res
|
|
||||||
|
|
||||||
def msgidDupes(self):
|
|
||||||
"""
|
|
||||||
Search for duplicates in the msgids.
|
|
||||||
@self The object instance
|
|
||||||
"""
|
|
||||||
msgids={}
|
|
||||||
res=""
|
|
||||||
for message in self._messages:
|
|
||||||
msgid=message._id
|
|
||||||
if msgid in msgids:
|
|
||||||
res=res+"Duplicate: %s\n" % (msgid)
|
|
||||||
else:
|
|
||||||
msgids[msgid]=1
|
|
||||||
return res
|
|
||||||
|
|
||||||
def getMsgstr(self,msgid):
|
|
||||||
"""
|
|
||||||
Return the msgstr matching the given id. 'None' if missing
|
|
||||||
@self The object instance
|
|
||||||
@msgid The msgid key
|
|
||||||
"""
|
|
||||||
|
|
||||||
for message in self._messages:
|
|
||||||
if msgid == message._id:
|
|
||||||
return message._message
|
|
||||||
return None
|
|
||||||
|
|
||||||
def emptyMsgStrings(self):
|
|
||||||
"""
|
|
||||||
Return a string representation of the object, but leave the msgstr
|
|
||||||
empty - create a pot file from a po file
|
|
||||||
@self The object instance
|
|
||||||
"""
|
|
||||||
|
|
||||||
res=""
|
|
||||||
for message in self._messages:
|
|
||||||
res=res+message.emptyMsgStrings()+"\n"
|
|
||||||
return res
|
|
||||||
|
|
||||||
|
|
||||||
def append(self,B):
|
|
||||||
"""
|
|
||||||
Append entries from dictionary B which aren't
|
|
||||||
already present in this dictionary
|
|
||||||
@self The object instance
|
|
||||||
@B the dictionary to append messages from
|
|
||||||
"""
|
|
||||||
|
|
||||||
for message in B._messages:
|
|
||||||
if not self.getMsgstr(message._id):
|
|
||||||
self._messages.append(message)
|
|
||||||
|
|
||||||
|
|
||||||
def readFile(self,filename):
|
|
||||||
"""
|
|
||||||
Read the contents of a file into the GTFile object
|
|
||||||
@self The object instance
|
|
||||||
@filename The name of the file to read
|
|
||||||
"""
|
|
||||||
|
|
||||||
file=open(filename,"r")
|
|
||||||
msgid=""
|
|
||||||
msgstr=""
|
|
||||||
refs=[]
|
|
||||||
lines=[]
|
|
||||||
inmsgid=0
|
|
||||||
inmsgstr=0
|
|
||||||
templines=file.readlines()
|
|
||||||
for line in templines:
|
|
||||||
lines.append(line.strip())
|
|
||||||
for line in lines:
|
|
||||||
pos=line.find('"')
|
|
||||||
pos2=line.rfind('"')
|
|
||||||
if line and line[0]=="#":
|
|
||||||
refs.append(line.strip())
|
|
||||||
if inmsgstr==0 and line[:6]=="msgstr":
|
|
||||||
msgstr=""
|
|
||||||
inmsgstr=1
|
|
||||||
inmsgid=0
|
|
||||||
if inmsgstr==1:
|
|
||||||
if pos==-1:
|
|
||||||
inmsgstr=0
|
|
||||||
#Handle entries with and without "" consistently
|
|
||||||
if msgid[:2]=='""' and len(msgid)>4:
|
|
||||||
msgid=msgid[2:]
|
|
||||||
if msgstr[:2]=='""' and len(msgstr)>4:
|
|
||||||
msgstr=msgstr[2:]
|
|
||||||
message=GTMessage(msgid,msgstr,refs)
|
|
||||||
self._messages.append(message)
|
|
||||||
msgstr=""
|
|
||||||
msgid=""
|
|
||||||
refs=[]
|
|
||||||
else:
|
|
||||||
msgstr=msgstr+line[pos:pos2+1]+"\n"
|
|
||||||
if inmsgid==0 and line[:5]=="msgid":
|
|
||||||
msgid=""
|
|
||||||
inmsgid=1
|
|
||||||
if inmsgid==1:
|
|
||||||
if pos==-1:
|
|
||||||
inmsgid=0
|
|
||||||
else:
|
|
||||||
msgid=msgid+line[pos:pos2+1]+"\n"
|
|
||||||
if msgstr and msgid:
|
|
||||||
message=GTMessage(msgid,msgstr,refs)
|
|
||||||
self._messages.append(message)
|
|
||||||
|
|
||||||
|
|
||||||
class GTMaster:
|
|
||||||
"""
|
|
||||||
A class containing a master catalogue of gettext dictionaries
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self,dicts):
|
|
||||||
"""
|
|
||||||
The constructor for the GTMaster class
|
|
||||||
@self The object instance
|
|
||||||
@dicts An array of dictionaries to merge
|
|
||||||
"""
|
|
||||||
self._messages=[]
|
|
||||||
self.createMaster(dicts)
|
|
||||||
|
|
||||||
def createMaster(self,dicts):
|
|
||||||
"""
|
|
||||||
Create the master catalogue
|
|
||||||
@self The object instance
|
|
||||||
@dicts An array of dictionaries to merge
|
|
||||||
"""
|
|
||||||
|
|
||||||
self._master=dicts[0]
|
|
||||||
self._dicts=dicts[1:]
|
|
||||||
|
|
||||||
for message in self._master._messages:
|
|
||||||
gtm=GTMasterMessage(message._id,message._refs)
|
|
||||||
gtm.addMessage(message._message,self._master._filename[:-3])
|
|
||||||
for dict in self._dicts:
|
|
||||||
res=dict.getMsgstr(message._id)
|
|
||||||
if(res):
|
|
||||||
gtm.addMessage(res,dict._filename[:-3])
|
|
||||||
self._messages.append(gtm)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
"""
|
|
||||||
Return a string representation of the object
|
|
||||||
@self The object instance
|
|
||||||
"""
|
|
||||||
res=""
|
|
||||||
for message in self._messages:
|
|
||||||
res=res+str(message)+"\n"
|
|
||||||
return res
|
|
||||||
|
|
||||||
def printUsage():
|
|
||||||
"Print the usage messages"
|
|
||||||
print("Usage: " + str(sys.argv[0]) + " [OPTION] file.po [ref.po]\n\
|
|
||||||
This program can be used to alter .po files in ways no sane mind would think about.\n\
|
|
||||||
-o result will be written to FILE\n\
|
|
||||||
--invert invert a po file by switching msgid and msgstr\n\
|
|
||||||
--master join any number of files in a master-formatted catalog\n\
|
|
||||||
--empty empty the contents of the .po file, creating a .pot\n\
|
|
||||||
--append append entries from ref.po that don't exist in file.po\n\
|
|
||||||
\n\
|
|
||||||
Note: It is just a replacement of msghack for backward support.\n")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__=="__main__":
|
|
||||||
output=None
|
|
||||||
res=None
|
|
||||||
if("-o") in sys.argv:
|
|
||||||
if (len(sys.argv)<=sys.argv.index("-o")+1):
|
|
||||||
print("file.po and ref.po are not specified!\n")
|
|
||||||
printUsage()
|
|
||||||
exit(1)
|
|
||||||
output=sys.argv[sys.argv.index("-o")+1]
|
|
||||||
sys.argv.remove("-o")
|
|
||||||
sys.argv.remove(output)
|
|
||||||
if("--invert") in sys.argv:
|
|
||||||
if (len(sys.argv)<=sys.argv.index("--invert")+1):
|
|
||||||
print("file.po is not specified!\n")
|
|
||||||
printUsage()
|
|
||||||
exit(1)
|
|
||||||
file=sys.argv[sys.argv.index("--invert")+1]
|
|
||||||
gtf=GTFile(file)
|
|
||||||
res1=gtf.msgidDupes()
|
|
||||||
if res1:
|
|
||||||
sys.stderr.write(res1)
|
|
||||||
sys.exit(1)
|
|
||||||
res=str(gtf.invertedStrings())
|
|
||||||
elif("--empty") in sys.argv:
|
|
||||||
if (len(sys.argv)<=sys.argv.index("--empty")+1):
|
|
||||||
print("file.po is not specified!\n")
|
|
||||||
printUsage()
|
|
||||||
exit(1)
|
|
||||||
file=sys.argv[sys.argv.index("--empty")+1]
|
|
||||||
gtf=GTFile(file)
|
|
||||||
res=str(gtf.emptyMsgStrings())
|
|
||||||
elif("--master") in sys.argv:
|
|
||||||
if (len(sys.argv)<=sys.argv.index("--master")+1):
|
|
||||||
print("file.po is not specified!\n")
|
|
||||||
printUsage()
|
|
||||||
exit(1)
|
|
||||||
loc=sys.argv.index("--master")+1
|
|
||||||
gtfs=[]
|
|
||||||
for file in sys.argv[loc:]:
|
|
||||||
gtfs.append(GTFile(file))
|
|
||||||
master=GTMaster(gtfs)
|
|
||||||
res=str(master)
|
|
||||||
elif("--append") in sys.argv:
|
|
||||||
if (len(sys.argv)<=sys.argv.index("--append")+2):
|
|
||||||
print("file.po and/or ref.po are not specified!\n")
|
|
||||||
printUsage()
|
|
||||||
exit(1)
|
|
||||||
file=sys.argv[sys.argv.index("--append")+1]
|
|
||||||
file2=sys.argv[sys.argv.index("--append")+2]
|
|
||||||
gtf=GTFile(file)
|
|
||||||
gtf2=GTFile(file2)
|
|
||||||
gtf.append(gtf2)
|
|
||||||
res=str(gtf)
|
|
||||||
else:
|
|
||||||
#print("Not implemented: "+str(sys.argv))
|
|
||||||
printUsage()
|
|
||||||
sys.exit(1)
|
|
||||||
if not output:
|
|
||||||
print(res)
|
|
||||||
else:
|
|
||||||
file=open(output,"w")
|
|
||||||
file.write(res)
|
|
||||||
sys.exit(0)
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
# Tests run on Atomic, Classic and Container
|
|
||||||
- hosts: localhost
|
|
||||||
roles:
|
|
||||||
- role: standard-test-beakerlib
|
|
||||||
tags:
|
|
||||||
- atomic
|
|
||||||
- classic
|
|
||||||
- container
|
|
||||||
repositories:
|
|
||||||
- repo: "https://src.fedoraproject.org/tests/gettext.git"
|
|
||||||
dest: "gettext"
|
|
||||||
tests:
|
|
||||||
- gettext/gettext-tests
|
|
||||||
required_packages:
|
|
||||||
- gettext
|
|
Loading…
Reference in New Issue
Block a user