apply.c 99.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9
/*
 * apply.c
 *
 * Copyright (C) Linus Torvalds, 2005
 *
 * This applies patches on top of some (arbitrary) version of the SCM.
 *
 */
#include "cache.h"
10
#include "cache-tree.h"
11
#include "quote.h"
12
#include "blob.h"
J
Junio C Hamano 已提交
13
#include "delta.h"
P
Peter Eriksen 已提交
14
#include "builtin.h"
15
#include "string-list.h"
16
#include "dir.h"
M
Miklos Vajna 已提交
17
#include "parse-options.h"
L
Linus Torvalds 已提交
18

19 20 21 22 23 24 25 26 27
/*
 *  --check turns on checking that the working tree matches the
 *    files that are being modified, but doesn't apply the patch
 *  --stat does just a diffstat, and doesn't actually apply
 *  --numstat does numeric diffstat, and doesn't actually apply
 *  --index-info shows the old and new index info for paths if available.
 *  --index updates the cache as well.
 *  --cached updates only the cache without ever touching the working tree.
 */
28 29
static const char *prefix;
static int prefix_length = -1;
30
static int newfd = -1;
31

32
static int unidiff_zero;
33
static int p_value = 1;
34
static int p_value_known;
35
static int check_index;
36
static int update_index;
37 38 39 40 41
static int cached;
static int diffstat;
static int numstat;
static int summary;
static int check;
42
static int apply = 1;
43
static int apply_in_reverse;
J
Junio C Hamano 已提交
44
static int apply_with_reject;
J
Junio C Hamano 已提交
45
static int apply_verbosely;
46
static int allow_overlap;
47
static int no_add;
48
static const char *fake_ancestor;
49
static int line_termination = '\n';
M
Miklos Vajna 已提交
50 51 52 53 54
static unsigned int p_context = UINT_MAX;
static const char * const apply_usage[] = {
	"git apply [options] [<patch>...]",
	NULL
};
L
Linus Torvalds 已提交
55

56 57 58 59
static enum ws_error_action {
	nowarn_ws_error,
	warn_on_ws_error,
	die_on_ws_error,
60
	correct_ws_error
61
} ws_error_action = warn_on_ws_error;
62
static int whitespace_error;
63
static int squelch_whitespace_errors = 5;
64
static int applied_after_fixing_ws;
65 66 67

static enum ws_ignore {
	ignore_ws_none,
68
	ignore_ws_change
69 70 71
} ws_ignore_action = ignore_ws_none;


72
static const char *patch_input_file;
73 74
static const char *root;
static int root_len;
M
Miklos Vajna 已提交
75 76
static int read_stdin = 1;
static int options;
L
Linus Torvalds 已提交
77

78 79 80
static void parse_whitespace_option(const char *option)
{
	if (!option) {
81
		ws_error_action = warn_on_ws_error;
82 83 84
		return;
	}
	if (!strcmp(option, "warn")) {
85
		ws_error_action = warn_on_ws_error;
86 87
		return;
	}
J
Junio C Hamano 已提交
88
	if (!strcmp(option, "nowarn")) {
89
		ws_error_action = nowarn_ws_error;
J
Junio C Hamano 已提交
90 91
		return;
	}
92
	if (!strcmp(option, "error")) {
93
		ws_error_action = die_on_ws_error;
94 95 96
		return;
	}
	if (!strcmp(option, "error-all")) {
97
		ws_error_action = die_on_ws_error;
98 99 100
		squelch_whitespace_errors = 0;
		return;
	}
101 102
	if (!strcmp(option, "strip") || !strcmp(option, "fix")) {
		ws_error_action = correct_ws_error;
103 104 105 106 107
		return;
	}
	die("unrecognized whitespace option '%s'", option);
}

108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
static void parse_ignorewhitespace_option(const char *option)
{
	if (!option || !strcmp(option, "no") ||
	    !strcmp(option, "false") || !strcmp(option, "never") ||
	    !strcmp(option, "none")) {
		ws_ignore_action = ignore_ws_none;
		return;
	}
	if (!strcmp(option, "change")) {
		ws_ignore_action = ignore_ws_change;
		return;
	}
	die("unrecognized whitespace ignore option '%s'", option);
}

123 124
static void set_default_whitespace_mode(const char *whitespace_option)
{
125 126
	if (!whitespace_option && !apply_default_whitespace)
		ws_error_action = (apply ? warn_on_ws_error : nowarn_ws_error);
127 128
}

129 130 131 132 133 134 135
/*
 * For "diff-stat" like behaviour, we keep track of the biggest change
 * we've seen, and the longest filename. That allows us to do simple
 * scaling.
 */
static int max_change, max_len;

136 137 138 139 140
/*
 * Various "current state", notably line numbers and what
 * file (and how) we're patching right now.. The "is_xxxx"
 * things are flags, where -1 means "don't know yet".
 */
141
static int linenr = 1;
142

143 144 145 146 147 148 149
/*
 * This represents one "hunk" from a patch, starting with
 * "@@ -oldpos,oldlines +newpos,newlines @@" marker.  The
 * patch text is pointed at by patch, and its byte length
 * is stored in size.  leading and trailing are the number
 * of context lines.
 */
150
struct fragment {
151
	unsigned long leading, trailing;
152 153 154 155
	unsigned long oldpos, oldlines;
	unsigned long newpos, newlines;
	const char *patch;
	int size;
J
Junio C Hamano 已提交
156
	int rejected;
157
	int linenr;
158 159 160
	struct fragment *next;
};

161 162 163 164 165 166 167 168 169
/*
 * When dealing with a binary patch, we reuse "leading" field
 * to store the type of the binary hunk, either deflated "delta"
 * or deflated "literal".
 */
#define binary_patch_method leading
#define BINARY_DELTA_DEFLATED	1
#define BINARY_LITERAL_DEFLATED 2

170 171 172 173 174
/*
 * This represents a "patch" to a file, both metainfo changes
 * such as creation/deletion, filemode and content changes represented
 * as a series of fragments.
 */
175
struct patch {
176
	char *new_name, *old_name, *def_name;
177
	unsigned int old_mode, new_mode;
178
	int is_new, is_delete;	/* -1 = unknown, 0 = false, 1 = true */
J
Junio C Hamano 已提交
179
	int rejected;
180
	unsigned ws_rule;
J
Junio C Hamano 已提交
181
	unsigned long deflate_origlen;
182
	int lines_added, lines_deleted;
183
	int score;
184
	unsigned int is_toplevel_relative:1;
185 186 187 188
	unsigned int inaccurate_eof:1;
	unsigned int is_binary:1;
	unsigned int is_copy:1;
	unsigned int is_rename:1;
189
	unsigned int recount:1;
190
	struct fragment *fragments;
191
	char *result;
192
	size_t resultsize;
193 194
	char old_sha1_prefix[41];
	char new_sha1_prefix[41];
195 196
	struct patch *next;
};
197

198 199 200 201 202 203 204 205 206
/*
 * A line in a file, len-bytes long (includes the terminating LF,
 * except for an incomplete line at the end if the file ends with
 * one), and its contents hashes to 'hash'.
 */
struct line {
	size_t len;
	unsigned hash : 24;
	unsigned flag : 8;
207
#define LINE_COMMON     1
208
#define LINE_PATCHED	2
209 210 211 212 213 214 215 216 217
};

/*
 * This represents a "file", which is an array of "lines".
 */
struct image {
	char *buf;
	size_t len;
	size_t nr;
218
	size_t alloc;
219 220 221 222
	struct line *line_allocated;
	struct line *line;
};

223 224 225 226 227
/*
 * Records filenames that have been touched, in order to handle
 * the case where more than one patches touch the same file.
 */

228
static struct string_list fn_table;
229

230 231 232 233 234 235 236 237 238 239 240 241
static uint32_t hash_line(const char *cp, size_t len)
{
	size_t i;
	uint32_t h;
	for (i = 0, h = 0; i < len; i++) {
		if (!isspace(cp[i])) {
			h = h * 3 + (cp[i] & 0xff);
		}
	}
	return h;
}

242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
/*
 * Compare lines s1 of length n1 and s2 of length n2, ignoring
 * whitespace difference. Returns 1 if they match, 0 otherwise
 */
static int fuzzy_matchlines(const char *s1, size_t n1,
			    const char *s2, size_t n2)
{
	const char *last1 = s1 + n1 - 1;
	const char *last2 = s2 + n2 - 1;
	int result = 0;

	/* ignore line endings */
	while ((*last1 == '\r') || (*last1 == '\n'))
		last1--;
	while ((*last2 == '\r') || (*last2 == '\n'))
		last2--;

	/* skip leading whitespace */
	while (isspace(*s1) && (s1 <= last1))
		s1++;
	while (isspace(*s2) && (s2 <= last2))
		s2++;
	/* early return if both lines are empty */
	if ((s1 > last1) && (s2 > last2))
		return 1;
	while (!result) {
		result = *s1++ - *s2++;
		/*
		 * Skip whitespace inside. We check for whitespace on
		 * both buffers because we don't want "a b" to match
		 * "ab"
		 */
		if (isspace(*s1) && isspace(*s2)) {
			while (isspace(*s1) && s1 <= last1)
				s1++;
			while (isspace(*s2) && s2 <= last2)
				s2++;
		}
		/*
		 * If we reached the end on one side only,
		 * lines don't match
		 */
		if (
		    ((s2 > last2) && (s1 <= last1)) ||
		    ((s1 > last1) && (s2 <= last2)))
			return 0;
		if ((s1 > last1) && (s2 > last2))
			break;
	}

	return !result;
}

295 296 297 298 299 300 301 302 303
static void add_line_info(struct image *img, const char *bol, size_t len, unsigned flag)
{
	ALLOC_GROW(img->line_allocated, img->nr + 1, img->alloc);
	img->line_allocated[img->nr].len = len;
	img->line_allocated[img->nr].hash = hash_line(bol, len);
	img->line_allocated[img->nr].flag = flag;
	img->nr++;
}

304 305 306 307 308
static void prepare_image(struct image *image, char *buf, size_t len,
			  int prepare_linetable)
{
	const char *cp, *ep;

309
	memset(image, 0, sizeof(*image));
310 311 312
	image->buf = buf;
	image->len = len;

313
	if (!prepare_linetable)
314 315 316 317 318 319 320 321 322 323
		return;

	ep = image->buf + image->len;
	cp = image->buf;
	while (cp < ep) {
		const char *next;
		for (next = cp; next < ep && *next != '\n'; next++)
			;
		if (next < ep)
			next++;
324
		add_line_info(image, cp, next - cp, 0);
325 326
		cp = next;
	}
327
	image->line = image->line_allocated;
328 329 330 331 332 333 334 335 336
}

static void clear_image(struct image *image)
{
	free(image->buf);
	image->buf = NULL;
	image->len = 0;
}

337 338
static void say_patch_name(FILE *output, const char *pre,
			   struct patch *patch, const char *post)
J
Junio C Hamano 已提交
339 340 341 342
{
	fputs(pre, output);
	if (patch->old_name && patch->new_name &&
	    strcmp(patch->old_name, patch->new_name)) {
343
		quote_c_style(patch->old_name, NULL, output, 0);
J
Junio C Hamano 已提交
344
		fputs(" => ", output);
345 346
		quote_c_style(patch->new_name, NULL, output, 0);
	} else {
J
Junio C Hamano 已提交
347 348 349
		const char *n = patch->new_name;
		if (!n)
			n = patch->old_name;
350
		quote_c_style(n, NULL, output, 0);
J
Junio C Hamano 已提交
351 352 353 354
	}
	fputs(post, output);
}

L
Linus Torvalds 已提交
355
#define CHUNKSIZE (8192)
356
#define SLOP (16)
L
Linus Torvalds 已提交
357

358
static void read_patch_file(struct strbuf *sb, int fd)
L
Linus Torvalds 已提交
359
{
360
	if (strbuf_read(sb, fd, 0) < 0)
361
		die_errno("git apply: failed to read");
362 363 364 365 366 367

	/*
	 * Make sure that we have some slop in the buffer
	 * so that we can do speculative "memcmp" etc, and
	 * see to it that it is NUL-filled.
	 */
368 369
	strbuf_grow(sb, SLOP);
	memset(sb->buf + sb->len, 0, SLOP);
L
Linus Torvalds 已提交
370 371
}

372
static unsigned long linelen(const char *buffer, unsigned long size)
L
Linus Torvalds 已提交
373 374 375 376 377 378 379 380 381 382
{
	unsigned long len = 0;
	while (size--) {
		len++;
		if (*buffer++ == '\n')
			break;
	}
	return len;
}

383 384 385 386 387
static int is_dev_null(const char *str)
{
	return !memcmp("/dev/null", str, 9) && isspace(str[9]);
}

388 389
#define TERM_SPACE	1
#define TERM_TAB	2
390 391 392 393 394 395 396 397 398 399 400

static int name_terminate(const char *name, int namelen, int c, int terminate)
{
	if (c == ' ' && !(terminate & TERM_SPACE))
		return 0;
	if (c == '\t' && !(terminate & TERM_TAB))
		return 0;

	return 1;
}

401 402 403 404 405
/* remove double slashes to make --index work with such filenames */
static char *squash_slash(char *name)
{
	int i = 0, j = 0;

406 407 408
	if (!name)
		return NULL;

409 410 411 412 413 414 415 416 417
	while (name[i]) {
		if ((name[j++] = name[i++]) == '/')
			while (name[i] == '/')
				i++;
	}
	name[j] = '\0';
	return name;
}

418
static char *find_name_gnu(const char *line, char *def, int p_value)
L
Linus Torvalds 已提交
419
{
420 421
	struct strbuf name = STRBUF_INIT;
	char *cp;
422

423 424 425 426 427 428 429 430
	/*
	 * Proposed "new-style" GNU patch/diff format; see
	 * http://marc.theaimsgroup.com/?l=git&m=112927316408690&w=2
	 */
	if (unquote_c_style(&name, line, NULL)) {
		strbuf_release(&name);
		return NULL;
	}
431

432 433 434 435 436
	for (cp = name.buf; p_value; p_value--) {
		cp = strchr(cp, '/');
		if (!cp) {
			strbuf_release(&name);
			return NULL;
437
		}
438 439 440 441 442 443 444 445 446 447 448 449 450
		cp++;
	}

	/* name can later be freed, so we need
	 * to memmove, not just return cp
	 */
	strbuf_remove(&name, 0, cp - name.buf);
	free(def);
	if (root)
		strbuf_insert(&name, 0, root, root_len);
	return squash_slash(strbuf_detach(&name, NULL));
}

451
static size_t sane_tz_len(const char *line, size_t len)
L
Linus Torvalds 已提交
452
{
453
	const char *tz, *p;
454

455 456 457 458 459 460 461 462 463 464 465 466 467 468
	if (len < strlen(" +0500") || line[len-strlen(" +0500")] != ' ')
		return 0;
	tz = line + len - strlen(" +0500");

	if (tz[1] != '+' && tz[1] != '-')
		return 0;

	for (p = tz + 2; p != line + len; p++)
		if (!isdigit(*p))
			return 0;

	return line + len - tz;
}

469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486
static size_t tz_with_colon_len(const char *line, size_t len)
{
	const char *tz, *p;

	if (len < strlen(" +08:00") || line[len - strlen(":00")] != ':')
		return 0;
	tz = line + len - strlen(" +08:00");

	if (tz[0] != ' ' || (tz[1] != '+' && tz[1] != '-'))
		return 0;
	p = tz + 2;
	if (!isdigit(*p++) || !isdigit(*p++) || *p++ != ':' ||
	    !isdigit(*p++) || !isdigit(*p++))
		return 0;

	return line + len - tz;
}

487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561
static size_t date_len(const char *line, size_t len)
{
	const char *date, *p;

	if (len < strlen("72-02-05") || line[len-strlen("-05")] != '-')
		return 0;
	p = date = line + len - strlen("72-02-05");

	if (!isdigit(*p++) || !isdigit(*p++) || *p++ != '-' ||
	    !isdigit(*p++) || !isdigit(*p++) || *p++ != '-' ||
	    !isdigit(*p++) || !isdigit(*p++))	/* Not a date. */
		return 0;

	if (date - line >= strlen("19") &&
	    isdigit(date[-1]) && isdigit(date[-2]))	/* 4-digit year */
		date -= strlen("19");

	return line + len - date;
}

static size_t short_time_len(const char *line, size_t len)
{
	const char *time, *p;

	if (len < strlen(" 07:01:32") || line[len-strlen(":32")] != ':')
		return 0;
	p = time = line + len - strlen(" 07:01:32");

	/* Permit 1-digit hours? */
	if (*p++ != ' ' ||
	    !isdigit(*p++) || !isdigit(*p++) || *p++ != ':' ||
	    !isdigit(*p++) || !isdigit(*p++) || *p++ != ':' ||
	    !isdigit(*p++) || !isdigit(*p++))	/* Not a time. */
		return 0;

	return line + len - time;
}

static size_t fractional_time_len(const char *line, size_t len)
{
	const char *p;
	size_t n;

	/* Expected format: 19:41:17.620000023 */
	if (!len || !isdigit(line[len - 1]))
		return 0;
	p = line + len - 1;

	/* Fractional seconds. */
	while (p > line && isdigit(*p))
		p--;
	if (*p != '.')
		return 0;

	/* Hours, minutes, and whole seconds. */
	n = short_time_len(line, p - line);
	if (!n)
		return 0;

	return line + len - p + n;
}

static size_t trailing_spaces_len(const char *line, size_t len)
{
	const char *p;

	/* Expected format: ' ' x (1 or more)  */
	if (!len || line[len - 1] != ' ')
		return 0;

	p = line + len;
	while (p != line) {
		p--;
		if (*p != ' ')
			return line + len - (p + 1);
562 563
	}

564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
	/* All spaces! */
	return len;
}

static size_t diff_timestamp_len(const char *line, size_t len)
{
	const char *end = line + len;
	size_t n;

	/*
	 * Posix: 2010-07-05 19:41:17
	 * GNU: 2010-07-05 19:41:17.620000023 -0500
	 */

	if (!isdigit(end[-1]))
		return 0;

581 582 583
	n = sane_tz_len(line, end - line);
	if (!n)
		n = tz_with_colon_len(line, end - line);
584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
	end -= n;

	n = short_time_len(line, end - line);
	if (!n)
		n = fractional_time_len(line, end - line);
	end -= n;

	n = date_len(line, end - line);
	if (!n)	/* No date.  Too bad. */
		return 0;
	end -= n;

	if (end == line)	/* No space before date. */
		return 0;
	if (end[-1] == '\t') {	/* Success! */
		end--;
		return line + len - end;
	}
	if (end[-1] != ' ')	/* No space before date. */
		return 0;

	/* Whitespace damage. */
	end -= trailing_spaces_len(line, end - line);
	return line + len - end;
}

static char *find_name_common(const char *line, char *def, int p_value,
				const char *end, int terminate)
{
	int len;
	const char *start = NULL;

616 617
	if (p_value == 0)
		start = line;
618
	while (line != end) {
619
		char c = *line;
620

621
		if (!end && isspace(c)) {
622 623 624 625 626
			if (c == '\n')
				break;
			if (name_terminate(start, line-start, c, terminate))
				break;
		}
627 628 629 630 631
		line++;
		if (c == '/' && !--p_value)
			start = line;
	}
	if (!start)
632
		return squash_slash(def);
633 634
	len = line - start;
	if (!len)
635
		return squash_slash(def);
636 637 638 639 640 641 642 643 644 645

	/*
	 * Generally we prefer the shorter name, especially
	 * if the other one is just a variation of that with
	 * something else tacked on to the end (ie "file.orig"
	 * or "file~").
	 */
	if (def) {
		int deflen = strlen(def);
		if (deflen < len && !strncmp(start, def, deflen))
646
			return squash_slash(def);
647
		free(def);
L
Linus Torvalds 已提交
648
	}
649

650 651 652 653 654
	if (root) {
		char *ret = xmalloc(root_len + len + 1);
		strcpy(ret, root);
		memcpy(ret + root_len, start, len);
		ret[root_len + len] = '\0';
655
		return squash_slash(ret);
656 657
	}

658
	return squash_slash(xmemdupz(start, len));
659 660
}

661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691
static char *find_name(const char *line, char *def, int p_value, int terminate)
{
	if (*line == '"') {
		char *name = find_name_gnu(line, def, p_value);
		if (name)
			return name;
	}

	return find_name_common(line, def, p_value, NULL, terminate);
}

static char *find_name_traditional(const char *line, char *def, int p_value)
{
	size_t len = strlen(line);
	size_t date_len;

	if (*line == '"') {
		char *name = find_name_gnu(line, def, p_value);
		if (name)
			return name;
	}

	len = strchrnul(line, '\n') - line;
	date_len = diff_timestamp_len(line, len);
	if (!date_len)
		return find_name_common(line, def, p_value, NULL, TERM_TAB);
	len -= date_len;

	return find_name_common(line, def, p_value, line + len, 0);
}

692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713
static int count_slashes(const char *cp)
{
	int cnt = 0;
	char ch;

	while ((ch = *cp++))
		if (ch == '/')
			cnt++;
	return cnt;
}

/*
 * Given the string after "--- " or "+++ ", guess the appropriate
 * p_value for the given patch.
 */
static int guess_p_value(const char *nameline)
{
	char *name, *cp;
	int val = -1;

	if (is_dev_null(nameline))
		return -1;
714
	name = find_name_traditional(nameline, NULL, 0);
715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736
	if (!name)
		return -1;
	cp = strchr(name, '/');
	if (!cp)
		val = 0;
	else if (prefix) {
		/*
		 * Does it begin with "a/$our-prefix" and such?  Then this is
		 * very likely to apply to our directory.
		 */
		if (!strncmp(name, prefix, prefix_length))
			val = count_slashes(prefix);
		else {
			cp++;
			if (!strncmp(cp, prefix, prefix_length))
				val = count_slashes(prefix) + 1;
		}
	}
	free(name);
	return val;
}

737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754
/*
 * Does the ---/+++ line has the POSIX timestamp after the last HT?
 * GNU diff puts epoch there to signal a creation/deletion event.  Is
 * this such a timestamp?
 */
static int has_epoch_timestamp(const char *nameline)
{
	/*
	 * We are only interested in epoch timestamp; any non-zero
	 * fraction cannot be one, hence "(\.0+)?" in the regexp below.
	 * For the same reason, the date must be either 1969-12-31 or
	 * 1970-01-01, and the seconds part must be "00".
	 */
	const char stamp_regexp[] =
		"^(1969-12-31|1970-01-01)"
		" "
		"[0-2][0-9]:[0-5][0-9]:00(\\.0+)?"
		" "
755 756
		"([-+][0-2][0-9]:?[0-5][0-9])\n";
	const char *timestamp = NULL, *cp, *colon;
757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
	static regex_t *stamp;
	regmatch_t m[10];
	int zoneoffset;
	int hourminute;
	int status;

	for (cp = nameline; *cp != '\n'; cp++) {
		if (*cp == '\t')
			timestamp = cp + 1;
	}
	if (!timestamp)
		return 0;
	if (!stamp) {
		stamp = xmalloc(sizeof(*stamp));
		if (regcomp(stamp, stamp_regexp, REG_EXTENDED)) {
			warning("Cannot prepare timestamp regexp %s",
				stamp_regexp);
			return 0;
		}
	}

	status = regexec(stamp, timestamp, ARRAY_SIZE(m), m, 0);
	if (status) {
		if (status != REG_NOMATCH)
			warning("regexec returned %d for input: %s",
				status, timestamp);
		return 0;
	}

786 787 788 789 790
	zoneoffset = strtol(timestamp + m[3].rm_so + 1, (char **) &colon, 10);
	if (*colon == ':')
		zoneoffset = zoneoffset * 60 + strtol(colon + 1, NULL, 10);
	else
		zoneoffset = (zoneoffset / 100) * 60 + (zoneoffset % 100);
791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809
	if (timestamp[m[3].rm_so] == '-')
		zoneoffset = -zoneoffset;

	/*
	 * YYYY-MM-DD hh:mm:ss must be from either 1969-12-31
	 * (west of GMT) or 1970-01-01 (east of GMT)
	 */
	if ((zoneoffset < 0 && memcmp(timestamp, "1969-12-31", 10)) ||
	    (0 <= zoneoffset && memcmp(timestamp, "1970-01-01", 10)))
		return 0;

	hourminute = (strtol(timestamp + 11, NULL, 10) * 60 +
		      strtol(timestamp + 14, NULL, 10) -
		      zoneoffset);

	return ((zoneoffset < 0 && hourminute == 1440) ||
		(0 <= zoneoffset && !hourminute));
}

810
/*
J
Junio C Hamano 已提交
811
 * Get the name etc info from the ---/+++ lines of a traditional patch header
812
 *
813 814 815
 * FIXME! The end-of-filename heuristics are kind of screwy. For existing
 * files, we can happily check the index for a match, but for creating a
 * new file we should try to match whatever "patch" does. I have no idea.
816
 */
817
static void parse_traditional_patch(const char *first, const char *second, struct patch *patch)
818 819 820
{
	char *name;

821 822
	first += 4;	/* skip "--- " */
	second += 4;	/* skip "+++ " */
823 824 825 826 827 828 829 830 831 832
	if (!p_value_known) {
		int p, q;
		p = guess_p_value(first);
		q = guess_p_value(second);
		if (p < 0) p = q;
		if (0 <= p && p == q) {
			p_value = p;
			p_value_known = 1;
		}
	}
833
	if (is_dev_null(first)) {
834 835
		patch->is_new = 1;
		patch->is_delete = 0;
836
		name = find_name_traditional(second, NULL, p_value);
837
		patch->new_name = name;
838
	} else if (is_dev_null(second)) {
839 840
		patch->is_new = 0;
		patch->is_delete = 1;
841
		name = find_name_traditional(first, NULL, p_value);
842
		patch->old_name = name;
843
	} else {
844 845
		name = find_name_traditional(first, NULL, p_value);
		name = find_name_traditional(second, name, p_value);
846 847 848 849 850 851 852 853 854 855 856
		if (has_epoch_timestamp(first)) {
			patch->is_new = 1;
			patch->is_delete = 0;
			patch->new_name = name;
		} else if (has_epoch_timestamp(second)) {
			patch->is_new = 0;
			patch->is_delete = 1;
			patch->old_name = name;
		} else {
			patch->old_name = patch->new_name = name;
		}
857 858 859 860 861
	}
	if (!name)
		die("unable to find filename in patch at line %d", linenr);
}

862
static int gitdiff_hdrend(const char *line, struct patch *patch)
863 864 865 866
{
	return -1;
}

867 868 869 870 871 872 873 874 875 876 877 878
/*
 * We're anal about diff header consistency, to make
 * sure that we don't end up having strange ambiguous
 * patches floating around.
 *
 * As a result, gitdiff_{old|new}name() will check
 * their names against any previous information, just
 * to make sure..
 */
static char *gitdiff_verify_name(const char *line, int isnull, char *orig_name, const char *oldnew)
{
	if (!orig_name && !isnull)
879
		return find_name(line, NULL, p_value, TERM_TAB);
880 881

	if (orig_name) {
882 883 884
		int len;
		const char *name;
		char *another;
885 886 887
		name = orig_name;
		len = strlen(name);
		if (isnull)
888
			die("git apply: bad git-diff - expected /dev/null, got %s on line %d", name, linenr);
889
		another = find_name(line, NULL, p_value, TERM_TAB);
890
		if (!another || memcmp(another, name, len + 1))
891
			die("git apply: bad git-diff - inconsistent %s filename on line %d", oldnew, linenr);
892
		free(another);
893 894
		return orig_name;
	}
895 896 897
	else {
		/* expect "/dev/null" */
		if (memcmp("/dev/null", line, 9) || line[9] != '\n')
898
			die("git apply: bad git-diff - expected /dev/null on line %d", linenr);
899 900
		return NULL;
	}
901 902
}

903
static int gitdiff_oldname(const char *line, struct patch *patch)
904
{
905
	patch->old_name = gitdiff_verify_name(line, patch->is_new, patch->old_name, "old");
906 907 908
	return 0;
}

909
static int gitdiff_newname(const char *line, struct patch *patch)
910
{
911
	patch->new_name = gitdiff_verify_name(line, patch->is_delete, patch->new_name, "new");
912 913 914
	return 0;
}

915
static int gitdiff_oldmode(const char *line, struct patch *patch)
916
{
917
	patch->old_mode = strtoul(line, NULL, 8);
918 919 920
	return 0;
}

921
static int gitdiff_newmode(const char *line, struct patch *patch)
922
{
923
	patch->new_mode = strtoul(line, NULL, 8);
924 925 926
	return 0;
}

927
static int gitdiff_delete(const char *line, struct patch *patch)
928
{
929
	patch->is_delete = 1;
930
	patch->old_name = patch->def_name;
931
	return gitdiff_oldmode(line, patch);
932 933
}

934
static int gitdiff_newfile(const char *line, struct patch *patch)
935
{
936
	patch->is_new = 1;
937
	patch->new_name = patch->def_name;
938
	return gitdiff_newmode(line, patch);
939 940
}

941
static int gitdiff_copysrc(const char *line, struct patch *patch)
942
{
943
	patch->is_copy = 1;
944
	patch->old_name = find_name(line, NULL, p_value ? p_value - 1 : 0, 0);
945 946 947
	return 0;
}

948
static int gitdiff_copydst(const char *line, struct patch *patch)
949
{
950
	patch->is_copy = 1;
951
	patch->new_name = find_name(line, NULL, p_value ? p_value - 1 : 0, 0);
952 953 954
	return 0;
}

955
static int gitdiff_renamesrc(const char *line, struct patch *patch)
956
{
957
	patch->is_rename = 1;
958
	patch->old_name = find_name(line, NULL, p_value ? p_value - 1 : 0, 0);
959 960 961
	return 0;
}

962
static int gitdiff_renamedst(const char *line, struct patch *patch)
963
{
964
	patch->is_rename = 1;
965
	patch->new_name = find_name(line, NULL, p_value ? p_value - 1 : 0, 0);
966 967 968
	return 0;
}

969
static int gitdiff_similarity(const char *line, struct patch *patch)
970
{
971 972
	if ((patch->score = strtoul(line, NULL, 10)) == ULONG_MAX)
		patch->score = 0;
973
	return 0;
L
Linus Torvalds 已提交
974 975
}

976 977
static int gitdiff_dissimilarity(const char *line, struct patch *patch)
{
978 979
	if ((patch->score = strtoul(line, NULL, 10)) == ULONG_MAX)
		patch->score = 0;
980 981 982
	return 0;
}

983 984
static int gitdiff_index(const char *line, struct patch *patch)
{
985 986
	/*
	 * index line is N hexadecimal, "..", N hexadecimal,
987 988 989 990 991 992
	 * and optional space with octal mode.
	 */
	const char *ptr, *eol;
	int len;

	ptr = strchr(line, '.');
993
	if (!ptr || ptr[1] != '.' || 40 < ptr - line)
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006
		return 0;
	len = ptr - line;
	memcpy(patch->old_sha1_prefix, line, len);
	patch->old_sha1_prefix[len] = 0;

	line = ptr + 2;
	ptr = strchr(line, ' ');
	eol = strchr(line, '\n');

	if (!ptr || eol < ptr)
		ptr = eol;
	len = ptr - line;

1007
	if (40 < len)
1008 1009 1010 1011
		return 0;
	memcpy(patch->new_sha1_prefix, line, len);
	patch->new_sha1_prefix[len] = 0;
	if (*ptr == ' ')
1012
		patch->old_mode = strtoul(ptr+1, NULL, 8);
1013 1014 1015
	return 0;
}

1016 1017 1018 1019
/*
 * This is normal for a diff that doesn't change anything: we'll fall through
 * into the next diff. Tell the parser to break out.
 */
1020
static int gitdiff_unrecognized(const char *line, struct patch *patch)
1021 1022 1023 1024
{
	return -1;
}

1025 1026
static const char *stop_at_slash(const char *line, int llen)
{
1027
	int nslash = p_value;
1028 1029 1030 1031
	int i;

	for (i = 0; i < llen; i++) {
		int ch = line[i];
1032 1033
		if (ch == '/' && --nslash <= 0)
			return &line[i];
1034 1035 1036 1037
	}
	return NULL;
}

1038 1039
/*
 * This is to extract the same name that appears on "diff --git"
1040 1041 1042 1043 1044 1045 1046
 * line.  We do not find and return anything if it is a rename
 * patch, and it is OK because we will find the name elsewhere.
 * We need to reliably find name only when it is mode-change only,
 * creation or deletion of an empty file.  In any of these cases,
 * both sides are the same name under a/ and b/ respectively.
 */
static char *git_header_name(char *line, int llen)
1047
{
1048 1049
	const char *name;
	const char *second = NULL;
1050
	size_t len, line_len;
1051

1052 1053 1054 1055 1056
	line += strlen("diff --git ");
	llen -= strlen("diff --git ");

	if (*line == '"') {
		const char *cp;
1057 1058
		struct strbuf first = STRBUF_INIT;
		struct strbuf sp = STRBUF_INIT;
1059 1060 1061

		if (unquote_c_style(&first, line, &second))
			goto free_and_fail1;
1062 1063

		/* advance to the first slash */
1064 1065 1066 1067 1068
		cp = stop_at_slash(first.buf, first.len);
		/* we do not accept absolute paths */
		if (!cp || cp == first.buf)
			goto free_and_fail1;
		strbuf_remove(&first, 0, cp + 1 - first.buf);
1069

1070 1071
		/*
		 * second points at one past closing dq of name.
1072 1073 1074 1075 1076 1077
		 * find the second name.
		 */
		while ((second < line + llen) && isspace(*second))
			second++;

		if (line + llen <= second)
1078
			goto free_and_fail1;
1079
		if (*second == '"') {
1080 1081 1082 1083 1084
			if (unquote_c_style(&sp, second, NULL))
				goto free_and_fail1;
			cp = stop_at_slash(sp.buf, sp.len);
			if (!cp || cp == sp.buf)
				goto free_and_fail1;
1085
			/* They must match, otherwise ignore */
1086 1087 1088
			if (strcmp(cp + 1, first.buf))
				goto free_and_fail1;
			strbuf_release(&sp);
1089
			return strbuf_detach(&first, NULL);
1090 1091 1092 1093 1094
		}

		/* unquoted second */
		cp = stop_at_slash(second, line + llen - second);
		if (!cp || cp == second)
1095
			goto free_and_fail1;
1096
		cp++;
1097 1098 1099
		if (line + llen - cp != first.len + 1 ||
		    memcmp(first.buf, cp, first.len))
			goto free_and_fail1;
1100
		return strbuf_detach(&first, NULL);
1101 1102 1103 1104 1105

	free_and_fail1:
		strbuf_release(&first);
		strbuf_release(&sp);
		return NULL;
1106 1107
	}

1108 1109 1110
	/* unquoted first name */
	name = stop_at_slash(line, llen);
	if (!name || name == line)
1111
		return NULL;
1112 1113
	name++;

1114 1115
	/*
	 * since the first name is unquoted, a dq if exists must be
1116 1117 1118 1119
	 * the beginning of the second name.
	 */
	for (second = name; second < line + llen; second++) {
		if (*second == '"') {
1120
			struct strbuf sp = STRBUF_INIT;
1121
			const char *np;
1122 1123 1124 1125 1126 1127 1128

			if (unquote_c_style(&sp, second, NULL))
				goto free_and_fail2;

			np = stop_at_slash(sp.buf, sp.len);
			if (!np || np == sp.buf)
				goto free_and_fail2;
1129
			np++;
1130 1131 1132

			len = sp.buf + sp.len - np;
			if (len < second - name &&
1133 1134 1135
			    !strncmp(np, name, len) &&
			    isspace(name[len])) {
				/* Good */
1136
				strbuf_remove(&sp, 0, np - sp.buf);
1137
				return strbuf_detach(&sp, NULL);
1138
			}
1139 1140 1141 1142

		free_and_fail2:
			strbuf_release(&sp);
			return NULL;
1143 1144 1145
		}
	}

1146 1147 1148 1149
	/*
	 * Accept a name only if it shows up twice, exactly the same
	 * form.
	 */
1150 1151 1152 1153
	second = strchr(name, '\n');
	if (!second)
		return NULL;
	line_len = second - name;
1154
	for (len = 0 ; ; len++) {
1155
		switch (name[len]) {
1156 1157 1158
		default:
			continue;
		case '\n':
1159
			return NULL;
1160
		case '\t': case ' ':
1161 1162 1163 1164 1165
			second = stop_at_slash(name + len, line_len - len);
			if (!second)
				return NULL;
			second++;
			if (second[len] == '\n' && !strncmp(name, second, len)) {
P
Pierre Habouzit 已提交
1166
				return xmemdupz(name, len);
1167 1168 1169 1170 1171
			}
		}
	}
}

L
Linus Torvalds 已提交
1172
/* Verify that we recognize the lines following a git header */
1173
static int parse_git_header(char *line, int len, unsigned int size, struct patch *patch)
L
Linus Torvalds 已提交
1174
{
1175 1176 1177
	unsigned long offset;

	/* A git diff has explicit new/delete information, so we don't guess */
1178 1179
	patch->is_new = 0;
	patch->is_delete = 0;
1180

1181 1182 1183 1184 1185 1186
	/*
	 * Some things may not have the old name in the
	 * rest of the headers anywhere (pure mode changes,
	 * or removing or adding empty files), so we get
	 * the default name from the header.
	 */
1187
	patch->def_name = git_header_name(line, len);
1188 1189 1190 1191 1192 1193 1194
	if (patch->def_name && root) {
		char *s = xmalloc(root_len + strlen(patch->def_name) + 1);
		strcpy(s, root);
		strcpy(s + root_len, patch->def_name);
		free(patch->def_name);
		patch->def_name = s;
	}
1195

1196 1197 1198 1199 1200 1201
	line += len;
	size -= len;
	linenr++;
	for (offset = len ; size > 0 ; offset += len, size -= len, line += len, linenr++) {
		static const struct opentry {
			const char *str;
1202
			int (*fn)(const char *, struct patch *);
1203 1204 1205 1206 1207 1208 1209 1210 1211 1212
		} optable[] = {
			{ "@@ -", gitdiff_hdrend },
			{ "--- ", gitdiff_oldname },
			{ "+++ ", gitdiff_newname },
			{ "old mode ", gitdiff_oldmode },
			{ "new mode ", gitdiff_newmode },
			{ "deleted file mode ", gitdiff_delete },
			{ "new file mode ", gitdiff_newfile },
			{ "copy from ", gitdiff_copysrc },
			{ "copy to ", gitdiff_copydst },
1213 1214
			{ "rename old ", gitdiff_renamesrc },
			{ "rename new ", gitdiff_renamedst },
L
Linus Torvalds 已提交
1215 1216
			{ "rename from ", gitdiff_renamesrc },
			{ "rename to ", gitdiff_renamedst },
1217
			{ "similarity index ", gitdiff_similarity },
1218
			{ "dissimilarity index ", gitdiff_dissimilarity },
1219
			{ "index ", gitdiff_index },
1220
			{ "", gitdiff_unrecognized },
1221 1222
		};
		int i;
L
Linus Torvalds 已提交
1223 1224

		len = linelen(line, size);
1225
		if (!len || line[len-1] != '\n')
L
Linus Torvalds 已提交
1226
			break;
1227
		for (i = 0; i < ARRAY_SIZE(optable); i++) {
1228 1229 1230 1231
			const struct opentry *p = optable + i;
			int oplen = strlen(p->str);
			if (len < oplen || memcmp(p->str, line, oplen))
				continue;
1232
			if (p->fn(line + oplen, patch) < 0)
1233
				return offset;
1234
			break;
1235
		}
L
Linus Torvalds 已提交
1236 1237
	}

1238
	return offset;
L
Linus Torvalds 已提交
1239 1240
}

1241
static int parse_num(const char *line, unsigned long *p)
1242 1243
{
	char *ptr;
1244 1245 1246 1247 1248 1249 1250 1251

	if (!isdigit(*line))
		return 0;
	*p = strtoul(line, &ptr, 10);
	return ptr - line;
}

static int parse_range(const char *line, int len, int offset, const char *expect,
1252
		       unsigned long *p1, unsigned long *p2)
1253
{
1254 1255 1256 1257 1258 1259 1260
	int digits, ex;

	if (offset < 0 || offset >= len)
		return -1;
	line += offset;
	len -= offset;

1261 1262
	digits = parse_num(line, p1);
	if (!digits)
1263 1264 1265 1266 1267 1268
		return -1;

	offset += digits;
	line += digits;
	len -= digits;

L
Linus Torvalds 已提交
1269
	*p2 = 1;
1270 1271 1272 1273 1274 1275 1276 1277 1278 1279
	if (*line == ',') {
		digits = parse_num(line+1, p2);
		if (!digits)
			return -1;

		offset += digits+1;
		line += digits+1;
		len -= digits+1;
	}

1280 1281 1282 1283 1284 1285 1286 1287 1288
	ex = strlen(expect);
	if (ex > len)
		return -1;
	if (memcmp(line, expect, ex))
		return -1;

	return offset + ex;
}

1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316
static void recount_diff(char *line, int size, struct fragment *fragment)
{
	int oldlines = 0, newlines = 0, ret = 0;

	if (size < 1) {
		warning("recount: ignore empty hunk");
		return;
	}

	for (;;) {
		int len = linelen(line, size);
		size -= len;
		line += len;

		if (size < 1)
			break;

		switch (*line) {
		case ' ': case '\n':
			newlines++;
			/* fall through */
		case '-':
			oldlines++;
			continue;
		case '+':
			newlines++;
			continue;
		case '\\':
1317
			continue;
1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338
		case '@':
			ret = size < 3 || prefixcmp(line, "@@ ");
			break;
		case 'd':
			ret = size < 5 || prefixcmp(line, "diff ");
			break;
		default:
			ret = -1;
			break;
		}
		if (ret) {
			warning("recount: unexpected line: %.*s",
				(int)linelen(line, size), line);
			return;
		}
		break;
	}
	fragment->oldlines = oldlines;
	fragment->newlines = newlines;
}

1339 1340 1341 1342
/*
 * Parse a unified diff fragment header of the
 * form "@@ -a,b +c,d @@"
 */
1343
static int parse_fragment_header(char *line, int len, struct fragment *fragment)
1344 1345 1346 1347 1348 1349 1350
{
	int offset;

	if (!len || line[len-1] != '\n')
		return -1;

	/* Figure out the number of lines in a fragment */
1351 1352
	offset = parse_range(line, len, 4, " +", &fragment->oldpos, &fragment->oldlines);
	offset = parse_range(line, len, offset, " @@", &fragment->newpos, &fragment->newlines);
1353 1354 1355 1356

	return offset;
}

1357
static int find_header(char *line, unsigned long size, int *hdrsize, struct patch *patch)
L
Linus Torvalds 已提交
1358 1359 1360
{
	unsigned long offset, len;

1361
	patch->is_toplevel_relative = 0;
1362 1363 1364 1365
	patch->is_rename = patch->is_copy = 0;
	patch->is_new = patch->is_delete = -1;
	patch->old_mode = patch->new_mode = 0;
	patch->old_name = patch->new_name = NULL;
1366
	for (offset = 0; size > 0; offset += len, size -= len, line += len, linenr++) {
L
Linus Torvalds 已提交
1367 1368 1369 1370 1371 1372 1373 1374 1375
		unsigned long nextlen;

		len = linelen(line, size);
		if (!len)
			break;

		/* Testing this early allows us to take a few shortcuts.. */
		if (len < 6)
			continue;
1376 1377

		/*
1378
		 * Make sure we don't find any unconnected patch fragments.
1379 1380 1381 1382
		 * That's a sign that we didn't find a header, and that a
		 * patch has become corrupted/broken up.
		 */
		if (!memcmp("@@ -", line, 4)) {
1383 1384
			struct fragment dummy;
			if (parse_fragment_header(line, len, &dummy) < 0)
1385
				continue;
1386 1387
			die("patch fragment without header at line %d: %.*s",
			    linenr, (int)len-1, line);
1388 1389
		}

L
Linus Torvalds 已提交
1390 1391 1392 1393 1394 1395 1396 1397
		if (size < len + 6)
			break;

		/*
		 * Git patch? It might not have a real patch, just a rename
		 * or mode change, so we handle that specially
		 */
		if (!memcmp("diff --git ", line, 11)) {
1398
			int git_hdr_len = parse_git_header(line, len, size, patch);
1399
			if (git_hdr_len <= len)
L
Linus Torvalds 已提交
1400
				continue;
1401 1402
			if (!patch->old_name && !patch->new_name) {
				if (!patch->def_name)
1403 1404
					die("git diff header lacks filename information when removing "
					    "%d leading pathname components (line %d)" , p_value, linenr);
1405 1406
				patch->old_name = patch->new_name = patch->def_name;
			}
1407 1408 1409
			if (!patch->is_delete && !patch->new_name)
				die("git diff header lacks filename information "
				    "(line %d)", linenr);
1410
			patch->is_toplevel_relative = 1;
1411
			*hdrsize = git_hdr_len;
L
Linus Torvalds 已提交
1412 1413 1414
			return offset;
		}

1415
		/* --- followed by +++ ? */
L
Linus Torvalds 已提交
1416 1417 1418 1419 1420 1421
		if (memcmp("--- ", line,  4) || memcmp("+++ ", line + len, 4))
			continue;

		/*
		 * We only accept unified patches, so we want it to
		 * at least have "@@ -a,b +c,d @@\n", which is 14 chars
1422
		 * minimum ("@@ -0,0 +1 @@\n" is the shortest).
L
Linus Torvalds 已提交
1423 1424 1425 1426 1427 1428
		 */
		nextlen = linelen(line + len, size - len);
		if (size < nextlen + 14 || memcmp("@@ -", line + len + nextlen, 4))
			continue;

		/* Ok, we'll consider it a patch */
1429
		parse_traditional_patch(line, line+len, patch);
L
Linus Torvalds 已提交
1430
		*hdrsize = len + nextlen;
1431
		linenr += 2;
L
Linus Torvalds 已提交
1432 1433 1434 1435 1436
		return offset;
	}
	return -1;
}

1437
static void record_ws_error(unsigned result, const char *line, int len, int linenr)
1438
{
W
Wincent Colaiuta 已提交
1439
	char *err;
1440

W
Wincent Colaiuta 已提交
1441 1442
	if (!result)
		return;
1443 1444 1445 1446

	whitespace_error++;
	if (squelch_whitespace_errors &&
	    squelch_whitespace_errors < whitespace_error)
1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459
		return;

	err = whitespace_error_string(result);
	fprintf(stderr, "%s:%d: %s.\n%.*s\n",
		patch_input_file, linenr, err, len, line);
	free(err);
}

static void check_whitespace(const char *line, int len, unsigned ws_rule)
{
	unsigned result = ws_check(line + 1, len - 1, ws_rule);

	record_ws_error(result, line + 1, len - 2, linenr);
1460 1461
}

L
Linus Torvalds 已提交
1462
/*
1463 1464 1465 1466
 * Parse a unified diff. Note that this really needs to parse each
 * fragment separately, since the only way to know the difference
 * between a "---" that is part of a patch, and a "---" that starts
 * the next patch is to look at the line counts..
L
Linus Torvalds 已提交
1467
 */
1468 1469
static int parse_fragment(char *line, unsigned long size,
			  struct patch *patch, struct fragment *fragment)
L
Linus Torvalds 已提交
1470
{
1471
	int added, deleted;
L
Linus Torvalds 已提交
1472
	int len = linelen(line, size), offset;
1473
	unsigned long oldlines, newlines;
1474
	unsigned long leading, trailing;
L
Linus Torvalds 已提交
1475

1476
	offset = parse_fragment_header(line, len, fragment);
L
Linus Torvalds 已提交
1477 1478
	if (offset < 0)
		return -1;
1479 1480
	if (offset > 0 && patch->recount)
		recount_diff(line + offset, size - offset, fragment);
1481 1482
	oldlines = fragment->oldlines;
	newlines = fragment->newlines;
1483 1484
	leading = 0;
	trailing = 0;
L
Linus Torvalds 已提交
1485 1486 1487 1488

	/* Parse the thing.. */
	line += len;
	size -= len;
1489
	linenr++;
1490
	added = deleted = 0;
1491 1492 1493
	for (offset = len;
	     0 < size;
	     offset += len, size -= len, line += len, linenr++) {
L
Linus Torvalds 已提交
1494 1495 1496 1497 1498 1499 1500 1501
		if (!oldlines && !newlines)
			break;
		len = linelen(line, size);
		if (!len || line[len-1] != '\n')
			return -1;
		switch (*line) {
		default:
			return -1;
1502
		case '\n': /* newer GNU diff, an empty context line */
L
Linus Torvalds 已提交
1503 1504 1505
		case ' ':
			oldlines--;
			newlines--;
1506 1507 1508
			if (!deleted && !added)
				leading++;
			trailing++;
L
Linus Torvalds 已提交
1509 1510
			break;
		case '-':
1511
			if (apply_in_reverse &&
1512
			    ws_error_action != nowarn_ws_error)
1513
				check_whitespace(line, len, patch->ws_rule);
1514
			deleted++;
L
Linus Torvalds 已提交
1515
			oldlines--;
1516
			trailing = 0;
L
Linus Torvalds 已提交
1517 1518
			break;
		case '+':
1519
			if (!apply_in_reverse &&
1520
			    ws_error_action != nowarn_ws_error)
1521
				check_whitespace(line, len, patch->ws_rule);
1522
			added++;
L
Linus Torvalds 已提交
1523
			newlines--;
1524
			trailing = 0;
L
Linus Torvalds 已提交
1525
			break;
1526

1527 1528
		/*
		 * We allow "\ No newline at end of file". Depending
1529 1530
                 * on locale settings when the patch was produced we
                 * don't know what this line looks like. The only
1531 1532 1533 1534
                 * thing we do know is that it begins with "\ ".
		 * Checking for 12 is just for sanity check -- any
		 * l10n of "\ No newline..." is at least that long.
		 */
1535
		case '\\':
1536
			if (len < 12 || memcmp(line, "\\ ", 2))
1537
				return -1;
1538
			break;
L
Linus Torvalds 已提交
1539 1540
		}
	}
L
Linus Torvalds 已提交
1541 1542
	if (oldlines || newlines)
		return -1;
1543 1544 1545
	fragment->leading = leading;
	fragment->trailing = trailing;

1546 1547
	/*
	 * If a fragment ends with an incomplete line, we failed to include
1548 1549 1550
	 * it in the above loop because we hit oldlines == newlines == 0
	 * before seeing it.
	 */
1551
	if (12 < size && !memcmp(line, "\\ ", 2))
1552 1553
		offset += linelen(line, size);

1554 1555
	patch->lines_added += added;
	patch->lines_deleted += deleted;
1556 1557 1558 1559 1560

	if (0 < patch->is_new && oldlines)
		return error("new file depends on old contents");
	if (0 < patch->is_delete && newlines)
		return error("deleted file still has contents");
L
Linus Torvalds 已提交
1561 1562 1563
	return offset;
}

1564
static int parse_single_patch(char *line, unsigned long size, struct patch *patch)
L
Linus Torvalds 已提交
1565 1566
{
	unsigned long offset = 0;
1567
	unsigned long oldlines = 0, newlines = 0, context = 0;
1568
	struct fragment **fragp = &patch->fragments;
L
Linus Torvalds 已提交
1569 1570

	while (size > 4 && !memcmp(line, "@@ -", 4)) {
1571 1572 1573
		struct fragment *fragment;
		int len;

1574
		fragment = xcalloc(1, sizeof(*fragment));
1575
		fragment->linenr = linenr;
1576
		len = parse_fragment(line, size, patch, fragment);
L
Linus Torvalds 已提交
1577
		if (len <= 0)
1578
			die("corrupt patch at line %d", linenr);
1579 1580
		fragment->patch = line;
		fragment->size = len;
1581 1582 1583
		oldlines += fragment->oldlines;
		newlines += fragment->newlines;
		context += fragment->leading + fragment->trailing;
1584 1585 1586

		*fragp = fragment;
		fragp = &fragment->next;
L
Linus Torvalds 已提交
1587 1588 1589 1590 1591

		offset += len;
		line += len;
		size -= len;
	}
1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620

	/*
	 * If something was removed (i.e. we have old-lines) it cannot
	 * be creation, and if something was added it cannot be
	 * deletion.  However, the reverse is not true; --unified=0
	 * patches that only add are not necessarily creation even
	 * though they do not have any old lines, and ones that only
	 * delete are not necessarily deletion.
	 *
	 * Unfortunately, a real creation/deletion patch do _not_ have
	 * any context line by definition, so we cannot safely tell it
	 * apart with --unified=0 insanity.  At least if the patch has
	 * more than one hunk it is not creation or deletion.
	 */
	if (patch->is_new < 0 &&
	    (oldlines || (patch->fragments && patch->fragments->next)))
		patch->is_new = 0;
	if (patch->is_delete < 0 &&
	    (newlines || (patch->fragments && patch->fragments->next)))
		patch->is_delete = 0;

	if (0 < patch->is_new && oldlines)
		die("new file %s depends on old contents", patch->new_name);
	if (0 < patch->is_delete && newlines)
		die("deleted file %s still has contents", patch->old_name);
	if (!patch->is_delete && !newlines && context)
		fprintf(stderr, "** warning: file %s becomes empty but "
			"is not deleted\n", patch->new_name);

L
Linus Torvalds 已提交
1621 1622 1623
	return offset;
}

1624 1625 1626 1627 1628 1629 1630 1631 1632 1633
static inline int metadata_changes(struct patch *patch)
{
	return	patch->is_rename > 0 ||
		patch->is_copy > 0 ||
		patch->is_new > 0 ||
		patch->is_delete ||
		(patch->old_mode && patch->new_mode &&
		 patch->old_mode != patch->new_mode);
}

1634 1635
static char *inflate_it(const void *data, unsigned long size,
			unsigned long inflated_size)
J
Junio C Hamano 已提交
1636
{
1637
	git_zstream stream;
1638 1639 1640 1641 1642 1643 1644 1645 1646
	void *out;
	int st;

	memset(&stream, 0, sizeof(stream));

	stream.next_in = (unsigned char *)data;
	stream.avail_in = size;
	stream.next_out = out = xmalloc(inflated_size);
	stream.avail_out = inflated_size;
1647 1648 1649
	git_inflate_init(&stream);
	st = git_inflate(&stream, Z_FINISH);
	git_inflate_end(&stream);
1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661
	if ((st != Z_STREAM_END) || stream.total_out != inflated_size) {
		free(out);
		return NULL;
	}
	return out;
}

static struct fragment *parse_binary_hunk(char **buf_p,
					  unsigned long *sz_p,
					  int *status_p,
					  int *used_p)
{
1662 1663
	/*
	 * Expect a line that begins with binary patch method ("literal"
1664 1665 1666
	 * or "delta"), followed by the length of data before deflating.
	 * a sequence of 'length-byte' followed by base-85 encoded data
	 * should follow, terminated by a newline.
J
Junio C Hamano 已提交
1667 1668 1669 1670 1671 1672 1673 1674
	 *
	 * Each 5-byte sequence of base-85 encodes up to 4 bytes,
	 * and we would limit the patch line to 66 characters,
	 * so one line can fit up to 13 groups that would decode
	 * to 52 bytes max.  The length byte 'A'-'Z' corresponds
	 * to 1-26 bytes, and 'a'-'z' corresponds to 27-52 bytes.
	 */
	int llen, used;
1675 1676 1677 1678
	unsigned long size = *sz_p;
	char *buffer = *buf_p;
	int patch_method;
	unsigned long origlen;
J
Junio C Hamano 已提交
1679
	char *data = NULL;
1680 1681
	int hunk_size = 0;
	struct fragment *frag;
J
Junio C Hamano 已提交
1682

J
Junio C Hamano 已提交
1683 1684
	llen = linelen(buffer, size);
	used = llen;
1685 1686

	*status_p = 0;
J
Junio C Hamano 已提交
1687

1688
	if (!prefixcmp(buffer, "delta ")) {
1689 1690
		patch_method = BINARY_DELTA_DEFLATED;
		origlen = strtoul(buffer + 6, NULL, 10);
J
Junio C Hamano 已提交
1691
	}
1692
	else if (!prefixcmp(buffer, "literal ")) {
1693 1694
		patch_method = BINARY_LITERAL_DEFLATED;
		origlen = strtoul(buffer + 8, NULL, 10);
J
Junio C Hamano 已提交
1695 1696
	}
	else
1697 1698 1699
		return NULL;

	linenr++;
J
Junio C Hamano 已提交
1700
	buffer += llen;
J
Junio C Hamano 已提交
1701 1702 1703 1704 1705
	while (1) {
		int byte_length, max_byte_length, newsize;
		llen = linelen(buffer, size);
		used += llen;
		linenr++;
1706 1707 1708 1709
		if (llen == 1) {
			/* consume the blank line */
			buffer++;
			size--;
J
Junio C Hamano 已提交
1710
			break;
1711
		}
1712 1713
		/*
		 * Minimum line is "A00000\n" which is 7-byte long,
J
Junio C Hamano 已提交
1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732
		 * and the line length must be multiple of 5 plus 2.
		 */
		if ((llen < 7) || (llen-2) % 5)
			goto corrupt;
		max_byte_length = (llen - 2) / 5 * 4;
		byte_length = *buffer;
		if ('A' <= byte_length && byte_length <= 'Z')
			byte_length = byte_length - 'A' + 1;
		else if ('a' <= byte_length && byte_length <= 'z')
			byte_length = byte_length - 'a' + 27;
		else
			goto corrupt;
		/* if the input length was not multiple of 4, we would
		 * have filler at the end but the filler should never
		 * exceed 3 bytes
		 */
		if (max_byte_length < byte_length ||
		    byte_length <= max_byte_length - 4)
			goto corrupt;
1733
		newsize = hunk_size + byte_length;
J
Junio C Hamano 已提交
1734
		data = xrealloc(data, newsize);
1735
		if (decode_85(data + hunk_size, buffer + 1, byte_length))
J
Junio C Hamano 已提交
1736
			goto corrupt;
1737
		hunk_size = newsize;
J
Junio C Hamano 已提交
1738 1739 1740
		buffer += llen;
		size -= llen;
	}
1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753

	frag = xcalloc(1, sizeof(*frag));
	frag->patch = inflate_it(data, hunk_size, origlen);
	if (!frag->patch)
		goto corrupt;
	free(data);
	frag->size = origlen;
	*buf_p = buffer;
	*sz_p = size;
	*used_p = used;
	frag->binary_patch_method = patch_method;
	return frag;

J
Junio C Hamano 已提交
1754
 corrupt:
J
Junio C Hamano 已提交
1755
	free(data);
1756 1757 1758 1759 1760 1761 1762 1763
	*status_p = -1;
	error("corrupt binary patch at line %d: %.*s",
	      linenr-1, llen-1, buffer);
	return NULL;
}

static int parse_binary(char *buffer, unsigned long size, struct patch *patch)
{
1764 1765
	/*
	 * We have read "GIT binary patch\n"; what follows is a line
1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794
	 * that says the patch method (currently, either "literal" or
	 * "delta") and the length of data before deflating; a
	 * sequence of 'length-byte' followed by base-85 encoded data
	 * follows.
	 *
	 * When a binary patch is reversible, there is another binary
	 * hunk in the same format, starting with patch method (either
	 * "literal" or "delta") with the length of data, and a sequence
	 * of length-byte + base-85 encoded data, terminated with another
	 * empty line.  This data, when applied to the postimage, produces
	 * the preimage.
	 */
	struct fragment *forward;
	struct fragment *reverse;
	int status;
	int used, used_1;

	forward = parse_binary_hunk(&buffer, &size, &status, &used);
	if (!forward && !status)
		/* there has to be one hunk (forward hunk) */
		return error("unrecognized binary patch at line %d", linenr-1);
	if (status)
		/* otherwise we already gave an error message */
		return status;

	reverse = parse_binary_hunk(&buffer, &size, &status, &used_1);
	if (reverse)
		used += used_1;
	else if (status) {
1795 1796
		/*
		 * Not having reverse hunk is not an error, but having
1797 1798 1799 1800 1801 1802 1803 1804 1805 1806
		 * a corrupt reverse hunk is.
		 */
		free((void*) forward->patch);
		free(forward);
		return status;
	}
	forward->next = reverse;
	patch->fragments = forward;
	patch->is_binary = 1;
	return used;
J
Junio C Hamano 已提交
1807 1808
}

1809
static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
L
Linus Torvalds 已提交
1810 1811
{
	int hdrsize, patchsize;
1812
	int offset = find_header(buffer, size, &hdrsize, patch);
L
Linus Torvalds 已提交
1813 1814 1815 1816

	if (offset < 0)
		return offset;

1817 1818 1819 1820
	patch->ws_rule = whitespace_rule(patch->new_name
					 ? patch->new_name
					 : patch->old_name);

1821 1822
	patchsize = parse_single_patch(buffer + offset + hdrsize,
				       size - offset - hdrsize, patch);
L
Linus Torvalds 已提交
1823

1824
	if (!patchsize) {
1825 1826 1827 1828 1829
		static const char *binhdr[] = {
			"Binary files ",
			"Files ",
			NULL,
		};
J
Junio C Hamano 已提交
1830
		static const char git_binary[] = "GIT binary patch\n";
1831 1832 1833 1834
		int i;
		int hd = hdrsize + offset;
		unsigned long llen = linelen(buffer + hd, size - hd);

J
Junio C Hamano 已提交
1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846
		if (llen == sizeof(git_binary) - 1 &&
		    !memcmp(git_binary, buffer + hd, llen)) {
			int used;
			linenr++;
			used = parse_binary(buffer + hd + llen,
					    size - hd - llen, patch);
			if (used)
				patchsize = used + llen;
			else
				patchsize = 0;
		}
		else if (!memcmp(" differ\n", buffer + hd + llen - 8, 8)) {
1847 1848 1849 1850
			for (i = 0; binhdr[i]; i++) {
				int len = strlen(binhdr[i]);
				if (len < size - hd &&
				    !memcmp(binhdr[i], buffer + hd, len)) {
J
Junio C Hamano 已提交
1851
					linenr++;
1852
					patch->is_binary = 1;
J
Junio C Hamano 已提交
1853
					patchsize = llen;
1854 1855 1856
					break;
				}
			}
J
Junio C Hamano 已提交
1857
		}
1858

J
Junio C Hamano 已提交
1859 1860 1861
		/* Empty patch cannot be applied if it is a text patch
		 * without metadata change.  A binary patch appears
		 * empty to us here.
1862 1863
		 */
		if ((apply || check) &&
J
Junio C Hamano 已提交
1864
		    (!patch->is_binary && !metadata_changes(patch)))
1865 1866
			die("patch with only garbage at line %d", linenr);
	}
1867

L
Linus Torvalds 已提交
1868 1869 1870
	return offset + hdrsize + patchsize;
}

J
Johannes Schindelin 已提交
1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897
#define swap(a,b) myswap((a),(b),sizeof(a))

#define myswap(a, b, size) do {		\
	unsigned char mytmp[size];	\
	memcpy(mytmp, &a, size);		\
	memcpy(&a, &b, size);		\
	memcpy(&b, mytmp, size);		\
} while (0)

static void reverse_patches(struct patch *p)
{
	for (; p; p = p->next) {
		struct fragment *frag = p->fragments;

		swap(p->new_name, p->old_name);
		swap(p->new_mode, p->old_mode);
		swap(p->is_new, p->is_delete);
		swap(p->lines_added, p->lines_deleted);
		swap(p->old_sha1_prefix, p->new_sha1_prefix);

		for (; frag; frag = frag->next) {
			swap(frag->newpos, frag->oldpos);
			swap(frag->newlines, frag->oldlines);
		}
	}
}

1898 1899 1900 1901
static const char pluses[] =
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++";
static const char minuses[]=
"----------------------------------------------------------------------";
1902 1903 1904

static void show_stats(struct patch *patch)
{
1905
	struct strbuf qname = STRBUF_INIT;
1906 1907
	char *cp = patch->new_name ? patch->new_name : patch->old_name;
	int max, add, del;
1908

1909
	quote_c_style(cp, &qname, NULL, 0);
1910

1911 1912 1913 1914 1915 1916
	/*
	 * "scale" the filename
	 */
	max = max_len;
	if (max > 50)
		max = 50;
1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928

	if (qname.len > max) {
		cp = strchr(qname.buf + qname.len + 3 - max, '/');
		if (!cp)
			cp = qname.buf + qname.len + 3 - max;
		strbuf_splice(&qname, 0, cp - qname.buf, "...", 3);
	}

	if (patch->is_binary) {
		printf(" %-*s |  Bin\n", max, qname.buf);
		strbuf_release(&qname);
		return;
1929
	}
1930 1931 1932

	printf(" %-*s |", max, qname.buf);
	strbuf_release(&qname);
1933 1934 1935 1936

	/*
	 * scale the add/delete
	 */
1937
	max = max + max_change > 70 ? 70 - max : max_change;
1938 1939 1940
	add = patch->lines_added;
	del = patch->lines_deleted;

1941
	if (max_change > 0) {
1942
		int total = ((add + del) * max + max_change / 2) / max_change;
1943 1944 1945
		add = (add * max + max_change / 2) / max_change;
		del = total - add;
	}
1946 1947
	printf("%5d %.*s%.*s\n", patch->lines_added + patch->lines_deleted,
		add, pluses, del, minuses);
1948 1949
}

1950
static int read_old_data(struct stat *st, const char *path, struct strbuf *buf)
1951 1952 1953
{
	switch (st->st_mode & S_IFMT) {
	case S_IFLNK:
1954 1955
		if (strbuf_readlink(buf, path, st->st_size) < 0)
			return error("unable to read symlink %s", path);
1956
		return 0;
1957
	case S_IFREG:
1958 1959
		if (strbuf_read_file(buf, path, st->st_size) != st->st_size)
			return error("unable to open or read %s", path);
1960
		convert_to_git(path, buf->buf, buf->len, buf, 0);
1961
		return 0;
1962 1963 1964 1965 1966
	default:
		return -1;
	}
}

1967 1968 1969 1970 1971 1972 1973
/*
 * Update the preimage, and the common lines in postimage,
 * from buffer buf of length len. If postlen is 0 the postimage
 * is updated in place, otherwise it's updated on a new buffer
 * of length postlen
 */

1974 1975 1976
static void update_pre_post_images(struct image *preimage,
				   struct image *postimage,
				   char *buf,
1977
				   size_t len, size_t postlen)
1978
{
1979 1980 1981
	int i, ctx;
	char *new, *old, *fixed;
	struct image fixed_preimage;
1982

1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993
	/*
	 * Update the preimage with whitespace fixes.  Note that we
	 * are not losing preimage->buf -- apply_one_fragment() will
	 * free "oldlines".
	 */
	prepare_image(&fixed_preimage, buf, len, 1);
	assert(fixed_preimage.nr == preimage->nr);
	for (i = 0; i < preimage->nr; i++)
		fixed_preimage.line[i].flag = preimage->line[i].flag;
	free(preimage->line_allocated);
	*preimage = fixed_preimage;
1994

1995
	/*
1996 1997 1998 1999 2000 2001 2002
	 * Adjust the common context lines in postimage. This can be
	 * done in-place when we are just doing whitespace fixing,
	 * which does not make the string grow, but needs a new buffer
	 * when ignoring whitespace causes the update, since in this case
	 * we could have e.g. tabs converted to multiple spaces.
	 * We trust the caller to tell us if the update can be done
	 * in place (postlen==0) or not.
2003
	 */
2004 2005 2006 2007 2008
	old = postimage->buf;
	if (postlen)
		new = postimage->buf = xmalloc(postlen);
	else
		new = old;
2009 2010 2011 2012 2013 2014 2015 2016 2017
	fixed = preimage->buf;
	for (i = ctx = 0; i < postimage->nr; i++) {
		size_t len = postimage->line[i].len;
		if (!(postimage->line[i].flag & LINE_COMMON)) {
			/* an added line -- no counterparts in preimage */
			memmove(new, old, len);
			old += len;
			new += len;
			continue;
2018
		}
2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044

		/* a common context -- skip it in the original postimage */
		old += len;

		/* and find the corresponding one in the fixed preimage */
		while (ctx < preimage->nr &&
		       !(preimage->line[ctx].flag & LINE_COMMON)) {
			fixed += preimage->line[ctx].len;
			ctx++;
		}
		if (preimage->nr <= ctx)
			die("oops");

		/* and copy it in, while fixing the line length */
		len = preimage->line[ctx].len;
		memcpy(new, fixed, len);
		new += len;
		fixed += len;
		postimage->line[i].len = len;
		ctx++;
	}

	/* Fix the length of the whole thing */
	postimage->len = new - postimage->buf;
}

2045 2046 2047
static int match_fragment(struct image *img,
			  struct image *preimage,
			  struct image *postimage,
2048
			  unsigned long try,
2049
			  int try_lno,
2050
			  unsigned ws_rule,
2051
			  int match_beginning, int match_end)
2052
{
2053
	int i;
2054
	char *fixed_buf, *buf, *orig, *target;
2055 2056
	struct strbuf fixed;
	size_t fixed_len;
2057
	int preimage_limit;
2058

2059 2060 2061 2062 2063 2064 2065 2066
	if (preimage->nr + try_lno <= img->nr) {
		/*
		 * The hunk falls within the boundaries of img.
		 */
		preimage_limit = preimage->nr;
		if (match_end && (preimage->nr + try_lno != img->nr))
			return 0;
	} else if (ws_error_action == correct_ws_error &&
2067
		   (ws_rule & WS_BLANK_AT_EOF)) {
2068
		/*
2069 2070 2071 2072 2073
		 * This hunk extends beyond the end of img, and we are
		 * removing blank lines at the end of the file.  This
		 * many lines from the beginning of the preimage must
		 * match with img, and the remainder of the preimage
		 * must be blank.
2074 2075 2076 2077 2078 2079 2080 2081
		 */
		preimage_limit = img->nr - try_lno;
	} else {
		/*
		 * The hunk extends beyond the end of the img and
		 * we are not removing blanks at the end, so we
		 * should reject the hunk at this position.
		 */
2082
		return 0;
2083
	}
2084 2085

	if (match_beginning && try_lno)
2086
		return 0;
2087

2088
	/* Quick hash check */
2089
	for (i = 0; i < preimage_limit; i++)
2090 2091
		if ((img->line[try_lno + i].flag & LINE_PATCHED) ||
		    (preimage->line[i].hash != img->line[try_lno + i].hash))
2092 2093
			return 0;

2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127
	if (preimage_limit == preimage->nr) {
		/*
		 * Do we have an exact match?  If we were told to match
		 * at the end, size must be exactly at try+fragsize,
		 * otherwise try+fragsize must be still within the preimage,
		 * and either case, the old piece should match the preimage
		 * exactly.
		 */
		if ((match_end
		     ? (try + preimage->len == img->len)
		     : (try + preimage->len <= img->len)) &&
		    !memcmp(img->buf + try, preimage->buf, preimage->len))
			return 1;
	} else {
		/*
		 * The preimage extends beyond the end of img, so
		 * there cannot be an exact match.
		 *
		 * There must be one non-blank context line that match
		 * a line before the end of img.
		 */
		char *buf_end;

		buf = preimage->buf;
		buf_end = buf;
		for (i = 0; i < preimage_limit; i++)
			buf_end += preimage->line[i].len;

		for ( ; buf < buf_end; buf++)
			if (!isspace(*buf))
				break;
		if (buf == buf_end)
			return 0;
	}
2128

2129 2130 2131 2132 2133 2134 2135 2136 2137
	/*
	 * No exact match. If we are ignoring whitespace, run a line-by-line
	 * fuzzy matching. We collect all the line length information because
	 * we need it to adjust whitespace if we match.
	 */
	if (ws_ignore_action == ignore_ws_change) {
		size_t imgoff = 0;
		size_t preoff = 0;
		size_t postlen = postimage->len;
2138 2139 2140 2141
		size_t extra_chars;
		char *preimage_eof;
		char *preimage_end;
		for (i = 0; i < preimage_limit; i++) {
2142
			size_t prelen = preimage->line[i].len;
2143
			size_t imglen = img->line[try_lno+i].len;
2144

2145 2146
			if (!fuzzy_matchlines(img->buf + try + imgoff, imglen,
					      preimage->buf + preoff, prelen))
2147 2148
				return 0;
			if (preimage->line[i].flag & LINE_COMMON)
2149 2150
				postlen += imglen - prelen;
			imgoff += imglen;
2151 2152 2153 2154
			preoff += prelen;
		}

		/*
2155 2156 2157
		 * Ok, the preimage matches with whitespace fuzz.
		 *
		 * imgoff now holds the true length of the target that
2158 2159 2160 2161 2162 2163
		 * matches the preimage before the end of the file.
		 *
		 * Count the number of characters in the preimage that fall
		 * beyond the end of the file and make sure that all of them
		 * are whitespace characters. (This can only happen if
		 * we are removing blank lines at the end of the file.)
2164
		 */
2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180
		buf = preimage_eof = preimage->buf + preoff;
		for ( ; i < preimage->nr; i++)
			preoff += preimage->line[i].len;
		preimage_end = preimage->buf + preoff;
		for ( ; buf < preimage_end; buf++)
			if (!isspace(*buf))
				return 0;

		/*
		 * Update the preimage and the common postimage context
		 * lines to use the same whitespace as the target.
		 * If whitespace is missing in the target (i.e.
		 * if the preimage extends beyond the end of the file),
		 * use the whitespace from the preimage.
		 */
		extra_chars = preimage_end - preimage_eof;
2181 2182 2183 2184
		strbuf_init(&fixed, imgoff + extra_chars);
		strbuf_add(&fixed, img->buf + try, imgoff);
		strbuf_add(&fixed, preimage_eof, extra_chars);
		fixed_buf = strbuf_detach(&fixed, &fixed_len);
2185
		update_pre_post_images(preimage, postimage,
2186
				fixed_buf, fixed_len, postlen);
2187 2188 2189
		return 1;
	}

2190 2191 2192
	if (ws_error_action != correct_ws_error)
		return 0;

2193
	/*
2194
	 * The hunk does not apply byte-by-byte, but the hash says
2195 2196 2197
	 * it might with whitespace fuzz. We haven't been asked to
	 * ignore whitespace, we were asked to correct whitespace
	 * errors, so let's try matching after whitespace correction.
2198 2199 2200 2201
	 *
	 * The preimage may extend beyond the end of the file,
	 * but in this loop we will only handle the part of the
	 * preimage that falls within the file.
2202
	 */
2203
	strbuf_init(&fixed, preimage->len + 1);
2204 2205
	orig = preimage->buf;
	target = img->buf + try;
2206
	for (i = 0; i < preimage_limit; i++) {
2207 2208
		size_t oldlen = preimage->line[i].len;
		size_t tgtlen = img->line[try_lno + i].len;
2209 2210
		size_t fixstart = fixed.len;
		struct strbuf tgtfix;
2211 2212 2213
		int match;

		/* Try fixing the line in the preimage */
2214
		ws_fix_copy(&fixed, orig, oldlen, ws_rule, NULL);
2215 2216

		/* Try fixing the line in the target */
2217 2218
		strbuf_init(&tgtfix, tgtlen);
		ws_fix_copy(&tgtfix, target, tgtlen, ws_rule, NULL);
2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229

		/*
		 * If they match, either the preimage was based on
		 * a version before our tree fixed whitespace breakage,
		 * or we are lacking a whitespace-fix patch the tree
		 * the preimage was based on already had (i.e. target
		 * has whitespace breakage, the preimage doesn't).
		 * In either case, we are fixing the whitespace breakages
		 * so we might as well take the fix together with their
		 * real change.
		 */
2230 2231 2232
		match = (tgtfix.len == fixed.len - fixstart &&
			 !memcmp(tgtfix.buf, fixed.buf + fixstart,
					     fixed.len - fixstart));
2233

2234
		strbuf_release(&tgtfix);
2235 2236 2237 2238 2239
		if (!match)
			goto unmatch_exit;

		orig += oldlen;
		target += tgtlen;
2240 2241
	}

2242 2243 2244 2245 2246 2247 2248 2249

	/*
	 * Now handle the lines in the preimage that falls beyond the
	 * end of the file (if any). They will only match if they are
	 * empty or only contain whitespace (if WS_BLANK_AT_EOL is
	 * false).
	 */
	for ( ; i < preimage->nr; i++) {
2250
		size_t fixstart = fixed.len; /* start of the fixed preimage */
2251 2252 2253 2254
		size_t oldlen = preimage->line[i].len;
		int j;

		/* Try fixing the line in the preimage */
2255
		ws_fix_copy(&fixed, orig, oldlen, ws_rule, NULL);
2256

2257 2258
		for (j = fixstart; j < fixed.len; j++)
			if (!isspace(fixed.buf[j]))
2259 2260 2261 2262 2263
				goto unmatch_exit;

		orig += oldlen;
	}

2264 2265 2266 2267 2268
	/*
	 * Yes, the preimage is based on an older version that still
	 * has whitespace breakages unfixed, and fixing them makes the
	 * hunk match.  Update the context lines in the postimage.
	 */
2269
	fixed_buf = strbuf_detach(&fixed, &fixed_len);
2270
	update_pre_post_images(preimage, postimage,
2271
			       fixed_buf, fixed_len, 0);
2272 2273 2274
	return 1;

 unmatch_exit:
2275
	strbuf_release(&fixed);
2276
	return 0;
2277 2278
}

2279 2280 2281 2282
static int find_pos(struct image *img,
		    struct image *preimage,
		    struct image *postimage,
		    int line,
2283
		    unsigned ws_rule,
2284
		    int match_beginning, int match_end)
2285
{
2286 2287 2288
	int i;
	unsigned long backwards, forwards, try;
	int backwards_lno, forwards_lno, try_lno;
2289

2290
	/*
2291
	 * If match_beginning or match_end is specified, there is no
2292 2293 2294 2295 2296 2297 2298 2299
	 * point starting from a wrong line that will never match and
	 * wander around and wait for a match at the specified end.
	 */
	if (match_beginning)
		line = 0;
	else if (match_end)
		line = img->nr - preimage->nr;

2300 2301 2302 2303 2304 2305
	/*
	 * Because the comparison is unsigned, the following test
	 * will also take care of a negative line number that can
	 * result when match_end and preimage is larger than the target.
	 */
	if ((size_t) line > img->nr)
2306 2307
		line = img->nr;

2308 2309 2310
	try = 0;
	for (i = 0; i < line; i++)
		try += img->line[i].len;
2311

2312 2313 2314 2315
	/*
	 * There's probably some smart way to do this, but I'll leave
	 * that to the smart and beautiful people. I'm simple and stupid.
	 */
2316 2317 2318 2319 2320
	backwards = try;
	backwards_lno = line;
	forwards = try;
	forwards_lno = line;
	try_lno = line;
2321

2322
	for (i = 0; ; i++) {
2323
		if (match_fragment(img, preimage, postimage,
2324
				   try, try_lno, ws_rule,
2325 2326
				   match_beginning, match_end))
			return try_lno;
2327 2328

	again:
2329
		if (backwards_lno == 0 && forwards_lno == img->nr)
2330
			break;
2331 2332

		if (i & 1) {
2333
			if (backwards_lno == 0) {
2334 2335
				i++;
				goto again;
2336
			}
2337 2338
			backwards_lno--;
			backwards -= img->line[backwards_lno].len;
2339
			try = backwards;
2340
			try_lno = backwards_lno;
2341
		} else {
2342
			if (forwards_lno == img->nr) {
2343 2344
				i++;
				goto again;
2345
			}
2346 2347
			forwards += img->line[forwards_lno].len;
			forwards_lno++;
2348
			try = forwards;
2349
			try_lno = forwards_lno;
2350 2351 2352
		}

	}
2353 2354 2355
	return -1;
}

2356
static void remove_first_line(struct image *img)
2357
{
2358 2359 2360 2361
	img->buf += img->line[0].len;
	img->len -= img->line[0].len;
	img->line++;
	img->nr--;
2362 2363
}

2364
static void remove_last_line(struct image *img)
2365
{
2366
	img->len -= img->line[--img->nr].len;
2367 2368
}

2369 2370 2371 2372
static void update_image(struct image *img,
			 int applied_pos,
			 struct image *preimage,
			 struct image *postimage)
2373
{
2374
	/*
2375 2376
	 * remove the copy of preimage at offset in img
	 * and replace it with postimage
2377
	 */
2378 2379 2380
	int i, nr;
	size_t remove_count, insert_count, applied_at = 0;
	char *result;
2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394
	int preimage_limit;

	/*
	 * If we are removing blank lines at the end of img,
	 * the preimage may extend beyond the end.
	 * If that is the case, we must be careful only to
	 * remove the part of the preimage that falls within
	 * the boundaries of img. Initialize preimage_limit
	 * to the number of lines in the preimage that falls
	 * within the boundaries.
	 */
	preimage_limit = preimage->nr;
	if (preimage_limit > img->nr - applied_pos)
		preimage_limit = img->nr - applied_pos;
2395

2396 2397 2398 2399
	for (i = 0; i < applied_pos; i++)
		applied_at += img->line[i].len;

	remove_count = 0;
2400
	for (i = 0; i < preimage_limit; i++)
2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416
		remove_count += img->line[applied_pos + i].len;
	insert_count = postimage->len;

	/* Adjust the contents */
	result = xmalloc(img->len + insert_count - remove_count + 1);
	memcpy(result, img->buf, applied_at);
	memcpy(result + applied_at, postimage->buf, postimage->len);
	memcpy(result + applied_at + postimage->len,
	       img->buf + (applied_at + remove_count),
	       img->len - (applied_at + remove_count));
	free(img->buf);
	img->buf = result;
	img->len += insert_count - remove_count;
	result[img->len] = '\0';

	/* Adjust the line table */
2417 2418
	nr = img->nr + postimage->nr - preimage_limit;
	if (preimage_limit < postimage->nr) {
2419
		/*
2420 2421
		 * NOTE: this knows that we never call remove_first_line()
		 * on anything other than pre/post image.
2422
		 */
2423 2424
		img->line = xrealloc(img->line, nr * sizeof(*img->line));
		img->line_allocated = img->line;
2425
	}
2426
	if (preimage_limit != postimage->nr)
2427
		memmove(img->line + applied_pos + postimage->nr,
2428 2429
			img->line + applied_pos + preimage_limit,
			(img->nr - (applied_pos + preimage_limit)) *
2430 2431 2432 2433
			sizeof(*img->line));
	memcpy(img->line + applied_pos,
	       postimage->line,
	       postimage->nr * sizeof(*img->line));
2434 2435 2436
	if (!allow_overlap)
		for (i = 0; i < postimage->nr; i++)
			img->line[applied_pos + i].flag |= LINE_PATCHED;
2437
	img->nr = nr;
2438 2439
}

2440
static int apply_one_fragment(struct image *img, struct fragment *frag,
2441 2442
			      int inaccurate_eof, unsigned ws_rule,
			      int nth_fragment)
2443
{
2444
	int match_beginning, match_end;
2445
	const char *patch = frag->patch;
2446
	int size = frag->size;
2447 2448
	char *old, *oldlines;
	struct strbuf newlines;
2449
	int new_blank_lines_at_end = 0;
2450 2451
	int found_new_blank_lines_at_end = 0;
	int hunk_linenr = frag->linenr;
2452
	unsigned long leading, trailing;
2453 2454 2455
	int pos, applied_pos;
	struct image preimage;
	struct image postimage;
2456

2457 2458
	memset(&preimage, 0, sizeof(preimage));
	memset(&postimage, 0, sizeof(postimage));
2459
	oldlines = xmalloc(size);
2460
	strbuf_init(&newlines, size);
2461

2462
	old = oldlines;
2463
	while (size > 0) {
J
Johannes Schindelin 已提交
2464
		char first;
2465
		int len = linelen(patch, size);
2466
		int plen;
2467
		int added_blank_line = 0;
2468
		int is_blank_context = 0;
2469
		size_t start;
2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480

		if (!len)
			break;

		/*
		 * "plen" is how much of the line we should use for
		 * the actual patch data. Normally we just remove the
		 * first character on the line, but if the line is
		 * followed by "\ No newline", then we also remove the
		 * last one (which is the newline, of course).
		 */
2481
		plen = len - 1;
2482
		if (len < size && patch[len] == '\\')
2483
			plen--;
J
Johannes Schindelin 已提交
2484
		first = *patch;
2485
		if (apply_in_reverse) {
J
Johannes Schindelin 已提交
2486 2487 2488 2489 2490
			if (first == '-')
				first = '+';
			else if (first == '+')
				first = '-';
		}
2491

J
Johannes Schindelin 已提交
2492
		switch (first) {
2493 2494 2495 2496 2497
		case '\n':
			/* Newer GNU diff, empty context line */
			if (plen < 0)
				/* ... followed by '\No newline'; nothing */
				break;
2498
			*old++ = '\n';
2499
			strbuf_addch(&newlines, '\n');
2500 2501
			add_line_info(&preimage, "\n", 1, LINE_COMMON);
			add_line_info(&postimage, "\n", 1, LINE_COMMON);
2502
			is_blank_context = 1;
2503
			break;
2504
		case ' ':
2505 2506
			if (plen && (ws_rule & WS_BLANK_AT_EOF) &&
			    ws_blank_line(patch + 1, plen, ws_rule))
2507
				is_blank_context = 1;
2508
		case '-':
2509 2510
			memcpy(old, patch + 1, plen);
			add_line_info(&preimage, old, plen,
2511
				      (first == ' ' ? LINE_COMMON : 0));
2512
			old += plen;
J
Johannes Schindelin 已提交
2513
			if (first == '-')
2514 2515 2516
				break;
		/* Fall-through for ' ' */
		case '+':
2517 2518 2519 2520
			/* --no-add does not add new lines */
			if (first == '+' && no_add)
				break;

2521
			start = newlines.len;
2522 2523 2524
			if (first != '+' ||
			    !whitespace_error ||
			    ws_error_action != correct_ws_error) {
2525
				strbuf_add(&newlines, patch + 1, plen);
2526 2527
			}
			else {
2528
				ws_fix_copy(&newlines, patch + 1, plen, ws_rule, &applied_after_fixing_ws);
2529
			}
2530
			add_line_info(&postimage, newlines.buf + start, newlines.len - start,
2531 2532
				      (first == '+' ? 0 : LINE_COMMON));
			if (first == '+' &&
2533 2534
			    (ws_rule & WS_BLANK_AT_EOF) &&
			    ws_blank_line(patch + 1, plen, ws_rule))
2535
				added_blank_line = 1;
2536 2537 2538 2539 2540
			break;
		case '@': case '\\':
			/* Ignore it, we already handled it */
			break;
		default:
2541 2542
			if (apply_verbosely)
				error("invalid start of line: '%c'", first);
2543 2544
			return -1;
		}
2545 2546 2547
		if (added_blank_line) {
			if (!new_blank_lines_at_end)
				found_new_blank_lines_at_end = hunk_linenr;
2548
			new_blank_lines_at_end++;
2549
		}
2550 2551
		else if (is_blank_context)
			;
2552 2553
		else
			new_blank_lines_at_end = 0;
2554 2555
		patch += len;
		size -= len;
2556
		hunk_linenr++;
2557
	}
2558
	if (inaccurate_eof &&
2559
	    old > oldlines && old[-1] == '\n' &&
2560
	    newlines.len > 0 && newlines.buf[newlines.len - 1] == '\n') {
2561
		old--;
2562
		strbuf_setlen(&newlines, newlines.len - 1);
2563
	}
2564 2565 2566

	leading = frag->leading;
	trailing = frag->trailing;
2567 2568

	/*
2569 2570
	 * A hunk to change lines at the beginning would begin with
	 * @@ -1,L +N,M @@
2571 2572
	 * but we need to be careful.  -U0 that inserts before the second
	 * line also has this pattern.
2573
	 *
2574 2575 2576 2577 2578
	 * And a hunk to add to an empty file would begin with
	 * @@ -0,0 +N,M @@
	 *
	 * In other words, a hunk that is (frag->oldpos <= 1) with or
	 * without leading context must match at the beginning.
2579
	 */
2580 2581
	match_beginning = (!frag->oldpos ||
			   (frag->oldpos == 1 && !unidiff_zero));
2582 2583 2584 2585 2586 2587 2588 2589

	/*
	 * A hunk without trailing lines must match at the end.
	 * However, we simply cannot tell if a hunk must match end
	 * from the lack of trailing lines if the patch was generated
	 * with unidiff without any context.
	 */
	match_end = !unidiff_zero && !trailing;
2590

2591
	pos = frag->newpos ? (frag->newpos - 1) : 0;
2592 2593
	preimage.buf = oldlines;
	preimage.len = old - oldlines;
2594 2595
	postimage.buf = newlines.buf;
	postimage.len = newlines.len;
2596 2597 2598
	preimage.line = preimage.line_allocated;
	postimage.line = postimage.line_allocated;

2599
	for (;;) {
2600

2601 2602
		applied_pos = find_pos(img, &preimage, &postimage, pos,
				       ws_rule, match_beginning, match_end);
2603 2604

		if (applied_pos >= 0)
2605 2606 2607 2608 2609
			break;

		/* Am I at my context limits? */
		if ((leading <= p_context) && (trailing <= p_context))
			break;
2610 2611
		if (match_beginning || match_end) {
			match_beginning = match_end = 0;
2612 2613
			continue;
		}
2614

2615 2616 2617 2618
		/*
		 * Reduce the number of context lines; reduce both
		 * leading and trailing if they are equal otherwise
		 * just reduce the larger context.
2619 2620
		 */
		if (leading >= trailing) {
2621 2622
			remove_first_line(&preimage);
			remove_first_line(&postimage);
2623 2624 2625 2626
			pos--;
			leading--;
		}
		if (trailing > leading) {
2627 2628
			remove_last_line(&preimage);
			remove_last_line(&postimage);
2629
			trailing--;
2630
		}
2631 2632
	}

2633
	if (applied_pos >= 0) {
2634
		if (new_blank_lines_at_end &&
2635
		    preimage.nr + applied_pos >= img->nr &&
2636 2637
		    (ws_rule & WS_BLANK_AT_EOF) &&
		    ws_error_action != nowarn_ws_error) {
2638 2639
			record_ws_error(WS_BLANK_AT_EOF, "+", 1,
					found_new_blank_lines_at_end);
2640 2641 2642 2643
			if (ws_error_action == correct_ws_error) {
				while (new_blank_lines_at_end--)
					remove_last_line(&postimage);
			}
2644
			/*
2645 2646 2647 2648 2649
			 * We would want to prevent write_out_results()
			 * from taking place in apply_patch() that follows
			 * the callchain led us here, which is:
			 * apply_patch->check_patch_list->check_patch->
			 * apply_data->apply_fragments->apply_one_fragment
2650
			 */
2651 2652
			if (ws_error_action == die_on_ws_error)
				apply = 0;
2653
		}
2654

2655 2656 2657 2658 2659 2660 2661 2662 2663
		if (apply_verbosely && applied_pos != pos) {
			int offset = applied_pos - pos;
			if (apply_in_reverse)
				offset = 0 - offset;
			fprintf(stderr,
				"Hunk #%d succeeded at %d (offset %d lines).\n",
				nth_fragment, applied_pos + 1, offset);
		}

2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675
		/*
		 * Warn if it was necessary to reduce the number
		 * of context lines.
		 */
		if ((leading != frag->leading) ||
		    (trailing != frag->trailing))
			fprintf(stderr, "Context reduced to (%ld/%ld)"
				" to apply fragment at %d\n",
				leading, trailing, applied_pos+1);
		update_image(img, applied_pos, &preimage, &postimage);
	} else {
		if (apply_verbosely)
2676 2677
			error("while searching for:\n%.*s",
			      (int)(old - oldlines), oldlines);
2678
	}
2679

2680
	free(oldlines);
2681
	strbuf_release(&newlines);
2682 2683 2684 2685
	free(preimage.line_allocated);
	free(postimage.line_allocated);

	return (applied_pos < 0);
2686 2687
}

2688
static int apply_binary_fragment(struct image *img, struct patch *patch)
J
Junio C Hamano 已提交
2689 2690
{
	struct fragment *fragment = patch->fragments;
2691 2692
	unsigned long len;
	void *dst;
J
Junio C Hamano 已提交
2693

2694 2695 2696 2697 2698 2699
	if (!fragment)
		return error("missing binary patch data for '%s'",
			     patch->new_name ?
			     patch->new_name :
			     patch->old_name);

2700 2701 2702 2703 2704 2705 2706
	/* Binary patch is irreversible without the optional second hunk */
	if (apply_in_reverse) {
		if (!fragment->next)
			return error("cannot reverse-apply a binary patch "
				     "without the reverse hunk to '%s'",
				     patch->new_name
				     ? patch->new_name : patch->old_name);
2707
		fragment = fragment->next;
2708 2709
	}
	switch (fragment->binary_patch_method) {
J
Junio C Hamano 已提交
2710
	case BINARY_DELTA_DEFLATED:
2711
		dst = patch_delta(img->buf, img->len, fragment->patch,
2712 2713 2714
				  fragment->size, &len);
		if (!dst)
			return -1;
2715 2716 2717
		clear_image(img);
		img->buf = dst;
		img->len = len;
2718
		return 0;
J
Junio C Hamano 已提交
2719
	case BINARY_LITERAL_DEFLATED:
2720 2721 2722 2723 2724
		clear_image(img);
		img->len = fragment->size;
		img->buf = xmalloc(img->len+1);
		memcpy(img->buf, fragment->patch, img->len);
		img->buf[img->len] = '\0';
2725
		return 0;
J
Junio C Hamano 已提交
2726
	}
2727
	return -1;
J
Junio C Hamano 已提交
2728 2729
}

2730
static int apply_binary(struct image *img, struct patch *patch)
2731
{
J
Junio C Hamano 已提交
2732
	const char *name = patch->old_name ? patch->old_name : patch->new_name;
J
Junio C Hamano 已提交
2733
	unsigned char sha1[20];
J
Junio C Hamano 已提交
2734

2735 2736
	/*
	 * For safety, we require patch index line to contain
J
Junio C Hamano 已提交
2737 2738 2739 2740 2741 2742 2743 2744
	 * full 40-byte textual SHA1 for old and new, at least for now.
	 */
	if (strlen(patch->old_sha1_prefix) != 40 ||
	    strlen(patch->new_sha1_prefix) != 40 ||
	    get_sha1_hex(patch->old_sha1_prefix, sha1) ||
	    get_sha1_hex(patch->new_sha1_prefix, sha1))
		return error("cannot apply binary patch to '%s' "
			     "without full index line", name);
J
Junio C Hamano 已提交
2745

J
Junio C Hamano 已提交
2746
	if (patch->old_name) {
2747 2748
		/*
		 * See if the old one matches what the patch
J
Junio C Hamano 已提交
2749
		 * applies to.
J
Junio C Hamano 已提交
2750
		 */
2751
		hash_sha1_file(img->buf, img->len, blob_type, sha1);
J
Junio C Hamano 已提交
2752 2753 2754 2755 2756 2757 2758 2759
		if (strcmp(sha1_to_hex(sha1), patch->old_sha1_prefix))
			return error("the patch applies to '%s' (%s), "
				     "which does not match the "
				     "current contents.",
				     name, sha1_to_hex(sha1));
	}
	else {
		/* Otherwise, the old one must be empty. */
2760
		if (img->len)
J
Junio C Hamano 已提交
2761 2762 2763
			return error("the patch applies to an empty "
				     "'%s' but it is not empty", name);
	}
J
Junio C Hamano 已提交
2764

J
Junio C Hamano 已提交
2765
	get_sha1_hex(patch->new_sha1_prefix, sha1);
D
David Rientjes 已提交
2766
	if (is_null_sha1(sha1)) {
2767
		clear_image(img);
J
Junio C Hamano 已提交
2768
		return 0; /* deletion patch */
J
Junio C Hamano 已提交
2769
	}
J
Junio C Hamano 已提交
2770

J
Junio C Hamano 已提交
2771
	if (has_sha1_file(sha1)) {
J
Junio C Hamano 已提交
2772
		/* We already have the postimage */
2773
		enum object_type type;
J
Junio C Hamano 已提交
2774
		unsigned long size;
2775
		char *result;
J
Junio C Hamano 已提交
2776

2777 2778
		result = read_sha1_file(sha1, &type, &size);
		if (!result)
J
Junio C Hamano 已提交
2779 2780 2781
			return error("the necessary postimage %s for "
				     "'%s' cannot be read",
				     patch->new_sha1_prefix, name);
2782 2783 2784
		clear_image(img);
		img->buf = result;
		img->len = size;
2785
	} else {
2786 2787
		/*
		 * We have verified buf matches the preimage;
J
Junio C Hamano 已提交
2788 2789
		 * apply the patch data to it, which is stored
		 * in the patch->fragments->{patch,size}.
J
Junio C Hamano 已提交
2790
		 */
2791
		if (apply_binary_fragment(img, patch))
J
Junio C Hamano 已提交
2792 2793
			return error("binary patch does not apply to '%s'",
				     name);
J
Junio C Hamano 已提交
2794

J
Junio C Hamano 已提交
2795
		/* verify that the result matches */
2796
		hash_sha1_file(img->buf, img->len, blob_type, sha1);
J
Junio C Hamano 已提交
2797
		if (strcmp(sha1_to_hex(sha1), patch->new_sha1_prefix))
2798 2799
			return error("binary patch to '%s' creates incorrect result (expecting %s, got %s)",
				name, patch->new_sha1_prefix, sha1_to_hex(sha1));
J
Junio C Hamano 已提交
2800
	}
2801

J
Junio C Hamano 已提交
2802 2803 2804
	return 0;
}

2805
static int apply_fragments(struct image *img, struct patch *patch)
J
Junio C Hamano 已提交
2806 2807 2808
{
	struct fragment *frag = patch->fragments;
	const char *name = patch->old_name ? patch->old_name : patch->new_name;
2809 2810
	unsigned ws_rule = patch->ws_rule;
	unsigned inaccurate_eof = patch->inaccurate_eof;
2811
	int nth = 0;
J
Junio C Hamano 已提交
2812 2813

	if (patch->is_binary)
2814
		return apply_binary(img, patch);
J
Junio C Hamano 已提交
2815

2816
	while (frag) {
2817 2818
		nth++;
		if (apply_one_fragment(img, frag, inaccurate_eof, ws_rule, nth)) {
J
Junio C Hamano 已提交
2819 2820 2821 2822 2823
			error("patch failed: %s:%ld", name, frag->oldpos);
			if (!apply_with_reject)
				return -1;
			frag->rejected = 1;
		}
2824 2825
		frag = frag->next;
	}
2826
	return 0;
2827 2828
}

2829
static int read_file_or_gitlink(struct cache_entry *ce, struct strbuf *buf)
2830 2831 2832 2833
{
	if (!ce)
		return 0;

2834
	if (S_ISGITLINK(ce->ce_mode)) {
2835 2836
		strbuf_grow(buf, 100);
		strbuf_addf(buf, "Subproject commit %s\n", sha1_to_hex(ce->sha1));
2837 2838
	} else {
		enum object_type type;
2839 2840 2841 2842 2843
		unsigned long sz;
		char *result;

		result = read_sha1_file(ce->sha1, &type, &sz);
		if (!result)
2844
			return -1;
2845 2846
		/* XXX read_sha1_file NUL-terminates */
		strbuf_attach(buf, result, sz, sz + 1);
2847 2848 2849 2850
	}
	return 0;
}

2851 2852
static struct patch *in_fn_table(const char *name)
{
2853
	struct string_list_item *item;
2854 2855 2856 2857

	if (name == NULL)
		return NULL;

2858
	item = string_list_lookup(&fn_table, name);
2859 2860 2861 2862 2863 2864
	if (item != NULL)
		return (struct patch *)item->util;

	return NULL;
}

2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883
/*
 * item->util in the filename table records the status of the path.
 * Usually it points at a patch (whose result records the contents
 * of it after applying it), but it could be PATH_WAS_DELETED for a
 * path that a previously applied patch has already removed.
 */
 #define PATH_TO_BE_DELETED ((struct patch *) -2)
#define PATH_WAS_DELETED ((struct patch *) -1)

static int to_be_deleted(struct patch *patch)
{
	return patch == PATH_TO_BE_DELETED;
}

static int was_deleted(struct patch *patch)
{
	return patch == PATH_WAS_DELETED;
}

2884 2885
static void add_to_fn_table(struct patch *patch)
{
2886
	struct string_list_item *item;
2887 2888 2889 2890 2891 2892 2893

	/*
	 * Always add new_name unless patch is a deletion
	 * This should cover the cases for normal diffs,
	 * file creations and copies
	 */
	if (patch->new_name != NULL) {
2894
		item = string_list_insert(&fn_table, patch->new_name);
2895 2896 2897 2898 2899 2900 2901 2902
		item->util = patch;
	}

	/*
	 * store a failure on rename/deletion cases because
	 * later chunks shouldn't patch old names
	 */
	if ((patch->new_name == NULL) || (patch->is_rename)) {
2903
		item = string_list_insert(&fn_table, patch->old_name);
2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915
		item->util = PATH_WAS_DELETED;
	}
}

static void prepare_fn_table(struct patch *patch)
{
	/*
	 * store information about incoming file deletion
	 */
	while (patch) {
		if ((patch->new_name == NULL) || (patch->is_rename)) {
			struct string_list_item *item;
2916
			item = string_list_insert(&fn_table, patch->old_name);
2917 2918 2919
			item->util = PATH_TO_BE_DELETED;
		}
		patch = patch->next;
2920 2921 2922
	}
}

2923
static int apply_data(struct patch *patch, struct stat *st, struct cache_entry *ce)
2924
{
2925
	struct strbuf buf = STRBUF_INIT;
2926 2927 2928
	struct image image;
	size_t len;
	char *img;
2929
	struct patch *tpatch;
2930

J
Junio C Hamano 已提交
2931
	if (!(patch->is_copy || patch->is_rename) &&
2932 2933
	    (tpatch = in_fn_table(patch->old_name)) != NULL && !to_be_deleted(tpatch)) {
		if (was_deleted(tpatch)) {
2934 2935 2936 2937 2938 2939
			return error("patch %s has been renamed/deleted",
				patch->old_name);
		}
		/* We have a patched copy in memory use that */
		strbuf_add(&buf, tpatch->result, tpatch->resultsize);
	} else if (cached) {
2940
		if (read_file_or_gitlink(ce, &buf))
2941 2942 2943
			return error("read of %s failed", patch->old_name);
	} else if (patch->old_name) {
		if (S_ISGITLINK(patch->old_mode)) {
2944 2945 2946
			if (ce) {
				read_file_or_gitlink(ce, &buf);
			} else {
2947 2948 2949 2950 2951 2952
				/*
				 * There is no way to apply subproject
				 * patch without looking at the index.
				 */
				patch->fragments = NULL;
			}
2953 2954 2955
		} else {
			if (read_old_data(st, patch->old_name, &buf))
				return error("read of %s failed", patch->old_name);
2956 2957
		}
	}
2958

2959 2960 2961 2962
	img = strbuf_detach(&buf, &len);
	prepare_image(&image, img, len, !patch->is_binary);

	if (apply_fragments(&image, patch) < 0)
J
Junio C Hamano 已提交
2963
		return -1; /* note with --reject this succeeds. */
2964 2965
	patch->result = image.buf;
	patch->resultsize = image.len;
2966
	add_to_fn_table(patch);
2967
	free(image.line_allocated);
2968

2969
	if (0 < patch->is_delete && patch->resultsize)
2970 2971
		return error("removal patch leaves file contents");

2972 2973 2974
	return 0;
}

2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987
static int check_to_create_blob(const char *new_name, int ok_if_exists)
{
	struct stat nst;
	if (!lstat(new_name, &nst)) {
		if (S_ISDIR(nst.st_mode) || ok_if_exists)
			return 0;
		/*
		 * A leading component of new_name might be a symlink
		 * that is going to be removed with this patch, but
		 * still pointing at somewhere that has the path.
		 * In such a case, path "new_name" does not exist as
		 * far as git is concerned.
		 */
2988
		if (has_symlink_leading_path(new_name, strlen(new_name)))
2989 2990 2991 2992 2993 2994 2995 2996 2997
			return 0;

		return error("%s: already exists in working directory", new_name);
	}
	else if ((errno != ENOENT) && (errno != ENOTDIR))
		return error("%s: %s", new_name, strerror(errno));
	return 0;
}

2998 2999
static int verify_index_match(struct cache_entry *ce, struct stat *st)
{
3000
	if (S_ISGITLINK(ce->ce_mode)) {
3001 3002 3003 3004
		if (!S_ISDIR(st->st_mode))
			return -1;
		return 0;
	}
3005
	return ce_match_stat(ce, st, CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE);
3006 3007
}

3008
static int check_preimage(struct patch *patch, struct cache_entry **ce, struct stat *st)
3009 3010
{
	const char *old_name = patch->old_name;
J
Junio C Hamano 已提交
3011
	struct patch *tpatch = NULL;
3012 3013
	int stat_ret = 0;
	unsigned st_mode = 0;
3014 3015 3016 3017 3018 3019 3020

	/*
	 * Make sure that we do not have local modifications from the
	 * index when we are looking at the index.  Also make sure
	 * we have the preimage file to be patched in the work tree,
	 * unless --cached, which tells git to apply only in the index.
	 */
3021 3022
	if (!old_name)
		return 0;
3023

3024
	assert(patch->is_new <= 0);
J
Junio C Hamano 已提交
3025 3026

	if (!(patch->is_copy || patch->is_rename) &&
3027 3028
	    (tpatch = in_fn_table(old_name)) != NULL && !to_be_deleted(tpatch)) {
		if (was_deleted(tpatch))
3029 3030 3031
			return error("%s: has been deleted/renamed", old_name);
		st_mode = tpatch->new_mode;
	} else if (!cached) {
3032 3033 3034 3035
		stat_ret = lstat(old_name, st);
		if (stat_ret && errno != ENOENT)
			return error("%s: %s", old_name, strerror(errno));
	}
J
Junio C Hamano 已提交
3036

3037 3038 3039
	if (to_be_deleted(tpatch))
		tpatch = NULL;

3040
	if (check_index && !tpatch) {
3041 3042 3043 3044 3045 3046 3047 3048 3049 3050
		int pos = cache_name_pos(old_name, strlen(old_name));
		if (pos < 0) {
			if (patch->is_new < 0)
				goto is_new;
			return error("%s: does not exist in index", old_name);
		}
		*ce = active_cache[pos];
		if (stat_ret < 0) {
			struct checkout costate;
			/* checkout */
3051
			memset(&costate, 0, sizeof(costate));
3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062
			costate.base_dir = "";
			costate.refresh_cache = 1;
			if (checkout_entry(*ce, &costate, NULL) ||
			    lstat(old_name, st))
				return -1;
		}
		if (!cached && verify_index_match(*ce, st))
			return error("%s: does not match index", old_name);
		if (cached)
			st_mode = (*ce)->ce_mode;
	} else if (stat_ret < 0) {
3063
		if (patch->is_new < 0)
3064 3065
			goto is_new;
		return error("%s: %s", old_name, strerror(errno));
3066
	}
3067

3068
	if (!cached && !tpatch)
3069 3070 3071 3072 3073 3074 3075 3076 3077
		st_mode = ce_mode_from_stat(*ce, st->st_mode);

	if (patch->is_new < 0)
		patch->is_new = 0;
	if (!patch->old_mode)
		patch->old_mode = st_mode;
	if ((st_mode ^ patch->old_mode) & S_IFMT)
		return error("%s: wrong type", old_name);
	if (st_mode != patch->old_mode)
3078
		warning("%s has type %o, expected %o",
3079
			old_name, st_mode, patch->old_mode);
3080
	if (!patch->new_mode && !patch->is_delete)
3081
		patch->new_mode = st_mode;
3082 3083 3084 3085 3086 3087 3088 3089 3090
	return 0;

 is_new:
	patch->is_new = 1;
	patch->is_delete = 0;
	patch->old_name = NULL;
	return 0;
}

3091
static int check_patch(struct patch *patch)
3092 3093 3094 3095 3096 3097
{
	struct stat st;
	const char *old_name = patch->old_name;
	const char *new_name = patch->new_name;
	const char *name = old_name ? old_name : new_name;
	struct cache_entry *ce = NULL;
3098
	struct patch *tpatch;
3099 3100 3101 3102 3103 3104 3105 3106 3107 3108
	int ok_if_exists;
	int status;

	patch->rejected = 1; /* we will drop this after we succeed */

	status = check_preimage(patch, &ce, &st);
	if (status)
		return status;
	old_name = patch->old_name;

3109 3110
	if ((tpatch = in_fn_table(new_name)) &&
			(was_deleted(tpatch) || to_be_deleted(tpatch)))
3111 3112
		/*
		 * A type-change diff is always split into a patch to
3113 3114 3115 3116 3117 3118 3119 3120 3121 3122
		 * delete old, immediately followed by a patch to
		 * create new (see diff.c::run_diff()); in such a case
		 * it is Ok that the entry to be deleted by the
		 * previous patch is still in the working tree and in
		 * the index.
		 */
		ok_if_exists = 1;
	else
		ok_if_exists = 0;

3123 3124
	if (new_name &&
	    ((0 < patch->is_new) | (0 < patch->is_rename) | patch->is_copy)) {
3125 3126 3127
		if (check_index &&
		    cache_name_pos(new_name, strlen(new_name)) >= 0 &&
		    !ok_if_exists)
3128
			return error("%s: already exists in index", new_name);
3129
		if (!cached) {
3130 3131 3132
			int err = check_to_create_blob(new_name, ok_if_exists);
			if (err)
				return err;
3133
		}
3134
		if (!patch->new_mode) {
3135
			if (0 < patch->is_new)
3136 3137 3138 3139
				patch->new_mode = S_IFREG | 0644;
			else
				patch->new_mode = patch->old_mode;
		}
3140
	}
3141 3142 3143 3144 3145 3146 3147 3148 3149

	if (new_name && old_name) {
		int same = !strcmp(old_name, new_name);
		if (!patch->new_mode)
			patch->new_mode = patch->old_mode;
		if ((patch->old_mode ^ patch->new_mode) & S_IFMT)
			return error("new mode (%o) of %s does not match old mode (%o)%s%s",
				patch->new_mode, new_name, patch->old_mode,
				same ? "" : " of ", same ? "" : old_name);
3150
	}
3151

3152
	if (apply_data(patch, &st, ce) < 0)
J
Junio C Hamano 已提交
3153
		return error("%s: patch does not apply", name);
J
Junio C Hamano 已提交
3154
	patch->rejected = 0;
3155
	return 0;
3156 3157
}

3158
static int check_patch_list(struct patch *patch)
3159
{
3160
	int err = 0;
3161

3162
	prepare_fn_table(patch);
3163
	while (patch) {
J
Junio C Hamano 已提交
3164 3165 3166
		if (apply_verbosely)
			say_patch_name(stderr,
				       "Checking patch ", patch, "...\n");
3167 3168
		err |= check_patch(patch);
		patch = patch->next;
3169
	}
3170
	return err;
3171 3172
}

3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186
/* This function tries to read the sha1 from the current index */
static int get_current_sha1(const char *path, unsigned char *sha1)
{
	int pos;

	if (read_cache() < 0)
		return -1;
	pos = cache_name_pos(path, strlen(path));
	if (pos < 0)
		return -1;
	hashcpy(sha1, active_cache[pos]->sha1);
	return 0;
}

3187 3188
/* Build an index that contains the just the files needed for a 3way merge */
static void build_fake_ancestor(struct patch *list, const char *filename)
3189 3190
{
	struct patch *patch;
3191
	struct index_state result = { NULL };
3192
	int fd;
3193 3194 3195 3196 3197 3198 3199

	/* Once we start supporting the reverse patch, it may be
	 * worth showing the new sha1 prefix, but until then...
	 */
	for (patch = list; patch; patch = patch->next) {
		const unsigned char *sha1_ptr;
		unsigned char sha1[20];
3200
		struct cache_entry *ce;
3201 3202 3203
		const char *name;

		name = patch->old_name ? patch->old_name : patch->new_name;
3204
		if (0 < patch->is_new)
3205
			continue;
3206
		else if (get_sha1(patch->old_sha1_prefix, sha1))
3207 3208
			/* git diff has no index line for mode/type changes */
			if (!patch->lines_added && !patch->lines_deleted) {
3209
				if (get_current_sha1(patch->old_name, sha1))
3210 3211 3212 3213 3214 3215
					die("mode change for %s, which is not "
						"in current HEAD", name);
				sha1_ptr = sha1;
			} else
				die("sha1 information is lacking or useless "
					"(%s).", name);
3216 3217
		else
			sha1_ptr = sha1;
3218

3219
		ce = make_cache_entry(patch->old_mode, sha1_ptr, name, 0, 0);
3220 3221
		if (!ce)
			die("make_cache_entry failed for path '%s'", name);
3222 3223
		if (add_index_entry(&result, ce, ADD_CACHE_OK_TO_ADD))
			die ("Could not add %s to temporary index", name);
3224
	}
3225 3226 3227 3228 3229 3230

	fd = open(filename, O_WRONLY | O_CREAT, 0666);
	if (fd < 0 || write_index(&result, fd) || close(fd))
		die ("Could not write temporary index to %s", filename);

	discard_index(&result);
3231 3232
}

3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244
static void stat_patch_list(struct patch *patch)
{
	int files, adds, dels;

	for (files = adds = dels = 0 ; patch ; patch = patch->next) {
		files++;
		adds += patch->lines_added;
		dels += patch->lines_deleted;
		show_stats(patch);
	}

	printf(" %d files changed, %d insertions(+), %d deletions(-)\n", files, adds, dels);
3245 3246
}

J
Junio C Hamano 已提交
3247 3248 3249 3250
static void numstat_patch_list(struct patch *patch)
{
	for ( ; patch; patch = patch->next) {
		const char *name;
3251
		name = patch->new_name ? patch->new_name : patch->old_name;
3252 3253 3254
		if (patch->is_binary)
			printf("-\t-\t");
		else
3255 3256
			printf("%d\t%d\t", patch->lines_added, patch->lines_deleted);
		write_name_quoted(name, stdout, line_termination);
J
Junio C Hamano 已提交
3257 3258 3259
	}
}

3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304
static void show_file_mode_name(const char *newdelete, unsigned int mode, const char *name)
{
	if (mode)
		printf(" %s mode %06o %s\n", newdelete, mode, name);
	else
		printf(" %s %s\n", newdelete, name);
}

static void show_mode_change(struct patch *p, int show_name)
{
	if (p->old_mode && p->new_mode && p->old_mode != p->new_mode) {
		if (show_name)
			printf(" mode change %06o => %06o %s\n",
			       p->old_mode, p->new_mode, p->new_name);
		else
			printf(" mode change %06o => %06o\n",
			       p->old_mode, p->new_mode);
	}
}

static void show_rename_copy(struct patch *p)
{
	const char *renamecopy = p->is_rename ? "rename" : "copy";
	const char *old, *new;

	/* Find common prefix */
	old = p->old_name;
	new = p->new_name;
	while (1) {
		const char *slash_old, *slash_new;
		slash_old = strchr(old, '/');
		slash_new = strchr(new, '/');
		if (!slash_old ||
		    !slash_new ||
		    slash_old - old != slash_new - new ||
		    memcmp(old, new, slash_new - new))
			break;
		old = slash_old + 1;
		new = slash_new + 1;
	}
	/* p->old_name thru old is the common prefix, and old and new
	 * through the end of names are renames
	 */
	if (old != p->old_name)
		printf(" %s %.*s{%s => %s} (%d%%)\n", renamecopy,
3305
		       (int)(old - p->old_name), p->old_name,
3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337
		       old, new, p->score);
	else
		printf(" %s %s => %s (%d%%)\n", renamecopy,
		       p->old_name, p->new_name, p->score);
	show_mode_change(p, 0);
}

static void summary_patch_list(struct patch *patch)
{
	struct patch *p;

	for (p = patch; p; p = p->next) {
		if (p->is_new)
			show_file_mode_name("create", p->new_mode, p->new_name);
		else if (p->is_delete)
			show_file_mode_name("delete", p->old_mode, p->old_name);
		else {
			if (p->is_rename || p->is_copy)
				show_rename_copy(p);
			else {
				if (p->score) {
					printf(" rewrite %s (%d%%)\n",
					       p->new_name, p->score);
					show_mode_change(p, 0);
				}
				else
					show_mode_change(p, 1);
			}
		}
	}
}

3338 3339 3340 3341 3342 3343 3344
static void patch_stats(struct patch *patch)
{
	int lines = patch->lines_added + patch->lines_deleted;

	if (lines > max_change)
		max_change = lines;
	if (patch->old_name) {
3345 3346 3347
		int len = quote_c_style(patch->old_name, NULL, NULL, 0);
		if (!len)
			len = strlen(patch->old_name);
3348 3349 3350 3351
		if (len > max_len)
			max_len = len;
	}
	if (patch->new_name) {
3352 3353 3354
		int len = quote_c_style(patch->new_name, NULL, NULL, 0);
		if (!len)
			len = strlen(patch->new_name);
3355 3356 3357
		if (len > max_len)
			max_len = len;
	}
3358 3359
}

3360
static void remove_file(struct patch *patch, int rmdir_empty)
3361
{
3362
	if (update_index) {
3363 3364 3365
		if (remove_file_from_cache(patch->old_name) < 0)
			die("unable to remove %s from index", patch->old_name);
	}
3366
	if (!cached) {
3367
		if (!remove_or_warn(patch->old_mode, patch->old_name) && rmdir_empty) {
3368
			remove_path(patch->old_name);
3369 3370
		}
	}
3371 3372 3373 3374 3375 3376 3377 3378 3379
}

static void add_index_file(const char *path, unsigned mode, void *buf, unsigned long size)
{
	struct stat st;
	struct cache_entry *ce;
	int namelen = strlen(path);
	unsigned ce_size = cache_entry_size(namelen);

3380
	if (!update_index)
3381 3382
		return;

3383
	ce = xcalloc(1, ce_size);
3384 3385
	memcpy(ce->name, path, namelen);
	ce->ce_mode = create_ce_mode(mode);
3386
	ce->ce_flags = namelen;
3387 3388 3389 3390 3391 3392 3393 3394
	if (S_ISGITLINK(mode)) {
		const char *s = buf;

		if (get_sha1_hex(s + strlen("Subproject commit "), ce->sha1))
			die("corrupt patch for subproject %s", path);
	} else {
		if (!cached) {
			if (lstat(path, &st) < 0)
3395 3396
				die_errno("unable to stat newly created file '%s'",
					  path);
3397 3398 3399 3400
			fill_stat_cache_info(ce, &st);
		}
		if (write_sha1_file(buf, size, blob_type, ce->sha1) < 0)
			die("unable to create backing store for newly created file %s", path);
3401
	}
3402 3403 3404 3405
	if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD) < 0)
		die("unable to add cache entry for %s", path);
}

3406 3407
static int try_create_file(const char *path, unsigned int mode, const char *buf, unsigned long size)
{
3408
	int fd;
3409
	struct strbuf nbuf = STRBUF_INIT;
3410

3411 3412 3413 3414 3415 3416 3417
	if (S_ISGITLINK(mode)) {
		struct stat st;
		if (!lstat(path, &st) && S_ISDIR(st.st_mode))
			return 0;
		return mkdir(path, 0777);
	}

3418
	if (has_symlinks && S_ISLNK(mode))
3419 3420 3421
		/* Although buf:size is counted string, it also is NUL
		 * terminated.
		 */
3422
		return symlink(buf, path);
3423 3424 3425 3426 3427

	fd = open(path, O_CREAT | O_EXCL | O_WRONLY, (mode & 0100) ? 0777 : 0666);
	if (fd < 0)
		return -1;

3428 3429 3430
	if (convert_to_working_tree(path, buf, size, &nbuf)) {
		size = nbuf.len;
		buf  = nbuf.buf;
3431
	}
3432 3433
	write_or_die(fd, buf, size);
	strbuf_release(&nbuf);
3434

3435
	if (close(fd) < 0)
3436
		die_errno("closing file '%s'", path);
3437 3438 3439
	return 0;
}

3440 3441 3442 3443 3444
/*
 * We optimistically assume that the directories exist,
 * which is true 99% of the time anyway. If they don't,
 * we create them and try again.
 */
3445
static void create_one_file(char *path, unsigned mode, const char *buf, unsigned long size)
3446
{
3447 3448
	if (cached)
		return;
3449 3450
	if (!try_create_file(path, mode, buf, size))
		return;
3451

3452
	if (errno == ENOENT) {
3453 3454
		if (safe_create_leading_directories(path))
			return;
3455 3456
		if (!try_create_file(path, mode, buf, size))
			return;
3457 3458
	}

J
Johannes Schindelin 已提交
3459
	if (errno == EEXIST || errno == EACCES) {
3460 3461 3462 3463
		/* We may be trying to create a file where a directory
		 * used to be.
		 */
		struct stat st;
3464
		if (!lstat(path, &st) && (!S_ISDIR(st.st_mode) || !rmdir(path)))
3465 3466 3467
			errno = EEXIST;
	}

3468 3469
	if (errno == EEXIST) {
		unsigned int nr = getpid();
3470

3471
		for (;;) {
3472 3473
			char newpath[PATH_MAX];
			mksnpath(newpath, sizeof(newpath), "%s~%u", path, nr);
3474 3475 3476
			if (!try_create_file(newpath, mode, buf, size)) {
				if (!rename(newpath, path))
					return;
3477
				unlink_or_warn(newpath);
3478 3479 3480 3481
				break;
			}
			if (errno != EEXIST)
				break;
3482 3483
			++nr;
		}
3484
	}
3485
	die_errno("unable to write file '%s' mode %o", path, mode);
3486 3487
}

3488 3489
static void create_file(struct patch *patch)
{
3490
	char *path = patch->new_name;
3491 3492 3493 3494 3495 3496
	unsigned mode = patch->new_mode;
	unsigned long size = patch->resultsize;
	char *buf = patch->result;

	if (!mode)
		mode = S_IFREG | 0644;
3497
	create_one_file(path, mode, buf, size);
3498
	add_index_file(path, mode, buf, size);
3499 3500
}

3501 3502
/* phase zero is to remove, phase one is to create */
static void write_out_one_result(struct patch *patch, int phase)
3503 3504
{
	if (patch->is_delete > 0) {
3505
		if (phase == 0)
3506
			remove_file(patch, 1);
3507 3508 3509
		return;
	}
	if (patch->is_new > 0 || patch->is_copy) {
3510 3511
		if (phase == 1)
			create_file(patch);
3512 3513 3514 3515 3516 3517
		return;
	}
	/*
	 * Rename or modification boils down to the same
	 * thing: remove the old, write the new
	 */
3518
	if (phase == 0)
3519
		remove_file(patch, patch->is_rename);
3520
	if (phase == 1)
J
Junio C Hamano 已提交
3521
		create_file(patch);
3522 3523
}

J
Junio C Hamano 已提交
3524 3525
static int write_out_one_reject(struct patch *patch)
{
3526 3527
	FILE *rej;
	char namebuf[PATH_MAX];
J
Junio C Hamano 已提交
3528
	struct fragment *frag;
3529
	int cnt = 0;
J
Junio C Hamano 已提交
3530

3531
	for (cnt = 0, frag = patch->fragments; frag; frag = frag->next) {
J
Junio C Hamano 已提交
3532 3533
		if (!frag->rejected)
			continue;
3534 3535 3536
		cnt++;
	}

J
Junio C Hamano 已提交
3537 3538 3539 3540
	if (!cnt) {
		if (apply_verbosely)
			say_patch_name(stderr,
				       "Applied patch ", patch, " cleanly.\n");
3541
		return 0;
J
Junio C Hamano 已提交
3542
	}
3543 3544 3545 3546 3547 3548 3549

	/* This should not happen, because a removal patch that leaves
	 * contents are marked "rejected" at the patch level.
	 */
	if (!patch->new_name)
		die("internal error");

J
Junio C Hamano 已提交
3550 3551 3552 3553
	/* Say this even without --verbose */
	say_patch_name(stderr, "Applying patch ", patch, " with");
	fprintf(stderr, " %d rejects...\n", cnt);

3554 3555 3556
	cnt = strlen(patch->new_name);
	if (ARRAY_SIZE(namebuf) <= cnt + 5) {
		cnt = ARRAY_SIZE(namebuf) - 5;
3557
		warning("truncating .rej filename to %.*s.rej",
3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573
			cnt - 1, patch->new_name);
	}
	memcpy(namebuf, patch->new_name, cnt);
	memcpy(namebuf + cnt, ".rej", 5);

	rej = fopen(namebuf, "w");
	if (!rej)
		return error("cannot open %s: %s", namebuf, strerror(errno));

	/* Normal git tools never deal with .rej, so do not pretend
	 * this is a git patch by saying --git nor give extended
	 * headers.  While at it, maybe please "kompare" that wants
	 * the trailing TAB and some garbage at the end of line ;-).
	 */
	fprintf(rej, "diff a/%s b/%s\t(rejected hunks)\n",
		patch->new_name, patch->new_name);
3574
	for (cnt = 1, frag = patch->fragments;
3575 3576 3577 3578 3579
	     frag;
	     cnt++, frag = frag->next) {
		if (!frag->rejected) {
			fprintf(stderr, "Hunk #%d applied cleanly.\n", cnt);
			continue;
J
Junio C Hamano 已提交
3580
		}
3581 3582
		fprintf(stderr, "Rejected hunk #%d.\n", cnt);
		fprintf(rej, "%.*s", frag->size, frag->patch);
J
Junio C Hamano 已提交
3583
		if (frag->patch[frag->size-1] != '\n')
3584
			fputc('\n', rej);
J
Junio C Hamano 已提交
3585
	}
3586 3587
	fclose(rej);
	return -1;
3588 3589
}

3590
static int write_out_results(struct patch *list)
3591
{
3592
	int phase;
J
Junio C Hamano 已提交
3593 3594
	int errs = 0;
	struct patch *l;
3595 3596

	for (phase = 0; phase < 2; phase++) {
J
Junio C Hamano 已提交
3597
		l = list;
3598
		while (l) {
J
Junio C Hamano 已提交
3599 3600
			if (l->rejected)
				errs = 1;
3601
			else {
J
Junio C Hamano 已提交
3602
				write_out_one_result(l, phase);
3603
				if (phase == 1 && write_out_one_reject(l))
J
Junio C Hamano 已提交
3604 3605
					errs = 1;
			}
3606 3607
			l = l->next;
		}
3608
	}
J
Junio C Hamano 已提交
3609
	return errs;
3610 3611
}

3612
static struct lock_file lock_file;
3613

J
Junio C Hamano 已提交
3614 3615 3616 3617 3618 3619
static struct string_list limit_by_name;
static int has_include;
static void add_name_limit(const char *name, int exclude)
{
	struct string_list_item *it;

3620
	it = string_list_append(&limit_by_name, name);
J
Junio C Hamano 已提交
3621 3622
	it->util = exclude ? NULL : (void *) 1;
}
3623 3624 3625

static int use_patch(struct patch *p)
{
J
Jason Riedy 已提交
3626
	const char *pathname = p->new_name ? p->new_name : p->old_name;
J
Junio C Hamano 已提交
3627 3628 3629
	int i;

	/* Paths outside are not touched regardless of "--include" */
3630 3631 3632 3633 3634 3635
	if (0 < prefix_length) {
		int pathlen = strlen(pathname);
		if (pathlen <= prefix_length ||
		    memcmp(prefix, pathname, prefix_length))
			return 0;
	}
J
Junio C Hamano 已提交
3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649

	/* See if it matches any of exclude/include rule */
	for (i = 0; i < limit_by_name.nr; i++) {
		struct string_list_item *it = &limit_by_name.items[i];
		if (!fnmatch(it->string, pathname, 0))
			return (it->util != NULL);
	}

	/*
	 * If we had any include, a path that does not match any rule is
	 * not used.  Otherwise, we saw bunch of exclude rules (or none)
	 * and such a path is used.
	 */
	return !has_include;
3650 3651
}

J
Junio C Hamano 已提交
3652

3653
static void prefix_one(char **name)
3654
{
3655 3656 3657 3658 3659
	char *old_name = *name;
	if (!old_name)
		return;
	*name = xstrdup(prefix_filename(prefix, prefix_length, *name));
	free(old_name);
3660 3661 3662 3663
}

static void prefix_patches(struct patch *p)
{
3664
	if (!prefix || p->is_toplevel_relative)
3665 3666
		return;
	for ( ; p; p = p->next) {
J
Junio C Hamano 已提交
3667 3668 3669 3670 3671 3672
		if (p->new_name == p->old_name) {
			char *prefixed = p->new_name;
			prefix_one(&prefixed);
			p->new_name = p->old_name = prefixed;
		}
		else {
3673
			prefix_one(&p->new_name);
J
Junio C Hamano 已提交
3674 3675
			prefix_one(&p->old_name);
		}
3676 3677 3678
	}
}

3679 3680 3681 3682
#define INACCURATE_EOF	(1<<0)
#define RECOUNT		(1<<1)

static int apply_patch(int fd, const char *filename, int options)
L
Linus Torvalds 已提交
3683
{
3684
	size_t offset;
3685
	struct strbuf buf = STRBUF_INIT;
3686
	struct patch *list = NULL, **listp = &list;
3687
	int skipped_patch = 0;
L
Linus Torvalds 已提交
3688

3689
	/* FIXME - memory leak when using multiple patch files as inputs */
3690
	memset(&fn_table, 0, sizeof(struct string_list));
3691
	patch_input_file = filename;
3692
	read_patch_file(&buf, fd);
L
Linus Torvalds 已提交
3693
	offset = 0;
3694
	while (offset < buf.len) {
3695 3696 3697
		struct patch *patch;
		int nr;

3698
		patch = xcalloc(1, sizeof(*patch));
3699 3700
		patch->inaccurate_eof = !!(options & INACCURATE_EOF);
		patch->recount =  !!(options & RECOUNT);
3701
		nr = parse_chunk(buf.buf + offset, buf.len - offset, patch);
L
Linus Torvalds 已提交
3702 3703
		if (nr < 0)
			break;
3704
		if (apply_in_reverse)
J
Johannes Schindelin 已提交
3705
			reverse_patches(patch);
3706 3707
		if (prefix)
			prefix_patches(patch);
3708 3709 3710 3711
		if (use_patch(patch)) {
			patch_stats(patch);
			*listp = patch;
			listp = &patch->next;
3712 3713
		}
		else {
3714 3715 3716 3717
			/* perhaps free it a bit better? */
			free(patch);
			skipped_patch++;
		}
L
Linus Torvalds 已提交
3718 3719
		offset += nr;
	}
3720

3721 3722 3723
	if (!list && !skipped_patch)
		die("unrecognized input");

3724
	if (whitespace_error && (ws_error_action == die_on_ws_error))
3725 3726
		apply = 0;

3727 3728
	update_index = check_index && apply;
	if (update_index && newfd < 0)
3729 3730
		newfd = hold_locked_index(&lock_file, 1);

3731 3732 3733 3734 3735
	if (check_index) {
		if (read_cache() < 0)
			die("unable to read index file");
	}

J
Junio C Hamano 已提交
3736 3737 3738
	if ((check || apply) &&
	    check_patch_list(list) < 0 &&
	    !apply_with_reject)
3739 3740
		exit(1);

3741
	if (apply && write_out_results(list))
J
Junio C Hamano 已提交
3742
		exit(1);
3743

3744 3745
	if (fake_ancestor)
		build_fake_ancestor(list, fake_ancestor);
3746

3747 3748
	if (diffstat)
		stat_patch_list(list);
3749

J
Junio C Hamano 已提交
3750 3751 3752
	if (numstat)
		numstat_patch_list(list);

3753 3754 3755
	if (summary)
		summary_patch_list(list);

3756
	strbuf_release(&buf);
L
Linus Torvalds 已提交
3757 3758 3759
	return 0;
}

3760
static int git_apply_config(const char *var, const char *value, void *cb)
3761
{
3762 3763
	if (!strcmp(var, "apply.whitespace"))
		return git_config_string(&apply_default_whitespace, var, value);
3764 3765
	else if (!strcmp(var, "apply.ignorewhitespace"))
		return git_config_string(&apply_default_ignorewhitespace, var, value);
3766
	return git_default_config(var, value, cb);
3767 3768
}

M
Miklos Vajna 已提交
3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801
static int option_parse_exclude(const struct option *opt,
				const char *arg, int unset)
{
	add_name_limit(arg, 1);
	return 0;
}

static int option_parse_include(const struct option *opt,
				const char *arg, int unset)
{
	add_name_limit(arg, 0);
	has_include = 1;
	return 0;
}

static int option_parse_p(const struct option *opt,
			  const char *arg, int unset)
{
	p_value = atoi(arg);
	p_value_known = 1;
	return 0;
}

static int option_parse_z(const struct option *opt,
			  const char *arg, int unset)
{
	if (unset)
		line_termination = '\n';
	else
		line_termination = 0;
	return 0;
}

3802 3803 3804 3805 3806 3807 3808 3809 3810 3811
static int option_parse_space_change(const struct option *opt,
			  const char *arg, int unset)
{
	if (unset)
		ws_ignore_action = ignore_ws_none;
	else
		ws_ignore_action = ignore_ws_change;
	return 0;
}

M
Miklos Vajna 已提交
3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834
static int option_parse_whitespace(const struct option *opt,
				   const char *arg, int unset)
{
	const char **whitespace_option = opt->value;

	*whitespace_option = arg;
	parse_whitespace_option(arg);
	return 0;
}

static int option_parse_directory(const struct option *opt,
				  const char *arg, int unset)
{
	root_len = strlen(arg);
	if (root_len && arg[root_len - 1] != '/') {
		char *new_root;
		root = new_root = xmalloc(root_len + 2);
		strcpy(new_root, arg);
		strcpy(new_root + root_len++, "/");
	} else
		root = arg;
	return 0;
}
3835

3836
int cmd_apply(int argc, const char **argv, const char *prefix_)
L
Linus Torvalds 已提交
3837 3838
{
	int i;
J
Junio C Hamano 已提交
3839
	int errs = 0;
3840
	int is_not_gitdir = !startup_info->have_repository;
M
Miklos Vajna 已提交
3841
	int force_apply = 0;
3842

3843
	const char *whitespace_option = NULL;
L
Linus Torvalds 已提交
3844

M
Miklos Vajna 已提交
3845 3846
	struct option builtin_apply_options[] = {
		{ OPTION_CALLBACK, 0, "exclude", NULL, "path",
3847
			"don't apply changes matching the given path",
M
Miklos Vajna 已提交
3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858
			0, option_parse_exclude },
		{ OPTION_CALLBACK, 0, "include", NULL, "path",
			"apply changes matching the given path",
			0, option_parse_include },
		{ OPTION_CALLBACK, 'p', NULL, NULL, "num",
			"remove <num> leading slashes from traditional diff paths",
			0, option_parse_p },
		OPT_BOOLEAN(0, "no-add", &no_add,
			"ignore additions made by the patch"),
		OPT_BOOLEAN(0, "stat", &diffstat,
			"instead of applying the patch, output diffstat for the input"),
R
René Scharfe 已提交
3859 3860
		OPT_NOOP_NOARG(0, "allow-binary-replacement"),
		OPT_NOOP_NOARG(0, "binary"),
M
Miklos Vajna 已提交
3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872
		OPT_BOOLEAN(0, "numstat", &numstat,
			"shows number of added and deleted lines in decimal notation"),
		OPT_BOOLEAN(0, "summary", &summary,
			"instead of applying the patch, output a summary for the input"),
		OPT_BOOLEAN(0, "check", &check,
			"instead of applying the patch, see if the patch is applicable"),
		OPT_BOOLEAN(0, "index", &check_index,
			"make sure the patch is applicable to the current index"),
		OPT_BOOLEAN(0, "cached", &cached,
			"apply a patch without touching the working tree"),
		OPT_BOOLEAN(0, "apply", &force_apply,
			"also apply the patch (use with --stat/--summary/--check)"),
3873
		OPT_FILENAME(0, "build-fake-ancestor", &fake_ancestor,
M
Miklos Vajna 已提交
3874 3875 3876 3877 3878 3879 3880 3881 3882
			"build a temporary index based on embedded index information"),
		{ OPTION_CALLBACK, 'z', NULL, NULL, NULL,
			"paths are separated with NUL character",
			PARSE_OPT_NOARG, option_parse_z },
		OPT_INTEGER('C', NULL, &p_context,
				"ensure at least <n> lines of context match"),
		{ OPTION_CALLBACK, 0, "whitespace", &whitespace_option, "action",
			"detect new or modified lines that have whitespace errors",
			0, option_parse_whitespace },
3883 3884 3885 3886 3887 3888
		{ OPTION_CALLBACK, 0, "ignore-space-change", NULL, NULL,
			"ignore changes in whitespace when finding context",
			PARSE_OPT_NOARG, option_parse_space_change },
		{ OPTION_CALLBACK, 0, "ignore-whitespace", NULL, NULL,
			"ignore changes in whitespace when finding context",
			PARSE_OPT_NOARG, option_parse_space_change },
M
Miklos Vajna 已提交
3889 3890 3891 3892 3893 3894
		OPT_BOOLEAN('R', "reverse", &apply_in_reverse,
			"apply the patch in reverse"),
		OPT_BOOLEAN(0, "unidiff-zero", &unidiff_zero,
			"don't expect at least one line of context"),
		OPT_BOOLEAN(0, "reject", &apply_with_reject,
			"leave the rejected hunks in corresponding *.rej files"),
3895 3896
		OPT_BOOLEAN(0, "allow-overlap", &allow_overlap,
			"allow overlapping hunks"),
3897
		OPT__VERBOSE(&apply_verbosely, "be verbose"),
M
Miklos Vajna 已提交
3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909
		OPT_BIT(0, "inaccurate-eof", &options,
			"tolerate incorrectly detected missing new-line at the end of file",
			INACCURATE_EOF),
		OPT_BIT(0, "recount", &options,
			"do not trust the line counts in the hunk headers",
			RECOUNT),
		{ OPTION_CALLBACK, 0, "directory", NULL, "root",
			"prepend <root> to all filenames",
			0, option_parse_directory },
		OPT_END()
	};

3910
	prefix = prefix_;
3911
	prefix_length = prefix ? strlen(prefix) : 0;
3912
	git_config(git_apply_config, NULL);
3913 3914
	if (apply_default_whitespace)
		parse_whitespace_option(apply_default_whitespace);
3915 3916
	if (apply_default_ignorewhitespace)
		parse_ignorewhitespace_option(apply_default_ignorewhitespace);
3917

3918
	argc = parse_options(argc, argv, prefix, builtin_apply_options,
M
Miklos Vajna 已提交
3919
			apply_usage, 0);
3920

M
Miklos Vajna 已提交
3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932
	if (apply_with_reject)
		apply = apply_verbosely = 1;
	if (!force_apply && (diffstat || numstat || summary || check || fake_ancestor))
		apply = 0;
	if (check_index && is_not_gitdir)
		die("--index outside a repository");
	if (cached) {
		if (is_not_gitdir)
			die("--cached outside a repository");
		check_index = 1;
	}
	for (i = 0; i < argc; i++) {
L
Linus Torvalds 已提交
3933 3934 3935 3936
		const char *arg = argv[i];
		int fd;

		if (!strcmp(arg, "-")) {
3937
			errs |= apply_patch(0, "<stdin>", options);
3938
			read_stdin = 0;
L
Linus Torvalds 已提交
3939
			continue;
3940
		} else if (0 < prefix_length)
3941 3942
			arg = prefix_filename(prefix, prefix_length, arg);

L
Linus Torvalds 已提交
3943 3944
		fd = open(arg, O_RDONLY);
		if (fd < 0)
3945
			die_errno("can't open patch '%s'", arg);
3946
		read_stdin = 0;
3947
		set_default_whitespace_mode(whitespace_option);
3948
		errs |= apply_patch(fd, arg, options);
L
Linus Torvalds 已提交
3949 3950
		close(fd);
	}
3951
	set_default_whitespace_mode(whitespace_option);
3952
	if (read_stdin)
3953
		errs |= apply_patch(0, "<stdin>", options);
3954 3955 3956 3957 3958
	if (whitespace_error) {
		if (squelch_whitespace_errors &&
		    squelch_whitespace_errors < whitespace_error) {
			int squelched =
				whitespace_error - squelch_whitespace_errors;
3959 3960
			warning("squelched %d "
				"whitespace error%s",
3961 3962 3963
				squelched,
				squelched == 1 ? "" : "s");
		}
3964
		if (ws_error_action == die_on_ws_error)
3965
			die("%d line%s add%s whitespace errors.",
3966 3967 3968
			    whitespace_error,
			    whitespace_error == 1 ? "" : "s",
			    whitespace_error == 1 ? "s" : "");
3969
		if (applied_after_fixing_ws && apply)
3970 3971
			warning("%d line%s applied after"
				" fixing whitespace errors.",
3972 3973
				applied_after_fixing_ws,
				applied_after_fixing_ws == 1 ? "" : "s");
3974
		else if (whitespace_error)
3975
			warning("%d line%s add%s whitespace errors.",
3976 3977 3978 3979
				whitespace_error,
				whitespace_error == 1 ? "" : "s",
				whitespace_error == 1 ? "s" : "");
	}
3980

3981
	if (update_index) {
3982
		if (write_cache(newfd, active_cache, active_nr) ||
B
Brandon Casey 已提交
3983
		    commit_locked_index(&lock_file))
3984
			die("Unable to write new index file");
3985 3986
	}

J
Junio C Hamano 已提交
3987
	return !!errs;
L
Linus Torvalds 已提交
3988
}