git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] diff: run arguments through precompose_argv

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 5, 2016, 17:09 UTC
Message-ID
<xmqqzit80yov.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<1459802325-22056-2-git-send-email-alex@fournova.com>
Alexander Rinass <alex@fournova.com> writes:
Show 15 quoted lines
> File paths containing decomposed unicode chars passed to diff
> command are not converted to precomposed unicode form.
>
> As a result, no diff is displayed when feeding such a file path to the
> diff command.
>
> Opposite to most builtin commands, the diff builtin is missing the
> parse_options call, which internally runs arguments through the
> precompose_argv call, which ensures all arguments are in precomposed
> unicode form.
>
> Fix the problem by adding a precompose_argv call directly, as a call to
> parse_options would require additional work to call it.
>
> Also applies to diff-index, diff-files and diff-tree.

Thanks. The log message talks about "such a file path", but precompose_argv() applies indiscriminately on any command line arguments, so things like -G<string> would also get the same treatment, which I think is what most users would want).

Will queue.
Show 119 quoted lines
> Signed-off-by: Alexander Rinass <alex@fournova.com>
> Thanks-to: Torsten Bögershausen <tboegi@web.de>
> Thanks-to: Junio C Hamano <gitster@pobox.com>
> ---
>  builtin/diff-files.c         |  1 +
>  builtin/diff-index.c         |  1 +
>  builtin/diff-tree.c          |  2 ++
>  builtin/diff.c               |  1 +
>  t/t3910-mac-os-precompose.sh | 42 ++++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 47 insertions(+)
>
> diff --git a/builtin/diff-files.c b/builtin/diff-files.c
> index 8ed2eb8..15c61fd 100644
> --- a/builtin/diff-files.c
> +++ b/builtin/diff-files.c
> @@ -24,6 +24,7 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)
>  	gitmodules_config();
>  	git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
>  	rev.abbrev = 0;
> +	precompose_argv(argc, argv);
>  
>  	argc = setup_revisions(argc, argv, &rev, NULL);
>  	while (1 < argc && argv[1][0] == '-') {
> diff --git a/builtin/diff-index.c b/builtin/diff-index.c
> index d979824..1af373d 100644
> --- a/builtin/diff-index.c
> +++ b/builtin/diff-index.c
> @@ -21,6 +21,7 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)
>  	gitmodules_config();
>  	git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
>  	rev.abbrev = 0;
> +	precompose_argv(argc, argv);
>  
>  	argc = setup_revisions(argc, argv, &rev, NULL);
>  	for (i = 1; i < argc; i++) {
> diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c
> index 2a12b81..806dd7a 100644
> --- a/builtin/diff-tree.c
> +++ b/builtin/diff-tree.c
> @@ -114,6 +114,8 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
>  	opt->disable_stdin = 1;
>  	memset(&s_r_opt, 0, sizeof(s_r_opt));
>  	s_r_opt.tweak = diff_tree_tweak_rev;
> +
> +	precompose_argv(argc, argv);
>  	argc = setup_revisions(argc, argv, opt, &s_r_opt);
>  
>  	while (--argc > 0) {
> diff --git a/builtin/diff.c b/builtin/diff.c
> index 52c98a9..d6b8f98 100644
> --- a/builtin/diff.c
> +++ b/builtin/diff.c
> @@ -319,6 +319,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
>  	if (!no_index)
>  		gitmodules_config();
>  	git_config(git_diff_ui_config, NULL);
> +	precompose_argv(argc, argv);
>  
>  	init_revisions(&rev, prefix);
>  
> diff --git a/t/t3910-mac-os-precompose.sh b/t/t3910-mac-os-precompose.sh
> index 8319356..26dd5b7 100755
> --- a/t/t3910-mac-os-precompose.sh
> +++ b/t/t3910-mac-os-precompose.sh
> @@ -49,12 +49,54 @@ test_expect_success "setup" '
>  test_expect_success "setup case mac" '
>  	git checkout -b mac_os
>  '
> +# This will test nfd2nfc in git diff
> +test_expect_success "git diff f.Adiar" '
> +	touch f.$Adiarnfc &&
> +	git add f.$Adiarnfc &&
> +	echo f.Adiarnfc >f.$Adiarnfc &&
> +	git diff f.$Adiarnfd >expect &&
> +	git diff f.$Adiarnfc >actual &&
> +	test_cmp expect actual &&
> +	git reset HEAD f.Adiarnfc &&
> +	rm f.$Adiarnfc expect actual
> +'
> +# This will test nfd2nfc in git diff-files
> +test_expect_success "git diff-files f.Adiar" '
> +	touch f.$Adiarnfc &&
> +	git add f.$Adiarnfc &&
> +	echo f.Adiarnfc >f.$Adiarnfc &&
> +	git diff-files f.$Adiarnfd >expect &&
> +	git diff-files f.$Adiarnfc >actual &&
> +	test_cmp expect actual &&
> +	git reset HEAD f.Adiarnfc &&
> +	rm f.$Adiarnfc expect actual
> +'
> +# This will test nfd2nfc in git diff-index
> +test_expect_success "git diff-index f.Adiar" '
> +	touch f.$Adiarnfc &&
> +	git add f.$Adiarnfc &&
> +	echo f.Adiarnfc >f.$Adiarnfc &&
> +	git diff-index HEAD f.$Adiarnfd >expect &&
> +	git diff-index HEAD f.$Adiarnfc >actual &&
> +	test_cmp expect actual &&
> +	git reset HEAD f.Adiarnfc &&
> +	rm f.$Adiarnfc expect actual
> +'
>  # This will test nfd2nfc in readdir()
>  test_expect_success "add file Adiarnfc" '
>  	echo f.Adiarnfc >f.$Adiarnfc &&
>  	git add f.$Adiarnfc &&
>  	git commit -m "add f.$Adiarnfc"
>  '
> +# This will test nfd2nfc in git diff-tree
> +test_expect_success "git diff-tree f.Adiar" '
> +	echo f.Adiarnfc >>f.$Adiarnfc &&
> +	git diff-tree HEAD f.$Adiarnfd >expect &&
> +	git diff-tree HEAD f.$Adiarnfc >actual &&
> +	test_cmp expect actual &&
> +	git checkout f.$Adiarnfc &&
> +	rm expect actual
> +'
>  # This will test nfd2nfc in git stage()
>  test_expect_success "stage file d.Adiarnfd/f.Adiarnfd" '
>  	mkdir d.$Adiarnfd &&
Previous: Alexander RinassNext: Johannes Sixt
Message 3 of 12 in “diff: run arguments through precompose_argv”
  1. diff: run arguments through precompose_argvAlexander Rinass, Apr 4, 2016
  2. diff: run arguments through precompose_argvAlexander Rinass, Apr 4, 2016
  3. Junio C HamanoApr 5, 2016
  4. Johannes SixtApr 5, 2016
  5. Torsten BögershausenApr 5, 2016
  6. Junio C HamanoApr 5, 2016
  7. Alexander RinassApr 6, 2016
  8. Torsten BögershausenApr 6, 2016
  9. Junio C HamanoApr 6, 2016
  10. Junio C HamanoMay 11, 2016
  11. Alexander RinassMay 12, 2016
  12. Junio C HamanoMay 12, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.