]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
xgettext: Avoid error 'present charset "CHARSET" is not a portable encoding name...
authorBruno Haible <bruno@clisp.org>
Sat, 16 Sep 2023 22:18:47 +0000 (00:18 +0200)
committerBruno Haible <bruno@clisp.org>
Tue, 19 Sep 2023 02:11:23 +0000 (04:11 +0200)
Reported by Arsen Arsenović <arsen@aarsen.me>
at <https://savannah.gnu.org/bugs/?64490>.

This changes the behaviour back to the one from gettext 0.21.1, where this
xgettext invocation produced just a warning.

* gettext-tools/src/msgl-iconv.c (iconv_message_list_internal): Don't give an
error when a PO file has a header entry with charset=CHARSET and is entirely
ASCII.
* gettext-tools/src/msgl-cat.c (catenate_msgdomain_list): Likewise.
* gettext-tools/tests/xgettext-combine-1: New file.
* gettext-tools/tests/xgettext-combine-2: New file.
* gettext-tools/tests/xgettext-combine-3: New file.
* gettext-tools/tests/Makefile.am (TESTS): Add them.

gettext-tools/src/msgl-cat.c
gettext-tools/src/msgl-iconv.c
gettext-tools/tests/Makefile.am
gettext-tools/tests/xgettext-combine-1 [new file with mode: 0755]
gettext-tools/tests/xgettext-combine-2 [new file with mode: 0755]
gettext-tools/tests/xgettext-combine-3 [new file with mode: 0755]

index 965cc8cf8d2d50870c886ffd7e9292d70a9a2b27..54bb92f334a9c9547dad8900a2def7669fdb12ed 100644 (file)
@@ -1,6 +1,5 @@
 /* Message list concatenation and duplicate handling.
-   Copyright (C) 2001-2003, 2005-2008, 2012, 2015, 2019-2021 Free Software
-   Foundation, Inc.
+   Copyright (C) 2001-2003, 2005-2008, 2012, 2015, 2019-2021, 2023 Free Software Foundation, Inc.
    Written by Bruno Haible <haible@clisp.cons.org>, 2001.
 
    This program is free software: you can redistribute it and/or modify
@@ -164,15 +163,18 @@ catenate_msgdomain_list (string_list_ty *file_list,
                             if (canon_charset == NULL)
                               {
                                 /* Don't give an error for POT files, because
-                                   POT files usually contain only ASCII
+                                   POT files usually contain only ASCII msgids.
+                                   Also don't give an error for disguised POT
+                                   files that actually contain only ASCII
                                    msgids.  */
                                 const char *filename = files[n];
                                 size_t filenamelen = strlen (filename);
 
-                                if (filenamelen >= 4
-                                    && memcmp (filename + filenamelen - 4,
-                                               ".pot", 4) == 0
-                                    && strcmp (charset, "CHARSET") == 0)
+                                if (strcmp (charset, "CHARSET") == 0
+                                    && ((filenamelen >= 4
+                                         && memcmp (filename + filenamelen - 4,
+                                                    ".pot", 4) == 0)
+                                        || is_ascii_message_list (mlp)))
                                   canon_charset = po_charset_ascii;
                                 else
                                   error (EXIT_FAILURE, 0,
index 77de5c9e2395ecbb2257df40f7e3d36011a65542..33b1aa88a289fe7c41df2c69f71370b4d0406897 100644 (file)
@@ -245,16 +245,19 @@ iconv_message_list_internal (message_list_ty *mlp,
                   {
                     if (!canon_from_code_overridden)
                       {
-                        /* Don't give an error for POT files, because POT
-                           files usually contain only ASCII msgids.  */
+                        /* Don't give an error for POT files, because
+                           POT files usually contain only ASCII msgids.
+                           Also don't give an error for disguised POT
+                           files that actually contain only ASCII msgids.  */
                         const char *filename = from_filename;
                         size_t filenamelen;
 
-                        if (filename != NULL
-                            && (filenamelen = strlen (filename)) >= 4
-                            && memcmp (filename + filenamelen - 4, ".pot", 4)
-                               == 0
-                            && strcmp (charset, "CHARSET") == 0)
+                        if (strcmp (charset, "CHARSET") == 0
+                            && ((filename != NULL
+                                 && (filenamelen = strlen (filename)) >= 4
+                                 && memcmp (filename + filenamelen - 4, ".pot", 4)
+                                    == 0)
+                                || is_ascii_message_list (mlp)))
                           canon_charset = po_charset_ascii;
                         else
                           po_xerror (PO_SEVERITY_FATAL_ERROR, NULL, NULL, 0, 0,
index f4e3d227d55c7695857359ec67ea84cadcdd490f..e2114f8c9a964f7f1c3a6d1799d7a897ee6f3971 100644 (file)
@@ -81,6 +81,7 @@ TESTS = gettext-1 gettext-2 \
        xgettext-7 xgettext-8 xgettext-9 xgettext-10 xgettext-11 xgettext-12 \
        xgettext-13 xgettext-14 xgettext-15 xgettext-16 xgettext-17 \
        xgettext-18 \
+       xgettext-combine-1 xgettext-combine-2 xgettext-combine-3 \
        xgettext-appdata-1 \
        xgettext-awk-1 xgettext-awk-2 xgettext-awk-3 \
        xgettext-awk-stackovfl-1 xgettext-awk-stackovfl-2 \
diff --git a/gettext-tools/tests/xgettext-combine-1 b/gettext-tools/tests/xgettext-combine-1
new file mode 100755 (executable)
index 0000000..70e02a7
--- /dev/null
@@ -0,0 +1,55 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test combining of POT files by merging them.
+
+cat <<EOF > xg-co-test1-a.c
+void f () { gettext ("foobar"); }
+EOF
+
+cat <<EOF > xg-co-test1-b.py
+print gettext.gettext("sumsum");
+EOF
+
+: ${XGETTEXT=xgettext}
+
+${XGETTEXT} -o xg-co-test1-part-c.pot xg-co-test1-a.c || Exit 1
+${XGETTEXT} -o xg-co-test1-part-py.pot xg-co-test1-b.py || Exit 1
+${XGETTEXT} -o xg-co-test1-all.tmp1 xg-co-test1-part-c.pot xg-co-test1-part-py.pot || Exit 1
+LC_ALL=C tr -d '\r' < xg-co-test1-all.tmp1 > xg-co-test1-all.tmp2 || Exit 1
+
+sed -e '/POT-Creation-Date/d' < xg-co-test1-all.tmp2 > xg-co-test1-all.pot
+
+cat <<EOF > xg-co-test1.ok
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: xg-co-test1-a.c:1
+msgid "foobar"
+msgstr ""
+
+#: xg-co-test1-b.py:1
+msgid "sumsum"
+msgstr ""
+EOF
+
+: ${DIFF=diff}
+${DIFF} xg-co-test1.ok xg-co-test1-all.pot
+result=$?
+
+exit $result
diff --git a/gettext-tools/tests/xgettext-combine-2 b/gettext-tools/tests/xgettext-combine-2
new file mode 100755 (executable)
index 0000000..4c5fb7b
--- /dev/null
@@ -0,0 +1,55 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test combining of POT files by using the -j option on a file with
+# suffix ".pot".
+
+cat <<EOF > xg-co-test2-a.c
+void f () { gettext ("foobar"); }
+EOF
+
+cat <<EOF > xg-co-test2-b.py
+print gettext.gettext("sumsum");
+EOF
+
+: ${XGETTEXT=xgettext}
+
+${XGETTEXT} -o xg-co-test2-all-tmp.pot xg-co-test2-a.c || Exit 1
+${XGETTEXT} -j -o xg-co-test2-all-tmp.pot xg-co-test2-b.py || Exit 1
+LC_ALL=C tr -d '\r' < xg-co-test2-all-tmp.pot > xg-co-test2-all.tmp2 || Exit 1
+
+sed -e '/POT-Creation-Date/d' < xg-co-test2-all.tmp2 > xg-co-test2-all.pot
+
+cat <<EOF > xg-co-test2.ok
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: xg-co-test2-a.c:1
+msgid "foobar"
+msgstr ""
+
+#: xg-co-test2-b.py:1
+msgid "sumsum"
+msgstr ""
+EOF
+
+: ${DIFF=diff}
+${DIFF} xg-co-test2.ok xg-co-test2-all.pot
+result=$?
+
+exit $result
diff --git a/gettext-tools/tests/xgettext-combine-3 b/gettext-tools/tests/xgettext-combine-3
new file mode 100755 (executable)
index 0000000..1fd33f1
--- /dev/null
@@ -0,0 +1,56 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test combining of POT files by using the -j option on a file with another
+# suffix, e.g. with suffix ".po" (as generated by the --default-domain option).
+# <https://savannah.gnu.org/bugs/?64490>
+
+cat <<EOF > xg-co-test3-a.c
+void f () { gettext ("foobar"); }
+EOF
+
+cat <<EOF > xg-co-test3-b.py
+print gettext.gettext("sumsum");
+EOF
+
+: ${XGETTEXT=xgettext}
+
+${XGETTEXT} --default-domain=xg-co-test3-all-tmp xg-co-test3-a.c || Exit 1
+${XGETTEXT} -j --default-domain=xg-co-test3-all-tmp xg-co-test3-b.py || Exit 1
+LC_ALL=C tr -d '\r' < xg-co-test3-all-tmp.po > xg-co-test3-all.tmp2 || Exit 1
+
+sed -e '/POT-Creation-Date/d' < xg-co-test3-all.tmp2 > xg-co-test3-all.pot
+
+cat <<EOF > xg-co-test3.ok
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: xg-co-test3-a.c:1
+msgid "foobar"
+msgstr ""
+
+#: xg-co-test3-b.py:1
+msgid "sumsum"
+msgstr ""
+EOF
+
+: ${DIFF=diff}
+${DIFF} xg-co-test3.ok xg-co-test3-all.pot
+result=$?
+
+exit $result