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