v6 fixes a race condition which existed in the 'is_submodule_populated' function. Instead of calling 'resolve_gitdir' to check for the existance of a .git file/directory, use 'stat'. 'resolve_gitdir' calls 'chdir' which can affect other running threads trying to load thier files into a buffer in memory. Thanks to Stefan and Jeff for help debugging this problem. Brandon Williams (6): submodules: add helper functions to determine presence of submodules submodules: load gitmodules file from commit sha1 grep: add submodules as a grep source type grep: optionally recurse into submodules grep: enable recurse-submodules to work on <tree> objects grep: search history of moved submodules Documentation/git-grep.txt | 14 ++ builtin/grep.c | 386 ++++++++++++++++++++++++++++++++++--- cache.h | 2 + config.c | 8 +- git.c | 2 +- grep.c | 16 +- grep.h | 1 + submodule-config.c | 6 +- submodule-config.h | 3 + submodule.c | 51 +++++ submodule.h | 3 + t/t7814-grep-recurse-submodules.sh | 241 +++++++++++++++++++++++ tree-walk.c | 28 +++ 13 files changed, 730 insertions(+), 31 deletions(-) create mode 100755 t/t7814-grep-recurse-submodules.sh --- interdiff based on 'bw/grep-recurse-submodules' diff --git a/submodule.c b/submodule.c index 062e58b..8516ab0 100644 --- a/submodule.c +++ b/submodule.c @@ -239,9 +239,10 @@ int is_submodule_initialized(const char *path) int is_submodule_populated(const char *path) { int ret = 0; + struct stat st; char *gitdir = xstrfmt("%s/.git", path); - if (resolve_gitdir(gitdir)) + if (!stat(gitdir, &st)) ret = 1; free(gitdir); -- 2.8.0.rc3.226.g39d4020