From: Bruno Haible Date: Fri, 4 Dec 2020 21:49:27 +0000 (+0100) Subject: xgettext: Make --directory option work right with Ruby input files. X-Git-Tag: v0.21.1~35 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=747f688023f0eea9fe70461915c3d5b62667c6e2;p=thirdparty%2Fgettext.git xgettext: Make --directory option work right with Ruby input files. * 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. --- diff --git a/gettext-tools/src/x-ruby.c b/gettext-tools/src/x-ruby.c index e070122f4..115e5691f 100644 --- a/gettext-tools/src/x-ruby.c +++ b/gettext-tools/src/x-ruby.c @@ -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"); diff --git a/gettext-tools/src/x-ruby.h b/gettext-tools/src/x-ruby.h index 6f29febd1..4b0dad363 100644 --- a/gettext-tools/src/x-ruby.h +++ b/gettext-tools/src/x-ruby.h @@ -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); diff --git a/gettext-tools/src/xgettext.c b/gettext-tools/src/xgettext.c index 9b8786ebf..1dce01efb 100644 --- a/gettext-tools/src/xgettext.c +++ b/gettext-tools/src/xgettext.c @@ -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); diff --git a/gettext-tools/tests/Makefile.am b/gettext-tools/tests/Makefile.am index 6b7ec29ea..5e1377594 100644 --- a/gettext-tools/tests/Makefile.am +++ b/gettext-tools/tests/Makefile.am @@ -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 index 000000000..a167b651a --- /dev/null +++ b/gettext-tools/tests/xgettext-16 @@ -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 , 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 \n" +"Language-Team: LANGUAGE \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