From: "Jean-Noël Avila via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: "Johannes Sixt" <j6t@kdbg.org>,
"Phillip Wood" <phillip.wood123@gmail.com>,
"Jean-Noël Avila" <jn.avila@free.fr>
Subject: [PATCH v2 0/4] Factorize i18n
Date: Fri, 28 Jan 2022 22:23:59 +0000 [thread overview]
Message-ID: <pull.1123.v2.git.1643408643.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1123.git.1642876553.gitgitgadget@gmail.com>
This is a small series of i18n factorizations. Again the idea is to:
* reduce the number of strings to translate
* make life easier for translators by removing constant parts of the
strings to translate
* uniformize the UI by using a type of message for the a given type of
condition.
Changes since V1:
* factorize checks of more than 2 incompatible options into dedicated
functions which list all the incompatible options present on the command
line
Jean-Noël Avila (4):
i18n: factorize more 'incompatible options' messages
i18n: factorize "invalid value" messages
i18n: remove from i18n strings that do not hold translatable parts
i18n: transfer variables into placeholders in command synopsis
archive.c | 2 +-
builtin/am.c | 7 ++--
builtin/bisect--helper.c | 6 +--
builtin/blame.c | 6 +--
builtin/commit.c | 39 +++++++++---------
builtin/count-objects.c | 2 +-
builtin/difftool.c | 5 ++-
builtin/fast-export.c | 2 +-
builtin/fetch.c | 4 +-
builtin/grep.c | 8 ++--
builtin/hash-object.c | 2 +-
builtin/help.c | 4 +-
builtin/log.c | 5 ++-
builtin/merge-base.c | 4 +-
builtin/mktag.c | 2 +-
builtin/mktree.c | 2 +-
builtin/notes.c | 6 +--
builtin/pack-objects.c | 2 +-
builtin/prune-packed.c | 2 +-
builtin/pull.c | 6 +--
builtin/push.c | 2 +-
builtin/rebase.c | 2 +-
builtin/reflog.c | 6 +--
builtin/remote.c | 2 +-
builtin/replace.c | 2 +-
builtin/rev-list.c | 2 +-
builtin/send-pack.c | 2 +-
builtin/sparse-checkout.c | 8 ++--
builtin/stripspace.c | 4 +-
builtin/submodule--helper.c | 2 +-
builtin/update-server-info.c | 2 +-
diff-merges.c | 2 +-
gpg-interface.c | 4 +-
ls-refs.c | 2 +-
parallel-checkout.c | 3 +-
parse-options.c | 50 +++++++++++++++++++++++
parse-options.h | 9 ++++
sequencer.c | 2 +-
setup.c | 2 +-
submodule-config.c | 2 +-
t/t4150-am.sh | 2 +-
t/t7500-commit-template-squash-signoff.sh | 2 +-
42 files changed, 145 insertions(+), 85 deletions(-)
base-commit: 90d242d36e248acfae0033274b524bfa55a947fd
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1123%2Fjnavila%2Ffactorize_i18n-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1123/jnavila/factorize_i18n-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1123
Range-diff vs v1:
1: 81ff928567f ! 1: 844e01391e1 i18n: factorize more 'incompatible options' messages
@@ Metadata
## Commit message ##
i18n: factorize more 'incompatible options' messages
+ Find more incompatible options to factorize.
+
When more than two options are mutually exclusive, print the ones
which are actually on the command line.
@@ Commit message
## builtin/commit.c ##
@@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *argv[],
+ struct commit *current_head,
struct wt_status *s)
{
- int f = 0;
-+ char * f_options[4];
-
+- int f = 0;
+-
argc = parse_options(argc, argv, prefix, options, usage, 0);
finalize_deferred_config(s);
+
@@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *argv[],
force_author = find_author_by_nickname(force_author);
@@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *ar
- f++;
- if (logfile)
- f++;
-+ die(_("options '%s' and '%s' cannot be used together"), "--squash", "--fixup");
-+ f_options[f] = "-C";
-+ f+= !!use_message;
-+ f_options[f] = "-c";
-+ f+=!!edit_message;
-+ f_options[f] = "-F";
-+ f+=!!logfile;
-+ f_options[f] = "--fixup";
-+ f+=!!fixup_message;
- if (f > 1)
+- if (f > 1)
- die(_("Only one of -c/-C/-F/--fixup can be used."));
-+ die(_("options '%s' and '%s' cannot be used together"), f_options[0], f_options[1]);
- if (have_option_m && (edit_message || use_message || logfile))
+- if (have_option_m && (edit_message || use_message || logfile))
- die((_("Option -m cannot be combined with -c/-C/-F.")));
-+ die(_("options '%s' and '%s' cannot be used together"), "-m", f_options[0]);
- if (f || have_option_m)
+- if (f || have_option_m)
++ die(_("options '%s' and '%s' cannot be used together"), "--squash", "--fixup");
++ die_if_incompatible_opt4(!!use_message, "-C",
++ !!edit_message, "-c",
++ !!logfile, "-F",
++ !!fixup_message, "--fixup");
++ if (have_option_m) {
++ if (edit_message)
++ die(_("options '%s' and '%s' cannot be used together"), "-m", "-c");
++ else if (use_message)
++ die(_("options '%s' and '%s' cannot be used together"), "-m", "-C");
++ else if (logfile)
++ die(_("options '%s' and '%s' cannot be used together"), "-m", "-F");
++ }
++ if (use_message || edit_message || logfile ||fixup_message || have_option_m)
template_file = NULL;
if (edit_message)
+ use_message = edit_message;
@@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *argv[],
-
if (patch_interactive)
interactive = 1;
--
+
- if (also + only + all + interactive > 1)
- die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
-+ f = 0;
-+ f_options[f] = "-i/--include";
-+ f += also;
-+ f_options[f] = "-o/--only";
-+ f += only;
-+ f_options[f] = "-a/--all";
-+ f += all;
-+ f_options[f] = "--interactive/-p/--patch";
-+ f += interactive;
-+ if (f > 1)
-+ die(_("options '%s' and '%s' cannot be used together"), f_options[0], f_options[1]);
-
+-
++ die_if_incompatible_opt4(also, "-i/--include",
++ only, "-o/--only",
++ all, "-a/--all",
++ interactive, "--interactive/-p/--patch");
if (fixup_message) {
/*
+ * We limit --fixup's suboptions to only alpha characters.
## builtin/difftool.c ##
-@@ builtin/difftool.c: int cmd_difftool(int argc, const char **argv, const char *prefix)
- int use_gui_tool = 0, dir_diff = 0, prompt = -1, symlinks = 0,
- tool_help = 0, no_index = 0;
- static char *difftool_cmd = NULL, *extcmd = NULL;
-+ int f = 0;
-+ char *f_options[3];
- struct option builtin_difftool_options[] = {
- OPT_BOOL('g', "gui", &use_gui_tool,
- N_("use `diff.guitool` instead of `diff.tool`")),
@@ builtin/difftool.c: int cmd_difftool(int argc, const char **argv, const char *prefix)
} else if (dir_diff)
die(_("options '%s' and '%s' cannot be used together"), "--dir-diff", "--no-index");
- if (use_gui_tool + !!difftool_cmd + !!extcmd > 1)
- die(_("options '%s', '%s', and '%s' cannot be used together"), "--gui", "--tool", "--extcmd");
-+ if (use_gui_tool) {
-+ f_options[f] = "--gui";
-+ f++;
-+ }
-+ if (difftool_cmd) {
-+ f_options[f] = "--tool";
-+ f++;
-+ }
-+ if (extcmd) {
-+ f_options[f] = "--extcmd";
-+ f++;
-+ }
-+ if (f > 1)
-+ die(_("options '%s' and '%s' cannot be used together"), f_options[0], f_options[1]);
++ die_if_incompatible_opt3(use_gui_tool, "--gui",
++ !!difftool_cmd, "--tool",
++ !!extcmd, "--extcmd");
if (use_gui_tool)
setenv("GIT_MERGETOOL_GUI", "true", 1);
## builtin/grep.c ##
@@ builtin/grep.c: int cmd_grep(int argc, const char **argv, const char *prefix)
+ if (!show_in_pager && !opt.status_only)
setup_pager();
- if (!use_index && (untracked || cached))
+- if (!use_index && (untracked || cached))
- die(_("--cached or --untracked cannot be used with --no-index"));
-+ die(_("options '%s' and '%s' cannot be used together"),"--cached/--untracked", "--no-index");
-
- if (untracked && cached)
+-
+- if (untracked && cached)
- die(_("--untracked cannot be used with --cached"));
-+ die(_("options '%s' and '%s' cannot be used together"), "--untracked", "--cached");
++ die_if_incompatible_opt3(!use_index, "--no-index",
++ untracked, "--untracked",
++ cached, "--cached");
if (!use_index || untracked) {
int use_exclude = (opt_exclude < 0) ? use_index : !!opt_exclude;
## builtin/log.c ##
-@@ builtin/log.c: int cmd_format_patch(int argc, const char **argv, const char *prefix)
- struct strbuf rdiff_title = STRBUF_INIT;
- int creation_factor = -1;
-
-+ int f = 0;
-+ char * f_options[4];
-+
- const struct option builtin_format_patch_options[] = {
- OPT_CALLBACK_F('n', "numbered", &numbered, NULL,
- N_("use [PATCH n/m] even with a single patch"),
@@ builtin/log.c: int cmd_format_patch(int argc, const char **argv, const char *prefix)
if (rev.show_notes)
load_display_notes(&rev.notes_opt);
- if (use_stdout + rev.diffopt.close_file + !!output_directory > 1)
- die(_("options '%s', '%s', and '%s' cannot be used together"), "--stdout", "--output", "--output-directory");
-+ if (use_stdout) {
-+ f_options[f] = "--stdout";
-+ f++;
-+ }
-+ if (rev.diffopt.close_file) {
-+ f_options[f] = "--output";
-+ f++;
-+ }
-+ if (output_directory) {
-+ f_options[f] = "--output-directory";
-+ f++;
-+ }
-+
-+ if (f > 1)
-+ die(_("options '%s'and '%s' cannot be used together"), f_options[0], f_options[1]);
++ die_if_incompatible_opt3(use_stdout, "--stdout",
++ rev.diffopt.close_file, "--output",
++ !!output_directory, "--output-directory");
if (use_stdout) {
setup_pager();
@@ builtin/merge-base.c: int cmd_merge_base(int argc, const char **argv, const char
if (cmdmode == 'o')
return handle_octopus(argc, argv, show_all);
+ ## parse-options.c ##
+@@ parse-options.c: void NORETURN usage_msg_opt(const char *msg,
+ die_message("%s\n", msg); /* The extra \n is intentional */
+ usage_with_options(usagestr, options);
+ }
++
++void die_if_incompatible_opt3(int opt1, const char *opt1_name,
++ int opt2, const char *opt2_name,
++ int opt3, const char *opt3_name)
++{
++ int count = 0;
++ const char *options[3];
++
++ if (opt1)
++ options[count++] = opt1_name;
++ if (opt2)
++ options[count++] = opt2_name;
++ if (opt3)
++ options[count++] = opt3_name;
++ if (count > 2)
++ die(_("options '%s', '%s', and '%s' cannot be used together"), opt1_name, opt2_name, opt3_name);
++ else if (count > 1)
++ die(_("options '%s' and '%s' cannot be used together"), options[0], options[1]);
++}
++
++void die_if_incompatible_opt4(int opt1, const char *opt1_name,
++ int opt2, const char *opt2_name,
++ int opt3, const char *opt3_name,
++ int opt4, const char *opt4_name)
++{
++ int count = 0;
++ const char *options[4];
++
++ if (opt1)
++ options[count++] = opt1_name;
++ if (opt2)
++ options[count++] = opt2_name;
++ if (opt3)
++ options[count++] = opt3_name;
++ if (opt4)
++ options[count++] = opt4_name;
++ switch (count) {
++ case 4:
++ die(_("options '%s', '%s', '%s', and '%s' cannot be used together"), opt1_name, opt2_name, opt3_name, opt4_name);
++ break;
++ case 3:
++ die(_("options '%s', '%s', and '%s' cannot be used together"), options[0], options[1], options[2]);
++ break;
++ case 2:
++ die(_("options '%s' and '%s' cannot be used together"), options[0], options[1]);
++ break;
++ default:
++ break;
++ }
++}
+
+ ## parse-options.h ##
+@@ parse-options.h: int parse_opt_tracking_mode(const struct option *, const char *, int);
+ #define OPT_PATHSPEC_FILE_NUL(v) OPT_BOOL(0, "pathspec-file-nul", v, N_("with --pathspec-from-file, pathspec elements are separated with NUL character"))
+ #define OPT_AUTOSTASH(v) OPT_BOOL(0, "autostash", v, N_("automatically stash/stash pop before and after"))
+
++void die_if_incompatible_opt3(int opt1, const char *opt1_name,
++ int opt2, const char *opt2_name,
++ int opt3, const char *opt3_name);
++
++void die_if_incompatible_opt4(int opt1, const char *opt1_name,
++ int opt2, const char *opt2_name,
++ int opt3, const char *opt3_name,
++ int opt4, const char *opt4_name);
++
+ #endif
+
## t/t7500-commit-template-squash-signoff.sh ##
@@ t/t7500-commit-template-squash-signoff.sh: test_expect_success '--fixup=reword: give error with pathsec' '
'
2: ca48e82a6b4 = 2: 4c860698d69 i18n: factorize "invalid value" messages
3: ead191faad9 = 3: 376f8b56908 i18n: remove from i18n strings that do not hold translatable parts
4: 643be0d82de = 4: 8b0057f6180 i18n: transfer variables into placeholders in command synopsis
--
gitgitgadget
next prev parent reply other threads:[~2022-01-28 22:24 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-22 18:35 [PATCH 0/4] Factorize i18n Jean-Noël Avila via GitGitGadget
2022-01-22 18:35 ` [PATCH 1/4] i18n: factorize more 'incompatible options' messages Jean-Noël Avila via GitGitGadget
2022-01-24 7:14 ` Johannes Sixt
2022-01-24 11:06 ` Phillip Wood
2022-01-25 20:52 ` Jean-Noël AVILA
2022-01-25 21:26 ` Johannes Sixt
2022-01-22 18:35 ` [PATCH 2/4] i18n: factorize "invalid value" messages Jean-Noël Avila via GitGitGadget
2022-01-24 11:09 ` Phillip Wood
2022-01-22 18:35 ` [PATCH 3/4] i18n: remove from i18n strings that do not hold translatable parts Jean-Noël Avila via GitGitGadget
2022-01-22 18:35 ` [PATCH 4/4] i18n: transfer variables into placeholders in command synopsis Jean-Noël Avila via GitGitGadget
2022-01-28 22:23 ` Jean-Noël Avila via GitGitGadget [this message]
2022-01-28 22:24 ` [PATCH v2 1/4] i18n: factorize more 'incompatible options' messages Jean-Noël Avila via GitGitGadget
2022-01-28 23:21 ` Johannes Sixt
2022-01-28 23:58 ` Junio C Hamano
2022-01-29 8:08 ` Johannes Sixt
2022-01-29 10:41 ` Jean-Noël AVILA
2022-01-29 13:18 ` Johannes Sixt
2022-02-01 21:01 ` Ævar Arnfjörð Bjarmason
2022-01-28 22:24 ` [PATCH v2 2/4] i18n: factorize "invalid value" messages Jean-Noël Avila via GitGitGadget
2022-01-28 22:24 ` [PATCH v2 3/4] i18n: remove from i18n strings that do not hold translatable parts Jean-Noël Avila via GitGitGadget
2022-01-28 22:24 ` [PATCH v2 4/4] i18n: transfer variables into placeholders in command synopsis Jean-Noël Avila via GitGitGadget
2022-01-30 22:01 ` [PATCH v3 0/4] Factorize i18n Jean-Noël Avila via GitGitGadget
2022-01-30 22:01 ` [PATCH v3 1/4] i18n: factorize more 'incompatible options' messages Jean-Noël Avila via GitGitGadget
2022-01-31 7:15 ` Johannes Sixt
2022-01-31 10:56 ` Phillip Wood
2022-01-30 22:01 ` [PATCH v3 2/4] i18n: factorize "invalid value" messages Jean-Noël Avila via GitGitGadget
2022-01-30 22:01 ` [PATCH v3 3/4] i18n: remove from i18n strings that do not hold translatable parts Jean-Noël Avila via GitGitGadget
2022-01-30 22:01 ` [PATCH v3 4/4] i18n: transfer variables into placeholders in command synopsis Jean-Noël Avila via GitGitGadget
2022-01-31 11:00 ` Phillip Wood
2022-01-31 13:36 ` Jean-Noël Avila
2022-01-31 7:15 ` [PATCH v3 0/4] Factorize i18n Johannes Sixt
2022-01-31 22:07 ` [PATCH v4 " Jean-Noël Avila via GitGitGadget
2022-01-31 22:07 ` [PATCH v4 1/4] i18n: factorize more 'incompatible options' messages Jean-Noël Avila via GitGitGadget
2022-01-31 22:41 ` Junio C Hamano
2022-02-01 7:01 ` Johannes Sixt
2022-02-01 17:58 ` Junio C Hamano
2022-02-02 16:05 ` Jean-Noël Avila
2022-02-02 17:29 ` Johannes Sixt
2022-01-31 22:07 ` [PATCH v4 2/4] i18n: factorize "invalid value" messages Jean-Noël Avila via GitGitGadget
2022-01-31 22:07 ` [PATCH v4 3/4] i18n: remove from i18n strings that do not hold translatable parts Jean-Noël Avila via GitGitGadget
2022-01-31 22:07 ` [PATCH v4 4/4] i18n: fix some misformated placeholders in command synopsis Jean-Noël Avila via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.1123.v2.git.1643408643.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=j6t@kdbg.org \
--cc=jn.avila@free.fr \
--cc=phillip.wood123@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).