Merge branch 'jc/fix-diff-no-index-diff-opt-parse'
authorJunio C Hamano <gitster@pobox.com>
Thu, 3 Apr 2014 19:38:42 +0000 (12:38 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 3 Apr 2014 19:38:42 +0000 (12:38 -0700)
"diff --no-index -Mq a b" fell into an infinite loop.

* jc/fix-diff-no-index-diff-opt-parse:
diff-no-index: correctly diagnose error return from diff_opt_parse()

1  2 
diff-no-index.c
diff --combined diff-no-index.c
index c554691df0bdb46eee26b4ca4c957fa86fc9f8c4,ecf929336d0c8d40862ad88ac188f5e18166c9f9..265709ba8c51a4390fad11c7d1aa23551a4fd266
@@@ -15,9 -15,8 +15,9 @@@
  #include "log-tree.h"
  #include "builtin.h"
  #include "string-list.h"
 +#include "dir.h"
  
 -static int read_directory(const char *path, struct string_list *list)
 +static int read_directory_contents(const char *path, struct string_list *list)
  {
        DIR *dir;
        struct dirent *e;
@@@ -26,7 -25,7 +26,7 @@@
                return error("Could not open directory %s", path);
  
        while ((e = readdir(dir)))
 -              if (strcmp(".", e->d_name) && strcmp("..", e->d_name))
 +              if (!is_dot_or_dotdot(e->d_name))
                        string_list_insert(list, e->d_name);
  
        closedir(dir);
@@@ -108,9 -107,9 +108,9 @@@ static int queue_diff(struct diff_optio
                int i1, i2, ret = 0;
                size_t len1 = 0, len2 = 0;
  
 -              if (name1 && read_directory(name1, &p1))
 +              if (name1 && read_directory_contents(name1, &p1))
                        return -1;
 -              if (name2 && read_directory(name2, &p2)) {
 +              if (name2 && read_directory_contents(name2, &p2)) {
                        string_list_clear(&p1, 0);
                        return -1;
                }
  
  void diff_no_index(struct rev_info *revs,
                   int argc, const char **argv,
 -                 int nongit, const char *prefix)
 +                 const char *prefix)
  {
        int i, prefixlen;
 -      int no_index = 0;
 -      unsigned deprecated_show_diff_q_option_used = 0;
        const char *paths[2];
  
 -      /* Were we asked to do --no-index explicitly? */
 -      for (i = 1; i < argc; i++) {
 -              if (!strcmp(argv[i], "--")) {
 -                      i++;
 -                      break;
 -              }
 -              if (!strcmp(argv[i], "--no-index"))
 -                      no_index = 1;
 -              if (argv[i][0] != '-')
 -                      break;
 -      }
 -
 -      if (!no_index && !nongit) {
 -              /*
 -               * Inside a git repository, without --no-index.  Only
 -               * when a path outside the repository is given,
 -               * e.g. "git diff /var/tmp/[12]", or "git diff
 -               * Makefile /var/tmp/Makefile", allow it to be used as
 -               * a colourful "diff" replacement.
 -               */
 -              if ((argc != i + 2) ||
 -                  (path_inside_repo(prefix, argv[i]) &&
 -                   path_inside_repo(prefix, argv[i+1])))
 -                      return;
 -      }
 -      if (argc != i + 2) {
 -              if (!no_index) {
 -                      /*
 -                       * There was no --no-index and there were not two
 -                       * paths. It is possible that the user intended
 -                       * to do an inside-repository operation.
 -                       */
 -                      fprintf(stderr, "Not a git repository\n");
 -                      fprintf(stderr,
 -                              "To compare two paths outside a working tree:\n");
 -              }
 -              /* Give the usage message for non-repository usage and exit. */
 -              usagef("git diff %s <path> <path>",
 -                     no_index ? "--no-index" : "[--no-index]");
 -      }
 -
        diff_setup(&revs->diffopt);
        for (i = 1; i < argc - 2; ) {
                int j;
                if (!strcmp(argv[i], "--no-index"))
                        i++;
 -              else if (!strcmp(argv[i], "-q")) {
 -                      deprecated_show_diff_q_option_used = 1;
 -                      i++;
 -              }
                else if (!strcmp(argv[i], "--"))
                        i++;
                else {
                        j = diff_opt_parse(&revs->diffopt, argv + i, argc - i);
-                       if (!j)
+                       if (j <= 0)
                                die("invalid diff option/value: %s", argv[i]);
                        i += j;
                }
        revs->max_count = -2;
        diff_setup_done(&revs->diffopt);
  
 -      if (deprecated_show_diff_q_option_used)
 -              handle_deprecated_show_diff_q(&revs->diffopt);
 -
        setup_diff_pager(&revs->diffopt);
        DIFF_OPT_SET(&revs->diffopt, EXIT_WITH_STATUS);