]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
xgettext: Make --directory option work right with Ruby input files.
authorBruno Haible <bruno@clisp.org>
Fri, 4 Dec 2020 21:49:27 +0000 (22:49 +0100)
committerBruno Haible <bruno@clisp.org>
Sun, 9 Oct 2022 07:30:42 +0000 (09:30 +0200)
* gettext-tools/src/xgettext.c (extract_from_file_func): Add found_in_dir
argument.
(xgettext_find_file): Return also the directory that was used to find the file.
(extract_from_file): Pass the directory to the extractor.
* gettext-tools/src/x-ruby.h (extract_ruby): Add found_in_dir argument.
* gettext-tools/src/x-ruby.c (extract_ruby): Add found_in_dir argument. Pass the
logical_filename to rxgettext, and run rxgettext in the given directory.
* gettext-tools/tests/xgettext-16: New file.
* gettext-tools/tests/Makefile.am (TESTS): Add it.

gettext-tools/src/x-ruby.c
gettext-tools/src/x-ruby.h
gettext-tools/src/xgettext.c
gettext-tools/tests/Makefile.am
gettext-tools/tests/xgettext-16 [new file with mode: 0755]

index e070122f4397e936a4a011864ff752ef1e6df0f6..115e5691f3108c9876b17e4473349f9d9a7a1deb 100644 (file)
@@ -76,7 +76,8 @@ init_flag_table_ruby (void)
 /* ========================= Extracting strings.  ========================== */
 
 void
-extract_ruby (const char *real_filename, const char *logical_filename,
+extract_ruby (const char *found_in_dir, const char *real_filename,
+              const char *logical_filename,
               flag_context_list_table_ty *flag_table,
               msgdomain_list_ty *mdlp)
 {
@@ -115,7 +116,7 @@ extract_ruby (const char *real_filename, const char *logical_filename,
             argv[i++] = xasprintf ("--add-comments=%s", comment_tag);
         }
 
-      argv[i++] = real_filename;
+      argv[i++] = logical_filename;
 
       argv[i] = NULL;
 
@@ -126,7 +127,7 @@ extract_ruby (const char *real_filename, const char *logical_filename,
           free (command);
         }
 
-      child = create_pipe_in (progname, progname, argv, NULL,
+      child = create_pipe_in (progname, progname, argv, found_in_dir,
                               DEV_NULL, false, true, true, fd);
 
       fp = fdopen (fd[0], "r");
index 6f29febd1ad99d0ecd2b40f63d46aa8b2b59a467..4b0dad3637f80ec4d50bc6f30dba7059eafe2201 100644 (file)
@@ -34,7 +34,7 @@ extern "C" {
   { "Ruby",             NULL, extract_ruby,                             \
                         &flag_table_ruby, &formatstring_ruby, NULL },   \
 
-extern void extract_ruby (const char *real_filename,
+extern void extract_ruby (const char *found_in_dir, const char *real_filename,
                           const char *logical_filename,
                           flag_context_list_table_ty *flag_table,
                           msgdomain_list_ty *mdlp);
index 9b8786ebf586f1434bcb7587f5e29b0c2661c848..1dce01efb1d5f1c7ec6d684c69f841906989ec9c 100644 (file)
@@ -286,7 +286,8 @@ typedef void (*extract_from_stream_func) (FILE *fp, const char *real_filename,
                                           const char *logical_filename,
                                           flag_context_list_table_ty *flag_table,
                                           msgdomain_list_ty *mdlp);
-typedef void (*extract_from_file_func) (const char *real_filename,
+typedef void (*extract_from_file_func) (const char *found_in_dir,
+                                        const char *real_filename,
                                         const char *logical_filename,
                                         flag_context_list_table_ty *flag_table,
                                         msgdomain_list_ty *mdlp);
@@ -1727,19 +1728,25 @@ savable_comment_to_xgettext_comment (refcounted_string_list_ty *rslp)
 
 /* xgettext_find_file and xgettext_open look up a file, taking into account
    the --directory options.
-   xgettext_find_file merely returns the file name.  This function is useful
-   for parsers implemented as separate programs.
+   xgettext_find_file merely returns the file name and the directory in which
+   it was found.  This function is useful for parsers implemented as separate
+   programs.
    xgettext_open returns the open file stream.  This function is useful for
    built-in parsers.  */
 
 static void
 xgettext_find_file (const char *fn,
-                    char **logical_file_name_p, char **real_file_name_p)
+                    char **logical_file_name_p,
+                    const char **found_in_dir_p,
+                    char **real_file_name_p)
 {
   char *new_name;
+  const char *found_in_dir;
   char *logical_file_name;
   struct stat statbuf;
 
+  found_in_dir = NULL;
+
   /* We cannot handle "-" here.  "/dev/fd/0" is not portable, and it cannot
      be opened multiple times.  */
   if (IS_RELATIVE_FILE_NAME (fn))
@@ -1757,7 +1764,10 @@ xgettext_find_file (const char *fn,
           new_name = xconcatenated_filename (dir, fn, NULL);
 
           if (stat (new_name, &statbuf) == 0)
-            break;
+            {
+              found_in_dir = dir;
+              break;
+            }
 
           if (errno != ENOENT)
             error (EXIT_FAILURE, errno,
@@ -1782,6 +1792,7 @@ xgettext_find_file (const char *fn,
     }
 
   *logical_file_name_p = logical_file_name;
+  *found_in_dir_p = found_in_dir;
   *real_file_name_p = new_name;
 }
 
@@ -1885,9 +1896,12 @@ extract_from_file (const char *file_name, extractor_ty extractor,
     }
   else
     {
-      xgettext_find_file (file_name, &logical_file_name, &real_file_name);
+      const char *found_in_dir;
+      xgettext_find_file (file_name, &logical_file_name,
+                          &found_in_dir, &real_file_name);
 
-      extractor.extract_from_file (real_file_name, logical_file_name,
+      extractor.extract_from_file (found_in_dir, real_file_name,
+                                   logical_file_name,
                                    extractor.flag_table, mdlp);
     }
   free (logical_file_name);
index 6b7ec29eaf1a9e9fc689c90cd30c165e00ebe3df..5e13775942fbf75fb9a5caead0c93685983f34f4 100644 (file)
@@ -77,7 +77,7 @@ TESTS = gettext-1 gettext-2 \
        recode-sr-latin-1 recode-sr-latin-2 \
        xgettext-2 xgettext-3 xgettext-4 xgettext-5 xgettext-6 \
        xgettext-7 xgettext-8 xgettext-9 xgettext-10 xgettext-11 xgettext-12 \
-       xgettext-13 xgettext-14 xgettext-15 \
+       xgettext-13 xgettext-14 xgettext-15 xgettext-16 \
        xgettext-appdata-1 \
        xgettext-awk-1 xgettext-awk-2 \
        xgettext-c-2 xgettext-c-3 xgettext-c-4 xgettext-c-5 xgettext-c-6 \
diff --git a/gettext-tools/tests/xgettext-16 b/gettext-tools/tests/xgettext-16
new file mode 100755 (executable)
index 0000000..a167b65
--- /dev/null
@@ -0,0 +1,90 @@
+#!/bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test of --directory option, with multiple directories and multiple languages.
+
+(rxgettext --version) >/dev/null 2>/dev/null \
+  || { echo "Skipping test: rxgettext not found"; Exit 77; }
+
+mkdir c-src1 c-src2 sh-src1 sh-src2 ruby-src1 ruby-src2
+
+cat <<\EOF > c-src1/a.c
+gettext("some C message");
+EOF
+
+cat <<\EOF > c-src2/b.c
+gettext("another C message");
+EOF
+
+cat <<\EOF > sh-src1/c.sh
+gettext "some Shell message"
+EOF
+
+cat <<\EOF > sh-src2/d.sh
+gettext "another Shell message"
+EOF
+
+cat <<\EOF > ruby-src1/e.rb
+gettext("some Ruby message");
+EOF
+
+cat <<\EOF > ruby-src2/f.rb
+gettext("another Ruby message");
+EOF
+
+: ${XGETTEXT=xgettext}
+${XGETTEXT} -o xg-16.tmp \
+            -D c-src1 -D c-src2 -D sh-src1 -D sh-src2 -D ruby-src1 -D ruby-src2 \
+            a.c b.c c.sh d.sh e.rb f.rb 2>xg-16.err
+test $? = 0 || { cat xg-16.err; Exit 1; }
+func_filter_POT_Creation_Date xg-16.tmp xg-16.pot
+
+cat <<\EOF > xg-16.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"
+
+#: a.c:1
+msgid "some C message"
+msgstr ""
+
+#: b.c:1
+msgid "another C message"
+msgstr ""
+
+#: c.sh:1
+msgid "some Shell message"
+msgstr ""
+
+#: d.sh:1
+msgid "another Shell message"
+msgstr ""
+
+#: e.rb:1
+msgid "some Ruby message"
+msgstr ""
+
+#: f.rb:1
+msgid "another Ruby message"
+msgstr ""
+EOF
+
+: ${DIFF=diff}
+${DIFF} xg-16.ok xg-16.pot
+result=$?
+
+exit $result