Skip to content

Commit a4dcbed

Browse files
authored
Merge pull request #448 from rustcoreutils/xgettext-merge
Xgettext merge
2 parents d03017b + 296a073 commit a4dcbed

26 files changed

+8224
-4
lines changed

.gitignore

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
21
target/
3-
2+
locale/posixutils-rs.pot
3+
locale/*/LC_MESSAGES/posixutils-rs.mo

Cargo.lock

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Makefile

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# SPDX-License-Identifier: MIT
2+
3+
PROJECT_NAME = posixutils-rs
4+
5+
SRCS := $(shell find . -name '*.rs' -not -path './target/*' -not -path './*/tests/*')
6+
POS := $(shell find locale -name '*.po')
7+
MOS := $(POS:.po=.mo)
8+
9+
locale: $(MOS)
10+
11+
%.mo: %.po locale/${PROJECT_NAME}.pot
12+
msgmerge $^ -o $<
13+
msgfmt $< -o $@
14+
15+
locale/${PROJECT_NAME}.pot: $(SRCS)
16+
cargo r --release --bin xgettext -- -n -p locale -d ${PROJECT_NAME} $^
17+
18+
clean:
19+
rm -rf locale/${PROJECT_NAME}.pot
20+
rm -rf $(MOS)

i18n/Cargo.toml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ bytemuck = { version = "1.17", features = ["derive"] }
1515
byteorder = "1.5"
1616
strum = "0.26"
1717
strum_macros = "0.26"
18+
proc-macro2 = { version = "1", features = ["span-locations"] }
19+
quote = "1"
20+
syn = { version = "2", features = ["parsing", "full"] }
21+
22+
[dev-dependencies]
23+
tempfile = "3.10"
24+
pretty_assertions = "1.4"
1825

1926
[lints]
2027
workspace = true
@@ -26,3 +33,7 @@ path = "./gencat.rs"
2633
[[bin]]
2734
name = "iconv"
2835
path = "./iconv.rs"
36+
37+
[[bin]]
38+
name = "xgettext"
39+
path = "./xgettext.rs"

i18n/iconv.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use strum_macros::{Display, EnumIter, EnumString};
3131
mod iconv_lib;
3232

3333
#[derive(Parser)]
34-
#[command(version, about=gettext("iconv codeset conversion"))]
34+
#[command(version, about=gettext("iconv - codeset conversion"))]
3535
struct Args {
3636
#[arg(short = 'c', help=gettext("Omit invalid characters of the input file from the output"))]
3737
omit_invalid: bool,

i18n/tests/i18n-tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@
99

1010
mod gencat;
1111
mod iconv;
12+
mod xgettext;

i18n/tests/xgettext/mod.rs

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
// SPDX-License-Identifier: MIT
2+
3+
use std::fs::{read_to_string, remove_file};
4+
use std::path::Path;
5+
6+
use pretty_assertions::assert_eq;
7+
use tempfile::tempdir;
8+
9+
use plib::testing::{run_test, TestPlan};
10+
11+
fn xgettext_test<P: AsRef<Path>, P2: AsRef<Path>>(
12+
args: &[&str],
13+
output_file: P,
14+
expected_output_file: P2,
15+
) {
16+
let str_args: Vec<String> = args.iter().map(|s| String::from(*s)).collect();
17+
run_test(TestPlan {
18+
cmd: String::from("xgettext"),
19+
args: str_args,
20+
stdin_data: "".into(),
21+
expected_out: "".into(),
22+
expected_err: "".into(),
23+
expected_exit_code: 0,
24+
});
25+
26+
let output = read_to_string(output_file).expect("Unable to open po-file");
27+
let expected_out = read_to_string(expected_output_file).unwrap();
28+
assert_eq!(output, expected_out);
29+
}
30+
31+
#[test]
32+
fn test_xgettext_no_arg() {
33+
run_test(TestPlan {
34+
cmd: String::from("xgettext"),
35+
args: vec![],
36+
stdin_data: "".into(),
37+
expected_out: "".into(),
38+
expected_err: "xgettext: no input file given\n".into(),
39+
expected_exit_code: 1,
40+
});
41+
}
42+
43+
#[test]
44+
fn test_xgettext() {
45+
let output_file = "messages.pot";
46+
xgettext_test(
47+
&["tests/xgettext/test_gettext.rs"],
48+
output_file,
49+
"tests/xgettext/test_gettext_no_lines.pot",
50+
);
51+
let _ = remove_file(output_file);
52+
}
53+
54+
#[test]
55+
fn test_xgettext_domain() {
56+
let output_file = "domain.pot";
57+
xgettext_test(
58+
&["-d", "domain", "tests/xgettext/test_gettext.rs"],
59+
output_file,
60+
"tests/xgettext/test_gettext_no_lines.pot",
61+
);
62+
let _ = remove_file(output_file);
63+
}
64+
65+
#[test]
66+
fn test_xgettext_pathname() {
67+
let temp_dir = tempdir().expect("Unable to create temporary directory");
68+
xgettext_test(
69+
&[
70+
"-p",
71+
&temp_dir.path().to_str().unwrap(),
72+
"tests/xgettext/test_gettext.rs",
73+
],
74+
temp_dir.path().join("messages.pot"),
75+
"tests/xgettext/test_gettext_no_lines.pot",
76+
);
77+
}
78+
79+
#[test]
80+
fn test_xgettext_domain_pathname() {
81+
let temp_dir = tempdir().expect("Unable to create temporary directory");
82+
xgettext_test(
83+
&[
84+
"-d",
85+
"domain",
86+
"-p",
87+
&temp_dir.path().to_str().unwrap(),
88+
"tests/xgettext/test_gettext.rs",
89+
],
90+
temp_dir.path().join("domain.pot"),
91+
"tests/xgettext/test_gettext_no_lines.pot",
92+
);
93+
}
94+
95+
#[test]
96+
fn test_xgettext_pathname_lines() {
97+
let temp_dir = tempdir().expect("Unable to create temporary directory");
98+
xgettext_test(
99+
&[
100+
"-n",
101+
"-p",
102+
&temp_dir.path().to_str().unwrap(),
103+
"tests/xgettext/test_gettext.rs",
104+
],
105+
temp_dir.path().join("messages.pot"),
106+
"tests/xgettext/test_gettext.pot",
107+
);
108+
}
109+
110+
#[test]
111+
fn test_clap() {
112+
let temp_dir = tempdir().expect("Unable to create temporary directory");
113+
xgettext_test(
114+
&[
115+
"-n",
116+
"-p",
117+
&temp_dir.path().to_str().unwrap(),
118+
"tests/xgettext/test_clap.rs",
119+
],
120+
temp_dir.path().join("messages.pot"),
121+
"tests/xgettext/test_clap.pot",
122+
);
123+
}
124+
125+
#[ignore]
126+
#[test]
127+
fn test_xgettext_ngettext() {
128+
let temp_dir = tempdir().expect("Unable to create temporary directory");
129+
xgettext_test(
130+
&[
131+
"-n",
132+
"-p",
133+
&temp_dir.path().to_str().unwrap(),
134+
"tests/xgettext/test_ngettext.rs",
135+
],
136+
temp_dir.path().join("messages.pot"),
137+
"tests/xgettext/test_ngettext.pot",
138+
);
139+
}
140+
141+
#[ignore]
142+
#[test]
143+
fn test_xgettext_pgettext() {
144+
let temp_dir = tempdir().expect("Unable to create temporary directory");
145+
xgettext_test(
146+
&[
147+
"-n",
148+
"-p",
149+
&temp_dir.path().to_str().unwrap(),
150+
"tests/xgettext/test_pgettext.rs",
151+
],
152+
temp_dir.path().join("messages.pot"),
153+
"tests/xgettext/test_pgettext.pot",
154+
);
155+
}
156+
157+
#[ignore]
158+
#[test]
159+
fn test_xgettext_npgettext() {
160+
let temp_dir = tempdir().expect("Unable to create temporary directory");
161+
xgettext_test(
162+
&[
163+
"-n",
164+
"-p",
165+
&temp_dir.path().to_str().unwrap(),
166+
"tests/xgettext/test_npgettext.rs",
167+
],
168+
temp_dir.path().join("messages.pot"),
169+
"tests/xgettext/test_npgettext.pot",
170+
);
171+
}

i18n/tests/xgettext/test_clap.pot

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#: tests/xgettext/test_clap.rs:29
2+
msgid "Arguments for the utility"
3+
msgstr ""
4+
5+
#: tests/xgettext/test_clap.rs:33
6+
msgid "Print help"
7+
msgstr ""
8+
9+
#: tests/xgettext/test_clap.rs:36
10+
msgid "Print version"
11+
msgstr ""
12+
13+
#: tests/xgettext/test_clap.rs:23
14+
msgid "The utility to be invoked"
15+
msgstr ""
16+
17+
#: tests/xgettext/test_clap.rs:19
18+
msgid "Write timing output to standard error in POSIX format"
19+
msgstr ""
20+
21+
#: tests/xgettext/test_clap.rs:10
22+
msgid "time - time a simple command or give resource usage"
23+
msgstr ""
24+
25+
#: tests/xgettext/test_clap.rs:11
26+
msgid "{about}\n"
27+
"\n"
28+
"Usage: {usage}\n"
29+
"\n"
30+
"Arguments:\n"
31+
"{positionals}\n"
32+
"\n"
33+
"Options:\n"
34+
"{options}"
35+
msgstr ""
36+

i18n/tests/xgettext/test_clap.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
use clap::Parser;
2+
3+
use gettextrs::{
4+
bind_textdomain_codeset, bindtextdomain, gettext, setlocale, textdomain, LocaleCategory,
5+
};
6+
7+
#[derive(Parser)]
8+
#[command(
9+
version,
10+
about = gettext("time - time a simple command or give resource usage"),
11+
help_template = gettext("{about}\n\nUsage: {usage}\n\nArguments:\n{positionals}\n\nOptions:\n{options}"),
12+
disable_help_flag = true,
13+
disable_version_flag = true,
14+
)]
15+
struct Args {
16+
#[arg(
17+
short,
18+
long,
19+
help = gettext("Write timing output to standard error in POSIX format")
20+
)]
21+
posix: bool,
22+
23+
#[arg(help = gettext("The utility to be invoked"))]
24+
utility: String,
25+
26+
#[arg(
27+
name = "ARGUMENT",
28+
trailing_var_arg = true,
29+
help = gettext("Arguments for the utility")
30+
)]
31+
arguments: Vec<String>,
32+
33+
#[arg(short, long, help = gettext("Print help"), action = clap::ArgAction::HelpLong)]
34+
help: Option<bool>,
35+
36+
#[arg(short = 'V', long, help = gettext("Print version"), action = clap::ArgAction::Version)]
37+
version: Option<bool>,
38+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#: tests/xgettext/test_gettext.rs:6
2+
msgid "Hello, world!"
3+
msgstr ""
4+

0 commit comments

Comments
 (0)