Merge branch 'mt/grep-submodules-working-tree'
authorJunio C Hamano <gitster@pobox.com>
Thu, 22 Aug 2019 19:34:10 +0000 (12:34 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 22 Aug 2019 19:34:10 +0000 (12:34 -0700)
"git grep --recurse-submodules" that looks at the working tree
files looked at the contents in the index in submodules, instead of
files in the working tree.

* mt/grep-submodules-working-tree:
  grep: fix worktree case in submodules

1  2 
builtin/grep.c
t/t7814-grep-recurse-submodules.sh

diff --combined builtin/grep.c
@@@ -403,7 -403,7 +403,7 @@@ static int grep_tree(struct grep_opt *o
  static int grep_submodule(struct grep_opt *opt,
                          const struct pathspec *pathspec,
                          const struct object_id *oid,
-                         const char *filename, const char *path)
+                         const char *filename, const char *path, int cached)
  {
        struct repository subrepo;
        struct repository *superproject = opt->repo;
                object = parse_object_or_die(oid, oid_to_hex(oid));
  
                grep_read_lock();
 -              data = read_object_with_reference(&object->oid, tree_type,
 +              data = read_object_with_reference(&subrepo,
 +                                                &object->oid, tree_type,
                                                  &size, NULL);
                grep_read_unlock();
  
                strbuf_release(&base);
                free(data);
        } else {
-               hit = grep_cache(&subopt, pathspec, 1);
+               hit = grep_cache(&subopt, pathspec, cached);
        }
  
        repo_clear(&subrepo);
@@@ -523,7 -522,8 +523,8 @@@ static int grep_cache(struct grep_opt *
                        }
                } else if (recurse_submodules && S_ISGITLINK(ce->ce_mode) &&
                           submodule_path_match(repo->index, pathspec, name.buf, NULL)) {
-                       hit |= grep_submodule(opt, pathspec, NULL, ce->name, ce->name);
+                       hit |= grep_submodule(opt, pathspec, NULL, ce->name,
+                                             ce->name, cached);
                } else {
                        continue;
                }
@@@ -598,7 -598,8 +599,8 @@@ static int grep_tree(struct grep_opt *o
                        free(data);
                } else if (recurse_submodules && S_ISGITLINK(entry.mode)) {
                        hit |= grep_submodule(opt, pathspec, &entry.oid,
-                                             base->buf, base->buf + tn_len);
+                                             base->buf, base->buf + tn_len,
+                                             1); /* ignored */
                }
  
                strbuf_setlen(base, old_baselen);
@@@ -624,8 -625,7 +626,8 @@@ static int grep_object(struct grep_opt 
                int hit, len;
  
                grep_read_lock();
 -              data = read_object_with_reference(&obj->oid, tree_type,
 +              data = read_object_with_reference(opt->repo,
 +                                                &obj->oid, tree_type,
                                                  &size, NULL);
                grep_read_unlock();
  
@@@ -14,14 -14,12 +14,14 @@@ test_expect_success 'setup directory st
        echo "(3|4)" >b/b &&
        git add a b &&
        git commit -m "add a and b" &&
 +      test_tick &&
        git init submodule &&
        echo "(1|2)d(3|4)" >submodule/a &&
        git -C submodule add a &&
        git -C submodule commit -m "add a" &&
        git submodule add ./submodule &&
 -      git commit -m "added submodule"
 +      git commit -m "added submodule" &&
 +      test_tick
  '
  
  test_expect_success 'grep correctly finds patterns in a submodule' '
@@@ -67,14 -65,11 +67,14 @@@ test_expect_success 'grep and nested su
        echo "(1|2)d(3|4)" >submodule/sub/a &&
        git -C submodule/sub add a &&
        git -C submodule/sub commit -m "add a" &&
 +      test_tick &&
        git -C submodule submodule add ./sub &&
        git -C submodule add sub &&
        git -C submodule commit -m "added sub" &&
 +      test_tick &&
        git add submodule &&
        git commit -m "updated submodule" &&
 +      test_tick &&
  
        cat >expect <<-\EOF &&
        a:(1|2)d(3|4)
@@@ -184,18 -179,15 +184,18 @@@ test_expect_success !MINGW 'grep recurs
        echo "(1|2)d(3|4)" >"parent/fi:le" &&
        git -C parent add "fi:le" &&
        git -C parent commit -m "add fi:le" &&
 +      test_tick &&
  
        git init "su:b" &&
        test_when_finished "rm -rf su:b" &&
        echo "(1|2)d(3|4)" >"su:b/fi:le" &&
        git -C "su:b" add "fi:le" &&
        git -C "su:b" commit -m "add fi:le" &&
 +      test_tick &&
  
        git -C parent submodule add "../su:b" "su:b" &&
        git -C parent commit -m "add submodule" &&
 +      test_tick &&
  
        cat >expect <<-\EOF &&
        fi:le:(1|2)d(3|4)
@@@ -218,18 -210,15 +218,18 @@@ test_expect_success 'grep history with 
        echo "(1|2)d(3|4)" >parent/file &&
        git -C parent add file &&
        git -C parent commit -m "add file" &&
 +      test_tick &&
  
        git init sub &&
        test_when_finished "rm -rf sub" &&
        echo "(1|2)d(3|4)" >sub/file &&
        git -C sub add file &&
        git -C sub commit -m "add file" &&
 +      test_tick &&
  
        git -C parent submodule add ../sub dir/sub &&
        git -C parent commit -m "add submodule" &&
 +      test_tick &&
  
        cat >expect <<-\EOF &&
        dir/sub/file:(1|2)d(3|4)
  
        git -C parent mv dir/sub sub-moved &&
        git -C parent commit -m "moved submodule" &&
 +      test_tick &&
  
        cat >expect <<-\EOF &&
        file:(1|2)d(3|4)
@@@ -263,7 -251,6 +263,7 @@@ test_expect_success 'grep using relativ
        echo "(1|2)d(3|4)" >sub/file &&
        git -C sub add file &&
        git -C sub commit -m "add file" &&
 +      test_tick &&
  
        git init parent &&
        echo "(1|2)d(3|4)" >parent/file &&
        git -C parent add src/file2 &&
        git -C parent submodule add ../sub &&
        git -C parent commit -m "add files and submodule" &&
 +      test_tick &&
  
        # From top works
        cat >expect <<-\EOF &&
@@@ -307,7 -293,6 +307,7 @@@ test_expect_success 'grep from a subdir
        echo "(1|2)d(3|4)" >sub/file &&
        git -C sub add file &&
        git -C sub commit -m "add file" &&
 +      test_tick &&
  
        git init parent &&
        mkdir parent/src &&
        git -C parent submodule add ../sub src/sub &&
        git -C parent submodule add ../sub sub &&
        git -C parent commit -m "add files and submodules" &&
 +      test_tick &&
  
        # Verify grep from root works
        cat >expect <<-\EOF &&
@@@ -408,4 -392,25 +408,25 @@@ test_expect_success 'grep --recurse-sub
        test_cmp expect actual
  '
  
+ reset_and_clean () {
+       git reset --hard &&
+       git clean -fd &&
+       git submodule foreach --recursive 'git reset --hard' &&
+       git submodule foreach --recursive 'git clean -fd'
+ }
+ test_expect_success 'grep --recurse-submodules without --cached considers worktree modifications' '
+       reset_and_clean &&
+       echo "A modified line in submodule" >>submodule/a &&
+       echo "submodule/a:A modified line in submodule" >expect &&
+       git grep --recurse-submodules "A modified line in submodule" >actual &&
+       test_cmp expect actual
+ '
+ test_expect_success 'grep --recurse-submodules with --cached ignores worktree modifications' '
+       reset_and_clean &&
+       echo "A modified line in submodule" >>submodule/a &&
+       test_must_fail git grep --recurse-submodules --cached "A modified line in submodule" >actual 2>&1 &&
+       test_must_be_empty actual
+ '
  test_done