builtin-read-tree.c 20.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5
/*
 * GIT - The information manager from hell
 *
 * Copyright (C) Linus Torvalds, 2005
 */
6 7
#define DBRT_DEBUG 1

8 9
#include "cache.h"

D
Daniel Barkalow 已提交
10 11
#include "object.h"
#include "tree.h"
12
#include "cache-tree.h"
J
Junio C Hamano 已提交
13 14
#include <sys/time.h>
#include <signal.h>
P
Peter Eriksen 已提交
15
#include "builtin.h"
D
Daniel Barkalow 已提交
16

L
Linus Torvalds 已提交
17
static int reset = 0;
D
Daniel Barkalow 已提交
18
static int merge = 0;
19
static int update = 0;
20
static int index_only = 0;
L
Linus Torvalds 已提交
21 22
static int nontrivial_merge = 0;
static int trivial_merges_only = 0;
J
Junio C Hamano 已提交
23
static int aggressive = 0;
J
Junio C Hamano 已提交
24 25
static int verbose_update = 0;
static volatile int progress_update = 0;
26

D
Daniel Barkalow 已提交
27 28
static int head_idx = -1;
static int merge_size = 0;
29

D
Daniel Barkalow 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
static struct object_list *trees = NULL;

static struct cache_entry df_conflict_entry = { 
};

static struct tree_entry_list df_conflict_list = {
	.name = NULL,
	.next = &df_conflict_list
};

typedef int (*merge_fn_t)(struct cache_entry **src);

static int entcmp(char *name1, int dir1, char *name2, int dir2)
{
	int len1 = strlen(name1);
	int len2 = strlen(name2);
	int len = len1 < len2 ? len1 : len2;
	int ret = memcmp(name1, name2, len);
	unsigned char c1, c2;
	if (ret)
		return ret;
	c1 = name1[len];
	c2 = name2[len];
	if (!c1 && dir1)
		c1 = '/';
	if (!c2 && dir2)
		c2 = '/';
	ret = (c1 < c2) ? -1 : (c1 > c2) ? 1 : 0;
	if (c1 && c2 && !ret)
		ret = len1 - len2;
P
Petr Baudis 已提交
60
	return ret;
61 62
}

D
Daniel Barkalow 已提交
63 64
static int unpack_trees_rec(struct tree_entry_list **posns, int len,
			    const char *base, merge_fn_t fn, int *indpos)
65
{
D
Daniel Barkalow 已提交
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
	int baselen = strlen(base);
	int src_size = len + 1;
	do {
		int i;
		char *first;
		int firstdir = 0;
		int pathlen;
		unsigned ce_size;
		struct tree_entry_list **subposns;
		struct cache_entry **src;
		int any_files = 0;
		int any_dirs = 0;
		char *cache_name;
		int ce_stage;

		/* Find the first name in the input. */

		first = NULL;
		cache_name = NULL;

		/* Check the cache */
		if (merge && *indpos < active_nr) {
			/* This is a bit tricky: */
			/* If the index has a subdirectory (with
			 * contents) as the first name, it'll get a
			 * filename like "foo/bar". But that's after
			 * "foo", so the entry in trees will get
			 * handled first, at which point we'll go into
			 * "foo", and deal with "bar" from the index,
			 * because the base will be "foo/". The only
			 * way we can actually have "foo/bar" first of
			 * all the things is if the trees don't
			 * contain "foo" at all, in which case we'll
			 * handle "foo/bar" without going into the
			 * directory, but that's fine (and will return
			 * an error anyway, with the added unknown
			 * file case.
			 */

			cache_name = active_cache[*indpos]->name;
			if (strlen(cache_name) > baselen &&
			    !memcmp(cache_name, base, baselen)) {
				cache_name += baselen;
				first = cache_name;
			} else {
				cache_name = NULL;
			}
		}

115
#if DBRT_DEBUG > 1
D
Daniel Barkalow 已提交
116 117
		if (first)
			printf("index %s\n", first);
118
#endif
D
Daniel Barkalow 已提交
119 120 121
		for (i = 0; i < len; i++) {
			if (!posns[i] || posns[i] == &df_conflict_list)
				continue;
122
#if DBRT_DEBUG > 1
D
Daniel Barkalow 已提交
123
			printf("%d %s\n", i + 1, posns[i]->name);
124
#endif
D
Daniel Barkalow 已提交
125 126 127 128 129 130 131 132 133 134 135 136 137 138
			if (!first || entcmp(first, firstdir,
					     posns[i]->name, 
					     posns[i]->directory) > 0) {
				first = posns[i]->name;
				firstdir = posns[i]->directory;
			}
		}
		/* No name means we're done */
		if (!first)
			return 0;

		pathlen = strlen(first);
		ce_size = cache_entry_size(baselen + pathlen);

139
		src = xcalloc(src_size, sizeof(struct cache_entry *));
D
Daniel Barkalow 已提交
140

141
		subposns = xcalloc(len, sizeof(struct tree_list_entry *));
D
Daniel Barkalow 已提交
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180

		if (cache_name && !strcmp(cache_name, first)) {
			any_files = 1;
			src[0] = active_cache[*indpos];
			remove_cache_entry_at(*indpos);
		}

		for (i = 0; i < len; i++) {
			struct cache_entry *ce;

			if (!posns[i] ||
			    (posns[i] != &df_conflict_list &&
			     strcmp(first, posns[i]->name))) {
				continue;
			}

			if (posns[i] == &df_conflict_list) {
				src[i + merge] = &df_conflict_entry;
				continue;
			}

			if (posns[i]->directory) {
				any_dirs = 1;
				parse_tree(posns[i]->item.tree);
				subposns[i] = posns[i]->item.tree->entries;
				posns[i] = posns[i]->next;
				src[i + merge] = &df_conflict_entry;
				continue;
			}

			if (!merge)
				ce_stage = 0;
			else if (i + 1 < head_idx)
				ce_stage = 1;
			else if (i + 1 > head_idx)
				ce_stage = 3;
			else
				ce_stage = 2;

181
			ce = xcalloc(1, ce_size);
D
Daniel Barkalow 已提交
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
			ce->ce_mode = create_ce_mode(posns[i]->mode);
			ce->ce_flags = create_ce_flags(baselen + pathlen,
						       ce_stage);
			memcpy(ce->name, base, baselen);
			memcpy(ce->name + baselen, first, pathlen + 1);

			any_files = 1;

			memcpy(ce->sha1, posns[i]->item.any->sha1, 20);
			src[i + merge] = ce;
			subposns[i] = &df_conflict_list;
			posns[i] = posns[i]->next;
		}
		if (any_files) {
			if (merge) {
				int ret;

199
#if DBRT_DEBUG > 1
D
Daniel Barkalow 已提交
200 201 202 203 204 205 206 207
				printf("%s:\n", first);
				for (i = 0; i < src_size; i++) {
					printf(" %d ", i);
					if (src[i])
						printf("%s\n", sha1_to_hex(src[i]->sha1));
					else
						printf("\n");
				}
208
#endif
D
Daniel Barkalow 已提交
209 210
				ret = fn(src);
				
211
#if DBRT_DEBUG > 1
D
Daniel Barkalow 已提交
212
				printf("Added %d entries\n", ret);
213
#endif
D
Daniel Barkalow 已提交
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
				*indpos += ret;
			} else {
				for (i = 0; i < src_size; i++) {
					if (src[i]) {
						add_cache_entry(src[i], ADD_CACHE_OK_TO_ADD|ADD_CACHE_SKIP_DFCHECK);
					}
				}
			}
		}
		if (any_dirs) {
			char *newbase = xmalloc(baselen + 2 + pathlen);
			memcpy(newbase, base, baselen);
			memcpy(newbase + baselen, first, pathlen);
			newbase[baselen + pathlen] = '/';
			newbase[baselen + pathlen + 1] = '\0';
			if (unpack_trees_rec(subposns, len, newbase, fn,
					     indpos))
				return -1;
232
			free(newbase);
D
Daniel Barkalow 已提交
233 234 235 236
		}
		free(subposns);
		free(src);
	} while (1);
237 238
}

D
Daniel Barkalow 已提交
239
static void reject_merge(struct cache_entry *ce)
240
{
D
Daniel Barkalow 已提交
241 242
	die("Entry '%s' would be overwritten by merge. Cannot merge.", 
	    ce->name);
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
/* Unlink the last component and attempt to remove leading
 * directories, in case this unlink is the removal of the
 * last entry in the directory -- empty directories are removed.
 */
static void unlink_entry(char *name)
{
	char *cp, *prev;

	if (unlink(name))
		return;
	prev = NULL;
	while (1) {
		int status;
		cp = strrchr(name, '/');
		if (prev)
			*prev = '/';
		if (!cp)
			break;

		*cp = 0;
		status = rmdir(name);
		if (status) {
			*cp = '/';
			break;
		}
		prev = cp;
	}
}

J
Junio C Hamano 已提交
274 275 276 277 278
static void progress_interval(int signum)
{
	progress_update = 1;
}

279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
static void setup_progress_signal(void)
{
	struct sigaction sa;
	struct itimerval v;

	memset(&sa, 0, sizeof(sa));
	sa.sa_handler = progress_interval;
	sigemptyset(&sa.sa_mask);
	sa.sa_flags = SA_RESTART;
	sigaction(SIGALRM, &sa, NULL);

	v.it_interval.tv_sec = 1;
	v.it_interval.tv_usec = 0;
	v.it_value = v.it_interval;
	setitimer(ITIMER_REAL, &v, NULL);
}

D
Daniel Barkalow 已提交
296 297 298 299 300 301 302 303 304
static void check_updates(struct cache_entry **src, int nr)
{
	static struct checkout state = {
		.base_dir = "",
		.force = 1,
		.quiet = 1,
		.refresh_cache = 1,
	};
	unsigned short mask = htons(CE_UPDATE);
J
Junio C Hamano 已提交
305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
	unsigned last_percent = 200, cnt = 0, total = 0;

	if (update && verbose_update) {
		for (total = cnt = 0; cnt < nr; cnt++) {
			struct cache_entry *ce = src[cnt];
			if (!ce->ce_mode || ce->ce_flags & mask)
				total++;
		}

		/* Don't bother doing this for very small updates */
		if (total < 250)
			total = 0;

		if (total) {
			fprintf(stderr, "Checking files out...\n");
320
			setup_progress_signal();
J
Junio C Hamano 已提交
321 322 323 324 325
			progress_update = 1;
		}
		cnt = 0;
	}

D
Daniel Barkalow 已提交
326 327
	while (nr--) {
		struct cache_entry *ce = *src++;
J
Junio C Hamano 已提交
328 329 330 331 332 333 334 335 336 337 338 339 340 341

		if (total) {
			if (!ce->ce_mode || ce->ce_flags & mask) {
				unsigned percent;
				cnt++;
				percent = (cnt * 100) / total;
				if (percent != last_percent ||
				    progress_update) {
					fprintf(stderr, "%4u%% (%u/%u) done\r",
						percent, cnt, total);
					last_percent = percent;
				}
			}
		}
D
Daniel Barkalow 已提交
342 343
		if (!ce->ce_mode) {
			if (update)
344
				unlink_entry(ce->name);
D
Daniel Barkalow 已提交
345 346 347 348 349
			continue;
		}
		if (ce->ce_flags & mask) {
			ce->ce_flags &= ~mask;
			if (update)
350
				checkout_entry(ce, &state, NULL);
D
Daniel Barkalow 已提交
351 352
		}
	}
J
Junio C Hamano 已提交
353 354
	if (total) {
		signal(SIGALRM, SIG_IGN);
355
		fputc('\n', stderr);
J
Junio C Hamano 已提交
356
	}
D
Daniel Barkalow 已提交
357
}
358

D
Daniel Barkalow 已提交
359
static int unpack_trees(merge_fn_t fn)
360
{
D
Daniel Barkalow 已提交
361 362
	int indpos = 0;
	unsigned len = object_list_length(trees);
363
	struct tree_entry_list **posns;
D
Daniel Barkalow 已提交
364 365 366
	int i;
	struct object_list *posn = trees;
	merge_size = len;
367 368 369 370 371 372 373 374 375

	if (len) {
		posns = xmalloc(len * sizeof(struct tree_entry_list *));
		for (i = 0; i < len; i++) {
			posns[i] = ((struct tree *) posn->item)->entries;
			posn = posn->next;
		}
		if (unpack_trees_rec(posns, len, "", fn, &indpos))
			return -1;
376
	}
D
Daniel Barkalow 已提交
377

L
Linus Torvalds 已提交
378 379 380
	if (trivial_merges_only && nontrivial_merge)
		die("Merge requires file-level merging");

D
Daniel Barkalow 已提交
381 382
	check_updates(active_cache, active_nr);
	return 0;
383 384
}

D
Daniel Barkalow 已提交
385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
static int list_tree(unsigned char *sha1)
{
	struct tree *tree = parse_tree_indirect(sha1);
	if (!tree)
		return -1;
	object_list_append(&tree->object, &trees);
	return 0;
}

static int same(struct cache_entry *a, struct cache_entry *b)
{
	if (!!a != !!b)
		return 0;
	if (!a && !b)
		return 1;
	return a->ce_mode == b->ce_mode && 
		!memcmp(a->sha1, b->sha1, 20);
}


405 406 407 408 409 410 411 412
/*
 * When a CE gets turned into an unmerged entry, we
 * want it to be up-to-date
 */
static void verify_uptodate(struct cache_entry *ce)
{
	struct stat st;

413
	if (index_only || reset)
414 415
		return;

416
	if (!lstat(ce->name, &st)) {
J
Junio C Hamano 已提交
417
		unsigned changed = ce_match_stat(ce, &st, 1);
418 419 420 421
		if (!changed)
			return;
		errno = 0;
	}
L
Linus Torvalds 已提交
422 423 424 425
	if (reset) {
		ce->ce_flags |= htons(CE_UPDATE);
		return;
	}
426 427 428 429 430
	if (errno == ENOENT)
		return;
	die("Entry '%s' not uptodate. Cannot merge.", ce->name);
}

431 432 433 434 435 436
static void invalidate_ce_path(struct cache_entry *ce)
{
	if (ce)
		cache_tree_invalidate_path(active_cache_tree, ce->name);
}

437 438 439 440 441 442 443 444 445 446 447 448 449 450 451
/*
 * We do not want to remove or overwrite a working tree file that
 * is not tracked.
 */
static void verify_absent(const char *path, const char *action)
{
	struct stat st;

	if (index_only || reset || !update)
		return;
	if (!lstat(path, &st))
		die("Untracked working tree file '%s' "
		    "would be %s by merge.", path, action);
}

D
Daniel Barkalow 已提交
452
static int merged_entry(struct cache_entry *merge, struct cache_entry *old)
453
{
454 455
	merge->ce_flags |= htons(CE_UPDATE);
	if (old) {
456
		/*
457 458 459 460 461
		 * See if we can re-use the old CE directly?
		 * That way we get the uptodate stat info.
		 *
		 * This also removes the UPDATE flag on
		 * a match.
462
		 */
463 464
		if (same(old, merge)) {
			*merge = *old;
D
Daniel Barkalow 已提交
465
		} else {
466
			verify_uptodate(old);
467
			invalidate_ce_path(old);
468
		}
469
	}
470
	else {
471
		verify_absent(merge->name, "overwritten");
472
		invalidate_ce_path(merge);
473
	}
474

475
	merge->ce_flags &= ~htons(CE_STAGEMASK);
D
Daniel Barkalow 已提交
476
	add_cache_entry(merge, ADD_CACHE_OK_TO_ADD);
477
	return 1;
478 479
}

D
Daniel Barkalow 已提交
480
static int deleted_entry(struct cache_entry *ce, struct cache_entry *old)
481 482 483
{
	if (old)
		verify_uptodate(old);
484 485
	else
		verify_absent(ce->name, "removed");
486
	ce->ce_mode = 0;
D
Daniel Barkalow 已提交
487
	add_cache_entry(ce, ADD_CACHE_OK_TO_ADD);
488
	invalidate_ce_path(ce);
489 490 491
	return 1;
}

D
Daniel Barkalow 已提交
492
static int keep_entry(struct cache_entry *ce)
493
{
D
Daniel Barkalow 已提交
494 495
	add_cache_entry(ce, ADD_CACHE_OK_TO_ADD);
	return 1;
496 497
}

498 499 500 501
#if DBRT_DEBUG
static void show_stage_entry(FILE *o,
			     const char *label, const struct cache_entry *ce)
{
502 503 504 505 506 507 508 509 510
	if (!ce)
		fprintf(o, "%s (missing)\n", label);
	else
		fprintf(o, "%s%06o %s %d\t%s\n",
			label,
			ntohl(ce->ce_mode),
			sha1_to_hex(ce->sha1),
			ce_stage(ce),
			ce->name);
511 512 513
}
#endif

D
Daniel Barkalow 已提交
514
static int threeway_merge(struct cache_entry **stages)
515
{
D
Daniel Barkalow 已提交
516 517 518
	struct cache_entry *index;
	struct cache_entry *head; 
	struct cache_entry *remote = stages[head_idx + 1];
519
	int count;
D
Daniel Barkalow 已提交
520 521
	int head_match = 0;
	int remote_match = 0;
522
	const char *path = NULL;
523

D
Daniel Barkalow 已提交
524 525 526 527
	int df_conflict_head = 0;
	int df_conflict_remote = 0;

	int any_anc_missing = 0;
J
Junio C Hamano 已提交
528
	int no_anc_exists = 1;
D
Daniel Barkalow 已提交
529 530 531 532 533
	int i;

	for (i = 1; i < head_idx; i++) {
		if (!stages[i])
			any_anc_missing = 1;
534 535 536
		else {
			if (!path)
				path = stages[i]->name;
J
Junio C Hamano 已提交
537
			no_anc_exists = 0;
538
		}
539
	}
D
Daniel Barkalow 已提交
540 541 542 543 544 545 546 547 548 549 550 551 552 553

	index = stages[0];
	head = stages[head_idx];

	if (head == &df_conflict_entry) {
		df_conflict_head = 1;
		head = NULL;
	}

	if (remote == &df_conflict_entry) {
		df_conflict_remote = 1;
		remote = NULL;
	}

554 555 556 557 558 559 560
	if (!path && index)
		path = index->name;
	if (!path && head)
		path = head->name;
	if (!path && remote)
		path = remote->name;

D
Daniel Barkalow 已提交
561
	/* First, if there's a #16 situation, note that to prevent #13
562
	 * and #14.
D
Daniel Barkalow 已提交
563 564 565 566
	 */
	if (!same(remote, head)) {
		for (i = 1; i < head_idx; i++) {
			if (same(stages[i], head)) {
567
				head_match = i;
D
Daniel Barkalow 已提交
568 569
			}
			if (same(stages[i], remote)) {
570
				remote_match = i;
D
Daniel Barkalow 已提交
571
			}
572 573
		}
	}
D
Daniel Barkalow 已提交
574 575 576 577 578 579 580 581 582 583

	/* We start with cases where the index is allowed to match
	 * something other than the head: #14(ALT) and #2ALT, where it
	 * is permitted to match the result instead.
	 */
	/* #14, #14ALT, #2ALT */
	if (remote && !df_conflict_head && head_match && !remote_match) {
		if (index && !same(index, remote) && !same(index, head))
			reject_merge(index);
		return merged_entry(remote, index);
584
	}
585
	/*
D
Daniel Barkalow 已提交
586 587
	 * If we have an entry in the index cache, then we want to
	 * make sure that it matches head.
588
	 */
D
Daniel Barkalow 已提交
589 590
	if (index && !same(index, head)) {
		reject_merge(index);
591
	}
D
Daniel Barkalow 已提交
592 593 594 595 596 597 598 599 600 601 602 603 604 605

	if (head) {
		/* #5ALT, #15 */
		if (same(head, remote))
			return merged_entry(head, index);
		/* #13, #3ALT */
		if (!df_conflict_remote && remote_match && !head_match)
			return merged_entry(head, index);
	}

	/* #1 */
	if (!head && !remote && any_anc_missing)
		return 0;

J
Junio C Hamano 已提交
606 607 608 609 610 611 612 613 614 615 616 617
	/* Under the new "aggressive" rule, we resolve mostly trivial
	 * cases that we historically had git-merge-one-file resolve.
	 */
	if (aggressive) {
		int head_deleted = !head && !df_conflict_head;
		int remote_deleted = !remote && !df_conflict_remote;
		/*
		 * Deleted in both.
		 * Deleted in one and unchanged in the other.
		 */
		if ((head_deleted && remote_deleted) ||
		    (head_deleted && remote && remote_match) ||
618 619 620
		    (remote_deleted && head && head_match)) {
			if (index)
				return deleted_entry(index, index);
621 622
			else if (path)
				verify_absent(path, "removed");
J
Junio C Hamano 已提交
623
			return 0;
624
		}
J
Junio C Hamano 已提交
625 626 627 628 629 630 631 632
		/*
		 * Added in both, identically.
		 */
		if (no_anc_exists && head && remote && same(head, remote))
			return merged_entry(head, index);

	}

D
Daniel Barkalow 已提交
633 634 635 636 637 638 639
	/* Below are "no merge" cases, which require that the index be
	 * up-to-date to avoid the files getting overwritten with
	 * conflict resolution files. 
	 */
	if (index) {
		verify_uptodate(index);
	}
640 641
	else if (path)
		verify_absent(path, "overwritten");
D
Daniel Barkalow 已提交
642

L
Linus Torvalds 已提交
643 644
	nontrivial_merge = 1;

D
Daniel Barkalow 已提交
645
	/* #2, #3, #4, #6, #7, #9, #11. */
646
	count = 0;
D
Daniel Barkalow 已提交
647 648 649 650 651 652 653 654 655
	if (!head_match || !remote_match) {
		for (i = 1; i < head_idx; i++) {
			if (stages[i]) {
				keep_entry(stages[i]);
				count++;
				break;
			}
		}
	}
656 657 658 659 660 661 662
#if DBRT_DEBUG
	else {
		fprintf(stderr, "read-tree: warning #16 detected\n");
		show_stage_entry(stderr, "head   ", stages[head_match]);
		show_stage_entry(stderr, "remote ", stages[remote_match]);
	}
#endif
D
Daniel Barkalow 已提交
663 664
	if (head) { count += keep_entry(head); }
	if (remote) { count += keep_entry(remote); }
665
	return count;
666 667
}

668 669 670
/*
 * Two-way merge.
 *
671 672 673 674 675
 * The rule is to "carry forward" what is in the index without losing
 * information across a "fast forward", favoring a successful merge
 * over a merge failure when it makes sense.  For details of the
 * "carry forward" rule, please see <Documentation/git-read-tree.txt>.
 *
676
 */
D
Daniel Barkalow 已提交
677
static int twoway_merge(struct cache_entry **src)
678
{
679 680
	struct cache_entry *current = src[0];
	struct cache_entry *oldtree = src[1], *newtree = src[2];
681

D
Daniel Barkalow 已提交
682
	if (merge_size != 2)
683
		return error("Cannot do a twoway merge of %d trees",
D
Daniel Barkalow 已提交
684
			     merge_size);
685

686 687 688 689 690 691 692 693 694
	if (current) {
		if ((!oldtree && !newtree) || /* 4 and 5 */
		    (!oldtree && newtree &&
		     same(current, newtree)) || /* 6 and 7 */
		    (oldtree && newtree &&
		     same(oldtree, newtree)) || /* 14 and 15 */
		    (oldtree && newtree &&
		     !same(oldtree, newtree) && /* 18 and 19*/
		     same(current, newtree))) {
D
Daniel Barkalow 已提交
695
			return keep_entry(current);
696 697 698
		}
		else if (oldtree && !newtree && same(current, oldtree)) {
			/* 10 or 11 */
D
Daniel Barkalow 已提交
699
			return deleted_entry(oldtree, current);
700 701 702 703
		}
		else if (oldtree && newtree &&
			 same(current, oldtree) && !same(current, newtree)) {
			/* 20 or 21 */
D
Daniel Barkalow 已提交
704
			return merged_entry(newtree, current);
705
		}
D
Daniel Barkalow 已提交
706
		else {
707
			/* all other failures */
D
Daniel Barkalow 已提交
708 709 710 711 712 713
			if (oldtree)
				reject_merge(oldtree);
			if (current)
				reject_merge(current);
			if (newtree)
				reject_merge(newtree);
714
			return -1;
D
Daniel Barkalow 已提交
715
		}
716
	}
717
	else if (newtree)
D
Daniel Barkalow 已提交
718
		return merged_entry(newtree, current);
719
	else
D
Daniel Barkalow 已提交
720
		return deleted_entry(oldtree, current);
J
Junio C Hamano 已提交
721 722
}

723 724 725 726 727 728
/*
 * One-way merge.
 *
 * The rule is:
 * - take the stat information from stage0, take the data from stage1
 */
D
Daniel Barkalow 已提交
729
static int oneway_merge(struct cache_entry **src)
730
{
731 732
	struct cache_entry *old = src[0];
	struct cache_entry *a = src[1];
733

D
Daniel Barkalow 已提交
734
	if (merge_size != 1)
735
		return error("Cannot do a oneway merge of %d trees",
D
Daniel Barkalow 已提交
736
			     merge_size);
737

738
	if (!a)
739
		return deleted_entry(old, old);
740
	if (old && same(old, a)) {
L
Linus Torvalds 已提交
741 742 743 744 745 746
		if (reset) {
			struct stat st;
			if (lstat(old->name, &st) ||
			    ce_match_stat(old, &st, 1))
				old->ce_flags |= htons(CE_UPDATE);
		}
D
Daniel Barkalow 已提交
747
		return keep_entry(old);
748
	}
749
	return merged_entry(a, old);
750 751
}

752 753 754 755 756 757 758 759 760 761 762 763
static int read_cache_unmerged(void)
{
	int i, deleted;
	struct cache_entry **dst;

	read_cache();
	dst = active_cache;
	deleted = 0;
	for (i = 0; i < active_nr; i++) {
		struct cache_entry *ce = active_cache[i];
		if (ce_stage(ce)) {
			deleted++;
764
			invalidate_ce_path(ce);
765 766 767 768 769 770 771 772 773 774
			continue;
		}
		if (deleted)
			*dst = ce;
		dst++;
	}
	active_nr -= deleted;
	return deleted;
}

775 776 777 778
static void prime_cache_tree_rec(struct cache_tree *it, struct tree *tree)
{
	struct tree_entry_list *ent;
	int cnt;
779

780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807
	memcpy(it->sha1, tree->object.sha1, 20);
	for (cnt = 0, ent = tree->entries; ent; ent = ent->next) {
		if (!ent->directory)
			cnt++;
		else {
			struct cache_tree_sub *sub;
			struct tree *subtree = (struct tree *)ent->item.tree;
			if (!subtree->object.parsed)
				parse_tree(subtree);
			sub = cache_tree_sub(it, ent->name);
			sub->cache_tree = cache_tree();
			prime_cache_tree_rec(sub->cache_tree, subtree);
			cnt += sub->cache_tree->entry_count;
		}
	}
	it->entry_count = cnt;
}

static void prime_cache_tree(void)
{
	struct tree *tree = (struct tree *)trees->item;
	if (!tree)
		return;
	active_cache_tree = cache_tree();
	prime_cache_tree_rec(active_cache_tree, tree);

}

808
static const char read_tree_usage[] = "git-read-tree (<sha> | -m [--aggressive] [-u | -i] <sha1> [<sha2> [<sha3>]])";
J
Junio C Hamano 已提交
809

810 811
static struct cache_file cache_file;

P
Peter Eriksen 已提交
812
int cmd_read_tree(int argc, const char **argv, char **envp)
813
{
L
Linus Torvalds 已提交
814
	int i, newfd, stage = 0;
815
	unsigned char sha1[20];
D
Daniel Barkalow 已提交
816
	merge_fn_t fn = NULL;
817

818
	setup_git_directory();
819
	git_config(git_default_config);
820

821
	newfd = hold_index_file_for_update(&cache_file, get_index_file());
822
	if (newfd < 0)
823
		die("unable to create new cachefile");
824

825 826
	git_config(git_default_config);

827
	merge = 0;
828
	reset = 0;
829 830 831
	for (i = 1; i < argc; i++) {
		const char *arg = argv[i];

832 833 834
		/* "-u" means "update", meaning that a merge will update
		 * the working tree.
		 */
835 836 837 838 839
		if (!strcmp(arg, "-u")) {
			update = 1;
			continue;
		}

J
Junio C Hamano 已提交
840 841 842 843 844
		if (!strcmp(arg, "-v")) {
			verbose_update = 1;
			continue;
		}

845 846 847 848 849 850 851 852
		/* "-i" means "index only", meaning that a merge will
		 * not even look at the working tree.
		 */
		if (!strcmp(arg, "-i")) {
			index_only = 1;
			continue;
		}

853 854
		/* This differs from "-m" in that we'll silently ignore unmerged entries */
		if (!strcmp(arg, "--reset")) {
D
Daniel Barkalow 已提交
855
			if (stage || merge)
856 857 858 859 860
				usage(read_tree_usage);
			reset = 1;
			merge = 1;
			stage = 1;
			read_cache_unmerged();
861
			continue;
862 863
		}

L
Linus Torvalds 已提交
864 865 866 867 868
		if (!strcmp(arg, "--trivial")) {
			trivial_merges_only = 1;
			continue;
		}

J
Junio C Hamano 已提交
869 870 871 872 873
		if (!strcmp(arg, "--aggressive")) {
			aggressive = 1;
			continue;
		}

874
		/* "-m" stands for "merge", meaning we start in stage 1 */
875
		if (!strcmp(arg, "-m")) {
D
Daniel Barkalow 已提交
876
			if (stage || merge)
877 878 879
				usage(read_tree_usage);
			if (read_cache_unmerged())
				die("you need to resolve your current index first");
880
			stage = 1;
881
			merge = 1;
882 883
			continue;
		}
J
Junio C Hamano 已提交
884

885 886 887 888
		/* using -u and -i at the same time makes no sense */
		if (1 < index_only + update)
			usage(read_tree_usage);

889 890
		if (get_sha1(arg, sha1))
			die("Not a valid object name %s", arg);
D
Daniel Barkalow 已提交
891
		if (list_tree(sha1) < 0)
892
			die("failed to unpack tree object %s", arg);
893
		stage++;
894
	}
895
	if ((update||index_only) && !merge)
896
		usage(read_tree_usage);
J
Junio C Hamano 已提交
897 898

	if (merge) {
D
Daniel Barkalow 已提交
899
		if (stage < 2)
900
			die("just how do you expect me to merge %d trees?", stage-1);
D
Daniel Barkalow 已提交
901 902 903 904 905 906 907 908 909 910
		switch (stage - 1) {
		case 1:
			fn = oneway_merge;
			break;
		case 2:
			fn = twoway_merge;
			break;
		case 3:
		default:
			fn = threeway_merge;
911
			cache_tree_free(&active_cache_tree);
D
Daniel Barkalow 已提交
912
			break;
J
Junio C Hamano 已提交
913
		}
D
Daniel Barkalow 已提交
914 915 916 917 918 919 920 921

		if (stage - 1 >= 3)
			head_idx = stage - 2;
		else
			head_idx = 1;
	}

	unpack_trees(fn);
922 923 924 925 926 927 928

	/*
	 * When reading only one tree (either the most basic form,
	 * "-m ent" or "--reset ent" form), we can obtain a fully
	 * valid cache-tree because the index must match exactly
	 * what came from the tree.
	 */
929 930
	if (trees && trees->item && (!merge || (stage == 2))) {
		cache_tree_free(&active_cache_tree);
931 932 933
		prime_cache_tree();
	}

934 935
	if (write_cache(newfd, active_cache, active_nr) ||
	    commit_index_file(&cache_file))
936
		die("unable to write new index file");
937
	return 0;
938
}