Merge branch 'jc/maint-pathspec-stdin-and-cmdline'
authorJunio C Hamano <gitster@pobox.com>
Fri, 20 May 2011 03:37:18 +0000 (20:37 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 20 May 2011 03:37:18 +0000 (20:37 -0700)
* jc/maint-pathspec-stdin-and-cmdline:
  setup_revisions(): take pathspec from command line and --stdin correctly

Conflicts:
revision.c

1  2 
revision.c

diff --cc revision.c
index a7cf79bf2ed3f348f211878005899bebd96629f2,707a703a09d6c7ffc1adfcd89da83d5b97da397f..cf0b001570838af00b79b5c305dc9e5da65d5653
@@@ -1509,97 -1497,6 +1508,69 @@@ static int for_each_good_bisect_ref(con
        return for_each_ref_in_submodule(submodule, "refs/bisect/good", fn, cb_data);
  }
  
- static void append_prune_data(const char ***prune_data, const char **av)
- {
-       const char **prune = *prune_data;
-       int prune_nr;
-       int prune_alloc;
-       if (!prune) {
-               *prune_data = av;
-               return;
-       }
-       /* count existing ones */
-       for (prune_nr = 0; prune[prune_nr]; prune_nr++)
-               ;
-       prune_alloc = prune_nr; /* not really, but we do not know */
-       while (*av) {
-               ALLOC_GROW(prune, prune_nr+1, prune_alloc);
-               prune[prune_nr++] = *av;
-               av++;
-       }
-       if (prune) {
-               ALLOC_GROW(prune, prune_nr+1, prune_alloc);
-               prune[prune_nr] = NULL;
-       }
-       *prune_data = prune;
- }
 +static int handle_revision_pseudo_opt(const char *submodule,
 +                              struct rev_info *revs,
 +                              int argc, const char **argv, int *flags)
 +{
 +      const char *arg = argv[0];
 +      const char *optarg;
 +      int argcount;
 +
 +      /*
 +       * NOTE!
 +       *
 +       * Commands like "git shortlog" will not accept the options below
 +       * unless parse_revision_opt queues them (as opposed to erroring
 +       * out).
 +       *
 +       * When implementing your new pseudo-option, remember to
 +       * register it in the list at the top of handle_revision_opt.
 +       */
 +      if (!strcmp(arg, "--all")) {
 +              handle_refs(submodule, revs, *flags, for_each_ref_submodule);
 +              handle_refs(submodule, revs, *flags, head_ref_submodule);
 +      } else if (!strcmp(arg, "--branches")) {
 +              handle_refs(submodule, revs, *flags, for_each_branch_ref_submodule);
 +      } else if (!strcmp(arg, "--bisect")) {
 +              handle_refs(submodule, revs, *flags, for_each_bad_bisect_ref);
 +              handle_refs(submodule, revs, *flags ^ UNINTERESTING, for_each_good_bisect_ref);
 +              revs->bisect = 1;
 +      } else if (!strcmp(arg, "--tags")) {
 +              handle_refs(submodule, revs, *flags, for_each_tag_ref_submodule);
 +      } else if (!strcmp(arg, "--remotes")) {
 +              handle_refs(submodule, revs, *flags, for_each_remote_ref_submodule);
 +      } else if ((argcount = parse_long_opt("glob", argv, &optarg))) {
 +              struct all_refs_cb cb;
 +              init_all_refs_cb(&cb, revs, *flags);
 +              for_each_glob_ref(handle_one_ref, optarg, &cb);
 +              return argcount;
 +      } else if (!prefixcmp(arg, "--branches=")) {
 +              struct all_refs_cb cb;
 +              init_all_refs_cb(&cb, revs, *flags);
 +              for_each_glob_ref_in(handle_one_ref, arg + 11, "refs/heads/", &cb);
 +      } else if (!prefixcmp(arg, "--tags=")) {
 +              struct all_refs_cb cb;
 +              init_all_refs_cb(&cb, revs, *flags);
 +              for_each_glob_ref_in(handle_one_ref, arg + 7, "refs/tags/", &cb);
 +      } else if (!prefixcmp(arg, "--remotes=")) {
 +              struct all_refs_cb cb;
 +              init_all_refs_cb(&cb, revs, *flags);
 +              for_each_glob_ref_in(handle_one_ref, arg + 10, "refs/remotes/", &cb);
 +      } else if (!strcmp(arg, "--reflog")) {
 +              handle_reflog(revs, *flags);
 +      } else if (!strcmp(arg, "--not")) {
 +              *flags ^= UNINTERESTING;
 +      } else if (!strcmp(arg, "--no-walk")) {
 +              revs->no_walk = 1;
 +      } else if (!strcmp(arg, "--do-walk")) {
 +              revs->no_walk = 0;
 +      } else {
 +              return 0;
 +      }
 +
 +      return 1;
 +}
 +
  /*
   * Parse revision information, filling in the "rev_info" structure,
   * and removing the used arguments from the argument list.
  int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct setup_revision_opt *opt)
  {
        int i, flags, left, seen_dashdash, read_from_stdin, got_rev_arg = 0;
-       const char **prune_data = NULL;
+       struct cmdline_pathspec prune_data;
        const char *submodule = NULL;
 -      const char *optarg;
 -      int argcount;
  
+       memset(&prune_data, 0, sizeof(prune_data));
        if (opt)
                submodule = opt->submodule;