OSDN Git Service

Merge branch 'bw/recurse-submodules-relative-fix'
authorJunio C Hamano <gitster@pobox.com>
Thu, 30 Mar 2017 21:07:15 +0000 (14:07 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 30 Mar 2017 21:07:15 +0000 (14:07 -0700)
A few commands that recently learned the "--recurse-submodule"
option misbehaved when started from a subdirectory of the
superproject.

* bw/recurse-submodules-relative-fix:
  ls-files: fix bug when recursing with relative pathspec
  ls-files: fix typo in variable name
  grep: fix bug when recursing with relative pathspec
  setup: allow for prefix to be passed to git commands
  grep: fix help text typo

1  2 
builtin/grep.c
cache.h
git.c
setup.c

diff --cc builtin/grep.c
@@@ -321,9 -318,16 +318,16 @@@ static int grep_oid(struct grep_opt *op
                strbuf_addstr(&pathbuf, filename);
        }
  
+       if (opt->relative && opt->prefix_length) {
+               char *name = strbuf_detach(&pathbuf, NULL);
+               quote_path_relative(name + tree_name_len, opt->prefix, &pathbuf);
+               strbuf_insert(&pathbuf, 0, name, tree_name_len);
+               free(name);
+       }
  #ifndef NO_PTHREADS
        if (num_threads) {
 -              add_work(opt, GREP_SOURCE_SHA1, pathbuf.buf, path, sha1);
 +              add_work(opt, GREP_SOURCE_SHA1, pathbuf.buf, path, oid);
                strbuf_release(&pathbuf);
                return 0;
        } else
@@@ -1231,9 -1199,23 +1240,9 @@@ int cmd_grep(int argc, const char **arg
        }
  #endif
  
 -      /* The rest are paths */
 -      if (!seen_dashdash) {
 -              int j;
 -              for (j = i; j < argc; j++)
 -                      verify_filename(prefix, argv[j], j == i);
 -      }
 -
 -      parse_pathspec(&pathspec, 0,
 -                     PATHSPEC_PREFER_CWD |
 -                     (opt.max_depth != -1 ? PATHSPEC_MAXDEPTH_VALID : 0),
 -                     prefix, argv + i);
 -      pathspec.max_depth = opt.max_depth;
 -      pathspec.recursive = 1;
 -
        if (recurse_submodules) {
                gitmodules_config();
-               compile_submodule_options(&opt, &pathspec, cached, untracked,
+               compile_submodule_options(&opt, argv + i, cached, untracked,
                                          opt_exclude, use_index,
                                          pattern_type_arg);
        }
diff --cc cache.h
Simple merge
diff --cc git.c
Simple merge
diff --cc setup.c
+++ b/setup.c
@@@ -985,66 -939,14 +985,70 @@@ const char *discover_git_directory(stru
  
  const char *setup_git_directory_gently(int *nongit_ok)
  {
-       const char *prefix;
 +      static struct strbuf cwd = STRBUF_INIT;
 +      struct strbuf dir = STRBUF_INIT, gitdir = STRBUF_INIT;
+       const char *prefix, *env_prefix;
  
 -      prefix = setup_git_directory_gently_1(nongit_ok);
 -      env_prefix = getenv(GIT_TOPLEVEL_PREFIX_ENVIRONMENT);
 +      /*
 +       * We may have read an incomplete configuration before
 +       * setting-up the git directory. If so, clear the cache so
 +       * that the next queries to the configuration reload complete
 +       * configuration (including the per-repo config file that we
 +       * ignored previously).
 +       */
 +      git_config_clear();
 +
 +      /*
 +       * Let's assume that we are in a git repository.
 +       * If it turns out later that we are somewhere else, the value will be
 +       * updated accordingly.
 +       */
 +      if (nongit_ok)
 +              *nongit_ok = 0;
  
 +      if (strbuf_getcwd(&cwd))
 +              die_errno(_("Unable to read current working directory"));
 +      strbuf_addbuf(&dir, &cwd);
 +
 +      switch (setup_git_directory_gently_1(&dir, &gitdir, 1)) {
 +      case GIT_DIR_NONE:
 +              prefix = NULL;
 +              break;
 +      case GIT_DIR_EXPLICIT:
 +              prefix = setup_explicit_git_dir(gitdir.buf, &cwd, nongit_ok);
 +              break;
 +      case GIT_DIR_DISCOVERED:
 +              if (dir.len < cwd.len && chdir(dir.buf))
 +                      die(_("Cannot change to '%s'"), dir.buf);
 +              prefix = setup_discovered_git_dir(gitdir.buf, &cwd, dir.len,
 +                                                nongit_ok);
 +              break;
 +      case GIT_DIR_BARE:
 +              if (dir.len < cwd.len && chdir(dir.buf))
 +                      die(_("Cannot change to '%s'"), dir.buf);
 +              prefix = setup_bare_git_dir(&cwd, dir.len, nongit_ok);
 +              break;
 +      case GIT_DIR_HIT_CEILING:
 +              prefix = setup_nongit(cwd.buf, nongit_ok);
 +              break;
 +      case GIT_DIR_HIT_MOUNT_POINT:
 +              if (nongit_ok) {
 +                      *nongit_ok = 1;
 +                      strbuf_release(&cwd);
 +                      strbuf_release(&dir);
 +                      return NULL;
 +              }
 +              die(_("Not a git repository (or any parent up to mount point %s)\n"
 +                    "Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."),
 +                  dir.buf);
 +      default:
 +              die("BUG: unhandled setup_git_directory_1() result");
 +      }
 +
++      env_prefix = getenv(GIT_TOPLEVEL_PREFIX_ENVIRONMENT);
+       if (env_prefix)
+               prefix = env_prefix;
        if (prefix)
                setenv(GIT_PREFIX_ENVIRONMENT, prefix, 1);
        else