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 "cache.h" 10#include "cache-tree.h" 11#include "quote.h" 12#include "blob.h" 13#include "delta.h" 14#include "builtin.h" 15 16/* 17 * --check turns on checking that the working tree matches the 18 * files that are being modified, but doesn't apply the patch 19 * --stat does just a diffstat, and doesn't actually apply 20 * --numstat does numeric diffstat, and doesn't actually apply 21 * --index-info shows the old and new index info for paths if available. 22 * --index updates the cache as well. 23 * --cached updates only the cache without ever touching the working tree. 24 */ 25static const char *prefix; 26static int prefix_length = -1; 27static int newfd = -1; 28 29static int unidiff_zero; 30static int p_value = 1; 31static int p_value_known; 32static int check_index; 33static int update_index; 34static int cached; 35static int diffstat; 36static int numstat; 37static int summary; 38static int check; 39static int apply = 1; 40static int apply_in_reverse; 41static int apply_with_reject; 42static int apply_verbosely; 43static int no_add; 44static const char *fake_ancestor; 45static int line_termination = '\n'; 46static unsigned long p_context = ULONG_MAX; 47static const char apply_usage[] = 48"git-apply [--stat] [--numstat] [--summary] [--check] [--index] [--cached] [--apply] [--no-add] [--index-info] [--allow-binary-replacement] [--reverse] [--reject] [--verbose] [-z] [-pNUM] [-CNUM] [--whitespace=<nowarn|warn|fix|error|error-all>] <patch>..."; 49 50static enum ws_error_action { 51 nowarn_ws_error, 52 warn_on_ws_error, 53 die_on_ws_error, 54 correct_ws_error, 55} ws_error_action = warn_on_ws_error; 56static int whitespace_error; 57static int squelch_whitespace_errors = 5; 58static int applied_after_fixing_ws; 59static const char *patch_input_file; 60 61static void parse_whitespace_option(const char *option) 62{ 63 if (!option) { 64 ws_error_action = warn_on_ws_error; 65 return; 66 } 67 if (!strcmp(option, "warn")) { 68 ws_error_action = warn_on_ws_error; 69 return; 70 } 71 if (!strcmp(option, "nowarn")) { 72 ws_error_action = nowarn_ws_error; 73 return; 74 } 75 if (!strcmp(option, "error")) { 76 ws_error_action = die_on_ws_error; 77 return; 78 } 79 if (!strcmp(option, "error-all")) { 80 ws_error_action = die_on_ws_error; 81 squelch_whitespace_errors = 0; 82 return; 83 } 84 if (!strcmp(option, "strip") || !strcmp(option, "fix")) { 85 ws_error_action = correct_ws_error; 86 return; 87 } 88 die("unrecognized whitespace option '%s'", option); 89} 90 91static void set_default_whitespace_mode(const char *whitespace_option) 92{ 93 if (!whitespace_option && !apply_default_whitespace) 94 ws_error_action = (apply ? warn_on_ws_error : nowarn_ws_error); 95} 96 97/* 98 * For "diff-stat" like behaviour, we keep track of the biggest change 99 * we've seen, and the longest filename. That allows us to do simple 100 * scaling. 101 */ 102static int max_change, max_len; 103 104/* 105 * Various "current state", notably line numbers and what 106 * file (and how) we're patching right now.. The "is_xxxx" 107 * things are flags, where -1 means "don't know yet". 108 */ 109static int linenr = 1; 110 111/* 112 * This represents one "hunk" from a patch, starting with 113 * "@@ -oldpos,oldlines +newpos,newlines @@" marker. The 114 * patch text is pointed at by patch, and its byte length 115 * is stored in size. leading and trailing are the number 116 * of context lines. 117 */ 118struct fragment { 119 unsigned long leading, trailing; 120 unsigned long oldpos, oldlines; 121 unsigned long newpos, newlines; 122 const char *patch; 123 int size; 124 int rejected; 125 struct fragment *next; 126}; 127 128/* 129 * When dealing with a binary patch, we reuse "leading" field 130 * to store the type of the binary hunk, either deflated "delta" 131 * or deflated "literal". 132 */ 133#define binary_patch_method leading 134#define BINARY_DELTA_DEFLATED 1 135#define BINARY_LITERAL_DEFLATED 2 136 137/* 138 * This represents a "patch" to a file, both metainfo changes 139 * such as creation/deletion, filemode and content changes represented 140 * as a series of fragments. 141 */ 142struct patch { 143 char *new_name, *old_name, *def_name; 144 unsigned int old_mode, new_mode; 145 int is_new, is_delete; /* -1 = unknown, 0 = false, 1 = true */ 146 int rejected; 147 unsigned ws_rule; 148 unsigned long deflate_origlen; 149 int lines_added, lines_deleted; 150 int score; 151 unsigned int is_toplevel_relative:1; 152 unsigned int inaccurate_eof:1; 153 unsigned int is_binary:1; 154 unsigned int is_copy:1; 155 unsigned int is_rename:1; 156 struct fragment *fragments; 157 char *result; 158 size_t resultsize; 159 char old_sha1_prefix[41]; 160 char new_sha1_prefix[41]; 161 struct patch *next; 162}; 163 164/* 165 * A line in a file, len-bytes long (includes the terminating LF, 166 * except for an incomplete line at the end if the file ends with 167 * one), and its contents hashes to 'hash'. 168 */ 169struct line { 170 size_t len; 171 unsigned hash : 24; 172 unsigned flag : 8; 173#define LINE_COMMON 1 174}; 175 176/* 177 * This represents a "file", which is an array of "lines". 178 */ 179struct image { 180 char *buf; 181 size_t len; 182 size_t nr; 183 size_t alloc; 184 struct line *line_allocated; 185 struct line *line; 186}; 187 188static uint32_t hash_line(const char *cp, size_t len) 189{ 190 size_t i; 191 uint32_t h; 192 for (i = 0, h = 0; i < len; i++) { 193 if (!isspace(cp[i])) { 194 h = h * 3 + (cp[i] & 0xff); 195 } 196 } 197 return h; 198} 199 200static void add_line_info(struct image *img, const char *bol, size_t len, unsigned flag) 201{ 202 ALLOC_GROW(img->line_allocated, img->nr + 1, img->alloc); 203 img->line_allocated[img->nr].len = len; 204 img->line_allocated[img->nr].hash = hash_line(bol, len); 205 img->line_allocated[img->nr].flag = flag; 206 img->nr++; 207} 208 209static void prepare_image(struct image *image, char *buf, size_t len, 210 int prepare_linetable) 211{ 212 const char *cp, *ep; 213 214 memset(image, 0, sizeof(*image)); 215 image->buf = buf; 216 image->len = len; 217 218 if (!prepare_linetable) 219 return; 220 221 ep = image->buf + image->len; 222 cp = image->buf; 223 while (cp < ep) { 224 const char *next; 225 for (next = cp; next < ep && *next != '\n'; next++) 226 ; 227 if (next < ep) 228 next++; 229 add_line_info(image, cp, next - cp, 0); 230 cp = next; 231 } 232 image->line = image->line_allocated; 233} 234 235static void clear_image(struct image *image) 236{ 237 free(image->buf); 238 image->buf = NULL; 239 image->len = 0; 240} 241 242static void say_patch_name(FILE *output, const char *pre, 243 struct patch *patch, const char *post) 244{ 245 fputs(pre, output); 246 if (patch->old_name && patch->new_name && 247 strcmp(patch->old_name, patch->new_name)) { 248 quote_c_style(patch->old_name, NULL, output, 0); 249 fputs(" => ", output); 250 quote_c_style(patch->new_name, NULL, output, 0); 251 } else { 252 const char *n = patch->new_name; 253 if (!n) 254 n = patch->old_name; 255 quote_c_style(n, NULL, output, 0); 256 } 257 fputs(post, output); 258} 259 260#define CHUNKSIZE (8192) 261#define SLOP (16) 262 263static void read_patch_file(struct strbuf *sb, int fd) 264{ 265 if (strbuf_read(sb, fd, 0) < 0) 266 die("git-apply: read returned %s", strerror(errno)); 267 268 /* 269 * Make sure that we have some slop in the buffer 270 * so that we can do speculative "memcmp" etc, and 271 * see to it that it is NUL-filled. 272 */ 273 strbuf_grow(sb, SLOP); 274 memset(sb->buf + sb->len, 0, SLOP); 275} 276 277static unsigned long linelen(const char *buffer, unsigned long size) 278{ 279 unsigned long len = 0; 280 while (size--) { 281 len++; 282 if (*buffer++ == '\n') 283 break; 284 } 285 return len; 286} 287 288static int is_dev_null(const char *str) 289{ 290 return !memcmp("/dev/null", str, 9) && isspace(str[9]); 291} 292 293#define TERM_SPACE 1 294#define TERM_TAB 2 295 296static int name_terminate(const char *name, int namelen, int c, int terminate) 297{ 298 if (c == ' ' && !(terminate & TERM_SPACE)) 299 return 0; 300 if (c == '\t' && !(terminate & TERM_TAB)) 301 return 0; 302 303 return 1; 304} 305 306static char *find_name(const char *line, char *def, int p_value, int terminate) 307{ 308 int len; 309 const char *start = line; 310 311 if (*line == '"') { 312 struct strbuf name; 313 314 /* 315 * Proposed "new-style" GNU patch/diff format; see 316 * http://marc.theaimsgroup.com/?l=git&m=112927316408690&w=2 317 */ 318 strbuf_init(&name, 0); 319 if (!unquote_c_style(&name, line, NULL)) { 320 char *cp; 321 322 for (cp = name.buf; p_value; p_value--) { 323 cp = strchr(cp, '/'); 324 if (!cp) 325 break; 326 cp++; 327 } 328 if (cp) { 329 /* name can later be freed, so we need 330 * to memmove, not just return cp 331 */ 332 strbuf_remove(&name, 0, cp - name.buf); 333 free(def); 334 return strbuf_detach(&name, NULL); 335 } 336 } 337 strbuf_release(&name); 338 } 339 340 for (;;) { 341 char c = *line; 342 343 if (isspace(c)) { 344 if (c == '\n') 345 break; 346 if (name_terminate(start, line-start, c, terminate)) 347 break; 348 } 349 line++; 350 if (c == '/' && !--p_value) 351 start = line; 352 } 353 if (!start) 354 return def; 355 len = line - start; 356 if (!len) 357 return def; 358 359 /* 360 * Generally we prefer the shorter name, especially 361 * if the other one is just a variation of that with 362 * something else tacked on to the end (ie "file.orig" 363 * or "file~"). 364 */ 365 if (def) { 366 int deflen = strlen(def); 367 if (deflen < len && !strncmp(start, def, deflen)) 368 return def; 369 free(def); 370 } 371 372 return xmemdupz(start, len); 373} 374 375static int count_slashes(const char *cp) 376{ 377 int cnt = 0; 378 char ch; 379 380 while ((ch = *cp++)) 381 if (ch == '/') 382 cnt++; 383 return cnt; 384} 385 386/* 387 * Given the string after "--- " or "+++ ", guess the appropriate 388 * p_value for the given patch. 389 */ 390static int guess_p_value(const char *nameline) 391{ 392 char *name, *cp; 393 int val = -1; 394 395 if (is_dev_null(nameline)) 396 return -1; 397 name = find_name(nameline, NULL, 0, TERM_SPACE | TERM_TAB); 398 if (!name) 399 return -1; 400 cp = strchr(name, '/'); 401 if (!cp) 402 val = 0; 403 else if (prefix) { 404 /* 405 * Does it begin with "a/$our-prefix" and such? Then this is 406 * very likely to apply to our directory. 407 */ 408 if (!strncmp(name, prefix, prefix_length)) 409 val = count_slashes(prefix); 410 else { 411 cp++; 412 if (!strncmp(cp, prefix, prefix_length)) 413 val = count_slashes(prefix) + 1; 414 } 415 } 416 free(name); 417 return val; 418} 419 420/* 421 * Get the name etc info from the --/+++ lines of a traditional patch header 422 * 423 * FIXME! The end-of-filename heuristics are kind of screwy. For existing 424 * files, we can happily check the index for a match, but for creating a 425 * new file we should try to match whatever "patch" does. I have no idea. 426 */ 427static void parse_traditional_patch(const char *first, const char *second, struct patch *patch) 428{ 429 char *name; 430 431 first += 4; /* skip "--- " */ 432 second += 4; /* skip "+++ " */ 433 if (!p_value_known) { 434 int p, q; 435 p = guess_p_value(first); 436 q = guess_p_value(second); 437 if (p < 0) p = q; 438 if (0 <= p && p == q) { 439 p_value = p; 440 p_value_known = 1; 441 } 442 } 443 if (is_dev_null(first)) { 444 patch->is_new = 1; 445 patch->is_delete = 0; 446 name = find_name(second, NULL, p_value, TERM_SPACE | TERM_TAB); 447 patch->new_name = name; 448 } else if (is_dev_null(second)) { 449 patch->is_new = 0; 450 patch->is_delete = 1; 451 name = find_name(first, NULL, p_value, TERM_SPACE | TERM_TAB); 452 patch->old_name = name; 453 } else { 454 name = find_name(first, NULL, p_value, TERM_SPACE | TERM_TAB); 455 name = find_name(second, name, p_value, TERM_SPACE | TERM_TAB); 456 patch->old_name = patch->new_name = name; 457 } 458 if (!name) 459 die("unable to find filename in patch at line %d", linenr); 460} 461 462static int gitdiff_hdrend(const char *line, struct patch *patch) 463{ 464 return -1; 465} 466 467/* 468 * We're anal about diff header consistency, to make 469 * sure that we don't end up having strange ambiguous 470 * patches floating around. 471 * 472 * As a result, gitdiff_{old|new}name() will check 473 * their names against any previous information, just 474 * to make sure.. 475 */ 476static char *gitdiff_verify_name(const char *line, int isnull, char *orig_name, const char *oldnew) 477{ 478 if (!orig_name && !isnull) 479 return find_name(line, NULL, p_value, TERM_TAB); 480 481 if (orig_name) { 482 int len; 483 const char *name; 484 char *another; 485 name = orig_name; 486 len = strlen(name); 487 if (isnull) 488 die("git-apply: bad git-diff - expected /dev/null, got %s on line %d", name, linenr); 489 another = find_name(line, NULL, p_value, TERM_TAB); 490 if (!another || memcmp(another, name, len)) 491 die("git-apply: bad git-diff - inconsistent %s filename on line %d", oldnew, linenr); 492 free(another); 493 return orig_name; 494 } 495 else { 496 /* expect "/dev/null" */ 497 if (memcmp("/dev/null", line, 9) || line[9] != '\n') 498 die("git-apply: bad git-diff - expected /dev/null on line %d", linenr); 499 return NULL; 500 } 501} 502 503static int gitdiff_oldname(const char *line, struct patch *patch) 504{ 505 patch->old_name = gitdiff_verify_name(line, patch->is_new, patch->old_name, "old"); 506 return 0; 507} 508 509static int gitdiff_newname(const char *line, struct patch *patch) 510{ 511 patch->new_name = gitdiff_verify_name(line, patch->is_delete, patch->new_name, "new"); 512 return 0; 513} 514 515static int gitdiff_oldmode(const char *line, struct patch *patch) 516{ 517 patch->old_mode = strtoul(line, NULL, 8); 518 return 0; 519} 520 521static int gitdiff_newmode(const char *line, struct patch *patch) 522{ 523 patch->new_mode = strtoul(line, NULL, 8); 524 return 0; 525} 526 527static int gitdiff_delete(const char *line, struct patch *patch) 528{ 529 patch->is_delete = 1; 530 patch->old_name = patch->def_name; 531 return gitdiff_oldmode(line, patch); 532} 533 534static int gitdiff_newfile(const char *line, struct patch *patch) 535{ 536 patch->is_new = 1; 537 patch->new_name = patch->def_name; 538 return gitdiff_newmode(line, patch); 539} 540 541static int gitdiff_copysrc(const char *line, struct patch *patch) 542{ 543 patch->is_copy = 1; 544 patch->old_name = find_name(line, NULL, 0, 0); 545 return 0; 546} 547 548static int gitdiff_copydst(const char *line, struct patch *patch) 549{ 550 patch->is_copy = 1; 551 patch->new_name = find_name(line, NULL, 0, 0); 552 return 0; 553} 554 555static int gitdiff_renamesrc(const char *line, struct patch *patch) 556{ 557 patch->is_rename = 1; 558 patch->old_name = find_name(line, NULL, 0, 0); 559 return 0; 560} 561 562static int gitdiff_renamedst(const char *line, struct patch *patch) 563{ 564 patch->is_rename = 1; 565 patch->new_name = find_name(line, NULL, 0, 0); 566 return 0; 567} 568 569static int gitdiff_similarity(const char *line, struct patch *patch) 570{ 571 if ((patch->score = strtoul(line, NULL, 10)) == ULONG_MAX) 572 patch->score = 0; 573 return 0; 574} 575 576static int gitdiff_dissimilarity(const char *line, struct patch *patch) 577{ 578 if ((patch->score = strtoul(line, NULL, 10)) == ULONG_MAX) 579 patch->score = 0; 580 return 0; 581} 582 583static int gitdiff_index(const char *line, struct patch *patch) 584{ 585 /* 586 * index line is N hexadecimal, "..", N hexadecimal, 587 * and optional space with octal mode. 588 */ 589 const char *ptr, *eol; 590 int len; 591 592 ptr = strchr(line, '.'); 593 if (!ptr || ptr[1] != '.' || 40 < ptr - line) 594 return 0; 595 len = ptr - line; 596 memcpy(patch->old_sha1_prefix, line, len); 597 patch->old_sha1_prefix[len] = 0; 598 599 line = ptr + 2; 600 ptr = strchr(line, ' '); 601 eol = strchr(line, '\n'); 602 603 if (!ptr || eol < ptr) 604 ptr = eol; 605 len = ptr - line; 606 607 if (40 < len) 608 return 0; 609 memcpy(patch->new_sha1_prefix, line, len); 610 patch->new_sha1_prefix[len] = 0; 611 if (*ptr == ' ') 612 patch->new_mode = patch->old_mode = strtoul(ptr+1, NULL, 8); 613 return 0; 614} 615 616/* 617 * This is normal for a diff that doesn't change anything: we'll fall through 618 * into the next diff. Tell the parser to break out. 619 */ 620static int gitdiff_unrecognized(const char *line, struct patch *patch) 621{ 622 return -1; 623} 624 625static const char *stop_at_slash(const char *line, int llen) 626{ 627 int i; 628 629 for (i = 0; i < llen; i++) { 630 int ch = line[i]; 631 if (ch == '/') 632 return line + i; 633 } 634 return NULL; 635} 636 637/* 638 * This is to extract the same name that appears on "diff --git" 639 * line. We do not find and return anything if it is a rename 640 * patch, and it is OK because we will find the name elsewhere. 641 * We need to reliably find name only when it is mode-change only, 642 * creation or deletion of an empty file. In any of these cases, 643 * both sides are the same name under a/ and b/ respectively. 644 */ 645static char *git_header_name(char *line, int llen) 646{ 647 const char *name; 648 const char *second = NULL; 649 size_t len; 650 651 line += strlen("diff --git "); 652 llen -= strlen("diff --git "); 653 654 if (*line == '"') { 655 const char *cp; 656 struct strbuf first; 657 struct strbuf sp; 658 659 strbuf_init(&first, 0); 660 strbuf_init(&sp, 0); 661 662 if (unquote_c_style(&first, line, &second)) 663 goto free_and_fail1; 664 665 /* advance to the first slash */ 666 cp = stop_at_slash(first.buf, first.len); 667 /* we do not accept absolute paths */ 668 if (!cp || cp == first.buf) 669 goto free_and_fail1; 670 strbuf_remove(&first, 0, cp + 1 - first.buf); 671 672 /* 673 * second points at one past closing dq of name. 674 * find the second name. 675 */ 676 while ((second < line + llen) && isspace(*second)) 677 second++; 678 679 if (line + llen <= second) 680 goto free_and_fail1; 681 if (*second == '"') { 682 if (unquote_c_style(&sp, second, NULL)) 683 goto free_and_fail1; 684 cp = stop_at_slash(sp.buf, sp.len); 685 if (!cp || cp == sp.buf) 686 goto free_and_fail1; 687 /* They must match, otherwise ignore */ 688 if (strcmp(cp + 1, first.buf)) 689 goto free_and_fail1; 690 strbuf_release(&sp); 691 return strbuf_detach(&first, NULL); 692 } 693 694 /* unquoted second */ 695 cp = stop_at_slash(second, line + llen - second); 696 if (!cp || cp == second) 697 goto free_and_fail1; 698 cp++; 699 if (line + llen - cp != first.len + 1 || 700 memcmp(first.buf, cp, first.len)) 701 goto free_and_fail1; 702 return strbuf_detach(&first, NULL); 703 704 free_and_fail1: 705 strbuf_release(&first); 706 strbuf_release(&sp); 707 return NULL; 708 } 709 710 /* unquoted first name */ 711 name = stop_at_slash(line, llen); 712 if (!name || name == line) 713 return NULL; 714 name++; 715 716 /* 717 * since the first name is unquoted, a dq if exists must be 718 * the beginning of the second name. 719 */ 720 for (second = name; second < line + llen; second++) { 721 if (*second == '"') { 722 struct strbuf sp; 723 const char *np; 724 725 strbuf_init(&sp, 0); 726 if (unquote_c_style(&sp, second, NULL)) 727 goto free_and_fail2; 728 729 np = stop_at_slash(sp.buf, sp.len); 730 if (!np || np == sp.buf) 731 goto free_and_fail2; 732 np++; 733 734 len = sp.buf + sp.len - np; 735 if (len < second - name && 736 !strncmp(np, name, len) && 737 isspace(name[len])) { 738 /* Good */ 739 strbuf_remove(&sp, 0, np - sp.buf); 740 return strbuf_detach(&sp, NULL); 741 } 742 743 free_and_fail2: 744 strbuf_release(&sp); 745 return NULL; 746 } 747 } 748 749 /* 750 * Accept a name only if it shows up twice, exactly the same 751 * form. 752 */ 753 for (len = 0 ; ; len++) { 754 switch (name[len]) { 755 default: 756 continue; 757 case '\n': 758 return NULL; 759 case '\t': case ' ': 760 second = name+len; 761 for (;;) { 762 char c = *second++; 763 if (c == '\n') 764 return NULL; 765 if (c == '/') 766 break; 767 } 768 if (second[len] == '\n' && !memcmp(name, second, len)) { 769 return xmemdupz(name, len); 770 } 771 } 772 } 773} 774 775/* Verify that we recognize the lines following a git header */ 776static int parse_git_header(char *line, int len, unsigned int size, struct patch *patch) 777{ 778 unsigned long offset; 779 780 /* A git diff has explicit new/delete information, so we don't guess */ 781 patch->is_new = 0; 782 patch->is_delete = 0; 783 784 /* 785 * Some things may not have the old name in the 786 * rest of the headers anywhere (pure mode changes, 787 * or removing or adding empty files), so we get 788 * the default name from the header. 789 */ 790 patch->def_name = git_header_name(line, len); 791 792 line += len; 793 size -= len; 794 linenr++; 795 for (offset = len ; size > 0 ; offset += len, size -= len, line += len, linenr++) { 796 static const struct opentry { 797 const char *str; 798 int (*fn)(const char *, struct patch *); 799 } optable[] = { 800 { "@@ -", gitdiff_hdrend }, 801 { "--- ", gitdiff_oldname }, 802 { "+++ ", gitdiff_newname }, 803 { "old mode ", gitdiff_oldmode }, 804 { "new mode ", gitdiff_newmode }, 805 { "deleted file mode ", gitdiff_delete }, 806 { "new file mode ", gitdiff_newfile }, 807 { "copy from ", gitdiff_copysrc }, 808 { "copy to ", gitdiff_copydst }, 809 { "rename old ", gitdiff_renamesrc }, 810 { "rename new ", gitdiff_renamedst }, 811 { "rename from ", gitdiff_renamesrc }, 812 { "rename to ", gitdiff_renamedst }, 813 { "similarity index ", gitdiff_similarity }, 814 { "dissimilarity index ", gitdiff_dissimilarity }, 815 { "index ", gitdiff_index }, 816 { "", gitdiff_unrecognized }, 817 }; 818 int i; 819 820 len = linelen(line, size); 821 if (!len || line[len-1] != '\n') 822 break; 823 for (i = 0; i < ARRAY_SIZE(optable); i++) { 824 const struct opentry *p = optable + i; 825 int oplen = strlen(p->str); 826 if (len < oplen || memcmp(p->str, line, oplen)) 827 continue; 828 if (p->fn(line + oplen, patch) < 0) 829 return offset; 830 break; 831 } 832 } 833 834 return offset; 835} 836 837static int parse_num(const char *line, unsigned long *p) 838{ 839 char *ptr; 840 841 if (!isdigit(*line)) 842 return 0; 843 *p = strtoul(line, &ptr, 10); 844 return ptr - line; 845} 846 847static int parse_range(const char *line, int len, int offset, const char *expect, 848 unsigned long *p1, unsigned long *p2) 849{ 850 int digits, ex; 851 852 if (offset < 0 || offset >= len) 853 return -1; 854 line += offset; 855 len -= offset; 856 857 digits = parse_num(line, p1); 858 if (!digits) 859 return -1; 860 861 offset += digits; 862 line += digits; 863 len -= digits; 864 865 *p2 = 1; 866 if (*line == ',') { 867 digits = parse_num(line+1, p2); 868 if (!digits) 869 return -1; 870 871 offset += digits+1; 872 line += digits+1; 873 len -= digits+1; 874 } 875 876 ex = strlen(expect); 877 if (ex > len) 878 return -1; 879 if (memcmp(line, expect, ex)) 880 return -1; 881 882 return offset + ex; 883} 884 885/* 886 * Parse a unified diff fragment header of the 887 * form "@@ -a,b +c,d @@" 888 */ 889static int parse_fragment_header(char *line, int len, struct fragment *fragment) 890{ 891 int offset; 892 893 if (!len || line[len-1] != '\n') 894 return -1; 895 896 /* Figure out the number of lines in a fragment */ 897 offset = parse_range(line, len, 4, " +", &fragment->oldpos, &fragment->oldlines); 898 offset = parse_range(line, len, offset, " @@", &fragment->newpos, &fragment->newlines); 899 900 return offset; 901} 902 903static int find_header(char *line, unsigned long size, int *hdrsize, struct patch *patch) 904{ 905 unsigned long offset, len; 906 907 patch->is_toplevel_relative = 0; 908 patch->is_rename = patch->is_copy = 0; 909 patch->is_new = patch->is_delete = -1; 910 patch->old_mode = patch->new_mode = 0; 911 patch->old_name = patch->new_name = NULL; 912 for (offset = 0; size > 0; offset += len, size -= len, line += len, linenr++) { 913 unsigned long nextlen; 914 915 len = linelen(line, size); 916 if (!len) 917 break; 918 919 /* Testing this early allows us to take a few shortcuts.. */ 920 if (len < 6) 921 continue; 922 923 /* 924 * Make sure we don't find any unconnected patch fragments. 925 * That's a sign that we didn't find a header, and that a 926 * patch has become corrupted/broken up. 927 */ 928 if (!memcmp("@@ -", line, 4)) { 929 struct fragment dummy; 930 if (parse_fragment_header(line, len, &dummy) < 0) 931 continue; 932 die("patch fragment without header at line %d: %.*s", 933 linenr, (int)len-1, line); 934 } 935 936 if (size < len + 6) 937 break; 938 939 /* 940 * Git patch? It might not have a real patch, just a rename 941 * or mode change, so we handle that specially 942 */ 943 if (!memcmp("diff --git ", line, 11)) { 944 int git_hdr_len = parse_git_header(line, len, size, patch); 945 if (git_hdr_len <= len) 946 continue; 947 if (!patch->old_name && !patch->new_name) { 948 if (!patch->def_name) 949 die("git diff header lacks filename information (line %d)", linenr); 950 patch->old_name = patch->new_name = patch->def_name; 951 } 952 patch->is_toplevel_relative = 1; 953 *hdrsize = git_hdr_len; 954 return offset; 955 } 956 957 /* --- followed by +++ ? */ 958 if (memcmp("--- ", line, 4) || memcmp("+++ ", line + len, 4)) 959 continue; 960 961 /* 962 * We only accept unified patches, so we want it to 963 * at least have "@@ -a,b +c,d @@\n", which is 14 chars 964 * minimum ("@@ -0,0 +1 @@\n" is the shortest). 965 */ 966 nextlen = linelen(line + len, size - len); 967 if (size < nextlen + 14 || memcmp("@@ -", line + len + nextlen, 4)) 968 continue; 969 970 /* Ok, we'll consider it a patch */ 971 parse_traditional_patch(line, line+len, patch); 972 *hdrsize = len + nextlen; 973 linenr += 2; 974 return offset; 975 } 976 return -1; 977} 978 979static void check_whitespace(const char *line, int len, unsigned ws_rule) 980{ 981 char *err; 982 unsigned result = check_and_emit_line(line + 1, len - 1, ws_rule, 983 NULL, NULL, NULL, NULL); 984 if (!result) 985 return; 986 987 whitespace_error++; 988 if (squelch_whitespace_errors && 989 squelch_whitespace_errors < whitespace_error) 990 ; 991 else { 992 err = whitespace_error_string(result); 993 fprintf(stderr, "%s:%d: %s.\n%.*s\n", 994 patch_input_file, linenr, err, len - 2, line + 1); 995 free(err); 996 } 997} 998 999/*1000 * Parse a unified diff. Note that this really needs to parse each1001 * fragment separately, since the only way to know the difference1002 * between a "---" that is part of a patch, and a "---" that starts1003 * the next patch is to look at the line counts..1004 */1005static int parse_fragment(char *line, unsigned long size,1006 struct patch *patch, struct fragment *fragment)1007{1008 int added, deleted;1009 int len = linelen(line, size), offset;1010 unsigned long oldlines, newlines;1011 unsigned long leading, trailing;10121013 offset = parse_fragment_header(line, len, fragment);1014 if (offset < 0)1015 return -1;1016 oldlines = fragment->oldlines;1017 newlines = fragment->newlines;1018 leading = 0;1019 trailing = 0;10201021 /* Parse the thing.. */1022 line += len;1023 size -= len;1024 linenr++;1025 added = deleted = 0;1026 for (offset = len;1027 0 < size;1028 offset += len, size -= len, line += len, linenr++) {1029 if (!oldlines && !newlines)1030 break;1031 len = linelen(line, size);1032 if (!len || line[len-1] != '\n')1033 return -1;1034 switch (*line) {1035 default:1036 return -1;1037 case '\n': /* newer GNU diff, an empty context line */1038 case ' ':1039 oldlines--;1040 newlines--;1041 if (!deleted && !added)1042 leading++;1043 trailing++;1044 break;1045 case '-':1046 if (apply_in_reverse &&1047 ws_error_action != nowarn_ws_error)1048 check_whitespace(line, len, patch->ws_rule);1049 deleted++;1050 oldlines--;1051 trailing = 0;1052 break;1053 case '+':1054 if (!apply_in_reverse &&1055 ws_error_action != nowarn_ws_error)1056 check_whitespace(line, len, patch->ws_rule);1057 added++;1058 newlines--;1059 trailing = 0;1060 break;10611062 /*1063 * We allow "\ No newline at end of file". Depending1064 * on locale settings when the patch was produced we1065 * don't know what this line looks like. The only1066 * thing we do know is that it begins with "\ ".1067 * Checking for 12 is just for sanity check -- any1068 * l10n of "\ No newline..." is at least that long.1069 */1070 case '\\':1071 if (len < 12 || memcmp(line, "\\ ", 2))1072 return -1;1073 break;1074 }1075 }1076 if (oldlines || newlines)1077 return -1;1078 fragment->leading = leading;1079 fragment->trailing = trailing;10801081 /*1082 * If a fragment ends with an incomplete line, we failed to include1083 * it in the above loop because we hit oldlines == newlines == 01084 * before seeing it.1085 */1086 if (12 < size && !memcmp(line, "\\ ", 2))1087 offset += linelen(line, size);10881089 patch->lines_added += added;1090 patch->lines_deleted += deleted;10911092 if (0 < patch->is_new && oldlines)1093 return error("new file depends on old contents");1094 if (0 < patch->is_delete && newlines)1095 return error("deleted file still has contents");1096 return offset;1097}10981099static int parse_single_patch(char *line, unsigned long size, struct patch *patch)1100{1101 unsigned long offset = 0;1102 unsigned long oldlines = 0, newlines = 0, context = 0;1103 struct fragment **fragp = &patch->fragments;11041105 while (size > 4 && !memcmp(line, "@@ -", 4)) {1106 struct fragment *fragment;1107 int len;11081109 fragment = xcalloc(1, sizeof(*fragment));1110 len = parse_fragment(line, size, patch, fragment);1111 if (len <= 0)1112 die("corrupt patch at line %d", linenr);1113 fragment->patch = line;1114 fragment->size = len;1115 oldlines += fragment->oldlines;1116 newlines += fragment->newlines;1117 context += fragment->leading + fragment->trailing;11181119 *fragp = fragment;1120 fragp = &fragment->next;11211122 offset += len;1123 line += len;1124 size -= len;1125 }11261127 /*1128 * If something was removed (i.e. we have old-lines) it cannot1129 * be creation, and if something was added it cannot be1130 * deletion. However, the reverse is not true; --unified=01131 * patches that only add are not necessarily creation even1132 * though they do not have any old lines, and ones that only1133 * delete are not necessarily deletion.1134 *1135 * Unfortunately, a real creation/deletion patch do _not_ have1136 * any context line by definition, so we cannot safely tell it1137 * apart with --unified=0 insanity. At least if the patch has1138 * more than one hunk it is not creation or deletion.1139 */1140 if (patch->is_new < 0 &&1141 (oldlines || (patch->fragments && patch->fragments->next)))1142 patch->is_new = 0;1143 if (patch->is_delete < 0 &&1144 (newlines || (patch->fragments && patch->fragments->next)))1145 patch->is_delete = 0;1146 if (!unidiff_zero || context) {1147 /* If the user says the patch is not generated with1148 * --unified=0, or if we have seen context lines,1149 * then not having oldlines means the patch is creation,1150 * and not having newlines means the patch is deletion.1151 */1152 if (patch->is_new < 0 && !oldlines) {1153 patch->is_new = 1;1154 patch->old_name = NULL;1155 }1156 if (patch->is_delete < 0 && !newlines) {1157 patch->is_delete = 1;1158 patch->new_name = NULL;1159 }1160 }11611162 if (0 < patch->is_new && oldlines)1163 die("new file %s depends on old contents", patch->new_name);1164 if (0 < patch->is_delete && newlines)1165 die("deleted file %s still has contents", patch->old_name);1166 if (!patch->is_delete && !newlines && context)1167 fprintf(stderr, "** warning: file %s becomes empty but "1168 "is not deleted\n", patch->new_name);11691170 return offset;1171}11721173static inline int metadata_changes(struct patch *patch)1174{1175 return patch->is_rename > 0 ||1176 patch->is_copy > 0 ||1177 patch->is_new > 0 ||1178 patch->is_delete ||1179 (patch->old_mode && patch->new_mode &&1180 patch->old_mode != patch->new_mode);1181}11821183static char *inflate_it(const void *data, unsigned long size,1184 unsigned long inflated_size)1185{1186 z_stream stream;1187 void *out;1188 int st;11891190 memset(&stream, 0, sizeof(stream));11911192 stream.next_in = (unsigned char *)data;1193 stream.avail_in = size;1194 stream.next_out = out = xmalloc(inflated_size);1195 stream.avail_out = inflated_size;1196 inflateInit(&stream);1197 st = inflate(&stream, Z_FINISH);1198 if ((st != Z_STREAM_END) || stream.total_out != inflated_size) {1199 free(out);1200 return NULL;1201 }1202 return out;1203}12041205static struct fragment *parse_binary_hunk(char **buf_p,1206 unsigned long *sz_p,1207 int *status_p,1208 int *used_p)1209{1210 /*1211 * Expect a line that begins with binary patch method ("literal"1212 * or "delta"), followed by the length of data before deflating.1213 * a sequence of 'length-byte' followed by base-85 encoded data1214 * should follow, terminated by a newline.1215 *1216 * Each 5-byte sequence of base-85 encodes up to 4 bytes,1217 * and we would limit the patch line to 66 characters,1218 * so one line can fit up to 13 groups that would decode1219 * to 52 bytes max. The length byte 'A'-'Z' corresponds1220 * to 1-26 bytes, and 'a'-'z' corresponds to 27-52 bytes.1221 */1222 int llen, used;1223 unsigned long size = *sz_p;1224 char *buffer = *buf_p;1225 int patch_method;1226 unsigned long origlen;1227 char *data = NULL;1228 int hunk_size = 0;1229 struct fragment *frag;12301231 llen = linelen(buffer, size);1232 used = llen;12331234 *status_p = 0;12351236 if (!prefixcmp(buffer, "delta ")) {1237 patch_method = BINARY_DELTA_DEFLATED;1238 origlen = strtoul(buffer + 6, NULL, 10);1239 }1240 else if (!prefixcmp(buffer, "literal ")) {1241 patch_method = BINARY_LITERAL_DEFLATED;1242 origlen = strtoul(buffer + 8, NULL, 10);1243 }1244 else1245 return NULL;12461247 linenr++;1248 buffer += llen;1249 while (1) {1250 int byte_length, max_byte_length, newsize;1251 llen = linelen(buffer, size);1252 used += llen;1253 linenr++;1254 if (llen == 1) {1255 /* consume the blank line */1256 buffer++;1257 size--;1258 break;1259 }1260 /*1261 * Minimum line is "A00000\n" which is 7-byte long,1262 * and the line length must be multiple of 5 plus 2.1263 */1264 if ((llen < 7) || (llen-2) % 5)1265 goto corrupt;1266 max_byte_length = (llen - 2) / 5 * 4;1267 byte_length = *buffer;1268 if ('A' <= byte_length && byte_length <= 'Z')1269 byte_length = byte_length - 'A' + 1;1270 else if ('a' <= byte_length && byte_length <= 'z')1271 byte_length = byte_length - 'a' + 27;1272 else1273 goto corrupt;1274 /* if the input length was not multiple of 4, we would1275 * have filler at the end but the filler should never1276 * exceed 3 bytes1277 */1278 if (max_byte_length < byte_length ||1279 byte_length <= max_byte_length - 4)1280 goto corrupt;1281 newsize = hunk_size + byte_length;1282 data = xrealloc(data, newsize);1283 if (decode_85(data + hunk_size, buffer + 1, byte_length))1284 goto corrupt;1285 hunk_size = newsize;1286 buffer += llen;1287 size -= llen;1288 }12891290 frag = xcalloc(1, sizeof(*frag));1291 frag->patch = inflate_it(data, hunk_size, origlen);1292 if (!frag->patch)1293 goto corrupt;1294 free(data);1295 frag->size = origlen;1296 *buf_p = buffer;1297 *sz_p = size;1298 *used_p = used;1299 frag->binary_patch_method = patch_method;1300 return frag;13011302 corrupt:1303 free(data);1304 *status_p = -1;1305 error("corrupt binary patch at line %d: %.*s",1306 linenr-1, llen-1, buffer);1307 return NULL;1308}13091310static int parse_binary(char *buffer, unsigned long size, struct patch *patch)1311{1312 /*1313 * We have read "GIT binary patch\n"; what follows is a line1314 * that says the patch method (currently, either "literal" or1315 * "delta") and the length of data before deflating; a1316 * sequence of 'length-byte' followed by base-85 encoded data1317 * follows.1318 *1319 * When a binary patch is reversible, there is another binary1320 * hunk in the same format, starting with patch method (either1321 * "literal" or "delta") with the length of data, and a sequence1322 * of length-byte + base-85 encoded data, terminated with another1323 * empty line. This data, when applied to the postimage, produces1324 * the preimage.1325 */1326 struct fragment *forward;1327 struct fragment *reverse;1328 int status;1329 int used, used_1;13301331 forward = parse_binary_hunk(&buffer, &size, &status, &used);1332 if (!forward && !status)1333 /* there has to be one hunk (forward hunk) */1334 return error("unrecognized binary patch at line %d", linenr-1);1335 if (status)1336 /* otherwise we already gave an error message */1337 return status;13381339 reverse = parse_binary_hunk(&buffer, &size, &status, &used_1);1340 if (reverse)1341 used += used_1;1342 else if (status) {1343 /*1344 * Not having reverse hunk is not an error, but having1345 * a corrupt reverse hunk is.1346 */1347 free((void*) forward->patch);1348 free(forward);1349 return status;1350 }1351 forward->next = reverse;1352 patch->fragments = forward;1353 patch->is_binary = 1;1354 return used;1355}13561357static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)1358{1359 int hdrsize, patchsize;1360 int offset = find_header(buffer, size, &hdrsize, patch);13611362 if (offset < 0)1363 return offset;13641365 patch->ws_rule = whitespace_rule(patch->new_name1366 ? patch->new_name1367 : patch->old_name);13681369 patchsize = parse_single_patch(buffer + offset + hdrsize,1370 size - offset - hdrsize, patch);13711372 if (!patchsize) {1373 static const char *binhdr[] = {1374 "Binary files ",1375 "Files ",1376 NULL,1377 };1378 static const char git_binary[] = "GIT binary patch\n";1379 int i;1380 int hd = hdrsize + offset;1381 unsigned long llen = linelen(buffer + hd, size - hd);13821383 if (llen == sizeof(git_binary) - 1 &&1384 !memcmp(git_binary, buffer + hd, llen)) {1385 int used;1386 linenr++;1387 used = parse_binary(buffer + hd + llen,1388 size - hd - llen, patch);1389 if (used)1390 patchsize = used + llen;1391 else1392 patchsize = 0;1393 }1394 else if (!memcmp(" differ\n", buffer + hd + llen - 8, 8)) {1395 for (i = 0; binhdr[i]; i++) {1396 int len = strlen(binhdr[i]);1397 if (len < size - hd &&1398 !memcmp(binhdr[i], buffer + hd, len)) {1399 linenr++;1400 patch->is_binary = 1;1401 patchsize = llen;1402 break;1403 }1404 }1405 }14061407 /* Empty patch cannot be applied if it is a text patch1408 * without metadata change. A binary patch appears1409 * empty to us here.1410 */1411 if ((apply || check) &&1412 (!patch->is_binary && !metadata_changes(patch)))1413 die("patch with only garbage at line %d", linenr);1414 }14151416 return offset + hdrsize + patchsize;1417}14181419#define swap(a,b) myswap((a),(b),sizeof(a))14201421#define myswap(a, b, size) do { \1422 unsigned char mytmp[size]; \1423 memcpy(mytmp, &a, size); \1424 memcpy(&a, &b, size); \1425 memcpy(&b, mytmp, size); \1426} while (0)14271428static void reverse_patches(struct patch *p)1429{1430 for (; p; p = p->next) {1431 struct fragment *frag = p->fragments;14321433 swap(p->new_name, p->old_name);1434 swap(p->new_mode, p->old_mode);1435 swap(p->is_new, p->is_delete);1436 swap(p->lines_added, p->lines_deleted);1437 swap(p->old_sha1_prefix, p->new_sha1_prefix);14381439 for (; frag; frag = frag->next) {1440 swap(frag->newpos, frag->oldpos);1441 swap(frag->newlines, frag->oldlines);1442 }1443 }1444}14451446static const char pluses[] =1447"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++";1448static const char minuses[]=1449"----------------------------------------------------------------------";14501451static void show_stats(struct patch *patch)1452{1453 struct strbuf qname;1454 char *cp = patch->new_name ? patch->new_name : patch->old_name;1455 int max, add, del;14561457 strbuf_init(&qname, 0);1458 quote_c_style(cp, &qname, NULL, 0);14591460 /*1461 * "scale" the filename1462 */1463 max = max_len;1464 if (max > 50)1465 max = 50;14661467 if (qname.len > max) {1468 cp = strchr(qname.buf + qname.len + 3 - max, '/');1469 if (!cp)1470 cp = qname.buf + qname.len + 3 - max;1471 strbuf_splice(&qname, 0, cp - qname.buf, "...", 3);1472 }14731474 if (patch->is_binary) {1475 printf(" %-*s | Bin\n", max, qname.buf);1476 strbuf_release(&qname);1477 return;1478 }14791480 printf(" %-*s |", max, qname.buf);1481 strbuf_release(&qname);14821483 /*1484 * scale the add/delete1485 */1486 max = max + max_change > 70 ? 70 - max : max_change;1487 add = patch->lines_added;1488 del = patch->lines_deleted;14891490 if (max_change > 0) {1491 int total = ((add + del) * max + max_change / 2) / max_change;1492 add = (add * max + max_change / 2) / max_change;1493 del = total - add;1494 }1495 printf("%5d %.*s%.*s\n", patch->lines_added + patch->lines_deleted,1496 add, pluses, del, minuses);1497}14981499static int read_old_data(struct stat *st, const char *path, struct strbuf *buf)1500{1501 switch (st->st_mode & S_IFMT) {1502 case S_IFLNK:1503 strbuf_grow(buf, st->st_size);1504 if (readlink(path, buf->buf, st->st_size) != st->st_size)1505 return -1;1506 strbuf_setlen(buf, st->st_size);1507 return 0;1508 case S_IFREG:1509 if (strbuf_read_file(buf, path, st->st_size) != st->st_size)1510 return error("unable to open or read %s", path);1511 convert_to_git(path, buf->buf, buf->len, buf, 0);1512 return 0;1513 default:1514 return -1;1515 }1516}15171518static void update_pre_post_images(struct image *preimage,1519 struct image *postimage,1520 char *buf,1521 size_t len)1522{1523 int i, ctx;1524 char *new, *old, *fixed;1525 struct image fixed_preimage;15261527 /*1528 * Update the preimage with whitespace fixes. Note that we1529 * are not losing preimage->buf -- apply_one_fragment() will1530 * free "oldlines".1531 */1532 prepare_image(&fixed_preimage, buf, len, 1);1533 assert(fixed_preimage.nr == preimage->nr);1534 for (i = 0; i < preimage->nr; i++)1535 fixed_preimage.line[i].flag = preimage->line[i].flag;1536 free(preimage->line_allocated);1537 *preimage = fixed_preimage;15381539 /*1540 * Adjust the common context lines in postimage, in place.1541 * This is possible because whitespace fixing does not make1542 * the string grow.1543 */1544 new = old = postimage->buf;1545 fixed = preimage->buf;1546 for (i = ctx = 0; i < postimage->nr; i++) {1547 size_t len = postimage->line[i].len;1548 if (!(postimage->line[i].flag & LINE_COMMON)) {1549 /* an added line -- no counterparts in preimage */1550 memmove(new, old, len);1551 old += len;1552 new += len;1553 continue;1554 }15551556 /* a common context -- skip it in the original postimage */1557 old += len;15581559 /* and find the corresponding one in the fixed preimage */1560 while (ctx < preimage->nr &&1561 !(preimage->line[ctx].flag & LINE_COMMON)) {1562 fixed += preimage->line[ctx].len;1563 ctx++;1564 }1565 if (preimage->nr <= ctx)1566 die("oops");15671568 /* and copy it in, while fixing the line length */1569 len = preimage->line[ctx].len;1570 memcpy(new, fixed, len);1571 new += len;1572 fixed += len;1573 postimage->line[i].len = len;1574 ctx++;1575 }15761577 /* Fix the length of the whole thing */1578 postimage->len = new - postimage->buf;1579}15801581static int match_fragment(struct image *img,1582 struct image *preimage,1583 struct image *postimage,1584 unsigned long try,1585 int try_lno,1586 unsigned ws_rule,1587 int match_beginning, int match_end)1588{1589 int i;1590 char *fixed_buf, *buf, *orig, *target;15911592 if (preimage->nr + try_lno > img->nr)1593 return 0;15941595 if (match_beginning && try_lno)1596 return 0;15971598 if (match_end && preimage->nr + try_lno != img->nr)1599 return 0;16001601 /* Quick hash check */1602 for (i = 0; i < preimage->nr; i++)1603 if (preimage->line[i].hash != img->line[try_lno + i].hash)1604 return 0;16051606 /*1607 * Do we have an exact match? If we were told to match1608 * at the end, size must be exactly at try+fragsize,1609 * otherwise try+fragsize must be still within the preimage,1610 * and either case, the old piece should match the preimage1611 * exactly.1612 */1613 if ((match_end1614 ? (try + preimage->len == img->len)1615 : (try + preimage->len <= img->len)) &&1616 !memcmp(img->buf + try, preimage->buf, preimage->len))1617 return 1;16181619 if (ws_error_action != correct_ws_error)1620 return 0;16211622 /*1623 * The hunk does not apply byte-by-byte, but the hash says1624 * it might with whitespace fuzz.1625 */1626 fixed_buf = xmalloc(preimage->len + 1);1627 buf = fixed_buf;1628 orig = preimage->buf;1629 target = img->buf + try;1630 for (i = 0; i < preimage->nr; i++) {1631 size_t fixlen; /* length after fixing the preimage */1632 size_t oldlen = preimage->line[i].len;1633 size_t tgtlen = img->line[try_lno + i].len;1634 size_t tgtfixlen; /* length after fixing the target line */1635 char tgtfixbuf[1024], *tgtfix;1636 int match;16371638 /* Try fixing the line in the preimage */1639 fixlen = ws_fix_copy(buf, orig, oldlen, ws_rule, NULL);16401641 /* Try fixing the line in the target */1642 if (sizeof(tgtfixbuf) < tgtlen)1643 tgtfix = tgtfixbuf;1644 else1645 tgtfix = xmalloc(tgtlen);1646 tgtfixlen = ws_fix_copy(tgtfix, target, tgtlen, ws_rule, NULL);16471648 /*1649 * If they match, either the preimage was based on1650 * a version before our tree fixed whitespace breakage,1651 * or we are lacking a whitespace-fix patch the tree1652 * the preimage was based on already had (i.e. target1653 * has whitespace breakage, the preimage doesn't).1654 * In either case, we are fixing the whitespace breakages1655 * so we might as well take the fix together with their1656 * real change.1657 */1658 match = (tgtfixlen == fixlen && !memcmp(tgtfix, buf, fixlen));16591660 if (tgtfix != tgtfixbuf)1661 free(tgtfix);1662 if (!match)1663 goto unmatch_exit;16641665 orig += oldlen;1666 buf += fixlen;1667 target += tgtlen;1668 }16691670 /*1671 * Yes, the preimage is based on an older version that still1672 * has whitespace breakages unfixed, and fixing them makes the1673 * hunk match. Update the context lines in the postimage.1674 */1675 update_pre_post_images(preimage, postimage,1676 fixed_buf, buf - fixed_buf);1677 return 1;16781679 unmatch_exit:1680 free(fixed_buf);1681 return 0;1682}16831684static int find_pos(struct image *img,1685 struct image *preimage,1686 struct image *postimage,1687 int line,1688 unsigned ws_rule,1689 int match_beginning, int match_end)1690{1691 int i;1692 unsigned long backwards, forwards, try;1693 int backwards_lno, forwards_lno, try_lno;16941695 if (preimage->nr > img->nr)1696 return -1;16971698 /*1699 * If match_begining or match_end is specified, there is no1700 * point starting from a wrong line that will never match and1701 * wander around and wait for a match at the specified end.1702 */1703 if (match_beginning)1704 line = 0;1705 else if (match_end)1706 line = img->nr - preimage->nr;17071708 if (line > img->nr)1709 line = img->nr;17101711 try = 0;1712 for (i = 0; i < line; i++)1713 try += img->line[i].len;17141715 /*1716 * There's probably some smart way to do this, but I'll leave1717 * that to the smart and beautiful people. I'm simple and stupid.1718 */1719 backwards = try;1720 backwards_lno = line;1721 forwards = try;1722 forwards_lno = line;1723 try_lno = line;17241725 for (i = 0; ; i++) {1726 if (match_fragment(img, preimage, postimage,1727 try, try_lno, ws_rule,1728 match_beginning, match_end))1729 return try_lno;17301731 again:1732 if (backwards_lno == 0 && forwards_lno == img->nr)1733 break;17341735 if (i & 1) {1736 if (backwards_lno == 0) {1737 i++;1738 goto again;1739 }1740 backwards_lno--;1741 backwards -= img->line[backwards_lno].len;1742 try = backwards;1743 try_lno = backwards_lno;1744 } else {1745 if (forwards_lno == img->nr) {1746 i++;1747 goto again;1748 }1749 forwards += img->line[forwards_lno].len;1750 forwards_lno++;1751 try = forwards;1752 try_lno = forwards_lno;1753 }17541755 }1756 return -1;1757}17581759static void remove_first_line(struct image *img)1760{1761 img->buf += img->line[0].len;1762 img->len -= img->line[0].len;1763 img->line++;1764 img->nr--;1765}17661767static void remove_last_line(struct image *img)1768{1769 img->len -= img->line[--img->nr].len;1770}17711772static void update_image(struct image *img,1773 int applied_pos,1774 struct image *preimage,1775 struct image *postimage)1776{1777 /*1778 * remove the copy of preimage at offset in img1779 * and replace it with postimage1780 */1781 int i, nr;1782 size_t remove_count, insert_count, applied_at = 0;1783 char *result;17841785 for (i = 0; i < applied_pos; i++)1786 applied_at += img->line[i].len;17871788 remove_count = 0;1789 for (i = 0; i < preimage->nr; i++)1790 remove_count += img->line[applied_pos + i].len;1791 insert_count = postimage->len;17921793 /* Adjust the contents */1794 result = xmalloc(img->len + insert_count - remove_count + 1);1795 memcpy(result, img->buf, applied_at);1796 memcpy(result + applied_at, postimage->buf, postimage->len);1797 memcpy(result + applied_at + postimage->len,1798 img->buf + (applied_at + remove_count),1799 img->len - (applied_at + remove_count));1800 free(img->buf);1801 img->buf = result;1802 img->len += insert_count - remove_count;1803 result[img->len] = '\0';18041805 /* Adjust the line table */1806 nr = img->nr + postimage->nr - preimage->nr;1807 if (preimage->nr < postimage->nr) {1808 /*1809 * NOTE: this knows that we never call remove_first_line()1810 * on anything other than pre/post image.1811 */1812 img->line = xrealloc(img->line, nr * sizeof(*img->line));1813 img->line_allocated = img->line;1814 }1815 if (preimage->nr != postimage->nr)1816 memmove(img->line + applied_pos + postimage->nr,1817 img->line + applied_pos + preimage->nr,1818 (img->nr - (applied_pos + preimage->nr)) *1819 sizeof(*img->line));1820 memcpy(img->line + applied_pos,1821 postimage->line,1822 postimage->nr * sizeof(*img->line));1823 img->nr = nr;1824}18251826static int apply_one_fragment(struct image *img, struct fragment *frag,1827 int inaccurate_eof, unsigned ws_rule)1828{1829 int match_beginning, match_end;1830 const char *patch = frag->patch;1831 int size = frag->size;1832 char *old, *new, *oldlines, *newlines;1833 int new_blank_lines_at_end = 0;1834 unsigned long leading, trailing;1835 int pos, applied_pos;1836 struct image preimage;1837 struct image postimage;18381839 memset(&preimage, 0, sizeof(preimage));1840 memset(&postimage, 0, sizeof(postimage));1841 oldlines = xmalloc(size);1842 newlines = xmalloc(size);18431844 old = oldlines;1845 new = newlines;1846 while (size > 0) {1847 char first;1848 int len = linelen(patch, size);1849 int plen, added;1850 int added_blank_line = 0;18511852 if (!len)1853 break;18541855 /*1856 * "plen" is how much of the line we should use for1857 * the actual patch data. Normally we just remove the1858 * first character on the line, but if the line is1859 * followed by "\ No newline", then we also remove the1860 * last one (which is the newline, of course).1861 */1862 plen = len - 1;1863 if (len < size && patch[len] == '\\')1864 plen--;1865 first = *patch;1866 if (apply_in_reverse) {1867 if (first == '-')1868 first = '+';1869 else if (first == '+')1870 first = '-';1871 }18721873 switch (first) {1874 case '\n':1875 /* Newer GNU diff, empty context line */1876 if (plen < 0)1877 /* ... followed by '\No newline'; nothing */1878 break;1879 *old++ = '\n';1880 *new++ = '\n';1881 add_line_info(&preimage, "\n", 1, LINE_COMMON);1882 add_line_info(&postimage, "\n", 1, LINE_COMMON);1883 break;1884 case ' ':1885 case '-':1886 memcpy(old, patch + 1, plen);1887 add_line_info(&preimage, old, plen,1888 (first == ' ' ? LINE_COMMON : 0));1889 old += plen;1890 if (first == '-')1891 break;1892 /* Fall-through for ' ' */1893 case '+':1894 /* --no-add does not add new lines */1895 if (first == '+' && no_add)1896 break;18971898 if (first != '+' ||1899 !whitespace_error ||1900 ws_error_action != correct_ws_error) {1901 memcpy(new, patch + 1, plen);1902 added = plen;1903 }1904 else {1905 added = ws_fix_copy(new, patch + 1, plen, ws_rule, &applied_after_fixing_ws);1906 }1907 add_line_info(&postimage, new, added,1908 (first == '+' ? 0 : LINE_COMMON));1909 new += added;1910 if (first == '+' &&1911 added == 1 && new[-1] == '\n')1912 added_blank_line = 1;1913 break;1914 case '@': case '\\':1915 /* Ignore it, we already handled it */1916 break;1917 default:1918 if (apply_verbosely)1919 error("invalid start of line: '%c'", first);1920 return -1;1921 }1922 if (added_blank_line)1923 new_blank_lines_at_end++;1924 else1925 new_blank_lines_at_end = 0;1926 patch += len;1927 size -= len;1928 }1929 if (inaccurate_eof &&1930 old > oldlines && old[-1] == '\n' &&1931 new > newlines && new[-1] == '\n') {1932 old--;1933 new--;1934 }19351936 leading = frag->leading;1937 trailing = frag->trailing;19381939 /*1940 * A hunk to change lines at the beginning would begin with1941 * @@ -1,L +N,M @@1942 *1943 * And a hunk to add to an empty file would begin with1944 * @@ -0,0 +N,M @@1945 *1946 * In other words, a hunk that is (frag->oldpos <= 1) with or1947 * without leading context must match at the beginning.1948 */1949 match_beginning = frag->oldpos <= 1;19501951 /*1952 * A hunk without trailing lines must match at the end.1953 * However, we simply cannot tell if a hunk must match end1954 * from the lack of trailing lines if the patch was generated1955 * with unidiff without any context.1956 */1957 match_end = !unidiff_zero && !trailing;19581959 pos = frag->newpos ? (frag->newpos - 1) : 0;1960 preimage.buf = oldlines;1961 preimage.len = old - oldlines;1962 postimage.buf = newlines;1963 postimage.len = new - newlines;1964 preimage.line = preimage.line_allocated;1965 postimage.line = postimage.line_allocated;19661967 for (;;) {19681969 applied_pos = find_pos(img, &preimage, &postimage, pos,1970 ws_rule, match_beginning, match_end);19711972 if (applied_pos >= 0)1973 break;19741975 /* Am I at my context limits? */1976 if ((leading <= p_context) && (trailing <= p_context))1977 break;1978 if (match_beginning || match_end) {1979 match_beginning = match_end = 0;1980 continue;1981 }19821983 /*1984 * Reduce the number of context lines; reduce both1985 * leading and trailing if they are equal otherwise1986 * just reduce the larger context.1987 */1988 if (leading >= trailing) {1989 remove_first_line(&preimage);1990 remove_first_line(&postimage);1991 pos--;1992 leading--;1993 }1994 if (trailing > leading) {1995 remove_last_line(&preimage);1996 remove_last_line(&postimage);1997 trailing--;1998 }1999 }20002001 if (applied_pos >= 0) {2002 if (ws_error_action == correct_ws_error &&2003 new_blank_lines_at_end &&2004 postimage.nr + applied_pos == img->nr) {2005 /*2006 * If the patch application adds blank lines2007 * at the end, and if the patch applies at the2008 * end of the image, remove those added blank2009 * lines.2010 */2011 while (new_blank_lines_at_end--)2012 remove_last_line(&postimage);2013 }20142015 /*2016 * Warn if it was necessary to reduce the number2017 * of context lines.2018 */2019 if ((leading != frag->leading) ||2020 (trailing != frag->trailing))2021 fprintf(stderr, "Context reduced to (%ld/%ld)"2022 " to apply fragment at %d\n",2023 leading, trailing, applied_pos+1);2024 update_image(img, applied_pos, &preimage, &postimage);2025 } else {2026 if (apply_verbosely)2027 error("while searching for:\n%.*s",2028 (int)(old - oldlines), oldlines);2029 }20302031 free(oldlines);2032 free(newlines);2033 free(preimage.line_allocated);2034 free(postimage.line_allocated);20352036 return (applied_pos < 0);2037}20382039static int apply_binary_fragment(struct image *img, struct patch *patch)2040{2041 struct fragment *fragment = patch->fragments;2042 unsigned long len;2043 void *dst;20442045 /* Binary patch is irreversible without the optional second hunk */2046 if (apply_in_reverse) {2047 if (!fragment->next)2048 return error("cannot reverse-apply a binary patch "2049 "without the reverse hunk to '%s'",2050 patch->new_name2051 ? patch->new_name : patch->old_name);2052 fragment = fragment->next;2053 }2054 switch (fragment->binary_patch_method) {2055 case BINARY_DELTA_DEFLATED:2056 dst = patch_delta(img->buf, img->len, fragment->patch,2057 fragment->size, &len);2058 if (!dst)2059 return -1;2060 clear_image(img);2061 img->buf = dst;2062 img->len = len;2063 return 0;2064 case BINARY_LITERAL_DEFLATED:2065 clear_image(img);2066 img->len = fragment->size;2067 img->buf = xmalloc(img->len+1);2068 memcpy(img->buf, fragment->patch, img->len);2069 img->buf[img->len] = '\0';2070 return 0;2071 }2072 return -1;2073}20742075static int apply_binary(struct image *img, struct patch *patch)2076{2077 const char *name = patch->old_name ? patch->old_name : patch->new_name;2078 unsigned char sha1[20];20792080 /*2081 * For safety, we require patch index line to contain2082 * full 40-byte textual SHA1 for old and new, at least for now.2083 */2084 if (strlen(patch->old_sha1_prefix) != 40 ||2085 strlen(patch->new_sha1_prefix) != 40 ||2086 get_sha1_hex(patch->old_sha1_prefix, sha1) ||2087 get_sha1_hex(patch->new_sha1_prefix, sha1))2088 return error("cannot apply binary patch to '%s' "2089 "without full index line", name);20902091 if (patch->old_name) {2092 /*2093 * See if the old one matches what the patch2094 * applies to.2095 */2096 hash_sha1_file(img->buf, img->len, blob_type, sha1);2097 if (strcmp(sha1_to_hex(sha1), patch->old_sha1_prefix))2098 return error("the patch applies to '%s' (%s), "2099 "which does not match the "2100 "current contents.",2101 name, sha1_to_hex(sha1));2102 }2103 else {2104 /* Otherwise, the old one must be empty. */2105 if (img->len)2106 return error("the patch applies to an empty "2107 "'%s' but it is not empty", name);2108 }21092110 get_sha1_hex(patch->new_sha1_prefix, sha1);2111 if (is_null_sha1(sha1)) {2112 clear_image(img);2113 return 0; /* deletion patch */2114 }21152116 if (has_sha1_file(sha1)) {2117 /* We already have the postimage */2118 enum object_type type;2119 unsigned long size;2120 char *result;21212122 result = read_sha1_file(sha1, &type, &size);2123 if (!result)2124 return error("the necessary postimage %s for "2125 "'%s' cannot be read",2126 patch->new_sha1_prefix, name);2127 clear_image(img);2128 img->buf = result;2129 img->len = size;2130 } else {2131 /*2132 * We have verified buf matches the preimage;2133 * apply the patch data to it, which is stored2134 * in the patch->fragments->{patch,size}.2135 */2136 if (apply_binary_fragment(img, patch))2137 return error("binary patch does not apply to '%s'",2138 name);21392140 /* verify that the result matches */2141 hash_sha1_file(img->buf, img->len, blob_type, sha1);2142 if (strcmp(sha1_to_hex(sha1), patch->new_sha1_prefix))2143 return error("binary patch to '%s' creates incorrect result (expecting %s, got %s)",2144 name, patch->new_sha1_prefix, sha1_to_hex(sha1));2145 }21462147 return 0;2148}21492150static int apply_fragments(struct image *img, struct patch *patch)2151{2152 struct fragment *frag = patch->fragments;2153 const char *name = patch->old_name ? patch->old_name : patch->new_name;2154 unsigned ws_rule = patch->ws_rule;2155 unsigned inaccurate_eof = patch->inaccurate_eof;21562157 if (patch->is_binary)2158 return apply_binary(img, patch);21592160 while (frag) {2161 if (apply_one_fragment(img, frag, inaccurate_eof, ws_rule)) {2162 error("patch failed: %s:%ld", name, frag->oldpos);2163 if (!apply_with_reject)2164 return -1;2165 frag->rejected = 1;2166 }2167 frag = frag->next;2168 }2169 return 0;2170}21712172static int read_file_or_gitlink(struct cache_entry *ce, struct strbuf *buf)2173{2174 if (!ce)2175 return 0;21762177 if (S_ISGITLINK(ce->ce_mode)) {2178 strbuf_grow(buf, 100);2179 strbuf_addf(buf, "Subproject commit %s\n", sha1_to_hex(ce->sha1));2180 } else {2181 enum object_type type;2182 unsigned long sz;2183 char *result;21842185 result = read_sha1_file(ce->sha1, &type, &sz);2186 if (!result)2187 return -1;2188 /* XXX read_sha1_file NUL-terminates */2189 strbuf_attach(buf, result, sz, sz + 1);2190 }2191 return 0;2192}21932194static int apply_data(struct patch *patch, struct stat *st, struct cache_entry *ce)2195{2196 struct strbuf buf;2197 struct image image;2198 size_t len;2199 char *img;22002201 strbuf_init(&buf, 0);2202 if (cached) {2203 if (read_file_or_gitlink(ce, &buf))2204 return error("read of %s failed", patch->old_name);2205 } else if (patch->old_name) {2206 if (S_ISGITLINK(patch->old_mode)) {2207 if (ce) {2208 read_file_or_gitlink(ce, &buf);2209 } else {2210 /*2211 * There is no way to apply subproject2212 * patch without looking at the index.2213 */2214 patch->fragments = NULL;2215 }2216 } else {2217 if (read_old_data(st, patch->old_name, &buf))2218 return error("read of %s failed", patch->old_name);2219 }2220 }22212222 img = strbuf_detach(&buf, &len);2223 prepare_image(&image, img, len, !patch->is_binary);22242225 if (apply_fragments(&image, patch) < 0)2226 return -1; /* note with --reject this succeeds. */2227 patch->result = image.buf;2228 patch->resultsize = image.len;2229 free(image.line_allocated);22302231 if (0 < patch->is_delete && patch->resultsize)2232 return error("removal patch leaves file contents");22332234 return 0;2235}22362237static int check_to_create_blob(const char *new_name, int ok_if_exists)2238{2239 struct stat nst;2240 if (!lstat(new_name, &nst)) {2241 if (S_ISDIR(nst.st_mode) || ok_if_exists)2242 return 0;2243 /*2244 * A leading component of new_name might be a symlink2245 * that is going to be removed with this patch, but2246 * still pointing at somewhere that has the path.2247 * In such a case, path "new_name" does not exist as2248 * far as git is concerned.2249 */2250 if (has_symlink_leading_path(strlen(new_name), new_name))2251 return 0;22522253 return error("%s: already exists in working directory", new_name);2254 }2255 else if ((errno != ENOENT) && (errno != ENOTDIR))2256 return error("%s: %s", new_name, strerror(errno));2257 return 0;2258}22592260static int verify_index_match(struct cache_entry *ce, struct stat *st)2261{2262 if (S_ISGITLINK(ce->ce_mode)) {2263 if (!S_ISDIR(st->st_mode))2264 return -1;2265 return 0;2266 }2267 return ce_match_stat(ce, st, CE_MATCH_IGNORE_VALID);2268}22692270static int check_patch(struct patch *patch, struct patch *prev_patch)2271{2272 struct stat st;2273 const char *old_name = patch->old_name;2274 const char *new_name = patch->new_name;2275 const char *name = old_name ? old_name : new_name;2276 struct cache_entry *ce = NULL;2277 int ok_if_exists;22782279 patch->rejected = 1; /* we will drop this after we succeed */22802281 /*2282 * Make sure that we do not have local modifications from the2283 * index when we are looking at the index. Also make sure2284 * we have the preimage file to be patched in the work tree,2285 * unless --cached, which tells git to apply only in the index.2286 */2287 if (old_name) {2288 int stat_ret = 0;2289 unsigned st_mode = 0;22902291 if (!cached)2292 stat_ret = lstat(old_name, &st);2293 if (check_index) {2294 int pos = cache_name_pos(old_name, strlen(old_name));2295 if (pos < 0)2296 return error("%s: does not exist in index",2297 old_name);2298 ce = active_cache[pos];2299 if (stat_ret < 0) {2300 struct checkout costate;2301 if (errno != ENOENT)2302 return error("%s: %s", old_name,2303 strerror(errno));2304 /* checkout */2305 costate.base_dir = "";2306 costate.base_dir_len = 0;2307 costate.force = 0;2308 costate.quiet = 0;2309 costate.not_new = 0;2310 costate.refresh_cache = 1;2311 if (checkout_entry(ce,2312 &costate,2313 NULL) ||2314 lstat(old_name, &st))2315 return -1;2316 }2317 if (!cached && verify_index_match(ce, &st))2318 return error("%s: does not match index",2319 old_name);2320 if (cached)2321 st_mode = ce->ce_mode;2322 } else if (stat_ret < 0)2323 return error("%s: %s", old_name, strerror(errno));23242325 if (!cached)2326 st_mode = ce_mode_from_stat(ce, st.st_mode);23272328 if (patch->is_new < 0)2329 patch->is_new = 0;2330 if (!patch->old_mode)2331 patch->old_mode = st_mode;2332 if ((st_mode ^ patch->old_mode) & S_IFMT)2333 return error("%s: wrong type", old_name);2334 if (st_mode != patch->old_mode)2335 fprintf(stderr, "warning: %s has type %o, expected %o\n",2336 old_name, st_mode, patch->old_mode);2337 }23382339 if (new_name && prev_patch && 0 < prev_patch->is_delete &&2340 !strcmp(prev_patch->old_name, new_name))2341 /*2342 * A type-change diff is always split into a patch to2343 * delete old, immediately followed by a patch to2344 * create new (see diff.c::run_diff()); in such a case2345 * it is Ok that the entry to be deleted by the2346 * previous patch is still in the working tree and in2347 * the index.2348 */2349 ok_if_exists = 1;2350 else2351 ok_if_exists = 0;23522353 if (new_name &&2354 ((0 < patch->is_new) | (0 < patch->is_rename) | patch->is_copy)) {2355 if (check_index &&2356 cache_name_pos(new_name, strlen(new_name)) >= 0 &&2357 !ok_if_exists)2358 return error("%s: already exists in index", new_name);2359 if (!cached) {2360 int err = check_to_create_blob(new_name, ok_if_exists);2361 if (err)2362 return err;2363 }2364 if (!patch->new_mode) {2365 if (0 < patch->is_new)2366 patch->new_mode = S_IFREG | 0644;2367 else2368 patch->new_mode = patch->old_mode;2369 }2370 }23712372 if (new_name && old_name) {2373 int same = !strcmp(old_name, new_name);2374 if (!patch->new_mode)2375 patch->new_mode = patch->old_mode;2376 if ((patch->old_mode ^ patch->new_mode) & S_IFMT)2377 return error("new mode (%o) of %s does not match old mode (%o)%s%s",2378 patch->new_mode, new_name, patch->old_mode,2379 same ? "" : " of ", same ? "" : old_name);2380 }23812382 if (apply_data(patch, &st, ce) < 0)2383 return error("%s: patch does not apply", name);2384 patch->rejected = 0;2385 return 0;2386}23872388static int check_patch_list(struct patch *patch)2389{2390 struct patch *prev_patch = NULL;2391 int err = 0;23922393 for (prev_patch = NULL; patch ; patch = patch->next) {2394 if (apply_verbosely)2395 say_patch_name(stderr,2396 "Checking patch ", patch, "...\n");2397 err |= check_patch(patch, prev_patch);2398 prev_patch = patch;2399 }2400 return err;2401}24022403/* This function tries to read the sha1 from the current index */2404static int get_current_sha1(const char *path, unsigned char *sha1)2405{2406 int pos;24072408 if (read_cache() < 0)2409 return -1;2410 pos = cache_name_pos(path, strlen(path));2411 if (pos < 0)2412 return -1;2413 hashcpy(sha1, active_cache[pos]->sha1);2414 return 0;2415}24162417/* Build an index that contains the just the files needed for a 3way merge */2418static void build_fake_ancestor(struct patch *list, const char *filename)2419{2420 struct patch *patch;2421 struct index_state result = { 0 };2422 int fd;24232424 /* Once we start supporting the reverse patch, it may be2425 * worth showing the new sha1 prefix, but until then...2426 */2427 for (patch = list; patch; patch = patch->next) {2428 const unsigned char *sha1_ptr;2429 unsigned char sha1[20];2430 struct cache_entry *ce;2431 const char *name;24322433 name = patch->old_name ? patch->old_name : patch->new_name;2434 if (0 < patch->is_new)2435 continue;2436 else if (get_sha1(patch->old_sha1_prefix, sha1))2437 /* git diff has no index line for mode/type changes */2438 if (!patch->lines_added && !patch->lines_deleted) {2439 if (get_current_sha1(patch->new_name, sha1) ||2440 get_current_sha1(patch->old_name, sha1))2441 die("mode change for %s, which is not "2442 "in current HEAD", name);2443 sha1_ptr = sha1;2444 } else2445 die("sha1 information is lacking or useless "2446 "(%s).", name);2447 else2448 sha1_ptr = sha1;24492450 ce = make_cache_entry(patch->old_mode, sha1_ptr, name, 0, 0);2451 if (add_index_entry(&result, ce, ADD_CACHE_OK_TO_ADD))2452 die ("Could not add %s to temporary index", name);2453 }24542455 fd = open(filename, O_WRONLY | O_CREAT, 0666);2456 if (fd < 0 || write_index(&result, fd) || close(fd))2457 die ("Could not write temporary index to %s", filename);24582459 discard_index(&result);2460}24612462static void stat_patch_list(struct patch *patch)2463{2464 int files, adds, dels;24652466 for (files = adds = dels = 0 ; patch ; patch = patch->next) {2467 files++;2468 adds += patch->lines_added;2469 dels += patch->lines_deleted;2470 show_stats(patch);2471 }24722473 printf(" %d files changed, %d insertions(+), %d deletions(-)\n", files, adds, dels);2474}24752476static void numstat_patch_list(struct patch *patch)2477{2478 for ( ; patch; patch = patch->next) {2479 const char *name;2480 name = patch->new_name ? patch->new_name : patch->old_name;2481 if (patch->is_binary)2482 printf("-\t-\t");2483 else2484 printf("%d\t%d\t", patch->lines_added, patch->lines_deleted);2485 write_name_quoted(name, stdout, line_termination);2486 }2487}24882489static void show_file_mode_name(const char *newdelete, unsigned int mode, const char *name)2490{2491 if (mode)2492 printf(" %s mode %06o %s\n", newdelete, mode, name);2493 else2494 printf(" %s %s\n", newdelete, name);2495}24962497static void show_mode_change(struct patch *p, int show_name)2498{2499 if (p->old_mode && p->new_mode && p->old_mode != p->new_mode) {2500 if (show_name)2501 printf(" mode change %06o => %06o %s\n",2502 p->old_mode, p->new_mode, p->new_name);2503 else2504 printf(" mode change %06o => %06o\n",2505 p->old_mode, p->new_mode);2506 }2507}25082509static void show_rename_copy(struct patch *p)2510{2511 const char *renamecopy = p->is_rename ? "rename" : "copy";2512 const char *old, *new;25132514 /* Find common prefix */2515 old = p->old_name;2516 new = p->new_name;2517 while (1) {2518 const char *slash_old, *slash_new;2519 slash_old = strchr(old, '/');2520 slash_new = strchr(new, '/');2521 if (!slash_old ||2522 !slash_new ||2523 slash_old - old != slash_new - new ||2524 memcmp(old, new, slash_new - new))2525 break;2526 old = slash_old + 1;2527 new = slash_new + 1;2528 }2529 /* p->old_name thru old is the common prefix, and old and new2530 * through the end of names are renames2531 */2532 if (old != p->old_name)2533 printf(" %s %.*s{%s => %s} (%d%%)\n", renamecopy,2534 (int)(old - p->old_name), p->old_name,2535 old, new, p->score);2536 else2537 printf(" %s %s => %s (%d%%)\n", renamecopy,2538 p->old_name, p->new_name, p->score);2539 show_mode_change(p, 0);2540}25412542static void summary_patch_list(struct patch *patch)2543{2544 struct patch *p;25452546 for (p = patch; p; p = p->next) {2547 if (p->is_new)2548 show_file_mode_name("create", p->new_mode, p->new_name);2549 else if (p->is_delete)2550 show_file_mode_name("delete", p->old_mode, p->old_name);2551 else {2552 if (p->is_rename || p->is_copy)2553 show_rename_copy(p);2554 else {2555 if (p->score) {2556 printf(" rewrite %s (%d%%)\n",2557 p->new_name, p->score);2558 show_mode_change(p, 0);2559 }2560 else2561 show_mode_change(p, 1);2562 }2563 }2564 }2565}25662567static void patch_stats(struct patch *patch)2568{2569 int lines = patch->lines_added + patch->lines_deleted;25702571 if (lines > max_change)2572 max_change = lines;2573 if (patch->old_name) {2574 int len = quote_c_style(patch->old_name, NULL, NULL, 0);2575 if (!len)2576 len = strlen(patch->old_name);2577 if (len > max_len)2578 max_len = len;2579 }2580 if (patch->new_name) {2581 int len = quote_c_style(patch->new_name, NULL, NULL, 0);2582 if (!len)2583 len = strlen(patch->new_name);2584 if (len > max_len)2585 max_len = len;2586 }2587}25882589static void remove_file(struct patch *patch, int rmdir_empty)2590{2591 if (update_index) {2592 if (remove_file_from_cache(patch->old_name) < 0)2593 die("unable to remove %s from index", patch->old_name);2594 }2595 if (!cached) {2596 if (S_ISGITLINK(patch->old_mode)) {2597 if (rmdir(patch->old_name))2598 warning("unable to remove submodule %s",2599 patch->old_name);2600 } else if (!unlink(patch->old_name) && rmdir_empty) {2601 char *name = xstrdup(patch->old_name);2602 char *end = strrchr(name, '/');2603 while (end) {2604 *end = 0;2605 if (rmdir(name))2606 break;2607 end = strrchr(name, '/');2608 }2609 free(name);2610 }2611 }2612}26132614static void add_index_file(const char *path, unsigned mode, void *buf, unsigned long size)2615{2616 struct stat st;2617 struct cache_entry *ce;2618 int namelen = strlen(path);2619 unsigned ce_size = cache_entry_size(namelen);26202621 if (!update_index)2622 return;26232624 ce = xcalloc(1, ce_size);2625 memcpy(ce->name, path, namelen);2626 ce->ce_mode = create_ce_mode(mode);2627 ce->ce_flags = namelen;2628 if (S_ISGITLINK(mode)) {2629 const char *s = buf;26302631 if (get_sha1_hex(s + strlen("Subproject commit "), ce->sha1))2632 die("corrupt patch for subproject %s", path);2633 } else {2634 if (!cached) {2635 if (lstat(path, &st) < 0)2636 die("unable to stat newly created file %s",2637 path);2638 fill_stat_cache_info(ce, &st);2639 }2640 if (write_sha1_file(buf, size, blob_type, ce->sha1) < 0)2641 die("unable to create backing store for newly created file %s", path);2642 }2643 if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD) < 0)2644 die("unable to add cache entry for %s", path);2645}26462647static int try_create_file(const char *path, unsigned int mode, const char *buf, unsigned long size)2648{2649 int fd;2650 struct strbuf nbuf;26512652 if (S_ISGITLINK(mode)) {2653 struct stat st;2654 if (!lstat(path, &st) && S_ISDIR(st.st_mode))2655 return 0;2656 return mkdir(path, 0777);2657 }26582659 if (has_symlinks && S_ISLNK(mode))2660 /* Although buf:size is counted string, it also is NUL2661 * terminated.2662 */2663 return symlink(buf, path);26642665 fd = open(path, O_CREAT | O_EXCL | O_WRONLY, (mode & 0100) ? 0777 : 0666);2666 if (fd < 0)2667 return -1;26682669 strbuf_init(&nbuf, 0);2670 if (convert_to_working_tree(path, buf, size, &nbuf)) {2671 size = nbuf.len;2672 buf = nbuf.buf;2673 }2674 write_or_die(fd, buf, size);2675 strbuf_release(&nbuf);26762677 if (close(fd) < 0)2678 die("closing file %s: %s", path, strerror(errno));2679 return 0;2680}26812682/*2683 * We optimistically assume that the directories exist,2684 * which is true 99% of the time anyway. If they don't,2685 * we create them and try again.2686 */2687static void create_one_file(char *path, unsigned mode, const char *buf, unsigned long size)2688{2689 if (cached)2690 return;2691 if (!try_create_file(path, mode, buf, size))2692 return;26932694 if (errno == ENOENT) {2695 if (safe_create_leading_directories(path))2696 return;2697 if (!try_create_file(path, mode, buf, size))2698 return;2699 }27002701 if (errno == EEXIST || errno == EACCES) {2702 /* We may be trying to create a file where a directory2703 * used to be.2704 */2705 struct stat st;2706 if (!lstat(path, &st) && (!S_ISDIR(st.st_mode) || !rmdir(path)))2707 errno = EEXIST;2708 }27092710 if (errno == EEXIST) {2711 unsigned int nr = getpid();27122713 for (;;) {2714 const char *newpath;2715 newpath = mkpath("%s~%u", path, nr);2716 if (!try_create_file(newpath, mode, buf, size)) {2717 if (!rename(newpath, path))2718 return;2719 unlink(newpath);2720 break;2721 }2722 if (errno != EEXIST)2723 break;2724 ++nr;2725 }2726 }2727 die("unable to write file %s mode %o", path, mode);2728}27292730static void create_file(struct patch *patch)2731{2732 char *path = patch->new_name;2733 unsigned mode = patch->new_mode;2734 unsigned long size = patch->resultsize;2735 char *buf = patch->result;27362737 if (!mode)2738 mode = S_IFREG | 0644;2739 create_one_file(path, mode, buf, size);2740 add_index_file(path, mode, buf, size);2741}27422743/* phase zero is to remove, phase one is to create */2744static void write_out_one_result(struct patch *patch, int phase)2745{2746 if (patch->is_delete > 0) {2747 if (phase == 0)2748 remove_file(patch, 1);2749 return;2750 }2751 if (patch->is_new > 0 || patch->is_copy) {2752 if (phase == 1)2753 create_file(patch);2754 return;2755 }2756 /*2757 * Rename or modification boils down to the same2758 * thing: remove the old, write the new2759 */2760 if (phase == 0)2761 remove_file(patch, patch->is_rename);2762 if (phase == 1)2763 create_file(patch);2764}27652766static int write_out_one_reject(struct patch *patch)2767{2768 FILE *rej;2769 char namebuf[PATH_MAX];2770 struct fragment *frag;2771 int cnt = 0;27722773 for (cnt = 0, frag = patch->fragments; frag; frag = frag->next) {2774 if (!frag->rejected)2775 continue;2776 cnt++;2777 }27782779 if (!cnt) {2780 if (apply_verbosely)2781 say_patch_name(stderr,2782 "Applied patch ", patch, " cleanly.\n");2783 return 0;2784 }27852786 /* This should not happen, because a removal patch that leaves2787 * contents are marked "rejected" at the patch level.2788 */2789 if (!patch->new_name)2790 die("internal error");27912792 /* Say this even without --verbose */2793 say_patch_name(stderr, "Applying patch ", patch, " with");2794 fprintf(stderr, " %d rejects...\n", cnt);27952796 cnt = strlen(patch->new_name);2797 if (ARRAY_SIZE(namebuf) <= cnt + 5) {2798 cnt = ARRAY_SIZE(namebuf) - 5;2799 fprintf(stderr,2800 "warning: truncating .rej filename to %.*s.rej",2801 cnt - 1, patch->new_name);2802 }2803 memcpy(namebuf, patch->new_name, cnt);2804 memcpy(namebuf + cnt, ".rej", 5);28052806 rej = fopen(namebuf, "w");2807 if (!rej)2808 return error("cannot open %s: %s", namebuf, strerror(errno));28092810 /* Normal git tools never deal with .rej, so do not pretend2811 * this is a git patch by saying --git nor give extended2812 * headers. While at it, maybe please "kompare" that wants2813 * the trailing TAB and some garbage at the end of line ;-).2814 */2815 fprintf(rej, "diff a/%s b/%s\t(rejected hunks)\n",2816 patch->new_name, patch->new_name);2817 for (cnt = 1, frag = patch->fragments;2818 frag;2819 cnt++, frag = frag->next) {2820 if (!frag->rejected) {2821 fprintf(stderr, "Hunk #%d applied cleanly.\n", cnt);2822 continue;2823 }2824 fprintf(stderr, "Rejected hunk #%d.\n", cnt);2825 fprintf(rej, "%.*s", frag->size, frag->patch);2826 if (frag->patch[frag->size-1] != '\n')2827 fputc('\n', rej);2828 }2829 fclose(rej);2830 return -1;2831}28322833static int write_out_results(struct patch *list, int skipped_patch)2834{2835 int phase;2836 int errs = 0;2837 struct patch *l;28382839 if (!list && !skipped_patch)2840 return error("No changes");28412842 for (phase = 0; phase < 2; phase++) {2843 l = list;2844 while (l) {2845 if (l->rejected)2846 errs = 1;2847 else {2848 write_out_one_result(l, phase);2849 if (phase == 1 && write_out_one_reject(l))2850 errs = 1;2851 }2852 l = l->next;2853 }2854 }2855 return errs;2856}28572858static struct lock_file lock_file;28592860static struct excludes {2861 struct excludes *next;2862 const char *path;2863} *excludes;28642865static int use_patch(struct patch *p)2866{2867 const char *pathname = p->new_name ? p->new_name : p->old_name;2868 struct excludes *x = excludes;2869 while (x) {2870 if (fnmatch(x->path, pathname, 0) == 0)2871 return 0;2872 x = x->next;2873 }2874 if (0 < prefix_length) {2875 int pathlen = strlen(pathname);2876 if (pathlen <= prefix_length ||2877 memcmp(prefix, pathname, prefix_length))2878 return 0;2879 }2880 return 1;2881}28822883static void prefix_one(char **name)2884{2885 char *old_name = *name;2886 if (!old_name)2887 return;2888 *name = xstrdup(prefix_filename(prefix, prefix_length, *name));2889 free(old_name);2890}28912892static void prefix_patches(struct patch *p)2893{2894 if (!prefix || p->is_toplevel_relative)2895 return;2896 for ( ; p; p = p->next) {2897 if (p->new_name == p->old_name) {2898 char *prefixed = p->new_name;2899 prefix_one(&prefixed);2900 p->new_name = p->old_name = prefixed;2901 }2902 else {2903 prefix_one(&p->new_name);2904 prefix_one(&p->old_name);2905 }2906 }2907}29082909static int apply_patch(int fd, const char *filename, int inaccurate_eof)2910{2911 size_t offset;2912 struct strbuf buf;2913 struct patch *list = NULL, **listp = &list;2914 int skipped_patch = 0;29152916 strbuf_init(&buf, 0);2917 patch_input_file = filename;2918 read_patch_file(&buf, fd);2919 offset = 0;2920 while (offset < buf.len) {2921 struct patch *patch;2922 int nr;29232924 patch = xcalloc(1, sizeof(*patch));2925 patch->inaccurate_eof = inaccurate_eof;2926 nr = parse_chunk(buf.buf + offset, buf.len - offset, patch);2927 if (nr < 0)2928 break;2929 if (apply_in_reverse)2930 reverse_patches(patch);2931 if (prefix)2932 prefix_patches(patch);2933 if (use_patch(patch)) {2934 patch_stats(patch);2935 *listp = patch;2936 listp = &patch->next;2937 }2938 else {2939 /* perhaps free it a bit better? */2940 free(patch);2941 skipped_patch++;2942 }2943 offset += nr;2944 }29452946 if (whitespace_error && (ws_error_action == die_on_ws_error))2947 apply = 0;29482949 update_index = check_index && apply;2950 if (update_index && newfd < 0)2951 newfd = hold_locked_index(&lock_file, 1);29522953 if (check_index) {2954 if (read_cache() < 0)2955 die("unable to read index file");2956 }29572958 if ((check || apply) &&2959 check_patch_list(list) < 0 &&2960 !apply_with_reject)2961 exit(1);29622963 if (apply && write_out_results(list, skipped_patch))2964 exit(1);29652966 if (fake_ancestor)2967 build_fake_ancestor(list, fake_ancestor);29682969 if (diffstat)2970 stat_patch_list(list);29712972 if (numstat)2973 numstat_patch_list(list);29742975 if (summary)2976 summary_patch_list(list);29772978 strbuf_release(&buf);2979 return 0;2980}29812982static int git_apply_config(const char *var, const char *value)2983{2984 if (!strcmp(var, "apply.whitespace"))2985 return git_config_string(&apply_default_whitespace, var, value);2986 return git_default_config(var, value);2987}298829892990int cmd_apply(int argc, const char **argv, const char *unused_prefix)2991{2992 int i;2993 int read_stdin = 1;2994 int inaccurate_eof = 0;2995 int errs = 0;2996 int is_not_gitdir;29972998 const char *whitespace_option = NULL;29993000 prefix = setup_git_directory_gently(&is_not_gitdir);3001 prefix_length = prefix ? strlen(prefix) : 0;3002 git_config(git_apply_config);3003 if (apply_default_whitespace)3004 parse_whitespace_option(apply_default_whitespace);30053006 for (i = 1; i < argc; i++) {3007 const char *arg = argv[i];3008 char *end;3009 int fd;30103011 if (!strcmp(arg, "-")) {3012 errs |= apply_patch(0, "<stdin>", inaccurate_eof);3013 read_stdin = 0;3014 continue;3015 }3016 if (!prefixcmp(arg, "--exclude=")) {3017 struct excludes *x = xmalloc(sizeof(*x));3018 x->path = arg + 10;3019 x->next = excludes;3020 excludes = x;3021 continue;3022 }3023 if (!prefixcmp(arg, "-p")) {3024 p_value = atoi(arg + 2);3025 p_value_known = 1;3026 continue;3027 }3028 if (!strcmp(arg, "--no-add")) {3029 no_add = 1;3030 continue;3031 }3032 if (!strcmp(arg, "--stat")) {3033 apply = 0;3034 diffstat = 1;3035 continue;3036 }3037 if (!strcmp(arg, "--allow-binary-replacement") ||3038 !strcmp(arg, "--binary")) {3039 continue; /* now no-op */3040 }3041 if (!strcmp(arg, "--numstat")) {3042 apply = 0;3043 numstat = 1;3044 continue;3045 }3046 if (!strcmp(arg, "--summary")) {3047 apply = 0;3048 summary = 1;3049 continue;3050 }3051 if (!strcmp(arg, "--check")) {3052 apply = 0;3053 check = 1;3054 continue;3055 }3056 if (!strcmp(arg, "--index")) {3057 if (is_not_gitdir)3058 die("--index outside a repository");3059 check_index = 1;3060 continue;3061 }3062 if (!strcmp(arg, "--cached")) {3063 if (is_not_gitdir)3064 die("--cached outside a repository");3065 check_index = 1;3066 cached = 1;3067 continue;3068 }3069 if (!strcmp(arg, "--apply")) {3070 apply = 1;3071 continue;3072 }3073 if (!strcmp(arg, "--build-fake-ancestor")) {3074 apply = 0;3075 if (++i >= argc)3076 die ("need a filename");3077 fake_ancestor = argv[i];3078 continue;3079 }3080 if (!strcmp(arg, "-z")) {3081 line_termination = 0;3082 continue;3083 }3084 if (!prefixcmp(arg, "-C")) {3085 p_context = strtoul(arg + 2, &end, 0);3086 if (*end != '\0')3087 die("unrecognized context count '%s'", arg + 2);3088 continue;3089 }3090 if (!prefixcmp(arg, "--whitespace=")) {3091 whitespace_option = arg + 13;3092 parse_whitespace_option(arg + 13);3093 continue;3094 }3095 if (!strcmp(arg, "-R") || !strcmp(arg, "--reverse")) {3096 apply_in_reverse = 1;3097 continue;3098 }3099 if (!strcmp(arg, "--unidiff-zero")) {3100 unidiff_zero = 1;3101 continue;3102 }3103 if (!strcmp(arg, "--reject")) {3104 apply = apply_with_reject = apply_verbosely = 1;3105 continue;3106 }3107 if (!strcmp(arg, "-v") || !strcmp(arg, "--verbose")) {3108 apply_verbosely = 1;3109 continue;3110 }3111 if (!strcmp(arg, "--inaccurate-eof")) {3112 inaccurate_eof = 1;3113 continue;3114 }3115 if (0 < prefix_length)3116 arg = prefix_filename(prefix, prefix_length, arg);31173118 fd = open(arg, O_RDONLY);3119 if (fd < 0)3120 die("can't open patch '%s': %s", arg, strerror(errno));3121 read_stdin = 0;3122 set_default_whitespace_mode(whitespace_option);3123 errs |= apply_patch(fd, arg, inaccurate_eof);3124 close(fd);3125 }3126 set_default_whitespace_mode(whitespace_option);3127 if (read_stdin)3128 errs |= apply_patch(0, "<stdin>", inaccurate_eof);3129 if (whitespace_error) {3130 if (squelch_whitespace_errors &&3131 squelch_whitespace_errors < whitespace_error) {3132 int squelched =3133 whitespace_error - squelch_whitespace_errors;3134 fprintf(stderr, "warning: squelched %d "3135 "whitespace error%s\n",3136 squelched,3137 squelched == 1 ? "" : "s");3138 }3139 if (ws_error_action == die_on_ws_error)3140 die("%d line%s add%s whitespace errors.",3141 whitespace_error,3142 whitespace_error == 1 ? "" : "s",3143 whitespace_error == 1 ? "s" : "");3144 if (applied_after_fixing_ws && apply)3145 fprintf(stderr, "warning: %d line%s applied after"3146 " fixing whitespace errors.\n",3147 applied_after_fixing_ws,3148 applied_after_fixing_ws == 1 ? "" : "s");3149 else if (whitespace_error)3150 fprintf(stderr, "warning: %d line%s add%s whitespace errors.\n",3151 whitespace_error,3152 whitespace_error == 1 ? "" : "s",3153 whitespace_error == 1 ? "s" : "");3154 }31553156 if (update_index) {3157 if (write_cache(newfd, active_cache, active_nr) ||3158 commit_locked_index(&lock_file))3159 die("Unable to write new index file");3160 }31613162 return !!errs;3163}