Merge branch 'jp/string-list-api-cleanup' into jn/grep-open
authorJulian Phillips <julian@quantumfyre.co.uk>
Fri, 25 Jun 2010 23:41:39 +0000 (00:41 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sun, 27 Jun 2010 17:17:18 +0000 (10:17 -0700)
An evil merge to adjust the series to cleaned-up API.

From: Julian Phillips <julian@quantumfyre.co.uk>
Subject: [PATCH v2 7/7] grep: fix string_list_append calls
Date: Sat, 26 Jun 2010 00:41:39 +0100
Message-ID: <20100625234140.18927.35025.julian@quantumfyre.co.uk>

* jp/string-list-api-cleanup:
string_list: Fix argument order for string_list_append
string_list: Fix argument order for string_list_lookup
string_list: Fix argument order for string_list_insert_at_index
string_list: Fix argument order for string_list_insert
string_list: Fix argument order for for_each_string_list
string_list: Fix argument order for print_string_list

Signed-off-by: Julian Phillips <julian@quantumfyre.co.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
1  2 
builtin/grep.c
diff --combined builtin/grep.c
index f32fbbc35afb92a763c61b2c0df851eb9b3b08ce,b194ea3cea531f3a6c81d6d27b5b3028641ba9ce..4b8ddbe0d52d3aa9719372400c24959dc7efd8c2
@@@ -11,8 -11,6 +11,8 @@@
  #include "tree-walk.h"
  #include "builtin.h"
  #include "parse-options.h"
 +#include "string-list.h"
 +#include "run-command.h"
  #include "userdiff.h"
  #include "grep.h"
  #include "quote.h"
@@@ -558,33 -556,6 +558,33 @@@ static int grep_file(struct grep_opt *o
        }
  }
  
-       string_list_append(xstrndup(data, len), path_list);
 +static void append_path(struct grep_opt *opt, const void *data, size_t len)
 +{
 +      struct string_list *path_list = opt->output_priv;
 +
 +      if (len == 1 && *(const char *)data == '\0')
 +              return;
++      string_list_append(path_list, xstrndup(data, len));
 +}
 +
 +static void run_pager(struct grep_opt *opt, const char *prefix)
 +{
 +      struct string_list *path_list = opt->output_priv;
 +      const char **argv = xmalloc(sizeof(const char *) * (path_list->nr + 1));
 +      int i, status;
 +
 +      for (i = 0; i < path_list->nr; i++)
 +              argv[i] = path_list->items[i].string;
 +      argv[path_list->nr] = NULL;
 +
 +      if (prefix && chdir(prefix))
 +              die("Failed to chdir: %s", prefix);
 +      status = run_command_v_opt(argv, RUN_USING_SHELL);
 +      if (status)
 +              exit(status);
 +      free(argv);
 +}
 +
  static int grep_cache(struct grep_opt *opt, const char **paths, int cached)
  {
        int hit = 0;
                if (hit && opt->status_only)
                        break;
        }
 -      free_grep_patterns(opt);
        return hit;
  }
  
@@@ -703,25 -675,6 +703,25 @@@ static int grep_object(struct grep_opt 
        die("unable to grep from object of type %s", typename(obj->type));
  }
  
 +static int grep_objects(struct grep_opt *opt, const char **paths,
 +                      const struct object_array *list)
 +{
 +      unsigned int i;
 +      int hit = 0;
 +      const unsigned int nr = list->nr;
 +
 +      for (i = 0; i < nr; i++) {
 +              struct object *real_obj;
 +              real_obj = deref_tag(list->objects[i].item, NULL, 0);
 +              if (grep_object(opt, paths, real_obj, list->objects[i].name)) {
 +                      hit = 1;
 +                      if (opt->status_only)
 +                              break;
 +              }
 +      }
 +      return hit;
 +}
 +
  static int grep_directory(struct grep_opt *opt, const char **paths)
  {
        struct dir_struct dir;
                if (hit && opt->status_only)
                        break;
        }
 -      free_grep_patterns(opt);
        return hit;
  }
  
@@@ -828,11 -782,9 +828,11 @@@ int cmd_grep(int argc, const char **arg
        int cached = 0;
        int seen_dashdash = 0;
        int external_grep_allowed__ignored;
 +      const char *show_in_pager = NULL, *default_pager = "dummy";
        struct grep_opt opt;
        struct object_array list = { 0, 0, NULL };
        const char **paths = NULL;
 +      struct string_list path_list = { NULL, 0, 0, 0 };
        int i;
        int dummy;
        int nongit = 0, use_index = 1;
                OPT_BOOLEAN(0, "all-match", &opt.all_match,
                        "show only matches from files that match all patterns"),
                OPT_GROUP(""),
 +              { OPTION_STRING, 'O', "open-files-in-pager", &show_in_pager,
 +                      "pager", "show matching files in the pager",
 +                      PARSE_OPT_OPTARG, NULL, (intptr_t)default_pager },
                OPT_BOOLEAN(0, "ext-grep", &external_grep_allowed__ignored,
                            "allow calling of grep(1) (ignored by this build)"),
                { OPTION_CALLBACK, 0, "help-all", &options, NULL, "show usage",
                argc--;
        }
  
-               string_list_append(show_in_pager, &path_list);
 +      if (show_in_pager == default_pager)
 +              show_in_pager = git_pager(1);
 +      if (show_in_pager) {
 +              opt.name_only = 1;
 +              opt.null_following_name = 1;
 +              opt.output_priv = &path_list;
 +              opt.output = append_path;
++              string_list_append(&path_list, show_in_pager);
 +              use_threads = 0;
 +      }
 +
        if (!opt.pattern_list)
                die("no pattern given.");
        if (!opt.fixed && opt.ignore_case)
                paths[1] = NULL;
        }
  
-                       string_list_append(buf.buf, &path_list);
 +      if (show_in_pager && (cached || list.nr))
 +              die("--open-files-in-pager only works on the worktree");
 +
 +      if (show_in_pager && opt.pattern_list && !opt.pattern_list->next) {
 +              const char *pager = path_list.items[0].string;
 +              int len = strlen(pager);
 +
 +              if (len > 4 && is_dir_sep(pager[len - 5]))
 +                      pager += len - 4;
 +
 +              if (!strcmp("less", pager) || !strcmp("vi", pager)) {
 +                      struct strbuf buf = STRBUF_INIT;
 +                      strbuf_addf(&buf, "+/%s%s",
 +                                      strcmp("less", pager) ? "" : "*",
 +                                      opt.pattern_list->pattern);
++                      string_list_append(&path_list, buf.buf);
 +                      strbuf_detach(&buf, NULL);
 +              }
 +      }
 +
 +      if (!show_in_pager)
 +              setup_pager();
 +
 +
        if (!use_index) {
 -              int hit;
                if (cached)
                        die("--cached cannot be used with --no-index.");
                if (list.nr)
                        die("--no-index cannot be used with revs.");
                hit = grep_directory(&opt, paths);
 -              if (use_threads)
 -                      hit |= wait_all();
 -              return !hit;
 -      }
 -
 -      if (!list.nr) {
 -              int hit;
 +      } else if (!list.nr) {
                if (!cached)
                        setup_work_tree();
  
                hit = grep_cache(&opt, paths, cached);
 -              if (use_threads)
 -                      hit |= wait_all();
 -              return !hit;
 -      }
 -
 -      if (cached)
 -              die("both --cached and trees are given.");
 -
 -      for (i = 0; i < list.nr; i++) {
 -              struct object *real_obj;
 -              real_obj = deref_tag(list.objects[i].item, NULL, 0);
 -              if (grep_object(&opt, paths, real_obj, list.objects[i].name)) {
 -                      hit = 1;
 -                      if (opt.status_only)
 -                              break;
 -              }
 +      } else {
 +              if (cached)
 +                      die("both --cached and trees are given.");
 +              hit = grep_objects(&opt, paths, &list);
        }
  
        if (use_threads)
                hit |= wait_all();
 +      if (hit && show_in_pager)
 +              run_pager(&opt, prefix);
        free_grep_patterns(&opt);
        return !hit;
  }