Merge branch 'jc/apply-ignore-whitespace' into maint
authorJunio C Hamano <gitster@pobox.com>
Wed, 25 Jun 2014 18:46:23 +0000 (11:46 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Jun 2014 18:46:23 +0000 (11:46 -0700)
"--ignore-space-change" option of "git apply" ignored the spaces
at the beginning of line too aggressively, which is inconsistent
with the option of the same name "diff" and "git diff" have.

* jc/apply-ignore-whitespace:
apply --ignore-space-change: lines with and without leading whitespaces do not match

1  2 
builtin/apply.c
diff --combined builtin/apply.c
index 87439fad118a2671989120dd5993a17b4541e2db,b2e641934e0c344470e0189bb823e1b50d796173..9c5724eaccfaee62ff10eb097adc39ace351cade
@@@ -300,11 -300,13 +300,13 @@@ static int fuzzy_matchlines(const char 
        while ((*last2 == '\r') || (*last2 == '\n'))
                last2--;
  
-       /* skip leading whitespace */
-       while (isspace(*s1) && (s1 <= last1))
-               s1++;
-       while (isspace(*s2) && (s2 <= last2))
-               s2++;
+       /* skip leading whitespaces, if both begin with whitespace */
+       if (s1 <= last1 && s2 <= last2 && isspace(*s1) && isspace(*s2)) {
+               while (isspace(*s1) && (s1 <= last1))
+                       s1++;
+               while (isspace(*s2) && (s2 <= last2))
+                       s2++;
+       }
        /* early return if both lines are empty */
        if ((s1 > last1) && (s2 > last2))
                return 1;
@@@ -1409,10 -1411,10 +1411,10 @@@ static void recount_diff(const char *li
                case '\\':
                        continue;
                case '@':
 -                      ret = size < 3 || prefixcmp(line, "@@ ");
 +                      ret = size < 3 || !starts_with(line, "@@ ");
                        break;
                case 'd':
 -                      ret = size < 5 || prefixcmp(line, "diff ");
 +                      ret = size < 5 || !starts_with(line, "diff ");
                        break;
                default:
                        ret = -1;
@@@ -1798,11 -1800,11 +1800,11 @@@ static struct fragment *parse_binary_hu
  
        *status_p = 0;
  
 -      if (!prefixcmp(buffer, "delta ")) {
 +      if (starts_with(buffer, "delta ")) {
                patch_method = BINARY_DELTA_DEFLATED;
                origlen = strtoul(buffer + 6, NULL, 10);
        }
 -      else if (!prefixcmp(buffer, "literal ")) {
 +      else if (starts_with(buffer, "literal ")) {
                patch_method = BINARY_LITERAL_DEFLATED;
                origlen = strtoul(buffer + 8, NULL, 10);
        }
@@@ -1943,7 -1945,13 +1945,7 @@@ static int parse_chunk(char *buffer, un
                                       size - offset - hdrsize, patch);
  
        if (!patchsize) {
 -              static const char *binhdr[] = {
 -                      "Binary files ",
 -                      "Files ",
 -                      NULL,
 -              };
                static const char git_binary[] = "GIT binary patch\n";
 -              int i;
                int hd = hdrsize + offset;
                unsigned long llen = linelen(buffer + hd, size - hd);
  
                                patchsize = 0;
                }
                else if (!memcmp(" differ\n", buffer + hd + llen - 8, 8)) {
 +                      static const char *binhdr[] = {
 +                              "Binary files ",
 +                              "Files ",
 +                              NULL,
 +                      };
 +                      int i;
                        for (i = 0; binhdr[i]; i++) {
                                int len = strlen(binhdr[i]);
                                if (len < size - hd &&
@@@ -3627,12 -3629,12 +3629,12 @@@ static int preimage_sha1_in_gitlink_pat
            hunk->oldpos == 1 && hunk->oldlines == 1 &&
            /* does preimage begin with the heading? */
            (preimage = memchr(hunk->patch, '\n', hunk->size)) != NULL &&
 -          !prefixcmp(++preimage, heading) &&
 +          starts_with(++preimage, heading) &&
            /* does it record full SHA-1? */
            !get_sha1_hex(preimage + sizeof(heading) - 1, sha1) &&
            preimage[sizeof(heading) + 40 - 1] == '\n' &&
            /* does the abbreviated name on the index line agree with it? */
 -          !prefixcmp(preimage + sizeof(heading) - 1, p->old_sha1_prefix))
 +          starts_with(preimage + sizeof(heading) - 1, p->old_sha1_prefix))
                return 0; /* it all looks fine */
  
        /* we may have full object name on the index line */
@@@ -4061,7 -4063,7 +4063,7 @@@ static int write_out_one_reject(struct 
                return error(_("cannot open %s: %s"), namebuf, strerror(errno));
  
        /* Normal git tools never deal with .rej, so do not pretend
 -       * this is a git patch by saying --git nor give extended
 +       * this is a git patch by saying --git or giving extended
         * headers.  While at it, maybe please "kompare" that wants
         * the trailing TAB and some garbage at the end of line ;-).
         */
@@@ -4152,7 -4154,7 +4154,7 @@@ static int use_patch(struct patch *p
        /* See if it matches any of exclude/include rule */
        for (i = 0; i < limit_by_name.nr; i++) {
                struct string_list_item *it = &limit_by_name.items[i];
 -              if (!fnmatch(it->string, pathname, 0))
 +              if (!wildmatch(it->string, pathname, 0, NULL))
                        return (it->util != NULL);
        }