[PATCH v2] diff: run arguments through precompose_argv

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH v2] diff: run arguments through precompose_argv

Alexander Rinass
I have used Junios proposal/changes for the commit message as I
liked it and it is probably more in line with the usual commit
messages of the git project. I hope this is ok.

Let me know if you need me to do any more changes or what the
next steps are if the patch is ok.

Alexander

Alexander Rinass (1):
  diff: run arguments through precompose_argv

 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(+)

--
2.8.2
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [hidden email]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Reply | Threaded
Open this post in threaded view
|

[PATCH v2] diff: run arguments through precompose_argv

Alexander Rinass
When running diff commands, a pathspec containing decomposed
unicode code points is not converted to precomposed unicode form
under Mac OS X, but we normalize the paths in the index and the
history to precomposed form on that platform.  As a result, the
pathspec would not match and no diff is shown.

Unlike many builtin commands, the "diff" family of commands do
not use parse_options(), which is how other builtin commands
indirectly call precompose_argv() to normalize argv[] into
precomposed form on Mac OSX.  Teach these commands to call
precompose_argv() themselves.

Note that precomopose_argv() normalizes not just paths but all
command line arguments, so things like "git diff -G $string"
when $string has the decomposed form would first normalized into
the precomposed form and would stop hitting the same string in
the decomposed form in the diff output with this change.  It is
not a problem per-se, as "log" family of commands already use
parse_options() and call precompose_argv()--we can think of it
as making the "diff" family of commands behave in a similar way
as the commands in the "log" family.

Signed-off-by: Alexander Rinass <[hidden email]>
Helped-by: Torsten Bögershausen <[hidden email]>
Helped-by: Junio C Hamano <[hidden email]>
---
 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 &&
--
2.8.2

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [hidden email]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2] diff: run arguments through precompose_argv

Torsten Bögershausen-2


On 13.05.16 22:41, Alexander Rinass wrote:

> When running diff commands, a pathspec containing decomposed
> unicode code points is not converted to precomposed unicode form
> under Mac OS X, but we normalize the paths in the index and the
> history to precomposed form on that platform.  As a result, the
> pathspec would not match and no diff is shown.
>
> Unlike many builtin commands, the "diff" family of commands do
> not use parse_options(), which is how other builtin commands
> indirectly call precompose_argv() to normalize argv[] into
> precomposed form on Mac OSX.  Teach these commands to call
> precompose_argv() themselves.
>
> Note that precomopose_argv() normalizes not just paths but all
> command line arguments, so things like "git diff -G $string"
> when $string has the decomposed form would first normalized into
> the precomposed form and would stop hitting the same string in
> the decomposed form in the diff output with this change.  It is
> not a problem per-se, as "log" family of commands already use
> parse_options() and call precompose_argv()--we can think of it
> as making the "diff" family of commands behave in a similar way
> as the commands in the "log" family.
>
> Signed-off-by: Alexander Rinass <[hidden email]>
> Helped-by: Torsten Bögershausen <[hidden email]>
> Helped-by: Junio C Hamano <[hidden email]>
Looks good to me.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [hidden email]
More majordomo info at  http://vger.kernel.org/majordomo-info.html