Subject: [PATCH v4 00/11] Factorization of messages with similar meaning

From: "Jean-Noël Avila via GitGitGadget" <[email-masked]>
Date: Sun, 02 Jan 2022 17:15:34 +0000

This series is a meager attempt at rationalizing a small fraction of the
internationalized messages. Sorry in advance for the dull task of reviewing
these insipide patches.

Doing so has some positive effects:

 * non-translatable constant strings are kept out of the way for translators
 * messages with identical meaning are built identically
 * the total number of messages to translate is decreased.

Changes since V1:

 * took into account the comments, except for ref-filter.c where the
   proposed refactoring is not obvious.
 * added even more strings to the "cannot be used together" crowd.

Changes since V2:

 * fixed change of behaviour in tag.c
 * reverted sam changes as per Johannes Sixt comments

Changes since V3:

 * apply Oxford comma where needed
 * switch all options to " '%s' " style where i18n is applied.

Jean-Noël Avila (11):
  i18n: refactor "foo and bar are mutually exclusive"
  i18n: refactor "%s, %s and %s are mutually exclusive"
  i18n: turn "options are incompatible" into "cannot be used together"
  i18n: standardize "cannot open" and "cannot read"
  i18n: tag.c factorize i18n strings
  i18n: factorize "--foo requires --bar" and the like
  i18n: factorize "no directory given for --foo"
  i18n: refactor "unrecognized %(foo) argument" strings
  i18n: factorize "--foo outside a repository"
  i18n: ref-filter: factorize "%(foo) atom used without %(bar) atom"
  i18n: turn even more messages into "cannot be used together" ones

 apply.c                                   |  8 ++++----
 archive.c                                 |  8 ++++----
 builtin/add.c                             | 14 +++++++-------
 builtin/am.c                              |  6 +++---
 builtin/branch.c                          |  2 +-
 builtin/cat-file.c                        |  2 +-
 builtin/checkout.c                        | 18 +++++++++---------
 builtin/clone.c                           |  6 +++---
 builtin/commit.c                          | 17 +++++++++--------
 builtin/describe.c                        |  6 +++---
 builtin/diff-tree.c                       |  2 +-
 builtin/difftool.c                        |  4 ++--
 builtin/fast-export.c                     |  4 ++--
 builtin/fetch.c                           |  8 ++++----
 builtin/index-pack.c                      |  4 ++--
 builtin/init-db.c                         |  2 +-
 builtin/log.c                             |  8 ++++----
 builtin/ls-files.c                        |  2 +-
 builtin/merge.c                           |  4 ++--
 builtin/pack-objects.c                    |  2 +-
 builtin/push.c                            |  8 ++++----
 builtin/rebase.c                          | 10 +++++-----
 builtin/repack.c                          |  4 ++--
 builtin/reset.c                           | 10 +++++-----
 builtin/rev-list.c                        |  4 ++--
 builtin/rm.c                              |  4 ++--
 builtin/show-branch.c                     |  4 ++--
 builtin/stash.c                           |  8 ++++----
 builtin/submodule--helper.c               |  4 ++--
 builtin/tag.c                             | 23 +++++++++++++----------
 builtin/worktree.c                        |  6 +++---
 diff.c                                    | 12 ++++++++----
 fetch-pack.c                              |  2 +-
 git.c                                     |  6 +++---
 http-fetch.c                              |  4 ++--
 range-diff.c                              |  2 +-
 ref-filter.c                              | 22 +++++++++++-----------
 revision.c                                | 22 +++++++++++-----------
 t/t0001-init.sh                           |  2 +-
 t/t2025-checkout-no-overlay.sh            |  2 +-
 t/t2026-checkout-pathspec-file.sh         |  8 ++++----
 t/t2072-restore-pathspec-file.sh          |  6 +++---
 t/t3431-rebase-fork-point.sh              |  2 +-
 t/t3601-rm-pathspec-file.sh               |  4 ++--
 t/t3704-add-pathspec-file.sh              | 10 +++++-----
 t/t3909-stash-pathspec-file.sh            |  6 +++---
 t/t4209-log-pickaxe.sh                    | 10 +++++-----
 t/t5606-clone-options.sh                  |  4 ++--
 t/t7107-reset-pathspec-file.sh            |  6 +++---
 t/t7500-commit-template-squash-signoff.sh | 11 ++++++-----
 t/t7526-commit-pathspec-file.sh           | 10 +++++-----
 51 files changed, 186 insertions(+), 177 deletions(-)

base-commit: 2ae0a9cb8298185a94e5998086f380a355dd8907
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1088%2Fjnavila%2Fi18n-refactor-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1088/jnavila/i18n-refactor-v4
Pull-Request: https://github.com/gitgitgadget/git/pull/1088

Range-diff vs v3:

  1:  05af90f5814 =  1:  05af90f5814 i18n: refactor "foo and bar are mutually exclusive"
  2:  4accf1629e5 !  2:  e307ea9b998 i18n: refactor "%s, %s and %s are mutually exclusive"
     @@ builtin/difftool.c: int cmd_difftool(int argc, const char **argv, const char *pr
       
       	if (use_gui_tool + !!difftool_cmd + !!extcmd > 1)
      -		die(_("--gui, --tool and --extcmd are mutually exclusive"));
     -+		die(_("options '%s', '%s' and '%s' cannot be used together"), "--gui", "--tool", "--extcmd");
     ++		die(_("options '%s', '%s', and '%s' cannot be used together"), "--gui", "--tool", "--extcmd");
       
       	if (use_gui_tool)
       		setenv("GIT_MERGETOOL_GUI", "true", 1);
     @@ builtin/log.c: int cmd_format_patch(int argc, const char **argv, const char *pre
       
       	if (use_stdout + rev.diffopt.close_file + !!output_directory > 1)
      -		die(_("--stdout, --output, and --output-directory are mutually exclusive"));
     -+		die(_("options '%s', '%s' and '%s' cannot be used together"), "--stdout", "--output", "--output-directory");
     ++		die(_("options '%s', '%s', and '%s' cannot be used together"), "--stdout", "--output", "--output-directory");
       
       	if (use_stdout) {
       		setup_pager();
     @@ builtin/worktree.c: static int add(int ac, const char **av, const char *prefix)
       	ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
       	if (!!opts.detach + !!new_branch + !!new_branch_force > 1)
      -		die(_("-b, -B, and --detach are mutually exclusive"));
     -+		die(_("options '%s', '%s' and '%s' cannot be used together"), "-b", "-B", "--detach");
     ++		die(_("options '%s', '%s', and '%s' cannot be used together"),"-b", "-B", "--detach");
       	if (lock_reason && !keep_locked)
       		die(_("--reason requires --lock"));
       	if (lock_reason)
     @@ diff.c: void diff_setup_done(struct diff_options *options)
       
       	if (HAS_MULTI_BITS(options->pickaxe_opts & DIFF_PICKAXE_KINDS_MASK))
      -		die(_("-G, -S and --find-object are mutually exclusive"));
     -+		die(_("options '%s', '%s' and '%s' cannot be used together"), "-G", "-S", "--find-object");
     ++		die(_("options '%s', '%s', and '%s' cannot be used together"), "-G", "-S", "--find-object");
       
       	if (HAS_MULTI_BITS(options->pickaxe_opts & DIFF_PICKAXE_KINDS_G_REGEX_MASK))
       		die(_("-G and --pickaxe-regex are mutually exclusive, use --pickaxe-regex with -S"));
  3:  486cc6c89e2 !  3:  d5bfa26e992 i18n: turn "options are incompatible" into "cannot be used together"
     @@ apply.c: int check_apply_state(struct apply_state *state, int force_apply)
       
       	if (state->apply_with_reject && state->threeway)
      -		return error(_("--reject and --3way cannot be used together."));
     -+		return error(_("options '%s' and '%s' cannot be used together"),"--reject",  "--3way");
     ++		return error(_("options '%s' and '%s' cannot be used together"), "--reject",  "--3way");
       	if (state->threeway) {
       		if (is_not_gitdir)
       			return error(_("--3way outside a repository"));
     @@ builtin/branch.c: int cmd_branch(int argc, const char **argv, const char *prefix

       ## builtin/checkout.c ##
     +@@ builtin/checkout.c: static int checkout_paths(const struct checkout_opts *opts,
     + 		die(_("'%s' cannot be used with updating paths"), "--detach");
     + 
     + 	if (opts->merge && opts->patch_mode)
     +-		die(_("'%s' cannot be used with %s"), "--merge", "--patch");
     ++		die(_("options '%s' and '%s' cannot be used together"), "--merge", "--patch");
     + 
     + 	if (opts->ignore_unmerged && opts->merge)
     +-		die(_("'%s' cannot be used with %s"),
     ++		die(_("options '%s' and '%s' cannot be used together"),
     + 		    opts->ignore_unmerged_opt, "-m");
     + 
     + 	if (opts->new_branch)
      @@ builtin/checkout.c: static int checkout_main(int argc, const char **argv, const char *prefix,
       			die(_("--pathspec-from-file is incompatible with pathspec arguments"));
       
       		if (opts->force_detach)
      -			die(_("--pathspec-from-file is incompatible with --detach"));
     -+			die(_("options '%s' and '%s' cannot be used together"), "--pathspec-from-file",  "--detach");
     ++			die(_("options '%s' and '%s' cannot be used together"), "--pathspec-from-file", "--detach");
       
       		if (opts->patch_mode)
      -			die(_("--pathspec-from-file is incompatible with --patch"));
     @@ builtin/commit.c: static const char *prepare_index(const char **argv, const char
       
       		if (all)
      -			die(_("--pathspec-from-file with -a does not make sense"));
     -+			die(_("options '%s' and '%s' cannot be used together"),"--pathspec-from-file", "-a");
     ++			die(_("options '%s' and '%s' cannot be used together"), "--pathspec-from-file", "-a");
       
       		if (pathspec.nr)
       			die(_("--pathspec-from-file is incompatible with pathspec arguments"));
     @@ builtin/difftool.c: int cmd_difftool(int argc, const char **argv, const char *pr
      +		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");
     + 		die(_("options '%s', '%s', and '%s' cannot be used together"), "--gui", "--tool", "--extcmd");
      
       ## builtin/fast-export.c ##
      @@ builtin/fast-export.c: int cmd_fast_export(int argc, const char **argv, const char *prefix)
     @@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix
       	if (keep_base) {
       		if (options.onto_name)
      -			die(_("cannot combine '--keep-base' with '--onto'"));
     -+			die(_("options '%s' and '%s' cannot be used together"),"--keep-base", "--onto");
     ++			die(_("options '%s' and '%s' cannot be used together"), "--keep-base", "--onto");
       		if (options.root)
      -			die(_("cannot combine '--keep-base' with '--root'"));
     -+			die(_("options '%s' and '%s' cannot be used together"),"--keep-base", "--root");
     ++			die(_("options '%s' and '%s' cannot be used together"), "--keep-base", "--root");
       	}
       
       	if (options.root && options.fork_point > 0)
     @@ builtin/repack.c: int cmd_repack(int argc, const char **argv, const char *prefix
       	if (geometric_factor) {
       		if (pack_everything)
      -			die(_("--geometric is incompatible with -A, -a"));
     -+			die(_("options '%s' and '%s' cannot be used together"),"--geometric", "-A/-a");
     ++			die(_("options '%s' and '%s' cannot be used together"), "--geometric", "-A/-a");
       		init_pack_geometry(&geometry);
       		split_pack_geometry(geometry, geometric_factor);
       	}
     @@ builtin/rev-list.c: int cmd_rev_list(int argc, const char **argv, const char *pr
       		if (skip_prefix(arg, "--missing=", &arg)) {
       			if (revs.exclude_promisor_objects)
      -				die(_("cannot combine --exclude-promisor-objects and --missing"));
     -+				die(_("options '%s' and '%s' cannot be used together"),"--exclude-promisor-objects", "--missing");
     ++				die(_("options '%s' and '%s' cannot be used together"), "--exclude-promisor-objects", "--missing");
       			if (parse_missing_action_value(arg))
       				break;
       		}
     @@ builtin/tag.c: int cmd_tag(int argc, const char **argv, const char *prefix)
       		colopts = 0;
       	}
       	sorting = ref_sorting_options(&sorting_options);
     +@@ builtin/tag.c: int cmd_tag(int argc, const char **argv, const char *prefix)
     + 
     + 	if (msg.given || msgfile) {
     + 		if (msg.given && msgfile)
     +-			die(_("only one -F or -m option is allowed."));
     ++			die(_("options '%s' and '%s' cannot be used together"), "-F", "-m");
     + 		if (msg.given)
     + 			strbuf_addbuf(&buf, &(msg.buf));
     + 		else {
      
       ## revision.c ##
      @@ revision.c: static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
     @@ revision.c: int setup_revisions(int argc, const char **argv, struct rev_info *re
      -		die("cannot combine --no-walk with --graph");
      +		die(_("options '%s' and '%s' cannot be used together"), "--no-walk", "--graph");
       	if (!revs->reflog_info && revs->grep_filter.use_reflog_filter)
     --		die("cannot use --grep-reflog without --walk-reflogs");
     -+		die(_("%s requires %s"), "--grep-reflog", "--walk-reflogs");
     + 		die("cannot use --grep-reflog without --walk-reflogs");
       
     - 	if (revs->line_level_traverse &&
     - 	    (revs->diffopt.output_format & ~(DIFF_FORMAT_PATCH | DIFF_FORMAT_NO_OUTPUT)))
      
       ## t/t2026-checkout-pathspec-file.sh ##
      @@ t/t2026-checkout-pathspec-file.sh: test_expect_success 'error conditions' '
  4:  a2b42087342 =  4:  51c53f01dd8 i18n: standardize "cannot open" and "cannot read"
  5:  2d83654c48a !  5:  a9d8a50d666 i18n: tag.c factorize i18n strings
     @@ builtin/tag.c: int cmd_tag(int argc, const char **argv, const char *prefix)
      +	if (only_in_list)
      +		die(_("the '%s' option is only allowed in list mode"), only_in_list);
       	if (filter.reachable_from || filter.unreachable_from)
     - 		die(_("--merged and --no-merged options are only allowed in list mode"));
     +-		die(_("--merged and --no-merged options are only allowed in list mode"));
     ++		die(_("'--merged' and '--no-merged' options are only allowed in list mode"));
       	if (cmdmode == 'd') {
     + 		ret = delete_tags(argv);
     + 		goto cleanup;
  6:  1097cc7d6d1 !  6:  969946274aa i18n: factorize "--foo requires --bar" and the like
     @@ builtin/stash.c: static int push_stash(int argc, const char **argv, const char *
       ## builtin/worktree.c ##
      @@ builtin/worktree.c: static int add(int ac, const char **av, const char *prefix)
       	if (!!opts.detach + !!new_branch + !!new_branch_force > 1)
     - 		die(_("options '%s', '%s' and '%s' cannot be used together"), "-b", "-B", "--detach");
     + 		die(_("options '%s', '%s', and '%s' cannot be used together"),"-b", "-B", "--detach");
       	if (lock_reason && !keep_locked)
      -		die(_("--reason requires --lock"));
      +		die(_("the option '%s' requires '%s'"), "--reason", "--lock");
     @@ revision.c: int setup_revisions(int argc, const char **argv, struct rev_info *re
       	if (revs->no_walk && revs->graph)
       		die(_("options '%s' and '%s' cannot be used together"), "--no-walk", "--graph");
       	if (!revs->reflog_info && revs->grep_filter.use_reflog_filter)
     --		die(_("%s requires %s"), "--grep-reflog", "--walk-reflogs");
     +-		die("cannot use --grep-reflog without --walk-reflogs");
      +		die(_("the option '%s' requires '%s'"), "--grep-reflog", "--walk-reflogs");
       
       	if (revs->line_level_traverse &&
  7:  4c17e08b9d3 !  7:  052dc06beeb i18n: factorize "no directory given for --foo"
     @@ git.c: static int handle_options(const char ***argv, int *argc, int *envchanged)
       		} else if (!strcmp(cmd, "--git-dir")) {
       			if (*argc < 2) {
      -				fprintf(stderr, _("no directory given for --git-dir\n" ));
     -+				fprintf(stderr, _("no directory given for %s\n" ), "--git-dir");
     ++				fprintf(stderr, _("no directory given for '%s' option\n" ), "--git-dir");
       				usage(git_usage_string);
       			}
       			setenv(GIT_DIR_ENVIRONMENT, (*argv)[1], 1);
     @@ git.c: static int handle_options(const char ***argv, int *argc, int *envchanged)
       		} else if (!strcmp(cmd, "--work-tree")) {
       			if (*argc < 2) {
      -				fprintf(stderr, _("no directory given for --work-tree\n" ));
     -+				fprintf(stderr, _("no directory given for %s\n" ), "--work-tree");
     ++				fprintf(stderr, _("no directory given for '%s' option\n" ), "--work-tree");
       				usage(git_usage_string);
       			}
       			setenv(GIT_WORK_TREE_ENVIRONMENT, (*argv)[1], 1);
     @@ git.c: static int handle_options(const char ***argv, int *argc, int *envchanged)
       		} else if (!strcmp(cmd, "-C")) {
       			if (*argc < 2) {
      -				fprintf(stderr, _("no directory given for -C\n" ));
     -+				fprintf(stderr, _("no directory given for %s\n" ), "-C");
     ++				fprintf(stderr, _("no directory given for '%s' option\n" ), "-C");
       				usage(git_usage_string);
       			}
       			if ((*argv)[1][0]) {
  8:  b75c5b1ce35 =  8:  59e1e8aa1b4 i18n: refactor "unrecognized %(foo) argument" strings
  9:  44d715a224c !  9:  39e375c68ab i18n: factorize "--foo outside a repository"
     @@ Commit message
      
       ## apply.c ##
      @@ apply.c: int check_apply_state(struct apply_state *state, int force_apply)
     - 		return error(_("options '%s' and '%s' cannot be used together"),"--reject",  "--3way");
     + 		return error(_("options '%s' and '%s' cannot be used together"), "--reject",  "--3way");
       	if (state->threeway) {
       		if (is_not_gitdir)
      -			return error(_("--3way outside a repository"));
     -+			return error(_("%s outside a repository"), "--3way");
     ++			return error(_("'%s' outside a repository"), "--3way");
       		state->check_index = 1;
       	}
       	if (state->apply_with_reject) {
     @@ apply.c: int check_apply_state(struct apply_state *state, int force_apply)
       		state->apply = 0;
       	if (state->check_index && is_not_gitdir)
      -		return error(_("--index outside a repository"));
     -+		return error(_("%s outside a repository"), "--index");
     ++		return error(_("'%s' outside a repository"), "--index");
       	if (state->cached) {
       		if (is_not_gitdir)
      -			return error(_("--cached outside a repository"));
     -+			return error(_("%s outside a repository"), "--cached");
     ++			return error(_("'%s' outside a repository"), "--cached");
       		state->check_index = 1;
       	}
       	if (state->ita_only && (state->check_index || is_not_gitdir))
 10:  03a880d534b = 10:  c6161bc3f1a i18n: ref-filter: factorize "%(foo) atom used without %(bar) atom"
 11:  12c5da81087 ! 11:  4fab0db3cc4 i18n: turn even more messages into "cannot be used together" ones
     @@ builtin/add.c: int cmd_add(int argc, const char **argv, const char *prefix)
       	if (pathspec_from_file) {
       		if (pathspec.nr)
      -			die(_("--pathspec-from-file is incompatible with pathspec arguments"));
     -+			die(_("'--pathspec-from-file' and pathspec arguments cannot be used together"));
     ++			die(_("'%s' and pathspec arguments cannot be used together"), "--pathspec-from-file");
       
       		parse_pathspec_file(&pathspec, PATHSPEC_ATTR,
       				    PATHSPEC_PREFER_FULL |
     @@ builtin/am.c: static int parse_opt_show_current_patch(const struct option *opt,
       	if (resume->mode == RESUME_SHOW_PATCH && new_value != resume->sub_mode)
      -		return error(_("--show-current-patch=%s is incompatible with "
      -			       "--show-current-patch=%s"),
     -+		return error(_("options '--show-current-patch=%s' and '--show-current-patch=%s' "
     +-			     arg, valid_modes[resume->sub_mode]);
     ++		return error(_("options '%s=%s' and '%s=%s' "
      +					   "cannot be used together"),
     - 			     arg, valid_modes[resume->sub_mode]);
     ++					 "--show-current-patch", "--show-current-patch", arg, valid_modes[resume->sub_mode]);
       
       	resume->mode = RESUME_SHOW_PATCH;
     + 	resume->sub_mode = new_value;
      
       ## builtin/cat-file.c ##
      @@ builtin/cat-file.c: int cmd_cat_file(int argc, const char **argv, const char *prefix)
     @@ builtin/checkout.c: static int checkout_main(int argc, const char **argv, const
       
       	if ((!!opts->new_branch + !!opts->new_branch_force + !!opts->new_orphan_branch) > 1)
      -		die(_("-%c, -%c and --orphan are mutually exclusive"),
     -+		die(_("options '-%c', '-%c' and '--orphan' cannot be used together"),
     - 				cb_option, toupper(cb_option));
     +-				cb_option, toupper(cb_option));
     ++		die(_("options '-%c', '-%c', and '%s' cannot be used together"),
     ++			cb_option, toupper(cb_option), "--orphan");
       
       	if (opts->overlay_mode == 1 && opts->patch_mode)
     + 		die(_("options '%s' and '%s' cannot be used together"), "-p", "--overlay");
      @@ builtin/checkout.c: static int checkout_main(int argc, const char **argv, const char *prefix,
       
       	if (opts->pathspec_from_file) {
       		if (opts->pathspec.nr)
      -			die(_("--pathspec-from-file is incompatible with pathspec arguments"));
     -+			die(_("'--pathspec-from-file' and pathspec arguments cannot be used together"));
     ++			die(_("'%s' and pathspec arguments cannot be used together"), "--pathspec-from-file");
       
       		if (opts->force_detach)
     - 			die(_("options '%s' and '%s' cannot be used together"), "--pathspec-from-file",  "--detach");
     + 			die(_("options '%s' and '%s' cannot be used together"), "--pathspec-from-file", "--detach");
      
       ## builtin/clone.c ##
      @@ builtin/clone.c: int cmd_clone(int argc, const char **argv, const char *prefix)
     @@ builtin/clone.c: int cmd_clone(int argc, const char **argv, const char *prefix)
       	if (option_bare) {
       		if (option_origin)
      -			die(_("--bare and --origin %s options are incompatible."),
     -+			die(_("options '--bare' and '--origin %s' cannot be used together"),
     - 			    option_origin);
     +-			    option_origin);
     ++			die(_("options '%s' and '%s %s' cannot be used together"),
     ++			    "--bare", "--origin", option_origin);
       		if (real_git_dir)
       			die(_("options '%s' and '%s' cannot be used together"), "--bare", "--separate-git-dir");
     + 		option_no_checkout = 1;
      
       ## builtin/commit.c ##
      @@ builtin/commit.c: static const char *prepare_index(const char **argv, const char *prefix,
     - 			die(_("options '%s' and '%s' cannot be used together"),"--pathspec-from-file", "-a");
     + 			die(_("options '%s' and '%s' cannot be used together"), "--pathspec-from-file", "-a");
       
       		if (pathspec.nr)
      -			die(_("--pathspec-from-file is incompatible with pathspec arguments"));
     -+			die(_("'--pathspec-from-file' and pathspec arguments cannot be used together"));
     ++			die(_("'%s' and pathspec arguments cannot be used together"), "--pathspec-from-file");
       
       		parse_pathspec_file(&pathspec, 0,
       				    PATHSPEC_PREFER_FULL,
     @@ builtin/commit.c: static int prepare_to_commit(const char *index_file, const cha
       		if (!strcmp(fixup_prefix, "amend")) {
       			if (have_option_m)
      -				die(_("cannot combine -m with --fixup:%s"), fixup_message);
     -+				die(_("options '-m' and '--fixup:%s' cannot be used together"), fixup_message);
     ++				die(_("options '%s' and '%s:%s' cannot be used together"), "-m", "--fixup", fixup_message);
       			prepare_amend_commit(commit, &sb, &ctx);
       		}
       	} else if (!stat(git_path_merge_msg(the_repository), &statbuf)) {
     @@ builtin/commit.c: static void check_fixup_reword_options(int argc, const char *a
       	}
       	if (argc)
      -		die(_("cannot combine reword option of --fixup with path '%s'"), *argv);
     -+		die(_("reword option of --fixup and path '%s' cannot be used together"), *argv);
     ++		die(_("reword option of '%s' and path '%s' cannot be used together"), "--fixup", *argv);
       	if (patch_interactive || interactive || all || also || only)
      -		die(_("reword option of --fixup is mutually exclusive with --patch/--interactive/--all/--include/--only"));
     -+		die(_("reword option of --fixup and "
     -+			  "--patch/--interactive/--all/--include/--only "
     -+			  "cannot be used together"));
     ++		die(_("reword option of '%s' and '%s' cannot be used together"),
     ++			"--fixup", "--patch/--interactive/--all/--include/--only");
       }
       
       static int parse_and_validate_options(int argc, const char *argv[],
     @@ builtin/reset.c: int cmd_reset(int argc, const char **argv, const char *prefix)
       
       		if (pathspec.nr)
      -			die(_("--pathspec-from-file is incompatible with pathspec arguments"));
     -+			die(_("'--pathspec-from-file' and pathspec arguments cannot be used together"));
     ++			die(_("'%s' and pathspec arguments cannot be used together"), "--pathspec-from-file");
       
       		parse_pathspec_file(&pathspec, 0,
       				    PATHSPEC_PREFER_FULL,
     @@ builtin/rev-list.c: int cmd_rev_list(int argc, const char **argv, const char *pr
       	    (revs.tag_objects || revs.tree_objects || revs.blob_objects) &&
       	    (revs.left_right || revs.cherry_mark))
      -		die(_("marked counting is incompatible with --objects"));
     -+		die(_("marked counting and '--objects' cannot be used together"));
     ++		die(_("marked counting and '%s' cannot be used together"), "--objects");
       
       	save_commit_buffer = (revs.verbose_header ||
       			      revs.grep_filter.pattern_list ||
     @@ builtin/rm.c: int cmd_rm(int argc, const char **argv, const char *prefix)
       	if (pathspec_from_file) {
       		if (pathspec.nr)
      -			die(_("--pathspec-from-file is incompatible with pathspec arguments"));
     -+			die(_("'--pathspec-from-file' and pathspec arguments cannot be used together"));
     ++			die(_("'%s' and pathspec arguments cannot be used together"), "--pathspec-from-file");
       
       		parse_pathspec_file(&pathspec, 0,
       				    PATHSPEC_PREFER_CWD,
     @@ builtin/stash.c: static int push_stash(int argc, const char **argv, const char *
       
       		if (ps.nr)
      -			die(_("--pathspec-from-file is incompatible with pathspec arguments"));
     -+			die(_("'--pathspec-from-file' and pathspec arguments cannot be used together"));
     ++			die(_("'%s' and pathspec arguments cannot be used together"), "--pathspec-from-file");
       
       		parse_pathspec_file(&ps, 0,
       				    PATHSPEC_PREFER_FULL | PATHSPEC_PREFIX_ORIGIN,
     @@ diff.c: void diff_setup_done(struct diff_options *options)
       
       	if (HAS_MULTI_BITS(options->output_format & check_mask))
      -		die(_("--name-only, --name-status, --check and -s are mutually exclusive"));
     -+		die(_("options '--name-only', '--name-status', '--check' and '-s' cannot be used together"));
     ++		die(_("options '%s', '%s', '%s', and '%s' cannot be used together"),
     ++			"--name-only", "--name-status", "--check", "-s");
       
       	if (HAS_MULTI_BITS(options->pickaxe_opts & DIFF_PICKAXE_KINDS_MASK))
     - 		die(_("options '%s', '%s' and '%s' cannot be used together"), "-G", "-S", "--find-object");
     +-		die(_("options '%s', '%s', and '%s' cannot be used together"), "-G", "-S", "--find-object");
     ++		die(_("options '%s', '%s', and '%s' cannot be used together"),
     ++			"-G", "-S", "--find-object");
       
       	if (HAS_MULTI_BITS(options->pickaxe_opts & DIFF_PICKAXE_KINDS_G_REGEX_MASK))
      -		die(_("-G and --pickaxe-regex are mutually exclusive, use --pickaxe-regex with -S"));
     -+		die(_("-G and --pickaxe-regex cannot be used together, use --pickaxe-regex with -S"));
     ++		die(_("options '%s' and '%s' cannot be used together, use '%s' with '%s'"),
     ++			"-G", "--pickaxe-regex", "--pickaxe-regex", "-S");
       
       	if (HAS_MULTI_BITS(options->pickaxe_opts & DIFF_PICKAXE_KINDS_ALL_OBJFIND_MASK))
      -		die(_("--pickaxe-all and --find-object are mutually exclusive, use --pickaxe-all with -G and -S"));
     -+		die(_("--pickaxe-all and --find-object cannot be used together, use --pickaxe-all with -G and -S"));
     ++		die(_("options '%s' and '%s' cannot be used together, use '%s' with '%s' and '%s'"),
     ++			"--pickaxe-all", "--find-object", "--pickaxe-all", "-G", "-S");
       
       	/*
       	 * Most of the time we can say "there are changes"
     @@ t/t7500-commit-template-squash-signoff.sh: test_expect_success 'amend! commit al
       	test_expect_success "--fixup=reword: incompatible with $1" "
      -		echo 'fatal: reword option of --fixup is mutually exclusive with'\
      -			'--patch/--interactive/--all/--include/--only' >expect &&
     -+		echo 'fatal: reword option of --fixup and' \
     -+			'--patch/--interactive/--all/--include/--only' \
     ++		echo 'fatal: reword option of '\''--fixup'\'' and' \
     ++			''\''--patch/--interactive/--all/--include/--only'\' \
      +			'cannot be used together' >expect &&
       		test_must_fail git commit --fixup=reword:HEAD~ $1 2>actual &&
       		test_cmp expect actual
     @@ t/t7500-commit-template-squash-signoff.sh: done
       test_expect_success '--fixup=reword: give error with pathsec' '
       	commit_for_rebase_autosquash_setup &&
      -	echo "fatal: cannot combine reword option of --fixup with path '\''foo'\''" >expect &&
     -+	echo "fatal: reword option of --fixup and path '\''foo'\'' cannot be used together" >expect &&
     ++	echo "fatal: reword option of '\''--fixup'\'' and path '\''foo'\'' cannot be used together" >expect &&
       	test_must_fail git commit --fixup=reword:HEAD~ -- foo 2>actual &&
       	test_cmp expect actual
       '

-- 
gitgitgadget