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#include"string-list.h" 16#include"dir.h" 17 18/* 19 * --check turns on checking that the working tree matches the 20 * files that are being modified, but doesn't apply the patch 21 * --stat does just a diffstat, and doesn't actually apply 22 * --numstat does numeric diffstat, and doesn't actually apply 23 * --index-info shows the old and new index info for paths if available. 24 * --index updates the cache as well. 25 * --cached updates only the cache without ever touching the working tree. 26 */ 27static const char*prefix; 28static int prefix_length = -1; 29static int newfd = -1; 30 31static int unidiff_zero; 32static int p_value =1; 33static int p_value_known; 34static int check_index; 35static int update_index; 36static int cached; 37static int diffstat; 38static int numstat; 39static int summary; 40static int check; 41static int apply =1; 42static int apply_in_reverse; 43static int apply_with_reject; 44static int apply_verbosely; 45static int no_add; 46static const char*fake_ancestor; 47static int line_termination ='\n'; 48static unsigned long p_context = ULONG_MAX; 49static const char apply_usage[] = 50"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>..."; 51 52static enum ws_error_action { 53 nowarn_ws_error, 54 warn_on_ws_error, 55 die_on_ws_error, 56 correct_ws_error, 57} ws_error_action = warn_on_ws_error; 58static int whitespace_error; 59static int squelch_whitespace_errors =5; 60static int applied_after_fixing_ws; 61static const char*patch_input_file; 62static const char*root; 63static int root_len; 64 65static voidparse_whitespace_option(const char*option) 66{ 67if(!option) { 68 ws_error_action = warn_on_ws_error; 69return; 70} 71if(!strcmp(option,"warn")) { 72 ws_error_action = warn_on_ws_error; 73return; 74} 75if(!strcmp(option,"nowarn")) { 76 ws_error_action = nowarn_ws_error; 77return; 78} 79if(!strcmp(option,"error")) { 80 ws_error_action = die_on_ws_error; 81return; 82} 83if(!strcmp(option,"error-all")) { 84 ws_error_action = die_on_ws_error; 85 squelch_whitespace_errors =0; 86return; 87} 88if(!strcmp(option,"strip") || !strcmp(option,"fix")) { 89 ws_error_action = correct_ws_error; 90return; 91} 92die("unrecognized whitespace option '%s'", option); 93} 94 95static voidset_default_whitespace_mode(const char*whitespace_option) 96{ 97if(!whitespace_option && !apply_default_whitespace) 98 ws_error_action = (apply ? warn_on_ws_error : nowarn_ws_error); 99} 100 101/* 102 * For "diff-stat" like behaviour, we keep track of the biggest change 103 * we've seen, and the longest filename. That allows us to do simple 104 * scaling. 105 */ 106static int max_change, max_len; 107 108/* 109 * Various "current state", notably line numbers and what 110 * file (and how) we're patching right now.. The "is_xxxx" 111 * things are flags, where -1 means "don't know yet". 112 */ 113static int linenr =1; 114 115/* 116 * This represents one "hunk" from a patch, starting with 117 * "@@ -oldpos,oldlines +newpos,newlines @@" marker. The 118 * patch text is pointed at by patch, and its byte length 119 * is stored in size. leading and trailing are the number 120 * of context lines. 121 */ 122struct fragment { 123unsigned long leading, trailing; 124unsigned long oldpos, oldlines; 125unsigned long newpos, newlines; 126const char*patch; 127int size; 128int rejected; 129struct fragment *next; 130}; 131 132/* 133 * When dealing with a binary patch, we reuse "leading" field 134 * to store the type of the binary hunk, either deflated "delta" 135 * or deflated "literal". 136 */ 137#define binary_patch_method leading 138#define BINARY_DELTA_DEFLATED 1 139#define BINARY_LITERAL_DEFLATED 2 140 141/* 142 * This represents a "patch" to a file, both metainfo changes 143 * such as creation/deletion, filemode and content changes represented 144 * as a series of fragments. 145 */ 146struct patch { 147char*new_name, *old_name, *def_name; 148unsigned int old_mode, new_mode; 149int is_new, is_delete;/* -1 = unknown, 0 = false, 1 = true */ 150int rejected; 151unsigned ws_rule; 152unsigned long deflate_origlen; 153int lines_added, lines_deleted; 154int score; 155unsigned int is_toplevel_relative:1; 156unsigned int inaccurate_eof:1; 157unsigned int is_binary:1; 158unsigned int is_copy:1; 159unsigned int is_rename:1; 160unsigned int recount:1; 161struct fragment *fragments; 162char*result; 163size_t resultsize; 164char old_sha1_prefix[41]; 165char new_sha1_prefix[41]; 166struct patch *next; 167}; 168 169/* 170 * A line in a file, len-bytes long (includes the terminating LF, 171 * except for an incomplete line at the end if the file ends with 172 * one), and its contents hashes to 'hash'. 173 */ 174struct line { 175size_t len; 176unsigned hash :24; 177unsigned flag :8; 178#define LINE_COMMON 1 179}; 180 181/* 182 * This represents a "file", which is an array of "lines". 183 */ 184struct image { 185char*buf; 186size_t len; 187size_t nr; 188size_t alloc; 189struct line *line_allocated; 190struct line *line; 191}; 192 193/* 194 * Records filenames that have been touched, in order to handle 195 * the case where more than one patches touch the same file. 196 */ 197 198static struct string_list fn_table; 199 200static uint32_thash_line(const char*cp,size_t len) 201{ 202size_t i; 203uint32_t h; 204for(i =0, h =0; i < len; i++) { 205if(!isspace(cp[i])) { 206 h = h *3+ (cp[i] &0xff); 207} 208} 209return h; 210} 211 212static voidadd_line_info(struct image *img,const char*bol,size_t len,unsigned flag) 213{ 214ALLOC_GROW(img->line_allocated, img->nr +1, img->alloc); 215 img->line_allocated[img->nr].len = len; 216 img->line_allocated[img->nr].hash =hash_line(bol, len); 217 img->line_allocated[img->nr].flag = flag; 218 img->nr++; 219} 220 221static voidprepare_image(struct image *image,char*buf,size_t len, 222int prepare_linetable) 223{ 224const char*cp, *ep; 225 226memset(image,0,sizeof(*image)); 227 image->buf = buf; 228 image->len = len; 229 230if(!prepare_linetable) 231return; 232 233 ep = image->buf + image->len; 234 cp = image->buf; 235while(cp < ep) { 236const char*next; 237for(next = cp; next < ep && *next !='\n'; next++) 238; 239if(next < ep) 240 next++; 241add_line_info(image, cp, next - cp,0); 242 cp = next; 243} 244 image->line = image->line_allocated; 245} 246 247static voidclear_image(struct image *image) 248{ 249free(image->buf); 250 image->buf = NULL; 251 image->len =0; 252} 253 254static voidsay_patch_name(FILE*output,const char*pre, 255struct patch *patch,const char*post) 256{ 257fputs(pre, output); 258if(patch->old_name && patch->new_name && 259strcmp(patch->old_name, patch->new_name)) { 260quote_c_style(patch->old_name, NULL, output,0); 261fputs(" => ", output); 262quote_c_style(patch->new_name, NULL, output,0); 263}else{ 264const char*n = patch->new_name; 265if(!n) 266 n = patch->old_name; 267quote_c_style(n, NULL, output,0); 268} 269fputs(post, output); 270} 271 272#define CHUNKSIZE (8192) 273#define SLOP (16) 274 275static voidread_patch_file(struct strbuf *sb,int fd) 276{ 277if(strbuf_read(sb, fd,0) <0) 278die("git apply: read returned%s",strerror(errno)); 279 280/* 281 * Make sure that we have some slop in the buffer 282 * so that we can do speculative "memcmp" etc, and 283 * see to it that it is NUL-filled. 284 */ 285strbuf_grow(sb, SLOP); 286memset(sb->buf + sb->len,0, SLOP); 287} 288 289static unsigned longlinelen(const char*buffer,unsigned long size) 290{ 291unsigned long len =0; 292while(size--) { 293 len++; 294if(*buffer++ =='\n') 295break; 296} 297return len; 298} 299 300static intis_dev_null(const char*str) 301{ 302return!memcmp("/dev/null", str,9) &&isspace(str[9]); 303} 304 305#define TERM_SPACE 1 306#define TERM_TAB 2 307 308static intname_terminate(const char*name,int namelen,int c,int terminate) 309{ 310if(c ==' '&& !(terminate & TERM_SPACE)) 311return0; 312if(c =='\t'&& !(terminate & TERM_TAB)) 313return0; 314 315return1; 316} 317 318static char*find_name(const char*line,char*def,int p_value,int terminate) 319{ 320int len; 321const char*start = line; 322 323if(*line =='"') { 324struct strbuf name = STRBUF_INIT; 325 326/* 327 * Proposed "new-style" GNU patch/diff format; see 328 * http://marc.theaimsgroup.com/?l=git&m=112927316408690&w=2 329 */ 330if(!unquote_c_style(&name, line, NULL)) { 331char*cp; 332 333for(cp = name.buf; p_value; p_value--) { 334 cp =strchr(cp,'/'); 335if(!cp) 336break; 337 cp++; 338} 339if(cp) { 340/* name can later be freed, so we need 341 * to memmove, not just return cp 342 */ 343strbuf_remove(&name,0, cp - name.buf); 344free(def); 345if(root) 346strbuf_insert(&name,0, root, root_len); 347returnstrbuf_detach(&name, NULL); 348} 349} 350strbuf_release(&name); 351} 352 353for(;;) { 354char c = *line; 355 356if(isspace(c)) { 357if(c =='\n') 358break; 359if(name_terminate(start, line-start, c, terminate)) 360break; 361} 362 line++; 363if(c =='/'&& !--p_value) 364 start = line; 365} 366if(!start) 367return def; 368 len = line - start; 369if(!len) 370return def; 371 372/* 373 * Generally we prefer the shorter name, especially 374 * if the other one is just a variation of that with 375 * something else tacked on to the end (ie "file.orig" 376 * or "file~"). 377 */ 378if(def) { 379int deflen =strlen(def); 380if(deflen < len && !strncmp(start, def, deflen)) 381return def; 382free(def); 383} 384 385if(root) { 386char*ret =xmalloc(root_len + len +1); 387strcpy(ret, root); 388memcpy(ret + root_len, start, len); 389 ret[root_len + len] ='\0'; 390return ret; 391} 392 393returnxmemdupz(start, len); 394} 395 396static intcount_slashes(const char*cp) 397{ 398int cnt =0; 399char ch; 400 401while((ch = *cp++)) 402if(ch =='/') 403 cnt++; 404return cnt; 405} 406 407/* 408 * Given the string after "--- " or "+++ ", guess the appropriate 409 * p_value for the given patch. 410 */ 411static intguess_p_value(const char*nameline) 412{ 413char*name, *cp; 414int val = -1; 415 416if(is_dev_null(nameline)) 417return-1; 418 name =find_name(nameline, NULL,0, TERM_SPACE | TERM_TAB); 419if(!name) 420return-1; 421 cp =strchr(name,'/'); 422if(!cp) 423 val =0; 424else if(prefix) { 425/* 426 * Does it begin with "a/$our-prefix" and such? Then this is 427 * very likely to apply to our directory. 428 */ 429if(!strncmp(name, prefix, prefix_length)) 430 val =count_slashes(prefix); 431else{ 432 cp++; 433if(!strncmp(cp, prefix, prefix_length)) 434 val =count_slashes(prefix) +1; 435} 436} 437free(name); 438return val; 439} 440 441/* 442 * Get the name etc info from the ---/+++ lines of a traditional patch header 443 * 444 * FIXME! The end-of-filename heuristics are kind of screwy. For existing 445 * files, we can happily check the index for a match, but for creating a 446 * new file we should try to match whatever "patch" does. I have no idea. 447 */ 448static voidparse_traditional_patch(const char*first,const char*second,struct patch *patch) 449{ 450char*name; 451 452 first +=4;/* skip "--- " */ 453 second +=4;/* skip "+++ " */ 454if(!p_value_known) { 455int p, q; 456 p =guess_p_value(first); 457 q =guess_p_value(second); 458if(p <0) p = q; 459if(0<= p && p == q) { 460 p_value = p; 461 p_value_known =1; 462} 463} 464if(is_dev_null(first)) { 465 patch->is_new =1; 466 patch->is_delete =0; 467 name =find_name(second, NULL, p_value, TERM_SPACE | TERM_TAB); 468 patch->new_name = name; 469}else if(is_dev_null(second)) { 470 patch->is_new =0; 471 patch->is_delete =1; 472 name =find_name(first, NULL, p_value, TERM_SPACE | TERM_TAB); 473 patch->old_name = name; 474}else{ 475 name =find_name(first, NULL, p_value, TERM_SPACE | TERM_TAB); 476 name =find_name(second, name, p_value, TERM_SPACE | TERM_TAB); 477 patch->old_name = patch->new_name = name; 478} 479if(!name) 480die("unable to find filename in patch at line%d", linenr); 481} 482 483static intgitdiff_hdrend(const char*line,struct patch *patch) 484{ 485return-1; 486} 487 488/* 489 * We're anal about diff header consistency, to make 490 * sure that we don't end up having strange ambiguous 491 * patches floating around. 492 * 493 * As a result, gitdiff_{old|new}name() will check 494 * their names against any previous information, just 495 * to make sure.. 496 */ 497static char*gitdiff_verify_name(const char*line,int isnull,char*orig_name,const char*oldnew) 498{ 499if(!orig_name && !isnull) 500returnfind_name(line, NULL, p_value, TERM_TAB); 501 502if(orig_name) { 503int len; 504const char*name; 505char*another; 506 name = orig_name; 507 len =strlen(name); 508if(isnull) 509die("git apply: bad git-diff - expected /dev/null, got%son line%d", name, linenr); 510 another =find_name(line, NULL, p_value, TERM_TAB); 511if(!another ||memcmp(another, name, len)) 512die("git apply: bad git-diff - inconsistent%sfilename on line%d", oldnew, linenr); 513free(another); 514return orig_name; 515} 516else{ 517/* expect "/dev/null" */ 518if(memcmp("/dev/null", line,9) || line[9] !='\n') 519die("git apply: bad git-diff - expected /dev/null on line%d", linenr); 520return NULL; 521} 522} 523 524static intgitdiff_oldname(const char*line,struct patch *patch) 525{ 526 patch->old_name =gitdiff_verify_name(line, patch->is_new, patch->old_name,"old"); 527return0; 528} 529 530static intgitdiff_newname(const char*line,struct patch *patch) 531{ 532 patch->new_name =gitdiff_verify_name(line, patch->is_delete, patch->new_name,"new"); 533return0; 534} 535 536static intgitdiff_oldmode(const char*line,struct patch *patch) 537{ 538 patch->old_mode =strtoul(line, NULL,8); 539return0; 540} 541 542static intgitdiff_newmode(const char*line,struct patch *patch) 543{ 544 patch->new_mode =strtoul(line, NULL,8); 545return0; 546} 547 548static intgitdiff_delete(const char*line,struct patch *patch) 549{ 550 patch->is_delete =1; 551 patch->old_name = patch->def_name; 552returngitdiff_oldmode(line, patch); 553} 554 555static intgitdiff_newfile(const char*line,struct patch *patch) 556{ 557 patch->is_new =1; 558 patch->new_name = patch->def_name; 559returngitdiff_newmode(line, patch); 560} 561 562static intgitdiff_copysrc(const char*line,struct patch *patch) 563{ 564 patch->is_copy =1; 565 patch->old_name =find_name(line, NULL,0,0); 566return0; 567} 568 569static intgitdiff_copydst(const char*line,struct patch *patch) 570{ 571 patch->is_copy =1; 572 patch->new_name =find_name(line, NULL,0,0); 573return0; 574} 575 576static intgitdiff_renamesrc(const char*line,struct patch *patch) 577{ 578 patch->is_rename =1; 579 patch->old_name =find_name(line, NULL,0,0); 580return0; 581} 582 583static intgitdiff_renamedst(const char*line,struct patch *patch) 584{ 585 patch->is_rename =1; 586 patch->new_name =find_name(line, NULL,0,0); 587return0; 588} 589 590static intgitdiff_similarity(const char*line,struct patch *patch) 591{ 592if((patch->score =strtoul(line, NULL,10)) == ULONG_MAX) 593 patch->score =0; 594return0; 595} 596 597static intgitdiff_dissimilarity(const char*line,struct patch *patch) 598{ 599if((patch->score =strtoul(line, NULL,10)) == ULONG_MAX) 600 patch->score =0; 601return0; 602} 603 604static intgitdiff_index(const char*line,struct patch *patch) 605{ 606/* 607 * index line is N hexadecimal, "..", N hexadecimal, 608 * and optional space with octal mode. 609 */ 610const char*ptr, *eol; 611int len; 612 613 ptr =strchr(line,'.'); 614if(!ptr || ptr[1] !='.'||40< ptr - line) 615return0; 616 len = ptr - line; 617memcpy(patch->old_sha1_prefix, line, len); 618 patch->old_sha1_prefix[len] =0; 619 620 line = ptr +2; 621 ptr =strchr(line,' '); 622 eol =strchr(line,'\n'); 623 624if(!ptr || eol < ptr) 625 ptr = eol; 626 len = ptr - line; 627 628if(40< len) 629return0; 630memcpy(patch->new_sha1_prefix, line, len); 631 patch->new_sha1_prefix[len] =0; 632if(*ptr ==' ') 633 patch->new_mode = patch->old_mode =strtoul(ptr+1, NULL,8); 634return0; 635} 636 637/* 638 * This is normal for a diff that doesn't change anything: we'll fall through 639 * into the next diff. Tell the parser to break out. 640 */ 641static intgitdiff_unrecognized(const char*line,struct patch *patch) 642{ 643return-1; 644} 645 646static const char*stop_at_slash(const char*line,int llen) 647{ 648int i; 649 650for(i =0; i < llen; i++) { 651int ch = line[i]; 652if(ch =='/') 653return line + i; 654} 655return NULL; 656} 657 658/* 659 * This is to extract the same name that appears on "diff --git" 660 * line. We do not find and return anything if it is a rename 661 * patch, and it is OK because we will find the name elsewhere. 662 * We need to reliably find name only when it is mode-change only, 663 * creation or deletion of an empty file. In any of these cases, 664 * both sides are the same name under a/ and b/ respectively. 665 */ 666static char*git_header_name(char*line,int llen) 667{ 668const char*name; 669const char*second = NULL; 670size_t len; 671 672 line +=strlen("diff --git "); 673 llen -=strlen("diff --git "); 674 675if(*line =='"') { 676const char*cp; 677struct strbuf first = STRBUF_INIT; 678struct strbuf sp = STRBUF_INIT; 679 680if(unquote_c_style(&first, line, &second)) 681goto free_and_fail1; 682 683/* advance to the first slash */ 684 cp =stop_at_slash(first.buf, first.len); 685/* we do not accept absolute paths */ 686if(!cp || cp == first.buf) 687goto free_and_fail1; 688strbuf_remove(&first,0, cp +1- first.buf); 689 690/* 691 * second points at one past closing dq of name. 692 * find the second name. 693 */ 694while((second < line + llen) &&isspace(*second)) 695 second++; 696 697if(line + llen <= second) 698goto free_and_fail1; 699if(*second =='"') { 700if(unquote_c_style(&sp, second, NULL)) 701goto free_and_fail1; 702 cp =stop_at_slash(sp.buf, sp.len); 703if(!cp || cp == sp.buf) 704goto free_and_fail1; 705/* They must match, otherwise ignore */ 706if(strcmp(cp +1, first.buf)) 707goto free_and_fail1; 708strbuf_release(&sp); 709returnstrbuf_detach(&first, NULL); 710} 711 712/* unquoted second */ 713 cp =stop_at_slash(second, line + llen - second); 714if(!cp || cp == second) 715goto free_and_fail1; 716 cp++; 717if(line + llen - cp != first.len +1|| 718memcmp(first.buf, cp, first.len)) 719goto free_and_fail1; 720returnstrbuf_detach(&first, NULL); 721 722 free_and_fail1: 723strbuf_release(&first); 724strbuf_release(&sp); 725return NULL; 726} 727 728/* unquoted first name */ 729 name =stop_at_slash(line, llen); 730if(!name || name == line) 731return NULL; 732 name++; 733 734/* 735 * since the first name is unquoted, a dq if exists must be 736 * the beginning of the second name. 737 */ 738for(second = name; second < line + llen; second++) { 739if(*second =='"') { 740struct strbuf sp = STRBUF_INIT; 741const char*np; 742 743if(unquote_c_style(&sp, second, NULL)) 744goto free_and_fail2; 745 746 np =stop_at_slash(sp.buf, sp.len); 747if(!np || np == sp.buf) 748goto free_and_fail2; 749 np++; 750 751 len = sp.buf + sp.len - np; 752if(len < second - name && 753!strncmp(np, name, len) && 754isspace(name[len])) { 755/* Good */ 756strbuf_remove(&sp,0, np - sp.buf); 757returnstrbuf_detach(&sp, NULL); 758} 759 760 free_and_fail2: 761strbuf_release(&sp); 762return NULL; 763} 764} 765 766/* 767 * Accept a name only if it shows up twice, exactly the same 768 * form. 769 */ 770for(len =0; ; len++) { 771switch(name[len]) { 772default: 773continue; 774case'\n': 775return NULL; 776case'\t':case' ': 777 second = name+len; 778for(;;) { 779char c = *second++; 780if(c =='\n') 781return NULL; 782if(c =='/') 783break; 784} 785if(second[len] =='\n'&& !memcmp(name, second, len)) { 786returnxmemdupz(name, len); 787} 788} 789} 790} 791 792/* Verify that we recognize the lines following a git header */ 793static intparse_git_header(char*line,int len,unsigned int size,struct patch *patch) 794{ 795unsigned long offset; 796 797/* A git diff has explicit new/delete information, so we don't guess */ 798 patch->is_new =0; 799 patch->is_delete =0; 800 801/* 802 * Some things may not have the old name in the 803 * rest of the headers anywhere (pure mode changes, 804 * or removing or adding empty files), so we get 805 * the default name from the header. 806 */ 807 patch->def_name =git_header_name(line, len); 808 809 line += len; 810 size -= len; 811 linenr++; 812for(offset = len ; size >0; offset += len, size -= len, line += len, linenr++) { 813static const struct opentry { 814const char*str; 815int(*fn)(const char*,struct patch *); 816} optable[] = { 817{"@@ -", gitdiff_hdrend }, 818{"--- ", gitdiff_oldname }, 819{"+++ ", gitdiff_newname }, 820{"old mode ", gitdiff_oldmode }, 821{"new mode ", gitdiff_newmode }, 822{"deleted file mode ", gitdiff_delete }, 823{"new file mode ", gitdiff_newfile }, 824{"copy from ", gitdiff_copysrc }, 825{"copy to ", gitdiff_copydst }, 826{"rename old ", gitdiff_renamesrc }, 827{"rename new ", gitdiff_renamedst }, 828{"rename from ", gitdiff_renamesrc }, 829{"rename to ", gitdiff_renamedst }, 830{"similarity index ", gitdiff_similarity }, 831{"dissimilarity index ", gitdiff_dissimilarity }, 832{"index ", gitdiff_index }, 833{"", gitdiff_unrecognized }, 834}; 835int i; 836 837 len =linelen(line, size); 838if(!len || line[len-1] !='\n') 839break; 840for(i =0; i <ARRAY_SIZE(optable); i++) { 841const struct opentry *p = optable + i; 842int oplen =strlen(p->str); 843if(len < oplen ||memcmp(p->str, line, oplen)) 844continue; 845if(p->fn(line + oplen, patch) <0) 846return offset; 847break; 848} 849} 850 851return offset; 852} 853 854static intparse_num(const char*line,unsigned long*p) 855{ 856char*ptr; 857 858if(!isdigit(*line)) 859return0; 860*p =strtoul(line, &ptr,10); 861return ptr - line; 862} 863 864static intparse_range(const char*line,int len,int offset,const char*expect, 865unsigned long*p1,unsigned long*p2) 866{ 867int digits, ex; 868 869if(offset <0|| offset >= len) 870return-1; 871 line += offset; 872 len -= offset; 873 874 digits =parse_num(line, p1); 875if(!digits) 876return-1; 877 878 offset += digits; 879 line += digits; 880 len -= digits; 881 882*p2 =1; 883if(*line ==',') { 884 digits =parse_num(line+1, p2); 885if(!digits) 886return-1; 887 888 offset += digits+1; 889 line += digits+1; 890 len -= digits+1; 891} 892 893 ex =strlen(expect); 894if(ex > len) 895return-1; 896if(memcmp(line, expect, ex)) 897return-1; 898 899return offset + ex; 900} 901 902static voidrecount_diff(char*line,int size,struct fragment *fragment) 903{ 904int oldlines =0, newlines =0, ret =0; 905 906if(size <1) { 907warning("recount: ignore empty hunk"); 908return; 909} 910 911for(;;) { 912int len =linelen(line, size); 913 size -= len; 914 line += len; 915 916if(size <1) 917break; 918 919switch(*line) { 920case' ':case'\n': 921 newlines++; 922/* fall through */ 923case'-': 924 oldlines++; 925continue; 926case'+': 927 newlines++; 928continue; 929case'\\': 930continue; 931case'@': 932 ret = size <3||prefixcmp(line,"@@ "); 933break; 934case'd': 935 ret = size <5||prefixcmp(line,"diff "); 936break; 937default: 938 ret = -1; 939break; 940} 941if(ret) { 942warning("recount: unexpected line: %.*s", 943(int)linelen(line, size), line); 944return; 945} 946break; 947} 948 fragment->oldlines = oldlines; 949 fragment->newlines = newlines; 950} 951 952/* 953 * Parse a unified diff fragment header of the 954 * form "@@ -a,b +c,d @@" 955 */ 956static intparse_fragment_header(char*line,int len,struct fragment *fragment) 957{ 958int offset; 959 960if(!len || line[len-1] !='\n') 961return-1; 962 963/* Figure out the number of lines in a fragment */ 964 offset =parse_range(line, len,4," +", &fragment->oldpos, &fragment->oldlines); 965 offset =parse_range(line, len, offset," @@", &fragment->newpos, &fragment->newlines); 966 967return offset; 968} 969 970static intfind_header(char*line,unsigned long size,int*hdrsize,struct patch *patch) 971{ 972unsigned long offset, len; 973 974 patch->is_toplevel_relative =0; 975 patch->is_rename = patch->is_copy =0; 976 patch->is_new = patch->is_delete = -1; 977 patch->old_mode = patch->new_mode =0; 978 patch->old_name = patch->new_name = NULL; 979for(offset =0; size >0; offset += len, size -= len, line += len, linenr++) { 980unsigned long nextlen; 981 982 len =linelen(line, size); 983if(!len) 984break; 985 986/* Testing this early allows us to take a few shortcuts.. */ 987if(len <6) 988continue; 989 990/* 991 * Make sure we don't find any unconnected patch fragments. 992 * That's a sign that we didn't find a header, and that a 993 * patch has become corrupted/broken up. 994 */ 995if(!memcmp("@@ -", line,4)) { 996struct fragment dummy; 997if(parse_fragment_header(line, len, &dummy) <0) 998continue; 999die("patch fragment without header at line%d: %.*s",1000 linenr, (int)len-1, line);1001}10021003if(size < len +6)1004break;10051006/*1007 * Git patch? It might not have a real patch, just a rename1008 * or mode change, so we handle that specially1009 */1010if(!memcmp("diff --git ", line,11)) {1011int git_hdr_len =parse_git_header(line, len, size, patch);1012if(git_hdr_len <= len)1013continue;1014if(!patch->old_name && !patch->new_name) {1015if(!patch->def_name)1016die("git diff header lacks filename information (line%d)", linenr);1017 patch->old_name = patch->new_name = patch->def_name;1018}1019 patch->is_toplevel_relative =1;1020*hdrsize = git_hdr_len;1021return offset;1022}10231024/* --- followed by +++ ? */1025if(memcmp("--- ", line,4) ||memcmp("+++ ", line + len,4))1026continue;10271028/*1029 * We only accept unified patches, so we want it to1030 * at least have "@@ -a,b +c,d @@\n", which is 14 chars1031 * minimum ("@@ -0,0 +1 @@\n" is the shortest).1032 */1033 nextlen =linelen(line + len, size - len);1034if(size < nextlen +14||memcmp("@@ -", line + len + nextlen,4))1035continue;10361037/* Ok, we'll consider it a patch */1038parse_traditional_patch(line, line+len, patch);1039*hdrsize = len + nextlen;1040 linenr +=2;1041return offset;1042}1043return-1;1044}10451046static voidcheck_whitespace(const char*line,int len,unsigned ws_rule)1047{1048char*err;1049unsigned result =ws_check(line +1, len -1, ws_rule);1050if(!result)1051return;10521053 whitespace_error++;1054if(squelch_whitespace_errors &&1055 squelch_whitespace_errors < whitespace_error)1056;1057else{1058 err =whitespace_error_string(result);1059fprintf(stderr,"%s:%d:%s.\n%.*s\n",1060 patch_input_file, linenr, err, len -2, line +1);1061free(err);1062}1063}10641065/*1066 * Parse a unified diff. Note that this really needs to parse each1067 * fragment separately, since the only way to know the difference1068 * between a "---" that is part of a patch, and a "---" that starts1069 * the next patch is to look at the line counts..1070 */1071static intparse_fragment(char*line,unsigned long size,1072struct patch *patch,struct fragment *fragment)1073{1074int added, deleted;1075int len =linelen(line, size), offset;1076unsigned long oldlines, newlines;1077unsigned long leading, trailing;10781079 offset =parse_fragment_header(line, len, fragment);1080if(offset <0)1081return-1;1082if(offset >0&& patch->recount)1083recount_diff(line + offset, size - offset, fragment);1084 oldlines = fragment->oldlines;1085 newlines = fragment->newlines;1086 leading =0;1087 trailing =0;10881089/* Parse the thing.. */1090 line += len;1091 size -= len;1092 linenr++;1093 added = deleted =0;1094for(offset = len;10950< size;1096 offset += len, size -= len, line += len, linenr++) {1097if(!oldlines && !newlines)1098break;1099 len =linelen(line, size);1100if(!len || line[len-1] !='\n')1101return-1;1102switch(*line) {1103default:1104return-1;1105case'\n':/* newer GNU diff, an empty context line */1106case' ':1107 oldlines--;1108 newlines--;1109if(!deleted && !added)1110 leading++;1111 trailing++;1112break;1113case'-':1114if(apply_in_reverse &&1115 ws_error_action != nowarn_ws_error)1116check_whitespace(line, len, patch->ws_rule);1117 deleted++;1118 oldlines--;1119 trailing =0;1120break;1121case'+':1122if(!apply_in_reverse &&1123 ws_error_action != nowarn_ws_error)1124check_whitespace(line, len, patch->ws_rule);1125 added++;1126 newlines--;1127 trailing =0;1128break;11291130/*1131 * We allow "\ No newline at end of file". Depending1132 * on locale settings when the patch was produced we1133 * don't know what this line looks like. The only1134 * thing we do know is that it begins with "\ ".1135 * Checking for 12 is just for sanity check -- any1136 * l10n of "\ No newline..." is at least that long.1137 */1138case'\\':1139if(len <12||memcmp(line,"\\",2))1140return-1;1141break;1142}1143}1144if(oldlines || newlines)1145return-1;1146 fragment->leading = leading;1147 fragment->trailing = trailing;11481149/*1150 * If a fragment ends with an incomplete line, we failed to include1151 * it in the above loop because we hit oldlines == newlines == 01152 * before seeing it.1153 */1154if(12< size && !memcmp(line,"\\",2))1155 offset +=linelen(line, size);11561157 patch->lines_added += added;1158 patch->lines_deleted += deleted;11591160if(0< patch->is_new && oldlines)1161returnerror("new file depends on old contents");1162if(0< patch->is_delete && newlines)1163returnerror("deleted file still has contents");1164return offset;1165}11661167static intparse_single_patch(char*line,unsigned long size,struct patch *patch)1168{1169unsigned long offset =0;1170unsigned long oldlines =0, newlines =0, context =0;1171struct fragment **fragp = &patch->fragments;11721173while(size >4&& !memcmp(line,"@@ -",4)) {1174struct fragment *fragment;1175int len;11761177 fragment =xcalloc(1,sizeof(*fragment));1178 len =parse_fragment(line, size, patch, fragment);1179if(len <=0)1180die("corrupt patch at line%d", linenr);1181 fragment->patch = line;1182 fragment->size = len;1183 oldlines += fragment->oldlines;1184 newlines += fragment->newlines;1185 context += fragment->leading + fragment->trailing;11861187*fragp = fragment;1188 fragp = &fragment->next;11891190 offset += len;1191 line += len;1192 size -= len;1193}11941195/*1196 * If something was removed (i.e. we have old-lines) it cannot1197 * be creation, and if something was added it cannot be1198 * deletion. However, the reverse is not true; --unified=01199 * patches that only add are not necessarily creation even1200 * though they do not have any old lines, and ones that only1201 * delete are not necessarily deletion.1202 *1203 * Unfortunately, a real creation/deletion patch do _not_ have1204 * any context line by definition, so we cannot safely tell it1205 * apart with --unified=0 insanity. At least if the patch has1206 * more than one hunk it is not creation or deletion.1207 */1208if(patch->is_new <0&&1209(oldlines || (patch->fragments && patch->fragments->next)))1210 patch->is_new =0;1211if(patch->is_delete <0&&1212(newlines || (patch->fragments && patch->fragments->next)))1213 patch->is_delete =0;12141215if(0< patch->is_new && oldlines)1216die("new file%sdepends on old contents", patch->new_name);1217if(0< patch->is_delete && newlines)1218die("deleted file%sstill has contents", patch->old_name);1219if(!patch->is_delete && !newlines && context)1220fprintf(stderr,"** warning: file%sbecomes empty but "1221"is not deleted\n", patch->new_name);12221223return offset;1224}12251226staticinlineintmetadata_changes(struct patch *patch)1227{1228return patch->is_rename >0||1229 patch->is_copy >0||1230 patch->is_new >0||1231 patch->is_delete ||1232(patch->old_mode && patch->new_mode &&1233 patch->old_mode != patch->new_mode);1234}12351236static char*inflate_it(const void*data,unsigned long size,1237unsigned long inflated_size)1238{1239 z_stream stream;1240void*out;1241int st;12421243memset(&stream,0,sizeof(stream));12441245 stream.next_in = (unsigned char*)data;1246 stream.avail_in = size;1247 stream.next_out = out =xmalloc(inflated_size);1248 stream.avail_out = inflated_size;1249inflateInit(&stream);1250 st =inflate(&stream, Z_FINISH);1251if((st != Z_STREAM_END) || stream.total_out != inflated_size) {1252free(out);1253return NULL;1254}1255return out;1256}12571258static struct fragment *parse_binary_hunk(char**buf_p,1259unsigned long*sz_p,1260int*status_p,1261int*used_p)1262{1263/*1264 * Expect a line that begins with binary patch method ("literal"1265 * or "delta"), followed by the length of data before deflating.1266 * a sequence of 'length-byte' followed by base-85 encoded data1267 * should follow, terminated by a newline.1268 *1269 * Each 5-byte sequence of base-85 encodes up to 4 bytes,1270 * and we would limit the patch line to 66 characters,1271 * so one line can fit up to 13 groups that would decode1272 * to 52 bytes max. The length byte 'A'-'Z' corresponds1273 * to 1-26 bytes, and 'a'-'z' corresponds to 27-52 bytes.1274 */1275int llen, used;1276unsigned long size = *sz_p;1277char*buffer = *buf_p;1278int patch_method;1279unsigned long origlen;1280char*data = NULL;1281int hunk_size =0;1282struct fragment *frag;12831284 llen =linelen(buffer, size);1285 used = llen;12861287*status_p =0;12881289if(!prefixcmp(buffer,"delta ")) {1290 patch_method = BINARY_DELTA_DEFLATED;1291 origlen =strtoul(buffer +6, NULL,10);1292}1293else if(!prefixcmp(buffer,"literal ")) {1294 patch_method = BINARY_LITERAL_DEFLATED;1295 origlen =strtoul(buffer +8, NULL,10);1296}1297else1298return NULL;12991300 linenr++;1301 buffer += llen;1302while(1) {1303int byte_length, max_byte_length, newsize;1304 llen =linelen(buffer, size);1305 used += llen;1306 linenr++;1307if(llen ==1) {1308/* consume the blank line */1309 buffer++;1310 size--;1311break;1312}1313/*1314 * Minimum line is "A00000\n" which is 7-byte long,1315 * and the line length must be multiple of 5 plus 2.1316 */1317if((llen <7) || (llen-2) %5)1318goto corrupt;1319 max_byte_length = (llen -2) /5*4;1320 byte_length = *buffer;1321if('A'<= byte_length && byte_length <='Z')1322 byte_length = byte_length -'A'+1;1323else if('a'<= byte_length && byte_length <='z')1324 byte_length = byte_length -'a'+27;1325else1326goto corrupt;1327/* if the input length was not multiple of 4, we would1328 * have filler at the end but the filler should never1329 * exceed 3 bytes1330 */1331if(max_byte_length < byte_length ||1332 byte_length <= max_byte_length -4)1333goto corrupt;1334 newsize = hunk_size + byte_length;1335 data =xrealloc(data, newsize);1336if(decode_85(data + hunk_size, buffer +1, byte_length))1337goto corrupt;1338 hunk_size = newsize;1339 buffer += llen;1340 size -= llen;1341}13421343 frag =xcalloc(1,sizeof(*frag));1344 frag->patch =inflate_it(data, hunk_size, origlen);1345if(!frag->patch)1346goto corrupt;1347free(data);1348 frag->size = origlen;1349*buf_p = buffer;1350*sz_p = size;1351*used_p = used;1352 frag->binary_patch_method = patch_method;1353return frag;13541355 corrupt:1356free(data);1357*status_p = -1;1358error("corrupt binary patch at line%d: %.*s",1359 linenr-1, llen-1, buffer);1360return NULL;1361}13621363static intparse_binary(char*buffer,unsigned long size,struct patch *patch)1364{1365/*1366 * We have read "GIT binary patch\n"; what follows is a line1367 * that says the patch method (currently, either "literal" or1368 * "delta") and the length of data before deflating; a1369 * sequence of 'length-byte' followed by base-85 encoded data1370 * follows.1371 *1372 * When a binary patch is reversible, there is another binary1373 * hunk in the same format, starting with patch method (either1374 * "literal" or "delta") with the length of data, and a sequence1375 * of length-byte + base-85 encoded data, terminated with another1376 * empty line. This data, when applied to the postimage, produces1377 * the preimage.1378 */1379struct fragment *forward;1380struct fragment *reverse;1381int status;1382int used, used_1;13831384 forward =parse_binary_hunk(&buffer, &size, &status, &used);1385if(!forward && !status)1386/* there has to be one hunk (forward hunk) */1387returnerror("unrecognized binary patch at line%d", linenr-1);1388if(status)1389/* otherwise we already gave an error message */1390return status;13911392 reverse =parse_binary_hunk(&buffer, &size, &status, &used_1);1393if(reverse)1394 used += used_1;1395else if(status) {1396/*1397 * Not having reverse hunk is not an error, but having1398 * a corrupt reverse hunk is.1399 */1400free((void*) forward->patch);1401free(forward);1402return status;1403}1404 forward->next = reverse;1405 patch->fragments = forward;1406 patch->is_binary =1;1407return used;1408}14091410static intparse_chunk(char*buffer,unsigned long size,struct patch *patch)1411{1412int hdrsize, patchsize;1413int offset =find_header(buffer, size, &hdrsize, patch);14141415if(offset <0)1416return offset;14171418 patch->ws_rule =whitespace_rule(patch->new_name1419? patch->new_name1420: patch->old_name);14211422 patchsize =parse_single_patch(buffer + offset + hdrsize,1423 size - offset - hdrsize, patch);14241425if(!patchsize) {1426static const char*binhdr[] = {1427"Binary files ",1428"Files ",1429 NULL,1430};1431static const char git_binary[] ="GIT binary patch\n";1432int i;1433int hd = hdrsize + offset;1434unsigned long llen =linelen(buffer + hd, size - hd);14351436if(llen ==sizeof(git_binary) -1&&1437!memcmp(git_binary, buffer + hd, llen)) {1438int used;1439 linenr++;1440 used =parse_binary(buffer + hd + llen,1441 size - hd - llen, patch);1442if(used)1443 patchsize = used + llen;1444else1445 patchsize =0;1446}1447else if(!memcmp(" differ\n", buffer + hd + llen -8,8)) {1448for(i =0; binhdr[i]; i++) {1449int len =strlen(binhdr[i]);1450if(len < size - hd &&1451!memcmp(binhdr[i], buffer + hd, len)) {1452 linenr++;1453 patch->is_binary =1;1454 patchsize = llen;1455break;1456}1457}1458}14591460/* Empty patch cannot be applied if it is a text patch1461 * without metadata change. A binary patch appears1462 * empty to us here.1463 */1464if((apply || check) &&1465(!patch->is_binary && !metadata_changes(patch)))1466die("patch with only garbage at line%d", linenr);1467}14681469return offset + hdrsize + patchsize;1470}14711472#define swap(a,b) myswap((a),(b),sizeof(a))14731474#define myswap(a, b, size) do { \1475 unsigned char mytmp[size]; \1476 memcpy(mytmp, &a, size); \1477 memcpy(&a, &b, size); \1478 memcpy(&b, mytmp, size); \1479} while (0)14801481static voidreverse_patches(struct patch *p)1482{1483for(; p; p = p->next) {1484struct fragment *frag = p->fragments;14851486swap(p->new_name, p->old_name);1487swap(p->new_mode, p->old_mode);1488swap(p->is_new, p->is_delete);1489swap(p->lines_added, p->lines_deleted);1490swap(p->old_sha1_prefix, p->new_sha1_prefix);14911492for(; frag; frag = frag->next) {1493swap(frag->newpos, frag->oldpos);1494swap(frag->newlines, frag->oldlines);1495}1496}1497}14981499static const char pluses[] =1500"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++";1501static const char minuses[]=1502"----------------------------------------------------------------------";15031504static voidshow_stats(struct patch *patch)1505{1506struct strbuf qname = STRBUF_INIT;1507char*cp = patch->new_name ? patch->new_name : patch->old_name;1508int max, add, del;15091510quote_c_style(cp, &qname, NULL,0);15111512/*1513 * "scale" the filename1514 */1515 max = max_len;1516if(max >50)1517 max =50;15181519if(qname.len > max) {1520 cp =strchr(qname.buf + qname.len +3- max,'/');1521if(!cp)1522 cp = qname.buf + qname.len +3- max;1523strbuf_splice(&qname,0, cp - qname.buf,"...",3);1524}15251526if(patch->is_binary) {1527printf(" %-*s | Bin\n", max, qname.buf);1528strbuf_release(&qname);1529return;1530}15311532printf(" %-*s |", max, qname.buf);1533strbuf_release(&qname);15341535/*1536 * scale the add/delete1537 */1538 max = max + max_change >70?70- max : max_change;1539 add = patch->lines_added;1540 del = patch->lines_deleted;15411542if(max_change >0) {1543int total = ((add + del) * max + max_change /2) / max_change;1544 add = (add * max + max_change /2) / max_change;1545 del = total - add;1546}1547printf("%5d %.*s%.*s\n", patch->lines_added + patch->lines_deleted,1548 add, pluses, del, minuses);1549}15501551static intread_old_data(struct stat *st,const char*path,struct strbuf *buf)1552{1553switch(st->st_mode & S_IFMT) {1554case S_IFLNK:1555strbuf_grow(buf, st->st_size);1556if(readlink(path, buf->buf, st->st_size) != st->st_size)1557return-1;1558strbuf_setlen(buf, st->st_size);1559return0;1560case S_IFREG:1561if(strbuf_read_file(buf, path, st->st_size) != st->st_size)1562returnerror("unable to open or read%s", path);1563convert_to_git(path, buf->buf, buf->len, buf,0);1564return0;1565default:1566return-1;1567}1568}15691570static voidupdate_pre_post_images(struct image *preimage,1571struct image *postimage,1572char*buf,1573size_t len)1574{1575int i, ctx;1576char*new, *old, *fixed;1577struct image fixed_preimage;15781579/*1580 * Update the preimage with whitespace fixes. Note that we1581 * are not losing preimage->buf -- apply_one_fragment() will1582 * free "oldlines".1583 */1584prepare_image(&fixed_preimage, buf, len,1);1585assert(fixed_preimage.nr == preimage->nr);1586for(i =0; i < preimage->nr; i++)1587 fixed_preimage.line[i].flag = preimage->line[i].flag;1588free(preimage->line_allocated);1589*preimage = fixed_preimage;15901591/*1592 * Adjust the common context lines in postimage, in place.1593 * This is possible because whitespace fixing does not make1594 * the string grow.1595 */1596new= old = postimage->buf;1597 fixed = preimage->buf;1598for(i = ctx =0; i < postimage->nr; i++) {1599size_t len = postimage->line[i].len;1600if(!(postimage->line[i].flag & LINE_COMMON)) {1601/* an added line -- no counterparts in preimage */1602memmove(new, old, len);1603 old += len;1604new+= len;1605continue;1606}16071608/* a common context -- skip it in the original postimage */1609 old += len;16101611/* and find the corresponding one in the fixed preimage */1612while(ctx < preimage->nr &&1613!(preimage->line[ctx].flag & LINE_COMMON)) {1614 fixed += preimage->line[ctx].len;1615 ctx++;1616}1617if(preimage->nr <= ctx)1618die("oops");16191620/* and copy it in, while fixing the line length */1621 len = preimage->line[ctx].len;1622memcpy(new, fixed, len);1623new+= len;1624 fixed += len;1625 postimage->line[i].len = len;1626 ctx++;1627}16281629/* Fix the length of the whole thing */1630 postimage->len =new- postimage->buf;1631}16321633static intmatch_fragment(struct image *img,1634struct image *preimage,1635struct image *postimage,1636unsigned longtry,1637int try_lno,1638unsigned ws_rule,1639int match_beginning,int match_end)1640{1641int i;1642char*fixed_buf, *buf, *orig, *target;16431644if(preimage->nr + try_lno > img->nr)1645return0;16461647if(match_beginning && try_lno)1648return0;16491650if(match_end && preimage->nr + try_lno != img->nr)1651return0;16521653/* Quick hash check */1654for(i =0; i < preimage->nr; i++)1655if(preimage->line[i].hash != img->line[try_lno + i].hash)1656return0;16571658/*1659 * Do we have an exact match? If we were told to match1660 * at the end, size must be exactly at try+fragsize,1661 * otherwise try+fragsize must be still within the preimage,1662 * and either case, the old piece should match the preimage1663 * exactly.1664 */1665if((match_end1666? (try+ preimage->len == img->len)1667: (try+ preimage->len <= img->len)) &&1668!memcmp(img->buf +try, preimage->buf, preimage->len))1669return1;16701671if(ws_error_action != correct_ws_error)1672return0;16731674/*1675 * The hunk does not apply byte-by-byte, but the hash says1676 * it might with whitespace fuzz.1677 */1678 fixed_buf =xmalloc(preimage->len +1);1679 buf = fixed_buf;1680 orig = preimage->buf;1681 target = img->buf +try;1682for(i =0; i < preimage->nr; i++) {1683size_t fixlen;/* length after fixing the preimage */1684size_t oldlen = preimage->line[i].len;1685size_t tgtlen = img->line[try_lno + i].len;1686size_t tgtfixlen;/* length after fixing the target line */1687char tgtfixbuf[1024], *tgtfix;1688int match;16891690/* Try fixing the line in the preimage */1691 fixlen =ws_fix_copy(buf, orig, oldlen, ws_rule, NULL);16921693/* Try fixing the line in the target */1694if(sizeof(tgtfixbuf) > tgtlen)1695 tgtfix = tgtfixbuf;1696else1697 tgtfix =xmalloc(tgtlen);1698 tgtfixlen =ws_fix_copy(tgtfix, target, tgtlen, ws_rule, NULL);16991700/*1701 * If they match, either the preimage was based on1702 * a version before our tree fixed whitespace breakage,1703 * or we are lacking a whitespace-fix patch the tree1704 * the preimage was based on already had (i.e. target1705 * has whitespace breakage, the preimage doesn't).1706 * In either case, we are fixing the whitespace breakages1707 * so we might as well take the fix together with their1708 * real change.1709 */1710 match = (tgtfixlen == fixlen && !memcmp(tgtfix, buf, fixlen));17111712if(tgtfix != tgtfixbuf)1713free(tgtfix);1714if(!match)1715goto unmatch_exit;17161717 orig += oldlen;1718 buf += fixlen;1719 target += tgtlen;1720}17211722/*1723 * Yes, the preimage is based on an older version that still1724 * has whitespace breakages unfixed, and fixing them makes the1725 * hunk match. Update the context lines in the postimage.1726 */1727update_pre_post_images(preimage, postimage,1728 fixed_buf, buf - fixed_buf);1729return1;17301731 unmatch_exit:1732free(fixed_buf);1733return0;1734}17351736static intfind_pos(struct image *img,1737struct image *preimage,1738struct image *postimage,1739int line,1740unsigned ws_rule,1741int match_beginning,int match_end)1742{1743int i;1744unsigned long backwards, forwards,try;1745int backwards_lno, forwards_lno, try_lno;17461747if(preimage->nr > img->nr)1748return-1;17491750/*1751 * If match_begining or match_end is specified, there is no1752 * point starting from a wrong line that will never match and1753 * wander around and wait for a match at the specified end.1754 */1755if(match_beginning)1756 line =0;1757else if(match_end)1758 line = img->nr - preimage->nr;17591760if(line > img->nr)1761 line = img->nr;17621763try=0;1764for(i =0; i < line; i++)1765try+= img->line[i].len;17661767/*1768 * There's probably some smart way to do this, but I'll leave1769 * that to the smart and beautiful people. I'm simple and stupid.1770 */1771 backwards =try;1772 backwards_lno = line;1773 forwards =try;1774 forwards_lno = line;1775 try_lno = line;17761777for(i =0; ; i++) {1778if(match_fragment(img, preimage, postimage,1779try, try_lno, ws_rule,1780 match_beginning, match_end))1781return try_lno;17821783 again:1784if(backwards_lno ==0&& forwards_lno == img->nr)1785break;17861787if(i &1) {1788if(backwards_lno ==0) {1789 i++;1790goto again;1791}1792 backwards_lno--;1793 backwards -= img->line[backwards_lno].len;1794try= backwards;1795 try_lno = backwards_lno;1796}else{1797if(forwards_lno == img->nr) {1798 i++;1799goto again;1800}1801 forwards += img->line[forwards_lno].len;1802 forwards_lno++;1803try= forwards;1804 try_lno = forwards_lno;1805}18061807}1808return-1;1809}18101811static voidremove_first_line(struct image *img)1812{1813 img->buf += img->line[0].len;1814 img->len -= img->line[0].len;1815 img->line++;1816 img->nr--;1817}18181819static voidremove_last_line(struct image *img)1820{1821 img->len -= img->line[--img->nr].len;1822}18231824static voidupdate_image(struct image *img,1825int applied_pos,1826struct image *preimage,1827struct image *postimage)1828{1829/*1830 * remove the copy of preimage at offset in img1831 * and replace it with postimage1832 */1833int i, nr;1834size_t remove_count, insert_count, applied_at =0;1835char*result;18361837for(i =0; i < applied_pos; i++)1838 applied_at += img->line[i].len;18391840 remove_count =0;1841for(i =0; i < preimage->nr; i++)1842 remove_count += img->line[applied_pos + i].len;1843 insert_count = postimage->len;18441845/* Adjust the contents */1846 result =xmalloc(img->len + insert_count - remove_count +1);1847memcpy(result, img->buf, applied_at);1848memcpy(result + applied_at, postimage->buf, postimage->len);1849memcpy(result + applied_at + postimage->len,1850 img->buf + (applied_at + remove_count),1851 img->len - (applied_at + remove_count));1852free(img->buf);1853 img->buf = result;1854 img->len += insert_count - remove_count;1855 result[img->len] ='\0';18561857/* Adjust the line table */1858 nr = img->nr + postimage->nr - preimage->nr;1859if(preimage->nr < postimage->nr) {1860/*1861 * NOTE: this knows that we never call remove_first_line()1862 * on anything other than pre/post image.1863 */1864 img->line =xrealloc(img->line, nr *sizeof(*img->line));1865 img->line_allocated = img->line;1866}1867if(preimage->nr != postimage->nr)1868memmove(img->line + applied_pos + postimage->nr,1869 img->line + applied_pos + preimage->nr,1870(img->nr - (applied_pos + preimage->nr)) *1871sizeof(*img->line));1872memcpy(img->line + applied_pos,1873 postimage->line,1874 postimage->nr *sizeof(*img->line));1875 img->nr = nr;1876}18771878static intapply_one_fragment(struct image *img,struct fragment *frag,1879int inaccurate_eof,unsigned ws_rule)1880{1881int match_beginning, match_end;1882const char*patch = frag->patch;1883int size = frag->size;1884char*old, *new, *oldlines, *newlines;1885int new_blank_lines_at_end =0;1886unsigned long leading, trailing;1887int pos, applied_pos;1888struct image preimage;1889struct image postimage;18901891memset(&preimage,0,sizeof(preimage));1892memset(&postimage,0,sizeof(postimage));1893 oldlines =xmalloc(size);1894 newlines =xmalloc(size);18951896 old = oldlines;1897new= newlines;1898while(size >0) {1899char first;1900int len =linelen(patch, size);1901int plen, added;1902int added_blank_line =0;19031904if(!len)1905break;19061907/*1908 * "plen" is how much of the line we should use for1909 * the actual patch data. Normally we just remove the1910 * first character on the line, but if the line is1911 * followed by "\ No newline", then we also remove the1912 * last one (which is the newline, of course).1913 */1914 plen = len -1;1915if(len < size && patch[len] =='\\')1916 plen--;1917 first = *patch;1918if(apply_in_reverse) {1919if(first =='-')1920 first ='+';1921else if(first =='+')1922 first ='-';1923}19241925switch(first) {1926case'\n':1927/* Newer GNU diff, empty context line */1928if(plen <0)1929/* ... followed by '\No newline'; nothing */1930break;1931*old++ ='\n';1932*new++ ='\n';1933add_line_info(&preimage,"\n",1, LINE_COMMON);1934add_line_info(&postimage,"\n",1, LINE_COMMON);1935break;1936case' ':1937case'-':1938memcpy(old, patch +1, plen);1939add_line_info(&preimage, old, plen,1940(first ==' '? LINE_COMMON :0));1941 old += plen;1942if(first =='-')1943break;1944/* Fall-through for ' ' */1945case'+':1946/* --no-add does not add new lines */1947if(first =='+'&& no_add)1948break;19491950if(first !='+'||1951!whitespace_error ||1952 ws_error_action != correct_ws_error) {1953memcpy(new, patch +1, plen);1954 added = plen;1955}1956else{1957 added =ws_fix_copy(new, patch +1, plen, ws_rule, &applied_after_fixing_ws);1958}1959add_line_info(&postimage,new, added,1960(first =='+'?0: LINE_COMMON));1961new+= added;1962if(first =='+'&&1963 added ==1&&new[-1] =='\n')1964 added_blank_line =1;1965break;1966case'@':case'\\':1967/* Ignore it, we already handled it */1968break;1969default:1970if(apply_verbosely)1971error("invalid start of line: '%c'", first);1972return-1;1973}1974if(added_blank_line)1975 new_blank_lines_at_end++;1976else1977 new_blank_lines_at_end =0;1978 patch += len;1979 size -= len;1980}1981if(inaccurate_eof &&1982 old > oldlines && old[-1] =='\n'&&1983new> newlines &&new[-1] =='\n') {1984 old--;1985new--;1986}19871988 leading = frag->leading;1989 trailing = frag->trailing;19901991/*1992 * A hunk to change lines at the beginning would begin with1993 * @@ -1,L +N,M @@1994 * but we need to be careful. -U0 that inserts before the second1995 * line also has this pattern.1996 *1997 * And a hunk to add to an empty file would begin with1998 * @@ -0,0 +N,M @@1999 *2000 * In other words, a hunk that is (frag->oldpos <= 1) with or2001 * without leading context must match at the beginning.2002 */2003 match_beginning = (!frag->oldpos ||2004(frag->oldpos ==1&& !unidiff_zero));20052006/*2007 * A hunk without trailing lines must match at the end.2008 * However, we simply cannot tell if a hunk must match end2009 * from the lack of trailing lines if the patch was generated2010 * with unidiff without any context.2011 */2012 match_end = !unidiff_zero && !trailing;20132014 pos = frag->newpos ? (frag->newpos -1) :0;2015 preimage.buf = oldlines;2016 preimage.len = old - oldlines;2017 postimage.buf = newlines;2018 postimage.len =new- newlines;2019 preimage.line = preimage.line_allocated;2020 postimage.line = postimage.line_allocated;20212022for(;;) {20232024 applied_pos =find_pos(img, &preimage, &postimage, pos,2025 ws_rule, match_beginning, match_end);20262027if(applied_pos >=0)2028break;20292030/* Am I at my context limits? */2031if((leading <= p_context) && (trailing <= p_context))2032break;2033if(match_beginning || match_end) {2034 match_beginning = match_end =0;2035continue;2036}20372038/*2039 * Reduce the number of context lines; reduce both2040 * leading and trailing if they are equal otherwise2041 * just reduce the larger context.2042 */2043if(leading >= trailing) {2044remove_first_line(&preimage);2045remove_first_line(&postimage);2046 pos--;2047 leading--;2048}2049if(trailing > leading) {2050remove_last_line(&preimage);2051remove_last_line(&postimage);2052 trailing--;2053}2054}20552056if(applied_pos >=0) {2057if(ws_error_action == correct_ws_error &&2058 new_blank_lines_at_end &&2059 postimage.nr + applied_pos == img->nr) {2060/*2061 * If the patch application adds blank lines2062 * at the end, and if the patch applies at the2063 * end of the image, remove those added blank2064 * lines.2065 */2066while(new_blank_lines_at_end--)2067remove_last_line(&postimage);2068}20692070/*2071 * Warn if it was necessary to reduce the number2072 * of context lines.2073 */2074if((leading != frag->leading) ||2075(trailing != frag->trailing))2076fprintf(stderr,"Context reduced to (%ld/%ld)"2077" to apply fragment at%d\n",2078 leading, trailing, applied_pos+1);2079update_image(img, applied_pos, &preimage, &postimage);2080}else{2081if(apply_verbosely)2082error("while searching for:\n%.*s",2083(int)(old - oldlines), oldlines);2084}20852086free(oldlines);2087free(newlines);2088free(preimage.line_allocated);2089free(postimage.line_allocated);20902091return(applied_pos <0);2092}20932094static intapply_binary_fragment(struct image *img,struct patch *patch)2095{2096struct fragment *fragment = patch->fragments;2097unsigned long len;2098void*dst;20992100/* Binary patch is irreversible without the optional second hunk */2101if(apply_in_reverse) {2102if(!fragment->next)2103returnerror("cannot reverse-apply a binary patch "2104"without the reverse hunk to '%s'",2105 patch->new_name2106? patch->new_name : patch->old_name);2107 fragment = fragment->next;2108}2109switch(fragment->binary_patch_method) {2110case BINARY_DELTA_DEFLATED:2111 dst =patch_delta(img->buf, img->len, fragment->patch,2112 fragment->size, &len);2113if(!dst)2114return-1;2115clear_image(img);2116 img->buf = dst;2117 img->len = len;2118return0;2119case BINARY_LITERAL_DEFLATED:2120clear_image(img);2121 img->len = fragment->size;2122 img->buf =xmalloc(img->len+1);2123memcpy(img->buf, fragment->patch, img->len);2124 img->buf[img->len] ='\0';2125return0;2126}2127return-1;2128}21292130static intapply_binary(struct image *img,struct patch *patch)2131{2132const char*name = patch->old_name ? patch->old_name : patch->new_name;2133unsigned char sha1[20];21342135/*2136 * For safety, we require patch index line to contain2137 * full 40-byte textual SHA1 for old and new, at least for now.2138 */2139if(strlen(patch->old_sha1_prefix) !=40||2140strlen(patch->new_sha1_prefix) !=40||2141get_sha1_hex(patch->old_sha1_prefix, sha1) ||2142get_sha1_hex(patch->new_sha1_prefix, sha1))2143returnerror("cannot apply binary patch to '%s' "2144"without full index line", name);21452146if(patch->old_name) {2147/*2148 * See if the old one matches what the patch2149 * applies to.2150 */2151hash_sha1_file(img->buf, img->len, blob_type, sha1);2152if(strcmp(sha1_to_hex(sha1), patch->old_sha1_prefix))2153returnerror("the patch applies to '%s' (%s), "2154"which does not match the "2155"current contents.",2156 name,sha1_to_hex(sha1));2157}2158else{2159/* Otherwise, the old one must be empty. */2160if(img->len)2161returnerror("the patch applies to an empty "2162"'%s' but it is not empty", name);2163}21642165get_sha1_hex(patch->new_sha1_prefix, sha1);2166if(is_null_sha1(sha1)) {2167clear_image(img);2168return0;/* deletion patch */2169}21702171if(has_sha1_file(sha1)) {2172/* We already have the postimage */2173enum object_type type;2174unsigned long size;2175char*result;21762177 result =read_sha1_file(sha1, &type, &size);2178if(!result)2179returnerror("the necessary postimage%sfor "2180"'%s' cannot be read",2181 patch->new_sha1_prefix, name);2182clear_image(img);2183 img->buf = result;2184 img->len = size;2185}else{2186/*2187 * We have verified buf matches the preimage;2188 * apply the patch data to it, which is stored2189 * in the patch->fragments->{patch,size}.2190 */2191if(apply_binary_fragment(img, patch))2192returnerror("binary patch does not apply to '%s'",2193 name);21942195/* verify that the result matches */2196hash_sha1_file(img->buf, img->len, blob_type, sha1);2197if(strcmp(sha1_to_hex(sha1), patch->new_sha1_prefix))2198returnerror("binary patch to '%s' creates incorrect result (expecting%s, got%s)",2199 name, patch->new_sha1_prefix,sha1_to_hex(sha1));2200}22012202return0;2203}22042205static intapply_fragments(struct image *img,struct patch *patch)2206{2207struct fragment *frag = patch->fragments;2208const char*name = patch->old_name ? patch->old_name : patch->new_name;2209unsigned ws_rule = patch->ws_rule;2210unsigned inaccurate_eof = patch->inaccurate_eof;22112212if(patch->is_binary)2213returnapply_binary(img, patch);22142215while(frag) {2216if(apply_one_fragment(img, frag, inaccurate_eof, ws_rule)) {2217error("patch failed:%s:%ld", name, frag->oldpos);2218if(!apply_with_reject)2219return-1;2220 frag->rejected =1;2221}2222 frag = frag->next;2223}2224return0;2225}22262227static intread_file_or_gitlink(struct cache_entry *ce,struct strbuf *buf)2228{2229if(!ce)2230return0;22312232if(S_ISGITLINK(ce->ce_mode)) {2233strbuf_grow(buf,100);2234strbuf_addf(buf,"Subproject commit%s\n",sha1_to_hex(ce->sha1));2235}else{2236enum object_type type;2237unsigned long sz;2238char*result;22392240 result =read_sha1_file(ce->sha1, &type, &sz);2241if(!result)2242return-1;2243/* XXX read_sha1_file NUL-terminates */2244strbuf_attach(buf, result, sz, sz +1);2245}2246return0;2247}22482249static struct patch *in_fn_table(const char*name)2250{2251struct string_list_item *item;22522253if(name == NULL)2254return NULL;22552256 item =string_list_lookup(name, &fn_table);2257if(item != NULL)2258return(struct patch *)item->util;22592260return NULL;2261}22622263static voidadd_to_fn_table(struct patch *patch)2264{2265struct string_list_item *item;22662267/*2268 * Always add new_name unless patch is a deletion2269 * This should cover the cases for normal diffs,2270 * file creations and copies2271 */2272if(patch->new_name != NULL) {2273 item =string_list_insert(patch->new_name, &fn_table);2274 item->util = patch;2275}22762277/*2278 * store a failure on rename/deletion cases because2279 * later chunks shouldn't patch old names2280 */2281if((patch->new_name == NULL) || (patch->is_rename)) {2282 item =string_list_insert(patch->old_name, &fn_table);2283 item->util = (struct patch *) -1;2284}2285}22862287static intapply_data(struct patch *patch,struct stat *st,struct cache_entry *ce)2288{2289struct strbuf buf = STRBUF_INIT;2290struct image image;2291size_t len;2292char*img;2293struct patch *tpatch;22942295if(!(patch->is_copy || patch->is_rename) &&2296((tpatch =in_fn_table(patch->old_name)) != NULL)) {2297if(tpatch == (struct patch *) -1) {2298returnerror("patch%shas been renamed/deleted",2299 patch->old_name);2300}2301/* We have a patched copy in memory use that */2302strbuf_add(&buf, tpatch->result, tpatch->resultsize);2303}else if(cached) {2304if(read_file_or_gitlink(ce, &buf))2305returnerror("read of%sfailed", patch->old_name);2306}else if(patch->old_name) {2307if(S_ISGITLINK(patch->old_mode)) {2308if(ce) {2309read_file_or_gitlink(ce, &buf);2310}else{2311/*2312 * There is no way to apply subproject2313 * patch without looking at the index.2314 */2315 patch->fragments = NULL;2316}2317}else{2318if(read_old_data(st, patch->old_name, &buf))2319returnerror("read of%sfailed", patch->old_name);2320}2321}23222323 img =strbuf_detach(&buf, &len);2324prepare_image(&image, img, len, !patch->is_binary);23252326if(apply_fragments(&image, patch) <0)2327return-1;/* note with --reject this succeeds. */2328 patch->result = image.buf;2329 patch->resultsize = image.len;2330add_to_fn_table(patch);2331free(image.line_allocated);23322333if(0< patch->is_delete && patch->resultsize)2334returnerror("removal patch leaves file contents");23352336return0;2337}23382339static intcheck_to_create_blob(const char*new_name,int ok_if_exists)2340{2341struct stat nst;2342if(!lstat(new_name, &nst)) {2343if(S_ISDIR(nst.st_mode) || ok_if_exists)2344return0;2345/*2346 * A leading component of new_name might be a symlink2347 * that is going to be removed with this patch, but2348 * still pointing at somewhere that has the path.2349 * In such a case, path "new_name" does not exist as2350 * far as git is concerned.2351 */2352if(has_symlink_leading_path(strlen(new_name), new_name))2353return0;23542355returnerror("%s: already exists in working directory", new_name);2356}2357else if((errno != ENOENT) && (errno != ENOTDIR))2358returnerror("%s:%s", new_name,strerror(errno));2359return0;2360}23612362static intverify_index_match(struct cache_entry *ce,struct stat *st)2363{2364if(S_ISGITLINK(ce->ce_mode)) {2365if(!S_ISDIR(st->st_mode))2366return-1;2367return0;2368}2369returnce_match_stat(ce, st, CE_MATCH_IGNORE_VALID);2370}23712372static intcheck_preimage(struct patch *patch,struct cache_entry **ce,struct stat *st)2373{2374const char*old_name = patch->old_name;2375struct patch *tpatch = NULL;2376int stat_ret =0;2377unsigned st_mode =0;23782379/*2380 * Make sure that we do not have local modifications from the2381 * index when we are looking at the index. Also make sure2382 * we have the preimage file to be patched in the work tree,2383 * unless --cached, which tells git to apply only in the index.2384 */2385if(!old_name)2386return0;23872388assert(patch->is_new <=0);23892390if(!(patch->is_copy || patch->is_rename) &&2391(tpatch =in_fn_table(old_name)) != NULL) {2392if(tpatch == (struct patch *) -1) {2393returnerror("%s: has been deleted/renamed", old_name);2394}2395 st_mode = tpatch->new_mode;2396}else if(!cached) {2397 stat_ret =lstat(old_name, st);2398if(stat_ret && errno != ENOENT)2399returnerror("%s:%s", old_name,strerror(errno));2400}24012402if(check_index && !tpatch) {2403int pos =cache_name_pos(old_name,strlen(old_name));2404if(pos <0) {2405if(patch->is_new <0)2406goto is_new;2407returnerror("%s: does not exist in index", old_name);2408}2409*ce = active_cache[pos];2410if(stat_ret <0) {2411struct checkout costate;2412/* checkout */2413 costate.base_dir ="";2414 costate.base_dir_len =0;2415 costate.force =0;2416 costate.quiet =0;2417 costate.not_new =0;2418 costate.refresh_cache =1;2419if(checkout_entry(*ce, &costate, NULL) ||2420lstat(old_name, st))2421return-1;2422}2423if(!cached &&verify_index_match(*ce, st))2424returnerror("%s: does not match index", old_name);2425if(cached)2426 st_mode = (*ce)->ce_mode;2427}else if(stat_ret <0) {2428if(patch->is_new <0)2429goto is_new;2430returnerror("%s:%s", old_name,strerror(errno));2431}24322433if(!cached)2434 st_mode =ce_mode_from_stat(*ce, st->st_mode);24352436if(patch->is_new <0)2437 patch->is_new =0;2438if(!patch->old_mode)2439 patch->old_mode = st_mode;2440if((st_mode ^ patch->old_mode) & S_IFMT)2441returnerror("%s: wrong type", old_name);2442if(st_mode != patch->old_mode)2443fprintf(stderr,"warning:%shas type%o, expected%o\n",2444 old_name, st_mode, patch->old_mode);2445return0;24462447 is_new:2448 patch->is_new =1;2449 patch->is_delete =0;2450 patch->old_name = NULL;2451return0;2452}24532454static intcheck_patch(struct patch *patch)2455{2456struct stat st;2457const char*old_name = patch->old_name;2458const char*new_name = patch->new_name;2459const char*name = old_name ? old_name : new_name;2460struct cache_entry *ce = NULL;2461int ok_if_exists;2462int status;24632464 patch->rejected =1;/* we will drop this after we succeed */24652466 status =check_preimage(patch, &ce, &st);2467if(status)2468return status;2469 old_name = patch->old_name;24702471if(in_fn_table(new_name) == (struct patch *) -1)2472/*2473 * A type-change diff is always split into a patch to2474 * delete old, immediately followed by a patch to2475 * create new (see diff.c::run_diff()); in such a case2476 * it is Ok that the entry to be deleted by the2477 * previous patch is still in the working tree and in2478 * the index.2479 */2480 ok_if_exists =1;2481else2482 ok_if_exists =0;24832484if(new_name &&2485((0< patch->is_new) | (0< patch->is_rename) | patch->is_copy)) {2486if(check_index &&2487cache_name_pos(new_name,strlen(new_name)) >=0&&2488!ok_if_exists)2489returnerror("%s: already exists in index", new_name);2490if(!cached) {2491int err =check_to_create_blob(new_name, ok_if_exists);2492if(err)2493return err;2494}2495if(!patch->new_mode) {2496if(0< patch->is_new)2497 patch->new_mode = S_IFREG |0644;2498else2499 patch->new_mode = patch->old_mode;2500}2501}25022503if(new_name && old_name) {2504int same = !strcmp(old_name, new_name);2505if(!patch->new_mode)2506 patch->new_mode = patch->old_mode;2507if((patch->old_mode ^ patch->new_mode) & S_IFMT)2508returnerror("new mode (%o) of%sdoes not match old mode (%o)%s%s",2509 patch->new_mode, new_name, patch->old_mode,2510 same ?"":" of ", same ?"": old_name);2511}25122513if(apply_data(patch, &st, ce) <0)2514returnerror("%s: patch does not apply", name);2515 patch->rejected =0;2516return0;2517}25182519static intcheck_patch_list(struct patch *patch)2520{2521int err =0;25222523while(patch) {2524if(apply_verbosely)2525say_patch_name(stderr,2526"Checking patch ", patch,"...\n");2527 err |=check_patch(patch);2528 patch = patch->next;2529}2530return err;2531}25322533/* This function tries to read the sha1 from the current index */2534static intget_current_sha1(const char*path,unsigned char*sha1)2535{2536int pos;25372538if(read_cache() <0)2539return-1;2540 pos =cache_name_pos(path,strlen(path));2541if(pos <0)2542return-1;2543hashcpy(sha1, active_cache[pos]->sha1);2544return0;2545}25462547/* Build an index that contains the just the files needed for a 3way merge */2548static voidbuild_fake_ancestor(struct patch *list,const char*filename)2549{2550struct patch *patch;2551struct index_state result = {0};2552int fd;25532554/* Once we start supporting the reverse patch, it may be2555 * worth showing the new sha1 prefix, but until then...2556 */2557for(patch = list; patch; patch = patch->next) {2558const unsigned char*sha1_ptr;2559unsigned char sha1[20];2560struct cache_entry *ce;2561const char*name;25622563 name = patch->old_name ? patch->old_name : patch->new_name;2564if(0< patch->is_new)2565continue;2566else if(get_sha1(patch->old_sha1_prefix, sha1))2567/* git diff has no index line for mode/type changes */2568if(!patch->lines_added && !patch->lines_deleted) {2569if(get_current_sha1(patch->new_name, sha1) ||2570get_current_sha1(patch->old_name, sha1))2571die("mode change for%s, which is not "2572"in current HEAD", name);2573 sha1_ptr = sha1;2574}else2575die("sha1 information is lacking or useless "2576"(%s).", name);2577else2578 sha1_ptr = sha1;25792580 ce =make_cache_entry(patch->old_mode, sha1_ptr, name,0,0);2581if(!ce)2582die("make_cache_entry failed for path '%s'", name);2583if(add_index_entry(&result, ce, ADD_CACHE_OK_TO_ADD))2584die("Could not add%sto temporary index", name);2585}25862587 fd =open(filename, O_WRONLY | O_CREAT,0666);2588if(fd <0||write_index(&result, fd) ||close(fd))2589die("Could not write temporary index to%s", filename);25902591discard_index(&result);2592}25932594static voidstat_patch_list(struct patch *patch)2595{2596int files, adds, dels;25972598for(files = adds = dels =0; patch ; patch = patch->next) {2599 files++;2600 adds += patch->lines_added;2601 dels += patch->lines_deleted;2602show_stats(patch);2603}26042605printf("%dfiles changed,%dinsertions(+),%ddeletions(-)\n", files, adds, dels);2606}26072608static voidnumstat_patch_list(struct patch *patch)2609{2610for( ; patch; patch = patch->next) {2611const char*name;2612 name = patch->new_name ? patch->new_name : patch->old_name;2613if(patch->is_binary)2614printf("-\t-\t");2615else2616printf("%d\t%d\t", patch->lines_added, patch->lines_deleted);2617write_name_quoted(name, stdout, line_termination);2618}2619}26202621static voidshow_file_mode_name(const char*newdelete,unsigned int mode,const char*name)2622{2623if(mode)2624printf("%smode%06o%s\n", newdelete, mode, name);2625else2626printf("%s %s\n", newdelete, name);2627}26282629static voidshow_mode_change(struct patch *p,int show_name)2630{2631if(p->old_mode && p->new_mode && p->old_mode != p->new_mode) {2632if(show_name)2633printf(" mode change%06o =>%06o%s\n",2634 p->old_mode, p->new_mode, p->new_name);2635else2636printf(" mode change%06o =>%06o\n",2637 p->old_mode, p->new_mode);2638}2639}26402641static voidshow_rename_copy(struct patch *p)2642{2643const char*renamecopy = p->is_rename ?"rename":"copy";2644const char*old, *new;26452646/* Find common prefix */2647 old = p->old_name;2648new= p->new_name;2649while(1) {2650const char*slash_old, *slash_new;2651 slash_old =strchr(old,'/');2652 slash_new =strchr(new,'/');2653if(!slash_old ||2654!slash_new ||2655 slash_old - old != slash_new -new||2656memcmp(old,new, slash_new -new))2657break;2658 old = slash_old +1;2659new= slash_new +1;2660}2661/* p->old_name thru old is the common prefix, and old and new2662 * through the end of names are renames2663 */2664if(old != p->old_name)2665printf("%s%.*s{%s=>%s} (%d%%)\n", renamecopy,2666(int)(old - p->old_name), p->old_name,2667 old,new, p->score);2668else2669printf("%s %s=>%s(%d%%)\n", renamecopy,2670 p->old_name, p->new_name, p->score);2671show_mode_change(p,0);2672}26732674static voidsummary_patch_list(struct patch *patch)2675{2676struct patch *p;26772678for(p = patch; p; p = p->next) {2679if(p->is_new)2680show_file_mode_name("create", p->new_mode, p->new_name);2681else if(p->is_delete)2682show_file_mode_name("delete", p->old_mode, p->old_name);2683else{2684if(p->is_rename || p->is_copy)2685show_rename_copy(p);2686else{2687if(p->score) {2688printf(" rewrite%s(%d%%)\n",2689 p->new_name, p->score);2690show_mode_change(p,0);2691}2692else2693show_mode_change(p,1);2694}2695}2696}2697}26982699static voidpatch_stats(struct patch *patch)2700{2701int lines = patch->lines_added + patch->lines_deleted;27022703if(lines > max_change)2704 max_change = lines;2705if(patch->old_name) {2706int len =quote_c_style(patch->old_name, NULL, NULL,0);2707if(!len)2708 len =strlen(patch->old_name);2709if(len > max_len)2710 max_len = len;2711}2712if(patch->new_name) {2713int len =quote_c_style(patch->new_name, NULL, NULL,0);2714if(!len)2715 len =strlen(patch->new_name);2716if(len > max_len)2717 max_len = len;2718}2719}27202721static voidremove_file(struct patch *patch,int rmdir_empty)2722{2723if(update_index) {2724if(remove_file_from_cache(patch->old_name) <0)2725die("unable to remove%sfrom index", patch->old_name);2726}2727if(!cached) {2728if(S_ISGITLINK(patch->old_mode)) {2729if(rmdir(patch->old_name))2730warning("unable to remove submodule%s",2731 patch->old_name);2732}else if(!unlink(patch->old_name) && rmdir_empty) {2733remove_path(patch->old_name);2734}2735}2736}27372738static voidadd_index_file(const char*path,unsigned mode,void*buf,unsigned long size)2739{2740struct stat st;2741struct cache_entry *ce;2742int namelen =strlen(path);2743unsigned ce_size =cache_entry_size(namelen);27442745if(!update_index)2746return;27472748 ce =xcalloc(1, ce_size);2749memcpy(ce->name, path, namelen);2750 ce->ce_mode =create_ce_mode(mode);2751 ce->ce_flags = namelen;2752if(S_ISGITLINK(mode)) {2753const char*s = buf;27542755if(get_sha1_hex(s +strlen("Subproject commit "), ce->sha1))2756die("corrupt patch for subproject%s", path);2757}else{2758if(!cached) {2759if(lstat(path, &st) <0)2760die("unable to stat newly created file%s",2761 path);2762fill_stat_cache_info(ce, &st);2763}2764if(write_sha1_file(buf, size, blob_type, ce->sha1) <0)2765die("unable to create backing store for newly created file%s", path);2766}2767if(add_cache_entry(ce, ADD_CACHE_OK_TO_ADD) <0)2768die("unable to add cache entry for%s", path);2769}27702771static inttry_create_file(const char*path,unsigned int mode,const char*buf,unsigned long size)2772{2773int fd;2774struct strbuf nbuf = STRBUF_INIT;27752776if(S_ISGITLINK(mode)) {2777struct stat st;2778if(!lstat(path, &st) &&S_ISDIR(st.st_mode))2779return0;2780returnmkdir(path,0777);2781}27822783if(has_symlinks &&S_ISLNK(mode))2784/* Although buf:size is counted string, it also is NUL2785 * terminated.2786 */2787returnsymlink(buf, path);27882789 fd =open(path, O_CREAT | O_EXCL | O_WRONLY, (mode &0100) ?0777:0666);2790if(fd <0)2791return-1;27922793if(convert_to_working_tree(path, buf, size, &nbuf)) {2794 size = nbuf.len;2795 buf = nbuf.buf;2796}2797write_or_die(fd, buf, size);2798strbuf_release(&nbuf);27992800if(close(fd) <0)2801die("closing file%s:%s", path,strerror(errno));2802return0;2803}28042805/*2806 * We optimistically assume that the directories exist,2807 * which is true 99% of the time anyway. If they don't,2808 * we create them and try again.2809 */2810static voidcreate_one_file(char*path,unsigned mode,const char*buf,unsigned long size)2811{2812if(cached)2813return;2814if(!try_create_file(path, mode, buf, size))2815return;28162817if(errno == ENOENT) {2818if(safe_create_leading_directories(path))2819return;2820if(!try_create_file(path, mode, buf, size))2821return;2822}28232824if(errno == EEXIST || errno == EACCES) {2825/* We may be trying to create a file where a directory2826 * used to be.2827 */2828struct stat st;2829if(!lstat(path, &st) && (!S_ISDIR(st.st_mode) || !rmdir(path)))2830 errno = EEXIST;2831}28322833if(errno == EEXIST) {2834unsigned int nr =getpid();28352836for(;;) {2837const char*newpath;2838 newpath =mkpath("%s~%u", path, nr);2839if(!try_create_file(newpath, mode, buf, size)) {2840if(!rename(newpath, path))2841return;2842unlink(newpath);2843break;2844}2845if(errno != EEXIST)2846break;2847++nr;2848}2849}2850die("unable to write file%smode%o", path, mode);2851}28522853static voidcreate_file(struct patch *patch)2854{2855char*path = patch->new_name;2856unsigned mode = patch->new_mode;2857unsigned long size = patch->resultsize;2858char*buf = patch->result;28592860if(!mode)2861 mode = S_IFREG |0644;2862create_one_file(path, mode, buf, size);2863add_index_file(path, mode, buf, size);2864}28652866/* phase zero is to remove, phase one is to create */2867static voidwrite_out_one_result(struct patch *patch,int phase)2868{2869if(patch->is_delete >0) {2870if(phase ==0)2871remove_file(patch,1);2872return;2873}2874if(patch->is_new >0|| patch->is_copy) {2875if(phase ==1)2876create_file(patch);2877return;2878}2879/*2880 * Rename or modification boils down to the same2881 * thing: remove the old, write the new2882 */2883if(phase ==0)2884remove_file(patch, patch->is_rename);2885if(phase ==1)2886create_file(patch);2887}28882889static intwrite_out_one_reject(struct patch *patch)2890{2891FILE*rej;2892char namebuf[PATH_MAX];2893struct fragment *frag;2894int cnt =0;28952896for(cnt =0, frag = patch->fragments; frag; frag = frag->next) {2897if(!frag->rejected)2898continue;2899 cnt++;2900}29012902if(!cnt) {2903if(apply_verbosely)2904say_patch_name(stderr,2905"Applied patch ", patch," cleanly.\n");2906return0;2907}29082909/* This should not happen, because a removal patch that leaves2910 * contents are marked "rejected" at the patch level.2911 */2912if(!patch->new_name)2913die("internal error");29142915/* Say this even without --verbose */2916say_patch_name(stderr,"Applying patch ", patch," with");2917fprintf(stderr,"%drejects...\n", cnt);29182919 cnt =strlen(patch->new_name);2920if(ARRAY_SIZE(namebuf) <= cnt +5) {2921 cnt =ARRAY_SIZE(namebuf) -5;2922fprintf(stderr,2923"warning: truncating .rej filename to %.*s.rej",2924 cnt -1, patch->new_name);2925}2926memcpy(namebuf, patch->new_name, cnt);2927memcpy(namebuf + cnt,".rej",5);29282929 rej =fopen(namebuf,"w");2930if(!rej)2931returnerror("cannot open%s:%s", namebuf,strerror(errno));29322933/* Normal git tools never deal with .rej, so do not pretend2934 * this is a git patch by saying --git nor give extended2935 * headers. While at it, maybe please "kompare" that wants2936 * the trailing TAB and some garbage at the end of line ;-).2937 */2938fprintf(rej,"diff a/%sb/%s\t(rejected hunks)\n",2939 patch->new_name, patch->new_name);2940for(cnt =1, frag = patch->fragments;2941 frag;2942 cnt++, frag = frag->next) {2943if(!frag->rejected) {2944fprintf(stderr,"Hunk #%dapplied cleanly.\n", cnt);2945continue;2946}2947fprintf(stderr,"Rejected hunk #%d.\n", cnt);2948fprintf(rej,"%.*s", frag->size, frag->patch);2949if(frag->patch[frag->size-1] !='\n')2950fputc('\n', rej);2951}2952fclose(rej);2953return-1;2954}29552956static intwrite_out_results(struct patch *list,int skipped_patch)2957{2958int phase;2959int errs =0;2960struct patch *l;29612962if(!list && !skipped_patch)2963returnerror("No changes");29642965for(phase =0; phase <2; phase++) {2966 l = list;2967while(l) {2968if(l->rejected)2969 errs =1;2970else{2971write_out_one_result(l, phase);2972if(phase ==1&&write_out_one_reject(l))2973 errs =1;2974}2975 l = l->next;2976}2977}2978return errs;2979}29802981static struct lock_file lock_file;29822983static struct string_list limit_by_name;2984static int has_include;2985static voidadd_name_limit(const char*name,int exclude)2986{2987struct string_list_item *it;29882989 it =string_list_append(name, &limit_by_name);2990 it->util = exclude ? NULL : (void*)1;2991}29922993static intuse_patch(struct patch *p)2994{2995const char*pathname = p->new_name ? p->new_name : p->old_name;2996int i;29972998/* Paths outside are not touched regardless of "--include" */2999if(0< prefix_length) {3000int pathlen =strlen(pathname);3001if(pathlen <= prefix_length ||3002memcmp(prefix, pathname, prefix_length))3003return0;3004}30053006/* See if it matches any of exclude/include rule */3007for(i =0; i < limit_by_name.nr; i++) {3008struct string_list_item *it = &limit_by_name.items[i];3009if(!fnmatch(it->string, pathname,0))3010return(it->util != NULL);3011}30123013/*3014 * If we had any include, a path that does not match any rule is3015 * not used. Otherwise, we saw bunch of exclude rules (or none)3016 * and such a path is used.3017 */3018return!has_include;3019}302030213022static voidprefix_one(char**name)3023{3024char*old_name = *name;3025if(!old_name)3026return;3027*name =xstrdup(prefix_filename(prefix, prefix_length, *name));3028free(old_name);3029}30303031static voidprefix_patches(struct patch *p)3032{3033if(!prefix || p->is_toplevel_relative)3034return;3035for( ; p; p = p->next) {3036if(p->new_name == p->old_name) {3037char*prefixed = p->new_name;3038prefix_one(&prefixed);3039 p->new_name = p->old_name = prefixed;3040}3041else{3042prefix_one(&p->new_name);3043prefix_one(&p->old_name);3044}3045}3046}30473048#define INACCURATE_EOF (1<<0)3049#define RECOUNT (1<<1)30503051static intapply_patch(int fd,const char*filename,int options)3052{3053size_t offset;3054struct strbuf buf = STRBUF_INIT;3055struct patch *list = NULL, **listp = &list;3056int skipped_patch =0;30573058/* FIXME - memory leak when using multiple patch files as inputs */3059memset(&fn_table,0,sizeof(struct string_list));3060 patch_input_file = filename;3061read_patch_file(&buf, fd);3062 offset =0;3063while(offset < buf.len) {3064struct patch *patch;3065int nr;30663067 patch =xcalloc(1,sizeof(*patch));3068 patch->inaccurate_eof = !!(options & INACCURATE_EOF);3069 patch->recount = !!(options & RECOUNT);3070 nr =parse_chunk(buf.buf + offset, buf.len - offset, patch);3071if(nr <0)3072break;3073if(apply_in_reverse)3074reverse_patches(patch);3075if(prefix)3076prefix_patches(patch);3077if(use_patch(patch)) {3078patch_stats(patch);3079*listp = patch;3080 listp = &patch->next;3081}3082else{3083/* perhaps free it a bit better? */3084free(patch);3085 skipped_patch++;3086}3087 offset += nr;3088}30893090if(whitespace_error && (ws_error_action == die_on_ws_error))3091 apply =0;30923093 update_index = check_index && apply;3094if(update_index && newfd <0)3095 newfd =hold_locked_index(&lock_file,1);30963097if(check_index) {3098if(read_cache() <0)3099die("unable to read index file");3100}31013102if((check || apply) &&3103check_patch_list(list) <0&&3104!apply_with_reject)3105exit(1);31063107if(apply &&write_out_results(list, skipped_patch))3108exit(1);31093110if(fake_ancestor)3111build_fake_ancestor(list, fake_ancestor);31123113if(diffstat)3114stat_patch_list(list);31153116if(numstat)3117numstat_patch_list(list);31183119if(summary)3120summary_patch_list(list);31213122strbuf_release(&buf);3123return0;3124}31253126static intgit_apply_config(const char*var,const char*value,void*cb)3127{3128if(!strcmp(var,"apply.whitespace"))3129returngit_config_string(&apply_default_whitespace, var, value);3130returngit_default_config(var, value, cb);3131}313231333134intcmd_apply(int argc,const char**argv,const char*unused_prefix)3135{3136int i;3137int read_stdin =1;3138int options =0;3139int errs =0;3140int is_not_gitdir;31413142const char*whitespace_option = NULL;31433144 prefix =setup_git_directory_gently(&is_not_gitdir);3145 prefix_length = prefix ?strlen(prefix) :0;3146git_config(git_apply_config, NULL);3147if(apply_default_whitespace)3148parse_whitespace_option(apply_default_whitespace);31493150for(i =1; i < argc; i++) {3151const char*arg = argv[i];3152char*end;3153int fd;31543155if(!strcmp(arg,"-")) {3156 errs |=apply_patch(0,"<stdin>", options);3157 read_stdin =0;3158continue;3159}3160if(!prefixcmp(arg,"--exclude=")) {3161add_name_limit(arg +10,1);3162continue;3163}3164if(!prefixcmp(arg,"--include=")) {3165add_name_limit(arg +10,0);3166 has_include =1;3167continue;3168}3169if(!prefixcmp(arg,"-p")) {3170 p_value =atoi(arg +2);3171 p_value_known =1;3172continue;3173}3174if(!strcmp(arg,"--no-add")) {3175 no_add =1;3176continue;3177}3178if(!strcmp(arg,"--stat")) {3179 apply =0;3180 diffstat =1;3181continue;3182}3183if(!strcmp(arg,"--allow-binary-replacement") ||3184!strcmp(arg,"--binary")) {3185continue;/* now no-op */3186}3187if(!strcmp(arg,"--numstat")) {3188 apply =0;3189 numstat =1;3190continue;3191}3192if(!strcmp(arg,"--summary")) {3193 apply =0;3194 summary =1;3195continue;3196}3197if(!strcmp(arg,"--check")) {3198 apply =0;3199 check =1;3200continue;3201}3202if(!strcmp(arg,"--index")) {3203if(is_not_gitdir)3204die("--index outside a repository");3205 check_index =1;3206continue;3207}3208if(!strcmp(arg,"--cached")) {3209if(is_not_gitdir)3210die("--cached outside a repository");3211 check_index =1;3212 cached =1;3213continue;3214}3215if(!strcmp(arg,"--apply")) {3216 apply =1;3217continue;3218}3219if(!strcmp(arg,"--build-fake-ancestor")) {3220 apply =0;3221if(++i >= argc)3222die("need a filename");3223 fake_ancestor = argv[i];3224continue;3225}3226if(!strcmp(arg,"-z")) {3227 line_termination =0;3228continue;3229}3230if(!prefixcmp(arg,"-C")) {3231 p_context =strtoul(arg +2, &end,0);3232if(*end !='\0')3233die("unrecognized context count '%s'", arg +2);3234continue;3235}3236if(!prefixcmp(arg,"--whitespace=")) {3237 whitespace_option = arg +13;3238parse_whitespace_option(arg +13);3239continue;3240}3241if(!strcmp(arg,"-R") || !strcmp(arg,"--reverse")) {3242 apply_in_reverse =1;3243continue;3244}3245if(!strcmp(arg,"--unidiff-zero")) {3246 unidiff_zero =1;3247continue;3248}3249if(!strcmp(arg,"--reject")) {3250 apply = apply_with_reject = apply_verbosely =1;3251continue;3252}3253if(!strcmp(arg,"-v") || !strcmp(arg,"--verbose")) {3254 apply_verbosely =1;3255continue;3256}3257if(!strcmp(arg,"--inaccurate-eof")) {3258 options |= INACCURATE_EOF;3259continue;3260}3261if(!strcmp(arg,"--recount")) {3262 options |= RECOUNT;3263continue;3264}3265if(!prefixcmp(arg,"--directory=")) {3266 arg +=strlen("--directory=");3267 root_len =strlen(arg);3268if(root_len && arg[root_len -1] !='/') {3269char*new_root;3270 root = new_root =xmalloc(root_len +2);3271strcpy(new_root, arg);3272strcpy(new_root + root_len++,"/");3273}else3274 root = arg;3275continue;3276}3277if(0< prefix_length)3278 arg =prefix_filename(prefix, prefix_length, arg);32793280 fd =open(arg, O_RDONLY);3281if(fd <0)3282die("can't open patch '%s':%s", arg,strerror(errno));3283 read_stdin =0;3284set_default_whitespace_mode(whitespace_option);3285 errs |=apply_patch(fd, arg, options);3286close(fd);3287}3288set_default_whitespace_mode(whitespace_option);3289if(read_stdin)3290 errs |=apply_patch(0,"<stdin>", options);3291if(whitespace_error) {3292if(squelch_whitespace_errors &&3293 squelch_whitespace_errors < whitespace_error) {3294int squelched =3295 whitespace_error - squelch_whitespace_errors;3296fprintf(stderr,"warning: squelched%d"3297"whitespace error%s\n",3298 squelched,3299 squelched ==1?"":"s");3300}3301if(ws_error_action == die_on_ws_error)3302die("%dline%sadd%swhitespace errors.",3303 whitespace_error,3304 whitespace_error ==1?"":"s",3305 whitespace_error ==1?"s":"");3306if(applied_after_fixing_ws && apply)3307fprintf(stderr,"warning:%dline%sapplied after"3308" fixing whitespace errors.\n",3309 applied_after_fixing_ws,3310 applied_after_fixing_ws ==1?"":"s");3311else if(whitespace_error)3312fprintf(stderr,"warning:%dline%sadd%swhitespace errors.\n",3313 whitespace_error,3314 whitespace_error ==1?"":"s",3315 whitespace_error ==1?"s":"");3316}33173318if(update_index) {3319if(write_cache(newfd, active_cache, active_nr) ||3320commit_locked_index(&lock_file))3321die("Unable to write new index file");3322}33233324return!!errs;3325}