OSDN Git Service

diff: restrict pathspec limitations to diff b/f case only
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Wed, 20 Nov 2013 01:26:41 +0000 (08:26 +0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 20 Nov 2013 23:04:51 +0000 (15:04 -0800)
builtin_diff_b_f() needs a path, not pathspec. Other modes in diff
can deal with pathspec just fine. But because of the current
GUARD_PATHSPEC() location, other modes also reject :(glob) and
:(icase).

Move GUARD_PATHSPEC(), and the "path" assignment statement, which is
the reason of this GUARD_PATHSPEC(), inside builtin_diff_b_f().

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/diff.c
t/t6131-pathspec-icase.sh

index 2fb8c5d..2af2542 100644 (file)
@@ -64,15 +64,18 @@ static void stuff_change(struct diff_options *opt,
 
 static int builtin_diff_b_f(struct rev_info *revs,
                            int argc, const char **argv,
-                           struct blobinfo *blob,
-                           const char *path)
+                           struct blobinfo *blob)
 {
        /* Blob vs file in the working tree*/
        struct stat st;
+       const char *path;
 
        if (argc > 1)
                usage(builtin_diff_usage);
 
+       GUARD_PATHSPEC(&revs->prune_data, PATHSPEC_FROMTOP | PATHSPEC_LITERAL);
+       path = revs->prune_data.items[0].match;
+
        if (lstat(path, &st))
                die_errno(_("failed to stat '%s'"), path);
        if (!(S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)))
@@ -255,7 +258,6 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
        struct rev_info rev;
        struct object_array ent = OBJECT_ARRAY_INIT;
        int blobs = 0, paths = 0;
-       const char *path = NULL;
        struct blobinfo blob[2];
        int nongit;
        int result = 0;
@@ -366,13 +368,8 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
                        die(_("unhandled object '%s' given."), name);
                }
        }
-       if (rev.prune_data.nr) {
-               /* builtin_diff_b_f() */
-               GUARD_PATHSPEC(&rev.prune_data, PATHSPEC_FROMTOP | PATHSPEC_LITERAL);
-               if (!path)
-                       path = rev.prune_data.items[0].match;
+       if (rev.prune_data.nr)
                paths += rev.prune_data.nr;
-       }
 
        /*
         * Now, do the arguments look reasonable?
@@ -385,7 +382,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
                case 1:
                        if (paths != 1)
                                usage(builtin_diff_usage);
-                       result = builtin_diff_b_f(&rev, argc, argv, blob, path);
+                       result = builtin_diff_b_f(&rev, argc, argv, blob);
                        break;
                case 2:
                        if (paths)
index 8d4a7fc..a7c7ff5 100755 (executable)
@@ -100,4 +100,10 @@ test_expect_success 'match_pathspec_depth matches :(icase)bar with empty prefix'
        test_cmp expect actual
 '
 
+test_expect_success '"git diff" can take magic :(icase) pathspec' '
+       echo FOO/BAR >expect &&
+       git diff --name-only HEAD^ HEAD -- ":(icase)foo/bar" >actual &&
+       test_cmp expect actual
+'
+
 test_done