e7b3dcad4ff4825fabed9ef4ed4474acc5f0c458
   1/*
   2 * apply.c
   3 *
   4 * Copyright (C) Linus Torvalds, 2005
   5 *
   6 * This applies patches on top of some (arbitrary) version of the SCM.
   7 *
   8 */
   9#include <fnmatch.h>
  10#include "cache.h"
  11#include "quote.h"
  12
  13//  --check turns on checking that the working tree matches the
  14//    files that are being modified, but doesn't apply the patch
  15//  --stat does just a diffstat, and doesn't actually apply
  16//  --numstat does numeric diffstat, and doesn't actually apply
  17//  --index-info shows the old and new index info for paths if available.
  18//
  19static const char *prefix;
  20static int prefix_length = -1;
  21
  22static int p_value = 1;
  23static int allow_binary_replacement = 0;
  24static int check_index = 0;
  25static int write_index = 0;
  26static int diffstat = 0;
  27static int numstat = 0;
  28static int summary = 0;
  29static int check = 0;
  30static int apply = 1;
  31static int no_add = 0;
  32static int show_index_info = 0;
  33static int line_termination = '\n';
  34static const char apply_usage[] =
  35"git-apply [--stat] [--numstat] [--summary] [--check] [--index] [--apply] [--no-add] [--index-info] [--allow-binary-replacement] [-z] [-pNUM] <patch>...";
  36
  37static enum whitespace_eol {
  38        nowarn,
  39        warn_on_whitespace,
  40        error_on_whitespace
  41} new_whitespace = nowarn;
  42
  43/*
  44 * For "diff-stat" like behaviour, we keep track of the biggest change
  45 * we've seen, and the longest filename. That allows us to do simple
  46 * scaling.
  47 */
  48static int max_change, max_len;
  49
  50/*
  51 * Various "current state", notably line numbers and what
  52 * file (and how) we're patching right now.. The "is_xxxx"
  53 * things are flags, where -1 means "don't know yet".
  54 */
  55static int linenr = 1;
  56
  57struct fragment {
  58        unsigned long oldpos, oldlines;
  59        unsigned long newpos, newlines;
  60        const char *patch;
  61        int size;
  62        struct fragment *next;
  63};
  64
  65struct patch {
  66        char *new_name, *old_name, *def_name;
  67        unsigned int old_mode, new_mode;
  68        int is_rename, is_copy, is_new, is_delete, is_binary;
  69        int lines_added, lines_deleted;
  70        int score;
  71        struct fragment *fragments;
  72        char *result;
  73        unsigned long resultsize;
  74        char old_sha1_prefix[41];
  75        char new_sha1_prefix[41];
  76        struct patch *next;
  77};
  78
  79#define CHUNKSIZE (8192)
  80#define SLOP (16)
  81
  82static void *read_patch_file(int fd, unsigned long *sizep)
  83{
  84        unsigned long size = 0, alloc = CHUNKSIZE;
  85        void *buffer = xmalloc(alloc);
  86
  87        for (;;) {
  88                int nr = alloc - size;
  89                if (nr < 1024) {
  90                        alloc += CHUNKSIZE;
  91                        buffer = xrealloc(buffer, alloc);
  92                        nr = alloc - size;
  93                }
  94                nr = xread(fd, buffer + size, nr);
  95                if (!nr)
  96                        break;
  97                if (nr < 0)
  98                        die("git-apply: read returned %s", strerror(errno));
  99                size += nr;
 100        }
 101        *sizep = size;
 102
 103        /*
 104         * Make sure that we have some slop in the buffer
 105         * so that we can do speculative "memcmp" etc, and
 106         * see to it that it is NUL-filled.
 107         */
 108        if (alloc < size + SLOP)
 109                buffer = xrealloc(buffer, size + SLOP);
 110        memset(buffer + size, 0, SLOP);
 111        return buffer;
 112}
 113
 114static unsigned long linelen(const char *buffer, unsigned long size)
 115{
 116        unsigned long len = 0;
 117        while (size--) {
 118                len++;
 119                if (*buffer++ == '\n')
 120                        break;
 121        }
 122        return len;
 123}
 124
 125static int is_dev_null(const char *str)
 126{
 127        return !memcmp("/dev/null", str, 9) && isspace(str[9]);
 128}
 129
 130#define TERM_SPACE      1
 131#define TERM_TAB        2
 132
 133static int name_terminate(const char *name, int namelen, int c, int terminate)
 134{
 135        if (c == ' ' && !(terminate & TERM_SPACE))
 136                return 0;
 137        if (c == '\t' && !(terminate & TERM_TAB))
 138                return 0;
 139
 140        return 1;
 141}
 142
 143static char * find_name(const char *line, char *def, int p_value, int terminate)
 144{
 145        int len;
 146        const char *start = line;
 147        char *name;
 148
 149        if (*line == '"') {
 150                /* Proposed "new-style" GNU patch/diff format; see
 151                 * http://marc.theaimsgroup.com/?l=git&m=112927316408690&w=2
 152                 */
 153                name = unquote_c_style(line, NULL);
 154                if (name) {
 155                        char *cp = name;
 156                        while (p_value) {
 157                                cp = strchr(name, '/');
 158                                if (!cp)
 159                                        break;
 160                                cp++;
 161                                p_value--;
 162                        }
 163                        if (cp) {
 164                                /* name can later be freed, so we need
 165                                 * to memmove, not just return cp
 166                                 */
 167                                memmove(name, cp, strlen(cp) + 1);
 168                                free(def);
 169                                return name;
 170                        }
 171                        else {
 172                                free(name);
 173                                name = NULL;
 174                        }
 175                }
 176        }
 177
 178        for (;;) {
 179                char c = *line;
 180
 181                if (isspace(c)) {
 182                        if (c == '\n')
 183                                break;
 184                        if (name_terminate(start, line-start, c, terminate))
 185                                break;
 186                }
 187                line++;
 188                if (c == '/' && !--p_value)
 189                        start = line;
 190        }
 191        if (!start)
 192                return def;
 193        len = line - start;
 194        if (!len)
 195                return def;
 196
 197        /*
 198         * Generally we prefer the shorter name, especially
 199         * if the other one is just a variation of that with
 200         * something else tacked on to the end (ie "file.orig"
 201         * or "file~").
 202         */
 203        if (def) {
 204                int deflen = strlen(def);
 205                if (deflen < len && !strncmp(start, def, deflen))
 206                        return def;
 207        }
 208
 209        name = xmalloc(len + 1);
 210        memcpy(name, start, len);
 211        name[len] = 0;
 212        free(def);
 213        return name;
 214}
 215
 216/*
 217 * Get the name etc info from the --/+++ lines of a traditional patch header
 218 *
 219 * NOTE! This hardcodes "-p1" behaviour in filename detection.
 220 *
 221 * FIXME! The end-of-filename heuristics are kind of screwy. For existing
 222 * files, we can happily check the index for a match, but for creating a
 223 * new file we should try to match whatever "patch" does. I have no idea.
 224 */
 225static void parse_traditional_patch(const char *first, const char *second, struct patch *patch)
 226{
 227        char *name;
 228
 229        first += 4;     // skip "--- "
 230        second += 4;    // skip "+++ "
 231        if (is_dev_null(first)) {
 232                patch->is_new = 1;
 233                patch->is_delete = 0;
 234                name = find_name(second, NULL, p_value, TERM_SPACE | TERM_TAB);
 235                patch->new_name = name;
 236        } else if (is_dev_null(second)) {
 237                patch->is_new = 0;
 238                patch->is_delete = 1;
 239                name = find_name(first, NULL, p_value, TERM_SPACE | TERM_TAB);
 240                patch->old_name = name;
 241        } else {
 242                name = find_name(first, NULL, p_value, TERM_SPACE | TERM_TAB);
 243                name = find_name(second, name, p_value, TERM_SPACE | TERM_TAB);
 244                patch->old_name = patch->new_name = name;
 245        }
 246        if (!name)
 247                die("unable to find filename in patch at line %d", linenr);
 248}
 249
 250static int gitdiff_hdrend(const char *line, struct patch *patch)
 251{
 252        return -1;
 253}
 254
 255/*
 256 * We're anal about diff header consistency, to make
 257 * sure that we don't end up having strange ambiguous
 258 * patches floating around.
 259 *
 260 * As a result, gitdiff_{old|new}name() will check
 261 * their names against any previous information, just
 262 * to make sure..
 263 */
 264static char *gitdiff_verify_name(const char *line, int isnull, char *orig_name, const char *oldnew)
 265{
 266        if (!orig_name && !isnull)
 267                return find_name(line, NULL, 1, 0);
 268
 269        if (orig_name) {
 270                int len;
 271                const char *name;
 272                char *another;
 273                name = orig_name;
 274                len = strlen(name);
 275                if (isnull)
 276                        die("git-apply: bad git-diff - expected /dev/null, got %s on line %d", name, linenr);
 277                another = find_name(line, NULL, 1, 0);
 278                if (!another || memcmp(another, name, len))
 279                        die("git-apply: bad git-diff - inconsistent %s filename on line %d", oldnew, linenr);
 280                free(another);
 281                return orig_name;
 282        }
 283        else {
 284                /* expect "/dev/null" */
 285                if (memcmp("/dev/null", line, 9) || line[9] != '\n')
 286                        die("git-apply: bad git-diff - expected /dev/null on line %d", linenr);
 287                return NULL;
 288        }
 289}
 290
 291static int gitdiff_oldname(const char *line, struct patch *patch)
 292{
 293        patch->old_name = gitdiff_verify_name(line, patch->is_new, patch->old_name, "old");
 294        return 0;
 295}
 296
 297static int gitdiff_newname(const char *line, struct patch *patch)
 298{
 299        patch->new_name = gitdiff_verify_name(line, patch->is_delete, patch->new_name, "new");
 300        return 0;
 301}
 302
 303static int gitdiff_oldmode(const char *line, struct patch *patch)
 304{
 305        patch->old_mode = strtoul(line, NULL, 8);
 306        return 0;
 307}
 308
 309static int gitdiff_newmode(const char *line, struct patch *patch)
 310{
 311        patch->new_mode = strtoul(line, NULL, 8);
 312        return 0;
 313}
 314
 315static int gitdiff_delete(const char *line, struct patch *patch)
 316{
 317        patch->is_delete = 1;
 318        patch->old_name = patch->def_name;
 319        return gitdiff_oldmode(line, patch);
 320}
 321
 322static int gitdiff_newfile(const char *line, struct patch *patch)
 323{
 324        patch->is_new = 1;
 325        patch->new_name = patch->def_name;
 326        return gitdiff_newmode(line, patch);
 327}
 328
 329static int gitdiff_copysrc(const char *line, struct patch *patch)
 330{
 331        patch->is_copy = 1;
 332        patch->old_name = find_name(line, NULL, 0, 0);
 333        return 0;
 334}
 335
 336static int gitdiff_copydst(const char *line, struct patch *patch)
 337{
 338        patch->is_copy = 1;
 339        patch->new_name = find_name(line, NULL, 0, 0);
 340        return 0;
 341}
 342
 343static int gitdiff_renamesrc(const char *line, struct patch *patch)
 344{
 345        patch->is_rename = 1;
 346        patch->old_name = find_name(line, NULL, 0, 0);
 347        return 0;
 348}
 349
 350static int gitdiff_renamedst(const char *line, struct patch *patch)
 351{
 352        patch->is_rename = 1;
 353        patch->new_name = find_name(line, NULL, 0, 0);
 354        return 0;
 355}
 356
 357static int gitdiff_similarity(const char *line, struct patch *patch)
 358{
 359        if ((patch->score = strtoul(line, NULL, 10)) == ULONG_MAX)
 360                patch->score = 0;
 361        return 0;
 362}
 363
 364static int gitdiff_dissimilarity(const char *line, struct patch *patch)
 365{
 366        if ((patch->score = strtoul(line, NULL, 10)) == ULONG_MAX)
 367                patch->score = 0;
 368        return 0;
 369}
 370
 371static int gitdiff_index(const char *line, struct patch *patch)
 372{
 373        /* index line is N hexadecimal, "..", N hexadecimal,
 374         * and optional space with octal mode.
 375         */
 376        const char *ptr, *eol;
 377        int len;
 378
 379        ptr = strchr(line, '.');
 380        if (!ptr || ptr[1] != '.' || 40 < ptr - line)
 381                return 0;
 382        len = ptr - line;
 383        memcpy(patch->old_sha1_prefix, line, len);
 384        patch->old_sha1_prefix[len] = 0;
 385
 386        line = ptr + 2;
 387        ptr = strchr(line, ' ');
 388        eol = strchr(line, '\n');
 389
 390        if (!ptr || eol < ptr)
 391                ptr = eol;
 392        len = ptr - line;
 393
 394        if (40 < len)
 395                return 0;
 396        memcpy(patch->new_sha1_prefix, line, len);
 397        patch->new_sha1_prefix[len] = 0;
 398        if (*ptr == ' ')
 399                patch->new_mode = patch->old_mode = strtoul(ptr+1, NULL, 8);
 400        return 0;
 401}
 402
 403/*
 404 * This is normal for a diff that doesn't change anything: we'll fall through
 405 * into the next diff. Tell the parser to break out.
 406 */
 407static int gitdiff_unrecognized(const char *line, struct patch *patch)
 408{
 409        return -1;
 410}
 411
 412static const char *stop_at_slash(const char *line, int llen)
 413{
 414        int i;
 415
 416        for (i = 0; i < llen; i++) {
 417                int ch = line[i];
 418                if (ch == '/')
 419                        return line + i;
 420        }
 421        return NULL;
 422}
 423
 424/* This is to extract the same name that appears on "diff --git"
 425 * line.  We do not find and return anything if it is a rename
 426 * patch, and it is OK because we will find the name elsewhere.
 427 * We need to reliably find name only when it is mode-change only,
 428 * creation or deletion of an empty file.  In any of these cases,
 429 * both sides are the same name under a/ and b/ respectively.
 430 */
 431static char *git_header_name(char *line, int llen)
 432{
 433        int len;
 434        const char *name;
 435        const char *second = NULL;
 436
 437        line += strlen("diff --git ");
 438        llen -= strlen("diff --git ");
 439
 440        if (*line == '"') {
 441                const char *cp;
 442                char *first = unquote_c_style(line, &second);
 443                if (!first)
 444                        return NULL;
 445
 446                /* advance to the first slash */
 447                cp = stop_at_slash(first, strlen(first));
 448                if (!cp || cp == first) {
 449                        /* we do not accept absolute paths */
 450                free_first_and_fail:
 451                        free(first);
 452                        return NULL;
 453                }
 454                len = strlen(cp+1);
 455                memmove(first, cp+1, len+1); /* including NUL */
 456
 457                /* second points at one past closing dq of name.
 458                 * find the second name.
 459                 */
 460                while ((second < line + llen) && isspace(*second))
 461                        second++;
 462
 463                if (line + llen <= second)
 464                        goto free_first_and_fail;
 465                if (*second == '"') {
 466                        char *sp = unquote_c_style(second, NULL);
 467                        if (!sp)
 468                                goto free_first_and_fail;
 469                        cp = stop_at_slash(sp, strlen(sp));
 470                        if (!cp || cp == sp) {
 471                        free_both_and_fail:
 472                                free(sp);
 473                                goto free_first_and_fail;
 474                        }
 475                        /* They must match, otherwise ignore */
 476                        if (strcmp(cp+1, first))
 477                                goto free_both_and_fail;
 478                        free(sp);
 479                        return first;
 480                }
 481
 482                /* unquoted second */
 483                cp = stop_at_slash(second, line + llen - second);
 484                if (!cp || cp == second)
 485                        goto free_first_and_fail;
 486                cp++;
 487                if (line + llen - cp != len + 1 ||
 488                    memcmp(first, cp, len))
 489                        goto free_first_and_fail;
 490                return first;
 491        }
 492
 493        /* unquoted first name */
 494        name = stop_at_slash(line, llen);
 495        if (!name || name == line)
 496                return NULL;
 497
 498        name++;
 499
 500        /* since the first name is unquoted, a dq if exists must be
 501         * the beginning of the second name.
 502         */
 503        for (second = name; second < line + llen; second++) {
 504                if (*second == '"') {
 505                        const char *cp = second;
 506                        const char *np;
 507                        char *sp = unquote_c_style(second, NULL);
 508
 509                        if (!sp)
 510                                return NULL;
 511                        np = stop_at_slash(sp, strlen(sp));
 512                        if (!np || np == sp) {
 513                        free_second_and_fail:
 514                                free(sp);
 515                                return NULL;
 516                        }
 517                        np++;
 518                        len = strlen(np);
 519                        if (len < cp - name &&
 520                            !strncmp(np, name, len) &&
 521                            isspace(name[len])) {
 522                                /* Good */
 523                                memmove(sp, np, len + 1);
 524                                return sp;
 525                        }
 526                        goto free_second_and_fail;
 527                }
 528        }
 529
 530        /*
 531         * Accept a name only if it shows up twice, exactly the same
 532         * form.
 533         */
 534        for (len = 0 ; ; len++) {
 535                char c = name[len];
 536
 537                switch (c) {
 538                default:
 539                        continue;
 540                case '\n':
 541                        return NULL;
 542                case '\t': case ' ':
 543                        second = name+len;
 544                        for (;;) {
 545                                char c = *second++;
 546                                if (c == '\n')
 547                                        return NULL;
 548                                if (c == '/')
 549                                        break;
 550                        }
 551                        if (second[len] == '\n' && !memcmp(name, second, len)) {
 552                                char *ret = xmalloc(len + 1);
 553                                memcpy(ret, name, len);
 554                                ret[len] = 0;
 555                                return ret;
 556                        }
 557                }
 558        }
 559        return NULL;
 560}
 561
 562/* Verify that we recognize the lines following a git header */
 563static int parse_git_header(char *line, int len, unsigned int size, struct patch *patch)
 564{
 565        unsigned long offset;
 566
 567        /* A git diff has explicit new/delete information, so we don't guess */
 568        patch->is_new = 0;
 569        patch->is_delete = 0;
 570
 571        /*
 572         * Some things may not have the old name in the
 573         * rest of the headers anywhere (pure mode changes,
 574         * or removing or adding empty files), so we get
 575         * the default name from the header.
 576         */
 577        patch->def_name = git_header_name(line, len);
 578
 579        line += len;
 580        size -= len;
 581        linenr++;
 582        for (offset = len ; size > 0 ; offset += len, size -= len, line += len, linenr++) {
 583                static const struct opentry {
 584                        const char *str;
 585                        int (*fn)(const char *, struct patch *);
 586                } optable[] = {
 587                        { "@@ -", gitdiff_hdrend },
 588                        { "--- ", gitdiff_oldname },
 589                        { "+++ ", gitdiff_newname },
 590                        { "old mode ", gitdiff_oldmode },
 591                        { "new mode ", gitdiff_newmode },
 592                        { "deleted file mode ", gitdiff_delete },
 593                        { "new file mode ", gitdiff_newfile },
 594                        { "copy from ", gitdiff_copysrc },
 595                        { "copy to ", gitdiff_copydst },
 596                        { "rename old ", gitdiff_renamesrc },
 597                        { "rename new ", gitdiff_renamedst },
 598                        { "rename from ", gitdiff_renamesrc },
 599                        { "rename to ", gitdiff_renamedst },
 600                        { "similarity index ", gitdiff_similarity },
 601                        { "dissimilarity index ", gitdiff_dissimilarity },
 602                        { "index ", gitdiff_index },
 603                        { "", gitdiff_unrecognized },
 604                };
 605                int i;
 606
 607                len = linelen(line, size);
 608                if (!len || line[len-1] != '\n')
 609                        break;
 610                for (i = 0; i < sizeof(optable) / sizeof(optable[0]); i++) {
 611                        const struct opentry *p = optable + i;
 612                        int oplen = strlen(p->str);
 613                        if (len < oplen || memcmp(p->str, line, oplen))
 614                                continue;
 615                        if (p->fn(line + oplen, patch) < 0)
 616                                return offset;
 617                        break;
 618                }
 619        }
 620
 621        return offset;
 622}
 623
 624static int parse_num(const char *line, unsigned long *p)
 625{
 626        char *ptr;
 627
 628        if (!isdigit(*line))
 629                return 0;
 630        *p = strtoul(line, &ptr, 10);
 631        return ptr - line;
 632}
 633
 634static int parse_range(const char *line, int len, int offset, const char *expect,
 635                        unsigned long *p1, unsigned long *p2)
 636{
 637        int digits, ex;
 638
 639        if (offset < 0 || offset >= len)
 640                return -1;
 641        line += offset;
 642        len -= offset;
 643
 644        digits = parse_num(line, p1);
 645        if (!digits)
 646                return -1;
 647
 648        offset += digits;
 649        line += digits;
 650        len -= digits;
 651
 652        *p2 = *p1;
 653        if (*line == ',') {
 654                digits = parse_num(line+1, p2);
 655                if (!digits)
 656                        return -1;
 657
 658                offset += digits+1;
 659                line += digits+1;
 660                len -= digits+1;
 661        }
 662
 663        ex = strlen(expect);
 664        if (ex > len)
 665                return -1;
 666        if (memcmp(line, expect, ex))
 667                return -1;
 668
 669        return offset + ex;
 670}
 671
 672/*
 673 * Parse a unified diff fragment header of the
 674 * form "@@ -a,b +c,d @@"
 675 */
 676static int parse_fragment_header(char *line, int len, struct fragment *fragment)
 677{
 678        int offset;
 679
 680        if (!len || line[len-1] != '\n')
 681                return -1;
 682
 683        /* Figure out the number of lines in a fragment */
 684        offset = parse_range(line, len, 4, " +", &fragment->oldpos, &fragment->oldlines);
 685        offset = parse_range(line, len, offset, " @@", &fragment->newpos, &fragment->newlines);
 686
 687        return offset;
 688}
 689
 690static int find_header(char *line, unsigned long size, int *hdrsize, struct patch *patch)
 691{
 692        unsigned long offset, len;
 693
 694        patch->is_rename = patch->is_copy = 0;
 695        patch->is_new = patch->is_delete = -1;
 696        patch->old_mode = patch->new_mode = 0;
 697        patch->old_name = patch->new_name = NULL;
 698        for (offset = 0; size > 0; offset += len, size -= len, line += len, linenr++) {
 699                unsigned long nextlen;
 700
 701                len = linelen(line, size);
 702                if (!len)
 703                        break;
 704
 705                /* Testing this early allows us to take a few shortcuts.. */
 706                if (len < 6)
 707                        continue;
 708
 709                /*
 710                 * Make sure we don't find any unconnected patch fragmants.
 711                 * That's a sign that we didn't find a header, and that a
 712                 * patch has become corrupted/broken up.
 713                 */
 714                if (!memcmp("@@ -", line, 4)) {
 715                        struct fragment dummy;
 716                        if (parse_fragment_header(line, len, &dummy) < 0)
 717                                continue;
 718                        error("patch fragment without header at line %d: %.*s", linenr, (int)len-1, line);
 719                }
 720
 721                if (size < len + 6)
 722                        break;
 723
 724                /*
 725                 * Git patch? It might not have a real patch, just a rename
 726                 * or mode change, so we handle that specially
 727                 */
 728                if (!memcmp("diff --git ", line, 11)) {
 729                        int git_hdr_len = parse_git_header(line, len, size, patch);
 730                        if (git_hdr_len <= len)
 731                                continue;
 732                        if (!patch->old_name && !patch->new_name) {
 733                                if (!patch->def_name)
 734                                        die("git diff header lacks filename information (line %d)", linenr);
 735                                patch->old_name = patch->new_name = patch->def_name;
 736                        }
 737                        *hdrsize = git_hdr_len;
 738                        return offset;
 739                }
 740
 741                /** --- followed by +++ ? */
 742                if (memcmp("--- ", line,  4) || memcmp("+++ ", line + len, 4))
 743                        continue;
 744
 745                /*
 746                 * We only accept unified patches, so we want it to
 747                 * at least have "@@ -a,b +c,d @@\n", which is 14 chars
 748                 * minimum
 749                 */
 750                nextlen = linelen(line + len, size - len);
 751                if (size < nextlen + 14 || memcmp("@@ -", line + len + nextlen, 4))
 752                        continue;
 753
 754                /* Ok, we'll consider it a patch */
 755                parse_traditional_patch(line, line+len, patch);
 756                *hdrsize = len + nextlen;
 757                linenr += 2;
 758                return offset;
 759        }
 760        return -1;
 761}
 762
 763/*
 764 * Parse a unified diff. Note that this really needs
 765 * to parse each fragment separately, since the only
 766 * way to know the difference between a "---" that is
 767 * part of a patch, and a "---" that starts the next
 768 * patch is to look at the line counts..
 769 */
 770static int parse_fragment(char *line, unsigned long size, struct patch *patch, struct fragment *fragment)
 771{
 772        int added, deleted;
 773        int len = linelen(line, size), offset;
 774        unsigned long oldlines, newlines;
 775
 776        offset = parse_fragment_header(line, len, fragment);
 777        if (offset < 0)
 778                return -1;
 779        oldlines = fragment->oldlines;
 780        newlines = fragment->newlines;
 781
 782        if (patch->is_new < 0) {
 783                patch->is_new =  !oldlines;
 784                if (!oldlines)
 785                        patch->old_name = NULL;
 786        }
 787        if (patch->is_delete < 0) {
 788                patch->is_delete = !newlines;
 789                if (!newlines)
 790                        patch->new_name = NULL;
 791        }
 792
 793        if (patch->is_new != !oldlines)
 794                return error("new file depends on old contents");
 795        if (patch->is_delete != !newlines) {
 796                if (newlines)
 797                        return error("deleted file still has contents");
 798                fprintf(stderr, "** warning: file %s becomes empty but is not deleted\n", patch->new_name);
 799        }
 800
 801        /* Parse the thing.. */
 802        line += len;
 803        size -= len;
 804        linenr++;
 805        added = deleted = 0;
 806        for (offset = len; size > 0; offset += len, size -= len, line += len, linenr++) {
 807                if (!oldlines && !newlines)
 808                        break;
 809                len = linelen(line, size);
 810                if (!len || line[len-1] != '\n')
 811                        return -1;
 812                switch (*line) {
 813                default:
 814                        return -1;
 815                case ' ':
 816                        oldlines--;
 817                        newlines--;
 818                        break;
 819                case '-':
 820                        deleted++;
 821                        oldlines--;
 822                        break;
 823                case '+':
 824                        /*
 825                         * We know len is at least two, since we have a '+' and
 826                         * we checked that the last character was a '\n' above
 827                         */
 828                        if (isspace(line[len-2])) {
 829                                switch (new_whitespace) {
 830                                case nowarn:
 831                                        break;
 832                                case warn_on_whitespace:
 833                                        new_whitespace = nowarn;        /* Just once */
 834                                        error("Added whitespace at end of line at line %d", linenr);
 835                                        break;
 836                                case error_on_whitespace:
 837                                        die("Added whitespace at end of line at line %d", linenr);
 838                                }
 839                        }
 840                        added++;
 841                        newlines--;
 842                        break;
 843
 844                /* We allow "\ No newline at end of file". Depending
 845                 * on locale settings when the patch was produced we
 846                 * don't know what this line looks like. The only
 847                 * thing we do know is that it begins with "\ ".
 848                 * Checking for 12 is just for sanity check -- any
 849                 * l10n of "\ No newline..." is at least that long.
 850                 */
 851                case '\\':
 852                        if (len < 12 || memcmp(line, "\\ ", 2))
 853                                return -1;
 854                        break;
 855                }
 856        }
 857        /* If a fragment ends with an incomplete line, we failed to include
 858         * it in the above loop because we hit oldlines == newlines == 0
 859         * before seeing it.
 860         */
 861        if (12 < size && !memcmp(line, "\\ ", 2))
 862                offset += linelen(line, size);
 863
 864        patch->lines_added += added;
 865        patch->lines_deleted += deleted;
 866        return offset;
 867}
 868
 869static int parse_single_patch(char *line, unsigned long size, struct patch *patch)
 870{
 871        unsigned long offset = 0;
 872        struct fragment **fragp = &patch->fragments;
 873
 874        while (size > 4 && !memcmp(line, "@@ -", 4)) {
 875                struct fragment *fragment;
 876                int len;
 877
 878                fragment = xmalloc(sizeof(*fragment));
 879                memset(fragment, 0, sizeof(*fragment));
 880                len = parse_fragment(line, size, patch, fragment);
 881                if (len <= 0)
 882                        die("corrupt patch at line %d", linenr);
 883
 884                fragment->patch = line;
 885                fragment->size = len;
 886
 887                *fragp = fragment;
 888                fragp = &fragment->next;
 889
 890                offset += len;
 891                line += len;
 892                size -= len;
 893        }
 894        return offset;
 895}
 896
 897static inline int metadata_changes(struct patch *patch)
 898{
 899        return  patch->is_rename > 0 ||
 900                patch->is_copy > 0 ||
 901                patch->is_new > 0 ||
 902                patch->is_delete ||
 903                (patch->old_mode && patch->new_mode &&
 904                 patch->old_mode != patch->new_mode);
 905}
 906
 907static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
 908{
 909        int hdrsize, patchsize;
 910        int offset = find_header(buffer, size, &hdrsize, patch);
 911
 912        if (offset < 0)
 913                return offset;
 914
 915        patchsize = parse_single_patch(buffer + offset + hdrsize, size - offset - hdrsize, patch);
 916
 917        if (!patchsize) {
 918                static const char *binhdr[] = {
 919                        "Binary files ",
 920                        "Files ",
 921                        NULL,
 922                };
 923                int i;
 924                int hd = hdrsize + offset;
 925                unsigned long llen = linelen(buffer + hd, size - hd);
 926
 927                if (!memcmp(" differ\n", buffer + hd + llen - 8, 8))
 928                        for (i = 0; binhdr[i]; i++) {
 929                                int len = strlen(binhdr[i]);
 930                                if (len < size - hd &&
 931                                    !memcmp(binhdr[i], buffer + hd, len)) {
 932                                        patch->is_binary = 1;
 933                                        break;
 934                                }
 935                        }
 936
 937                /* Empty patch cannot be applied if:
 938                 * - it is a binary patch and we do not do binary_replace, or
 939                 * - text patch without metadata change
 940                 */
 941                if ((apply || check) &&
 942                    (patch->is_binary
 943                     ? !allow_binary_replacement
 944                     : !metadata_changes(patch)))
 945                        die("patch with only garbage at line %d", linenr);
 946        }
 947
 948        return offset + hdrsize + patchsize;
 949}
 950
 951static const char pluses[] = "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++";
 952static const char minuses[]= "----------------------------------------------------------------------";
 953
 954static void show_stats(struct patch *patch)
 955{
 956        const char *prefix = "";
 957        char *name = patch->new_name;
 958        char *qname = NULL;
 959        int len, max, add, del, total;
 960
 961        if (!name)
 962                name = patch->old_name;
 963
 964        if (0 < (len = quote_c_style(name, NULL, NULL, 0))) {
 965                qname = xmalloc(len + 1);
 966                quote_c_style(name, qname, NULL, 0);
 967                name = qname;
 968        }
 969
 970        /*
 971         * "scale" the filename
 972         */
 973        len = strlen(name);
 974        max = max_len;
 975        if (max > 50)
 976                max = 50;
 977        if (len > max) {
 978                char *slash;
 979                prefix = "...";
 980                max -= 3;
 981                name += len - max;
 982                slash = strchr(name, '/');
 983                if (slash)
 984                        name = slash;
 985        }
 986        len = max;
 987
 988        /*
 989         * scale the add/delete
 990         */
 991        max = max_change;
 992        if (max + len > 70)
 993                max = 70 - len;
 994
 995        add = patch->lines_added;
 996        del = patch->lines_deleted;
 997        total = add + del;
 998
 999        if (max_change > 0) {
1000                total = (total * max + max_change / 2) / max_change;
1001                add = (add * max + max_change / 2) / max_change;
1002                del = total - add;
1003        }
1004        if (patch->is_binary)
1005                printf(" %s%-*s |  Bin\n", prefix, len, name);
1006        else
1007                printf(" %s%-*s |%5d %.*s%.*s\n", prefix,
1008                       len, name, patch->lines_added + patch->lines_deleted,
1009                       add, pluses, del, minuses);
1010        if (qname)
1011                free(qname);
1012}
1013
1014static int read_old_data(struct stat *st, const char *path, void *buf, unsigned long size)
1015{
1016        int fd;
1017        unsigned long got;
1018
1019        switch (st->st_mode & S_IFMT) {
1020        case S_IFLNK:
1021                return readlink(path, buf, size);
1022        case S_IFREG:
1023                fd = open(path, O_RDONLY);
1024                if (fd < 0)
1025                        return error("unable to open %s", path);
1026                got = 0;
1027                for (;;) {
1028                        int ret = xread(fd, buf + got, size - got);
1029                        if (ret <= 0)
1030                                break;
1031                        got += ret;
1032                }
1033                close(fd);
1034                return got;
1035
1036        default:
1037                return -1;
1038        }
1039}
1040
1041static int find_offset(const char *buf, unsigned long size, const char *fragment, unsigned long fragsize, int line)
1042{
1043        int i;
1044        unsigned long start, backwards, forwards;
1045
1046        if (fragsize > size)
1047                return -1;
1048
1049        start = 0;
1050        if (line > 1) {
1051                unsigned long offset = 0;
1052                i = line-1;
1053                while (offset + fragsize <= size) {
1054                        if (buf[offset++] == '\n') {
1055                                start = offset;
1056                                if (!--i)
1057                                        break;
1058                        }
1059                }
1060        }
1061
1062        /* Exact line number? */
1063        if (!memcmp(buf + start, fragment, fragsize))
1064                return start;
1065
1066        /*
1067         * There's probably some smart way to do this, but I'll leave
1068         * that to the smart and beautiful people. I'm simple and stupid.
1069         */
1070        backwards = start;
1071        forwards = start;
1072        for (i = 0; ; i++) {
1073                unsigned long try;
1074                int n;
1075
1076                /* "backward" */
1077                if (i & 1) {
1078                        if (!backwards) {
1079                                if (forwards + fragsize > size)
1080                                        break;
1081                                continue;
1082                        }
1083                        do {
1084                                --backwards;
1085                        } while (backwards && buf[backwards-1] != '\n');
1086                        try = backwards;
1087                } else {
1088                        while (forwards + fragsize <= size) {
1089                                if (buf[forwards++] == '\n')
1090                                        break;
1091                        }
1092                        try = forwards;
1093                }
1094
1095                if (try + fragsize > size)
1096                        continue;
1097                if (memcmp(buf + try, fragment, fragsize))
1098                        continue;
1099                n = (i >> 1)+1;
1100                if (i & 1)
1101                        n = -n;
1102                return try;
1103        }
1104
1105        /*
1106         * We should start searching forward and backward.
1107         */
1108        return -1;
1109}
1110
1111struct buffer_desc {
1112        char *buffer;
1113        unsigned long size;
1114        unsigned long alloc;
1115};
1116
1117static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
1118{
1119        char *buf = desc->buffer;
1120        const char *patch = frag->patch;
1121        int offset, size = frag->size;
1122        char *old = xmalloc(size);
1123        char *new = xmalloc(size);
1124        int oldsize = 0, newsize = 0;
1125
1126        while (size > 0) {
1127                int len = linelen(patch, size);
1128                int plen;
1129
1130                if (!len)
1131                        break;
1132
1133                /*
1134                 * "plen" is how much of the line we should use for
1135                 * the actual patch data. Normally we just remove the
1136                 * first character on the line, but if the line is
1137                 * followed by "\ No newline", then we also remove the
1138                 * last one (which is the newline, of course).
1139                 */
1140                plen = len-1;
1141                if (len < size && patch[len] == '\\')
1142                        plen--;
1143                switch (*patch) {
1144                case ' ':
1145                case '-':
1146                        memcpy(old + oldsize, patch + 1, plen);
1147                        oldsize += plen;
1148                        if (*patch == '-')
1149                                break;
1150                /* Fall-through for ' ' */
1151                case '+':
1152                        if (*patch != '+' || !no_add) {
1153                                memcpy(new + newsize, patch + 1, plen);
1154                                newsize += plen;
1155                        }
1156                        break;
1157                case '@': case '\\':
1158                        /* Ignore it, we already handled it */
1159                        break;
1160                default:
1161                        return -1;
1162                }
1163                patch += len;
1164                size -= len;
1165        }
1166
1167#ifdef NO_ACCURATE_DIFF
1168        if (oldsize > 0 && old[oldsize - 1] == '\n' &&
1169                        newsize > 0 && new[newsize - 1] == '\n') {
1170                oldsize--;
1171                newsize--;
1172        }
1173#endif
1174                        
1175        offset = find_offset(buf, desc->size, old, oldsize, frag->newpos);
1176        if (offset >= 0) {
1177                int diff = newsize - oldsize;
1178                unsigned long size = desc->size + diff;
1179                unsigned long alloc = desc->alloc;
1180
1181                if (size > alloc) {
1182                        alloc = size + 8192;
1183                        desc->alloc = alloc;
1184                        buf = xrealloc(buf, alloc);
1185                        desc->buffer = buf;
1186                }
1187                desc->size = size;
1188                memmove(buf + offset + newsize, buf + offset + oldsize, size - offset - newsize);
1189                memcpy(buf + offset, new, newsize);
1190                offset = 0;
1191        }
1192
1193        free(old);
1194        free(new);
1195        return offset;
1196}
1197
1198static int apply_fragments(struct buffer_desc *desc, struct patch *patch)
1199{
1200        struct fragment *frag = patch->fragments;
1201        const char *name = patch->old_name ? patch->old_name : patch->new_name;
1202
1203        if (patch->is_binary) {
1204                unsigned char sha1[20];
1205
1206                if (!allow_binary_replacement)
1207                        return error("cannot apply binary patch to '%s' "
1208                                     "without --allow-binary-replacement",
1209                                     name);
1210
1211                /* For safety, we require patch index line to contain
1212                 * full 40-byte textual SHA1 for old and new, at least for now.
1213                 */
1214                if (strlen(patch->old_sha1_prefix) != 40 ||
1215                    strlen(patch->new_sha1_prefix) != 40 ||
1216                    get_sha1_hex(patch->old_sha1_prefix, sha1) ||
1217                    get_sha1_hex(patch->new_sha1_prefix, sha1))
1218                        return error("cannot apply binary patch to '%s' "
1219                                     "without full index line", name);
1220
1221                if (patch->old_name) {
1222                        unsigned char hdr[50];
1223                        int hdrlen;
1224
1225                        /* See if the old one matches what the patch
1226                         * applies to.
1227                         */
1228                        write_sha1_file_prepare(desc->buffer, desc->size,
1229                                                "blob", sha1, hdr, &hdrlen);
1230                        if (strcmp(sha1_to_hex(sha1), patch->old_sha1_prefix))
1231                                return error("the patch applies to '%s' (%s), "
1232                                             "which does not match the "
1233                                             "current contents.",
1234                                             name, sha1_to_hex(sha1));
1235                }
1236                else {
1237                        /* Otherwise, the old one must be empty. */
1238                        if (desc->size)
1239                                return error("the patch applies to an empty "
1240                                             "'%s' but it is not empty", name);
1241                }
1242
1243                /* For now, we do not record post-image data in the patch,
1244                 * and require the object already present in the recipient's
1245                 * object database.
1246                 */
1247                if (desc->buffer) {
1248                        free(desc->buffer);
1249                        desc->alloc = desc->size = 0;
1250                }
1251                get_sha1_hex(patch->new_sha1_prefix, sha1);
1252
1253                if (memcmp(sha1, null_sha1, 20)) {
1254                        char type[10];
1255                        unsigned long size;
1256
1257                        desc->buffer = read_sha1_file(sha1, type, &size);
1258                        if (!desc->buffer)
1259                                return error("the necessary postimage %s for "
1260                                             "'%s' does not exist",
1261                                             patch->new_sha1_prefix, name);
1262                        desc->alloc = desc->size = size;
1263                }
1264
1265                return 0;
1266        }
1267
1268        while (frag) {
1269                if (apply_one_fragment(desc, frag) < 0)
1270                        return error("patch failed: %s:%ld",
1271                                     name, frag->oldpos);
1272                frag = frag->next;
1273        }
1274        return 0;
1275}
1276
1277static int apply_data(struct patch *patch, struct stat *st)
1278{
1279        char *buf;
1280        unsigned long size, alloc;
1281        struct buffer_desc desc;
1282
1283        size = 0;
1284        alloc = 0;
1285        buf = NULL;
1286        if (patch->old_name) {
1287                size = st->st_size;
1288                alloc = size + 8192;
1289                buf = xmalloc(alloc);
1290                if (read_old_data(st, patch->old_name, buf, alloc) != size)
1291                        return error("read of %s failed", patch->old_name);
1292        }
1293
1294        desc.size = size;
1295        desc.alloc = alloc;
1296        desc.buffer = buf;
1297        if (apply_fragments(&desc, patch) < 0)
1298                return -1;
1299        patch->result = desc.buffer;
1300        patch->resultsize = desc.size;
1301
1302        if (patch->is_delete && patch->resultsize)
1303                return error("removal patch leaves file contents");
1304
1305        return 0;
1306}
1307
1308static int check_patch(struct patch *patch)
1309{
1310        struct stat st;
1311        const char *old_name = patch->old_name;
1312        const char *new_name = patch->new_name;
1313        const char *name = old_name ? old_name : new_name;
1314
1315        if (old_name) {
1316                int changed;
1317                int stat_ret = lstat(old_name, &st);
1318
1319                if (check_index) {
1320                        int pos = cache_name_pos(old_name, strlen(old_name));
1321                        if (pos < 0)
1322                                return error("%s: does not exist in index",
1323                                             old_name);
1324                        if (stat_ret < 0) {
1325                                struct checkout costate;
1326                                if (errno != ENOENT)
1327                                        return error("%s: %s", old_name,
1328                                                     strerror(errno));
1329                                /* checkout */
1330                                costate.base_dir = "";
1331                                costate.base_dir_len = 0;
1332                                costate.force = 0;
1333                                costate.quiet = 0;
1334                                costate.not_new = 0;
1335                                costate.refresh_cache = 1;
1336                                if (checkout_entry(active_cache[pos],
1337                                                   &costate) ||
1338                                    lstat(old_name, &st))
1339                                        return -1;
1340                        }
1341
1342                        changed = ce_match_stat(active_cache[pos], &st, 1);
1343                        if (changed)
1344                                return error("%s: does not match index",
1345                                             old_name);
1346                }
1347                else if (stat_ret < 0)
1348                        return error("%s: %s", old_name, strerror(errno));
1349
1350                if (patch->is_new < 0)
1351                        patch->is_new = 0;
1352                st.st_mode = ntohl(create_ce_mode(st.st_mode));
1353                if (!patch->old_mode)
1354                        patch->old_mode = st.st_mode;
1355                if ((st.st_mode ^ patch->old_mode) & S_IFMT)
1356                        return error("%s: wrong type", old_name);
1357                if (st.st_mode != patch->old_mode)
1358                        fprintf(stderr, "warning: %s has type %o, expected %o\n",
1359                                old_name, st.st_mode, patch->old_mode);
1360        }
1361
1362        if (new_name && (patch->is_new | patch->is_rename | patch->is_copy)) {
1363                if (check_index && cache_name_pos(new_name, strlen(new_name)) >= 0)
1364                        return error("%s: already exists in index", new_name);
1365                if (!lstat(new_name, &st))
1366                        return error("%s: already exists in working directory", new_name);
1367                if (errno != ENOENT)
1368                        return error("%s: %s", new_name, strerror(errno));
1369                if (!patch->new_mode) {
1370                        if (patch->is_new)
1371                                patch->new_mode = S_IFREG | 0644;
1372                        else
1373                                patch->new_mode = patch->old_mode;
1374                }
1375        }
1376
1377        if (new_name && old_name) {
1378                int same = !strcmp(old_name, new_name);
1379                if (!patch->new_mode)
1380                        patch->new_mode = patch->old_mode;
1381                if ((patch->old_mode ^ patch->new_mode) & S_IFMT)
1382                        return error("new mode (%o) of %s does not match old mode (%o)%s%s",
1383                                patch->new_mode, new_name, patch->old_mode,
1384                                same ? "" : " of ", same ? "" : old_name);
1385        }       
1386
1387        if (apply_data(patch, &st) < 0)
1388                return error("%s: patch does not apply", name);
1389        return 0;
1390}
1391
1392static int check_patch_list(struct patch *patch)
1393{
1394        int error = 0;
1395
1396        for (;patch ; patch = patch->next)
1397                error |= check_patch(patch);
1398        return error;
1399}
1400
1401static inline int is_null_sha1(const unsigned char *sha1)
1402{
1403        return !memcmp(sha1, null_sha1, 20);
1404}
1405
1406static void show_index_list(struct patch *list)
1407{
1408        struct patch *patch;
1409
1410        /* Once we start supporting the reverse patch, it may be
1411         * worth showing the new sha1 prefix, but until then...
1412         */
1413        for (patch = list; patch; patch = patch->next) {
1414                const unsigned char *sha1_ptr;
1415                unsigned char sha1[20];
1416                const char *name;
1417
1418                name = patch->old_name ? patch->old_name : patch->new_name;
1419                if (patch->is_new)
1420                        sha1_ptr = null_sha1;
1421                else if (get_sha1(patch->old_sha1_prefix, sha1))
1422                        die("sha1 information is lacking or useless (%s).",
1423                            name);
1424                else
1425                        sha1_ptr = sha1;
1426
1427                printf("%06o %s ",patch->old_mode, sha1_to_hex(sha1_ptr));
1428                if (line_termination && quote_c_style(name, NULL, NULL, 0))
1429                        quote_c_style(name, NULL, stdout, 0);
1430                else
1431                        fputs(name, stdout);
1432                putchar(line_termination);
1433        }
1434}
1435
1436static void stat_patch_list(struct patch *patch)
1437{
1438        int files, adds, dels;
1439
1440        for (files = adds = dels = 0 ; patch ; patch = patch->next) {
1441                files++;
1442                adds += patch->lines_added;
1443                dels += patch->lines_deleted;
1444                show_stats(patch);
1445        }
1446
1447        printf(" %d files changed, %d insertions(+), %d deletions(-)\n", files, adds, dels);
1448}
1449
1450static void numstat_patch_list(struct patch *patch)
1451{
1452        for ( ; patch; patch = patch->next) {
1453                const char *name;
1454                name = patch->old_name ? patch->old_name : patch->new_name;
1455                printf("%d\t%d\t", patch->lines_added, patch->lines_deleted);
1456                if (line_termination && quote_c_style(name, NULL, NULL, 0))
1457                        quote_c_style(name, NULL, stdout, 0);
1458                else
1459                        fputs(name, stdout);
1460                putchar('\n');
1461        }
1462}
1463
1464static void show_file_mode_name(const char *newdelete, unsigned int mode, const char *name)
1465{
1466        if (mode)
1467                printf(" %s mode %06o %s\n", newdelete, mode, name);
1468        else
1469                printf(" %s %s\n", newdelete, name);
1470}
1471
1472static void show_mode_change(struct patch *p, int show_name)
1473{
1474        if (p->old_mode && p->new_mode && p->old_mode != p->new_mode) {
1475                if (show_name)
1476                        printf(" mode change %06o => %06o %s\n",
1477                               p->old_mode, p->new_mode, p->new_name);
1478                else
1479                        printf(" mode change %06o => %06o\n",
1480                               p->old_mode, p->new_mode);
1481        }
1482}
1483
1484static void show_rename_copy(struct patch *p)
1485{
1486        const char *renamecopy = p->is_rename ? "rename" : "copy";
1487        const char *old, *new;
1488
1489        /* Find common prefix */
1490        old = p->old_name;
1491        new = p->new_name;
1492        while (1) {
1493                const char *slash_old, *slash_new;
1494                slash_old = strchr(old, '/');
1495                slash_new = strchr(new, '/');
1496                if (!slash_old ||
1497                    !slash_new ||
1498                    slash_old - old != slash_new - new ||
1499                    memcmp(old, new, slash_new - new))
1500                        break;
1501                old = slash_old + 1;
1502                new = slash_new + 1;
1503        }
1504        /* p->old_name thru old is the common prefix, and old and new
1505         * through the end of names are renames
1506         */
1507        if (old != p->old_name)
1508                printf(" %s %.*s{%s => %s} (%d%%)\n", renamecopy,
1509                       (int)(old - p->old_name), p->old_name,
1510                       old, new, p->score);
1511        else
1512                printf(" %s %s => %s (%d%%)\n", renamecopy,
1513                       p->old_name, p->new_name, p->score);
1514        show_mode_change(p, 0);
1515}
1516
1517static void summary_patch_list(struct patch *patch)
1518{
1519        struct patch *p;
1520
1521        for (p = patch; p; p = p->next) {
1522                if (p->is_new)
1523                        show_file_mode_name("create", p->new_mode, p->new_name);
1524                else if (p->is_delete)
1525                        show_file_mode_name("delete", p->old_mode, p->old_name);
1526                else {
1527                        if (p->is_rename || p->is_copy)
1528                                show_rename_copy(p);
1529                        else {
1530                                if (p->score) {
1531                                        printf(" rewrite %s (%d%%)\n",
1532                                               p->new_name, p->score);
1533                                        show_mode_change(p, 0);
1534                                }
1535                                else
1536                                        show_mode_change(p, 1);
1537                        }
1538                }
1539        }
1540}
1541
1542static void patch_stats(struct patch *patch)
1543{
1544        int lines = patch->lines_added + patch->lines_deleted;
1545
1546        if (lines > max_change)
1547                max_change = lines;
1548        if (patch->old_name) {
1549                int len = quote_c_style(patch->old_name, NULL, NULL, 0);
1550                if (!len)
1551                        len = strlen(patch->old_name);
1552                if (len > max_len)
1553                        max_len = len;
1554        }
1555        if (patch->new_name) {
1556                int len = quote_c_style(patch->new_name, NULL, NULL, 0);
1557                if (!len)
1558                        len = strlen(patch->new_name);
1559                if (len > max_len)
1560                        max_len = len;
1561        }
1562}
1563
1564static void remove_file(struct patch *patch)
1565{
1566        if (write_index) {
1567                if (remove_file_from_cache(patch->old_name) < 0)
1568                        die("unable to remove %s from index", patch->old_name);
1569        }
1570        unlink(patch->old_name);
1571}
1572
1573static void add_index_file(const char *path, unsigned mode, void *buf, unsigned long size)
1574{
1575        struct stat st;
1576        struct cache_entry *ce;
1577        int namelen = strlen(path);
1578        unsigned ce_size = cache_entry_size(namelen);
1579
1580        if (!write_index)
1581                return;
1582
1583        ce = xmalloc(ce_size);
1584        memset(ce, 0, ce_size);
1585        memcpy(ce->name, path, namelen);
1586        ce->ce_mode = create_ce_mode(mode);
1587        ce->ce_flags = htons(namelen);
1588        if (lstat(path, &st) < 0)
1589                die("unable to stat newly created file %s", path);
1590        fill_stat_cache_info(ce, &st);
1591        if (write_sha1_file(buf, size, "blob", ce->sha1) < 0)
1592                die("unable to create backing store for newly created file %s", path);
1593        if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD) < 0)
1594                die("unable to add cache entry for %s", path);
1595}
1596
1597static int try_create_file(const char *path, unsigned int mode, const char *buf, unsigned long size)
1598{
1599        int fd;
1600
1601        if (S_ISLNK(mode))
1602                return symlink(buf, path);
1603        fd = open(path, O_CREAT | O_EXCL | O_WRONLY, (mode & 0100) ? 0777 : 0666);
1604        if (fd < 0)
1605                return -1;
1606        while (size) {
1607                int written = xwrite(fd, buf, size);
1608                if (written < 0)
1609                        die("writing file %s: %s", path, strerror(errno));
1610                if (!written)
1611                        die("out of space writing file %s", path);
1612                buf += written;
1613                size -= written;
1614        }
1615        if (close(fd) < 0)
1616                die("closing file %s: %s", path, strerror(errno));
1617        return 0;
1618}
1619
1620/*
1621 * We optimistically assume that the directories exist,
1622 * which is true 99% of the time anyway. If they don't,
1623 * we create them and try again.
1624 */
1625static void create_one_file(char *path, unsigned mode, const char *buf, unsigned long size)
1626{
1627        if (!try_create_file(path, mode, buf, size))
1628                return;
1629
1630        if (errno == ENOENT) {
1631                if (safe_create_leading_directories(path))
1632                        return;
1633                if (!try_create_file(path, mode, buf, size))
1634                        return;
1635        }
1636
1637        if (errno == EEXIST) {
1638                unsigned int nr = getpid();
1639
1640                for (;;) {
1641                        const char *newpath;
1642                        newpath = mkpath("%s~%u", path, nr);
1643                        if (!try_create_file(newpath, mode, buf, size)) {
1644                                if (!rename(newpath, path))
1645                                        return;
1646                                unlink(newpath);
1647                                break;
1648                        }
1649                        if (errno != EEXIST)
1650                                break;
1651                        ++nr;
1652                }
1653        }
1654        die("unable to write file %s mode %o", path, mode);
1655}
1656
1657static void create_file(struct patch *patch)
1658{
1659        char *path = patch->new_name;
1660        unsigned mode = patch->new_mode;
1661        unsigned long size = patch->resultsize;
1662        char *buf = patch->result;
1663
1664        if (!mode)
1665                mode = S_IFREG | 0644;
1666        create_one_file(path, mode, buf, size); 
1667        add_index_file(path, mode, buf, size);
1668}
1669
1670static void write_out_one_result(struct patch *patch)
1671{
1672        if (patch->is_delete > 0) {
1673                remove_file(patch);
1674                return;
1675        }
1676        if (patch->is_new > 0 || patch->is_copy) {
1677                create_file(patch);
1678                return;
1679        }
1680        /*
1681         * Rename or modification boils down to the same
1682         * thing: remove the old, write the new
1683         */
1684        remove_file(patch);
1685        create_file(patch);
1686}
1687
1688static void write_out_results(struct patch *list, int skipped_patch)
1689{
1690        if (!list && !skipped_patch)
1691                die("No changes");
1692
1693        while (list) {
1694                write_out_one_result(list);
1695                list = list->next;
1696        }
1697}
1698
1699static struct cache_file cache_file;
1700
1701static struct excludes {
1702        struct excludes *next;
1703        const char *path;
1704} *excludes;
1705
1706static int use_patch(struct patch *p)
1707{
1708        const char *pathname = p->new_name ? p->new_name : p->old_name;
1709        struct excludes *x = excludes;
1710        while (x) {
1711                if (fnmatch(x->path, pathname, 0) == 0)
1712                        return 0;
1713                x = x->next;
1714        }
1715        if (0 < prefix_length) {
1716                int pathlen = strlen(pathname);
1717                if (pathlen <= prefix_length ||
1718                    memcmp(prefix, pathname, prefix_length))
1719                        return 0;
1720        }
1721        return 1;
1722}
1723
1724static int apply_patch(int fd)
1725{
1726        int newfd;
1727        unsigned long offset, size;
1728        char *buffer = read_patch_file(fd, &size);
1729        struct patch *list = NULL, **listp = &list;
1730        int skipped_patch = 0;
1731
1732        if (!buffer)
1733                return -1;
1734        offset = 0;
1735        while (size > 0) {
1736                struct patch *patch;
1737                int nr;
1738
1739                patch = xmalloc(sizeof(*patch));
1740                memset(patch, 0, sizeof(*patch));
1741                nr = parse_chunk(buffer + offset, size, patch);
1742                if (nr < 0)
1743                        break;
1744                if (use_patch(patch)) {
1745                        patch_stats(patch);
1746                        *listp = patch;
1747                        listp = &patch->next;
1748                } else {
1749                        /* perhaps free it a bit better? */
1750                        free(patch);
1751                        skipped_patch++;
1752                }
1753                offset += nr;
1754                size -= nr;
1755        }
1756
1757        newfd = -1;
1758        write_index = check_index && apply;
1759        if (write_index)
1760                newfd = hold_index_file_for_update(&cache_file, get_index_file());
1761        if (check_index) {
1762                if (read_cache() < 0)
1763                        die("unable to read index file");
1764        }
1765
1766        if ((check || apply) && check_patch_list(list) < 0)
1767                exit(1);
1768
1769        if (apply)
1770                write_out_results(list, skipped_patch);
1771
1772        if (write_index) {
1773                if (write_cache(newfd, active_cache, active_nr) ||
1774                    commit_index_file(&cache_file))
1775                        die("Unable to write new cachefile");
1776        }
1777
1778        if (show_index_info)
1779                show_index_list(list);
1780
1781        if (diffstat)
1782                stat_patch_list(list);
1783
1784        if (numstat)
1785                numstat_patch_list(list);
1786
1787        if (summary)
1788                summary_patch_list(list);
1789
1790        free(buffer);
1791        return 0;
1792}
1793
1794int main(int argc, char **argv)
1795{
1796        int i;
1797        int read_stdin = 1;
1798
1799        for (i = 1; i < argc; i++) {
1800                const char *arg = argv[i];
1801                int fd;
1802
1803                if (!strcmp(arg, "-")) {
1804                        apply_patch(0);
1805                        read_stdin = 0;
1806                        continue;
1807                }
1808                if (!strncmp(arg, "--exclude=", 10)) {
1809                        struct excludes *x = xmalloc(sizeof(*x));
1810                        x->path = arg + 10;
1811                        x->next = excludes;
1812                        excludes = x;
1813                        continue;
1814                }
1815                if (!strncmp(arg, "-p", 2)) {
1816                        p_value = atoi(arg + 2);
1817                        continue;
1818                }
1819                if (!strcmp(arg, "--no-add")) {
1820                        no_add = 1;
1821                        continue;
1822                }
1823                if (!strcmp(arg, "--stat")) {
1824                        apply = 0;
1825                        diffstat = 1;
1826                        continue;
1827                }
1828                if (!strcmp(arg, "--allow-binary-replacement")) {
1829                        allow_binary_replacement = 1;
1830                        continue;
1831                }
1832                if (!strcmp(arg, "--numstat")) {
1833                        apply = 0;
1834                        numstat = 1;
1835                        continue;
1836                }
1837                if (!strcmp(arg, "--summary")) {
1838                        apply = 0;
1839                        summary = 1;
1840                        continue;
1841                }
1842                if (!strcmp(arg, "--check")) {
1843                        apply = 0;
1844                        check = 1;
1845                        continue;
1846                }
1847                if (!strcmp(arg, "--index")) {
1848                        check_index = 1;
1849                        continue;
1850                }
1851                if (!strcmp(arg, "--apply")) {
1852                        apply = 1;
1853                        continue;
1854                }
1855                if (!strcmp(arg, "--index-info")) {
1856                        apply = 0;
1857                        show_index_info = 1;
1858                        continue;
1859                }
1860                if (!strcmp(arg, "-z")) {
1861                        line_termination = 0;
1862                        continue;
1863                }
1864                if (!strncmp(arg, "--whitespace=", 13)) {
1865                        if (strcmp(arg+13, "warn")) {
1866                                new_whitespace = warn_on_whitespace;
1867                                continue;
1868                        }
1869                        if (strcmp(arg+13, "error")) {
1870                                new_whitespace = error_on_whitespace;
1871                                continue;
1872                        }
1873                        die("unrecognixed whitespace option '%s'", arg+13);
1874                }
1875
1876                if (check_index && prefix_length < 0) {
1877                        prefix = setup_git_directory();
1878                        prefix_length = prefix ? strlen(prefix) : 0;
1879                        git_config(git_default_config);
1880                }
1881                if (0 < prefix_length)
1882                        arg = prefix_filename(prefix, prefix_length, arg);
1883
1884                fd = open(arg, O_RDONLY);
1885                if (fd < 0)
1886                        usage(apply_usage);
1887                read_stdin = 0;
1888                apply_patch(fd);
1889                close(fd);
1890        }
1891        if (read_stdin)
1892                apply_patch(0);
1893        return 0;
1894}