revision.c 91.3 KB
Newer Older
1 2 3 4 5
#include "cache.h"
#include "tag.h"
#include "blob.h"
#include "tree.h"
#include "commit.h"
6
#include "diff.h"
7 8
#include "refs.h"
#include "revision.h"
9
#include "graph.h"
10
#include "grep.h"
11
#include "reflog-walk.h"
J
Junio C Hamano 已提交
12
#include "patch-ids.h"
13
#include "decorate.h"
14
#include "log-tree.h"
15
#include "string-list.h"
16
#include "line-log.h"
17
#include "mailmap.h"
18
#include "commit-slab.h"
19
#include "dir.h"
J
Jeff King 已提交
20
#include "cache-tree.h"
21
#include "bisect.h"
22

23 24
volatile show_early_output_fn_t show_early_output;

25 26 27
static const char *term_bad;
static const char *term_good;

28
void show_object_with_name(FILE *out, struct object *obj, const char *name)
29
{
30
	const char *p;
31

32
	fprintf(out, "%s ", oid_to_hex(&obj->oid));
33 34
	for (p = name; *p && *p != '\n'; p++)
		fputc(*p, out);
35
	fputc('\n', out);
36 37
}

38 39
static void mark_blob_uninteresting(struct blob *blob)
{
40 41
	if (!blob)
		return;
42 43 44 45 46
	if (blob->object.flags & UNINTERESTING)
		return;
	blob->object.flags |= UNINTERESTING;
}

47
static void mark_tree_contents_uninteresting(struct tree *tree)
48
{
49
	struct tree_desc desc;
50
	struct name_entry entry;
51 52
	struct object *obj = &tree->object;

53
	if (!has_object_file(&obj->oid))
54 55
		return;
	if (parse_tree(tree) < 0)
56
		die("bad tree %s", oid_to_hex(&obj->oid));
57

58
	init_tree_desc(&desc, tree->buffer, tree->size);
59
	while (tree_entry(&desc, &entry)) {
60 61
		switch (object_type(entry.mode)) {
		case OBJ_TREE:
62
			mark_tree_uninteresting(lookup_tree(entry.oid->hash));
63 64
			break;
		case OBJ_BLOB:
65
			mark_blob_uninteresting(lookup_blob(entry.oid->hash));
66 67 68 69 70
			break;
		default:
			/* Subproject commit - not in this repository */
			break;
		}
71
	}
72 73 74 75 76

	/*
	 * We don't care about the tree any more
	 * after it has been marked uninteresting.
	 */
77
	free_tree_buffer(tree);
78 79
}

80 81
void mark_tree_uninteresting(struct tree *tree)
{
82
	struct object *obj;
83 84 85

	if (!tree)
		return;
86 87

	obj = &tree->object;
88 89 90 91
	if (obj->flags & UNINTERESTING)
		return;
	obj->flags |= UNINTERESTING;
	mark_tree_contents_uninteresting(tree);
92 93 94 95
}

void mark_parents_uninteresting(struct commit *commit)
{
96 97 98 99
	struct commit_list *parents = NULL, *l;

	for (l = commit->parents; l; l = l->next)
		commit_list_insert(l->item, &parents);
100 101

	while (parents) {
102
		struct commit *commit = pop_commit(&parents);
103 104 105 106 107 108 109 110 111 112

		while (commit) {
			/*
			 * A missing commit is ok iff its parent is marked
			 * uninteresting.
			 *
			 * We just mark such a thing parsed, so that when
			 * it is popped next time around, we won't be trying
			 * to parse it and get an error.
			 */
113
			if (!has_object_file(&commit->object.oid))
114 115 116 117 118
				commit->object.parsed = 1;

			if (commit->object.flags & UNINTERESTING)
				break;

119
			commit->object.flags |= UNINTERESTING;
120

121 122 123 124 125 126 127 128
			/*
			 * Normally we haven't parsed the parent
			 * yet, so we won't have a parent of a parent
			 * here. However, it may turn out that we've
			 * reached this commit some other way (where it
			 * wasn't uninteresting), in which case we need
			 * to mark its parents recursively too..
			 */
129 130
			if (!commit->parents)
				break;
131

132 133 134 135
			for (l = commit->parents->next; l; l = l->next)
				commit_list_insert(l->item, &parents);
			commit = commit->parents->item;
		}
136 137 138
	}
}

139
static void add_pending_object_with_path(struct rev_info *revs,
140
					 struct object *obj,
141 142
					 const char *name, unsigned mode,
					 const char *path)
143
{
J
Junio C Hamano 已提交
144 145
	if (!obj)
		return;
L
Linus Torvalds 已提交
146
	if (revs->no_walk && (obj->flags & UNINTERESTING))
L
Linus Torvalds 已提交
147
		revs->no_walk = 0;
J
Junio C Hamano 已提交
148 149
	if (revs->reflog_info && obj->type == OBJ_COMMIT) {
		struct strbuf buf = STRBUF_INIT;
150
		int len = interpret_branch_name(name, 0, &buf, 0);
J
Junio C Hamano 已提交
151 152 153 154 155 156 157 158 159 160 161
		int st;

		if (0 < len && name[len] && buf.len)
			strbuf_addstr(&buf, name + len);
		st = add_reflog_for_walk(revs->reflog_info,
					 (struct commit *)obj,
					 buf.buf[0] ? buf.buf: name);
		strbuf_release(&buf);
		if (st)
			return;
	}
162 163 164 165 166 167 168 169
	add_object_array_with_path(obj, name, &revs->pending, mode, path);
}

static void add_pending_object_with_mode(struct rev_info *revs,
					 struct object *obj,
					 const char *name, unsigned mode)
{
	add_pending_object_with_path(revs, obj, name, mode, NULL);
170 171
}

172 173
void add_pending_object(struct rev_info *revs,
			struct object *obj, const char *name)
J
Junio C Hamano 已提交
174 175 176 177
{
	add_pending_object_with_mode(revs, obj, name, S_IFINVALID);
}

178 179 180 181 182 183 184 185 186 187 188 189
void add_head_to_pending(struct rev_info *revs)
{
	unsigned char sha1[20];
	struct object *obj;
	if (get_sha1("HEAD", sha1))
		return;
	obj = parse_object(sha1);
	if (!obj)
		return;
	add_pending_object(revs, obj, "HEAD");
}

190 191 192
static struct object *get_reference(struct rev_info *revs, const char *name,
				    const unsigned char *sha1,
				    unsigned int flags)
193 194 195 196
{
	struct object *object;

	object = parse_object(sha1);
J
Junio C Hamano 已提交
197 198 199
	if (!object) {
		if (revs->ignore_missing)
			return object;
200
		die("bad object %s", name);
J
Junio C Hamano 已提交
201
	}
202 203 204 205
	object->flags |= flags;
	return object;
}

206 207 208 209 210 211 212
void add_pending_sha1(struct rev_info *revs, const char *name,
		      const unsigned char *sha1, unsigned int flags)
{
	struct object *object = get_reference(revs, name, sha1, flags);
	add_pending_object(revs, object, name);
}

213
static struct commit *handle_commit(struct rev_info *revs,
214
				    struct object_array_entry *entry)
215
{
216 217 218 219
	struct object *object = entry->item;
	const char *name = entry->name;
	const char *path = entry->path;
	unsigned int mode = entry->mode;
220
	unsigned long flags = object->flags;
221 222 223 224

	/*
	 * Tag object? Look what it points to..
	 */
225
	while (object->type == OBJ_TAG) {
226
		struct tag *tag = (struct tag *) object;
227
		if (revs->tag_objects && !(flags & UNINTERESTING))
228
			add_pending_object(revs, object, tag->tag);
229 230
		if (!tag->tagged)
			die("bad tag");
B
brian m. carlson 已提交
231
		object = parse_object(tag->tagged->oid.hash);
232 233 234
		if (!object) {
			if (flags & UNINTERESTING)
				return NULL;
235
			die("bad object %s", oid_to_hex(&tag->tagged->oid));
236
		}
237
		object->flags |= flags;
238 239 240
		/*
		 * We'll handle the tagged object by looping or dropping
		 * through to the non-tag handlers below. Do not
241
		 * propagate path data from the tag's pending entry.
242 243 244
		 */
		path = NULL;
		mode = 0;
245 246 247 248 249 250
	}

	/*
	 * Commit object? Just return it, we'll do all the complex
	 * reachability crud.
	 */
251
	if (object->type == OBJ_COMMIT) {
252 253 254
		struct commit *commit = (struct commit *)object;
		if (parse_commit(commit) < 0)
			die("unable to parse commit %s", name);
255
		if (flags & UNINTERESTING) {
256
			mark_parents_uninteresting(commit);
257 258
			revs->limited = 1;
		}
259
		if (revs->show_source && !commit->util)
260
			commit->util = xstrdup(name);
261 262 263 264
		return commit;
	}

	/*
M
Mike Ralphson 已提交
265
	 * Tree object? Either mark it uninteresting, or add it
266 267
	 * to the list of objects to look at later..
	 */
268
	if (object->type == OBJ_TREE) {
269 270 271 272
		struct tree *tree = (struct tree *)object;
		if (!revs->tree_objects)
			return NULL;
		if (flags & UNINTERESTING) {
273
			mark_tree_contents_uninteresting(tree);
274 275
			return NULL;
		}
276
		add_pending_object_with_path(revs, object, name, mode, path);
277 278 279 280 281 282
		return NULL;
	}

	/*
	 * Blob object? You know the drill by now..
	 */
283
	if (object->type == OBJ_BLOB) {
284 285
		if (!revs->blob_objects)
			return NULL;
286
		if (flags & UNINTERESTING)
287
			return NULL;
288
		add_pending_object_with_path(revs, object, name, mode, path);
289 290 291 292 293
		return NULL;
	}
	die("%s is unknown object", name);
}

294 295
static int everybody_uninteresting(struct commit_list *orig,
				   struct commit **interesting_cache)
296 297
{
	struct commit_list *list = orig;
298 299 300 301 302 303 304

	if (*interesting_cache) {
		struct commit *commit = *interesting_cache;
		if (!(commit->object.flags & UNINTERESTING))
			return 0;
	}

305 306 307 308 309
	while (list) {
		struct commit *commit = list->item;
		list = list->next;
		if (commit->object.flags & UNINTERESTING)
			continue;
310 311

		*interesting_cache = commit;
312 313 314 315 316
		return 0;
	}
	return 1;
}

317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390
/*
 * A definition of "relevant" commit that we can use to simplify limited graphs
 * by eliminating side branches.
 *
 * A "relevant" commit is one that is !UNINTERESTING (ie we are including it
 * in our list), or that is a specified BOTTOM commit. Then after computing
 * a limited list, during processing we can generally ignore boundary merges
 * coming from outside the graph, (ie from irrelevant parents), and treat
 * those merges as if they were single-parent. TREESAME is defined to consider
 * only relevant parents, if any. If we are TREESAME to our on-graph parents,
 * we don't care if we were !TREESAME to non-graph parents.
 *
 * Treating bottom commits as relevant ensures that a limited graph's
 * connection to the actual bottom commit is not viewed as a side branch, but
 * treated as part of the graph. For example:
 *
 *   ....Z...A---X---o---o---B
 *        .     /
 *         W---Y
 *
 * When computing "A..B", the A-X connection is at least as important as
 * Y-X, despite A being flagged UNINTERESTING.
 *
 * And when computing --ancestry-path "A..B", the A-X connection is more
 * important than Y-X, despite both A and Y being flagged UNINTERESTING.
 */
static inline int relevant_commit(struct commit *commit)
{
	return (commit->object.flags & (UNINTERESTING | BOTTOM)) != UNINTERESTING;
}

/*
 * Return a single relevant commit from a parent list. If we are a TREESAME
 * commit, and this selects one of our parents, then we can safely simplify to
 * that parent.
 */
static struct commit *one_relevant_parent(const struct rev_info *revs,
					  struct commit_list *orig)
{
	struct commit_list *list = orig;
	struct commit *relevant = NULL;

	if (!orig)
		return NULL;

	/*
	 * For 1-parent commits, or if first-parent-only, then return that
	 * first parent (even if not "relevant" by the above definition).
	 * TREESAME will have been set purely on that parent.
	 */
	if (revs->first_parent_only || !orig->next)
		return orig->item;

	/*
	 * For multi-parent commits, identify a sole relevant parent, if any.
	 * If we have only one relevant parent, then TREESAME will be set purely
	 * with regard to that parent, and we can simplify accordingly.
	 *
	 * If we have more than one relevant parent, or no relevant parents
	 * (and multiple irrelevant ones), then we can't select a parent here
	 * and return NULL.
	 */
	while (list) {
		struct commit *commit = list->item;
		list = list->next;
		if (relevant_commit(commit)) {
			if (relevant)
				return NULL;
			relevant = commit;
		}
	}
	return relevant;
}

391 392
/*
 * The goal is to get REV_TREE_NEW as the result only if the
393 394 395 396 397 398
 * diff consists of all '+' (and no other changes), REV_TREE_OLD
 * if the whole diff is removal of old data, and otherwise
 * REV_TREE_DIFFERENT (of course if the trees are the same we
 * want REV_TREE_SAME).
 * That means that once we get to REV_TREE_DIFFERENT, we do not
 * have to look any further.
399
 */
400
static int tree_difference = REV_TREE_SAME;
401 402 403 404

static void file_add_remove(struct diff_options *options,
		    int addremove, unsigned mode,
		    const unsigned char *sha1,
405
		    int sha1_valid,
406
		    const char *fullpath, unsigned dirty_submodule)
407
{
408
	int diff = addremove == '+' ? REV_TREE_NEW : REV_TREE_OLD;
409

410
	tree_difference |= diff;
411
	if (tree_difference == REV_TREE_DIFFERENT)
412
		DIFF_OPT_SET(options, HAS_CHANGES);
413 414 415 416 417 418
}

static void file_change(struct diff_options *options,
		 unsigned old_mode, unsigned new_mode,
		 const unsigned char *old_sha1,
		 const unsigned char *new_sha1,
419
		 int old_sha1_valid, int new_sha1_valid,
420 421
		 const char *fullpath,
		 unsigned old_dirty_submodule, unsigned new_dirty_submodule)
422
{
423
	tree_difference = REV_TREE_DIFFERENT;
424
	DIFF_OPT_SET(options, HAS_CHANGES);
425 426
}

427 428
static int rev_compare_tree(struct rev_info *revs,
			    struct commit *parent, struct commit *commit)
429
{
430 431 432
	struct tree *t1 = parent->tree;
	struct tree *t2 = commit->tree;

433
	if (!t1)
434
		return REV_TREE_NEW;
435 436
	if (!t2)
		return REV_TREE_OLD;
437 438 439 440 441 442

	if (revs->simplify_by_decoration) {
		/*
		 * If we are simplifying by decoration, then the commit
		 * is worth showing if it has a tag pointing at it.
		 */
443
		if (get_name_decoration(&commit->object))
444 445 446 447 448 449 450 451
			return REV_TREE_DIFFERENT;
		/*
		 * A commit that is not pointed by a tag is uninteresting
		 * if we are not limited by path.  This means that you will
		 * see the usual "commits that touch the paths" plus any
		 * tagged commit by specifying both --simplify-by-decoration
		 * and pathspec.
		 */
452
		if (!revs->prune_data.nr)
453 454
			return REV_TREE_SAME;
	}
455

456
	tree_difference = REV_TREE_SAME;
457
	DIFF_OPT_CLR(&revs->pruning, HAS_CHANGES);
B
brian m. carlson 已提交
458
	if (diff_tree_sha1(t1->object.oid.hash, t2->object.oid.hash, "",
459
			   &revs->pruning) < 0)
460
		return REV_TREE_DIFFERENT;
461 462 463
	return tree_difference;
}

464
static int rev_same_tree_as_empty(struct rev_info *revs, struct commit *commit)
465 466
{
	int retval;
467
	struct tree *t1 = commit->tree;
468 469 470 471

	if (!t1)
		return 0;

472
	tree_difference = REV_TREE_SAME;
473
	DIFF_OPT_CLR(&revs->pruning, HAS_CHANGES);
B
brian m. carlson 已提交
474
	retval = diff_tree_sha1(NULL, t1->object.oid.hash, "", &revs->pruning);
475

476
	return retval >= 0 && (tree_difference == REV_TREE_SAME);
477 478
}

479 480 481 482 483 484 485 486
struct treesame_state {
	unsigned int nparents;
	unsigned char treesame[FLEX_ARRAY];
};

static struct treesame_state *initialise_treesame(struct rev_info *revs, struct commit *commit)
{
	unsigned n = commit_list_count(commit->parents);
487
	struct treesame_state *st = xcalloc(1, st_add(sizeof(*st), n));
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
	st->nparents = n;
	add_decoration(&revs->treesame, &commit->object, st);
	return st;
}

/*
 * Must be called immediately after removing the nth_parent from a commit's
 * parent list, if we are maintaining the per-parent treesame[] decoration.
 * This does not recalculate the master TREESAME flag - update_treesame()
 * should be called to update it after a sequence of treesame[] modifications
 * that may have affected it.
 */
static int compact_treesame(struct rev_info *revs, struct commit *commit, unsigned nth_parent)
{
	struct treesame_state *st;
	int old_same;

	if (!commit->parents) {
		/*
		 * Have just removed the only parent from a non-merge.
		 * Different handling, as we lack decoration.
		 */
		if (nth_parent != 0)
			die("compact_treesame %u", nth_parent);
		old_same = !!(commit->object.flags & TREESAME);
		if (rev_same_tree_as_empty(revs, commit))
			commit->object.flags |= TREESAME;
		else
			commit->object.flags &= ~TREESAME;
		return old_same;
	}

	st = lookup_decoration(&revs->treesame, &commit->object);
	if (!st || nth_parent >= st->nparents)
		die("compact_treesame %u", nth_parent);

	old_same = st->treesame[nth_parent];
	memmove(st->treesame + nth_parent,
		st->treesame + nth_parent + 1,
		st->nparents - nth_parent - 1);

	/*
	 * If we've just become a non-merge commit, update TREESAME
	 * immediately, and remove the no-longer-needed decoration.
	 * If still a merge, defer update until update_treesame().
	 */
	if (--st->nparents == 1) {
		if (commit->parents->next)
			die("compact_treesame parents mismatch");
		if (st->treesame[0] && revs->dense)
			commit->object.flags |= TREESAME;
		else
			commit->object.flags &= ~TREESAME;
		free(add_decoration(&revs->treesame, &commit->object, NULL));
	}

	return old_same;
}

static unsigned update_treesame(struct rev_info *revs, struct commit *commit)
{
	if (commit->parents && commit->parents->next) {
		unsigned n;
		struct treesame_state *st;
552 553 554
		struct commit_list *p;
		unsigned relevant_parents;
		unsigned relevant_change, irrelevant_change;
555 556 557

		st = lookup_decoration(&revs->treesame, &commit->object);
		if (!st)
558
			die("update_treesame %s", oid_to_hex(&commit->object.oid));
559 560 561 562 563 564 565 566
		relevant_parents = 0;
		relevant_change = irrelevant_change = 0;
		for (p = commit->parents, n = 0; p; n++, p = p->next) {
			if (relevant_commit(p->item)) {
				relevant_change |= !st->treesame[n];
				relevant_parents++;
			} else
				irrelevant_change |= !st->treesame[n];
567
		}
568 569 570 571
		if (relevant_parents ? relevant_change : irrelevant_change)
			commit->object.flags &= ~TREESAME;
		else
			commit->object.flags |= TREESAME;
572 573 574 575 576
	}

	return commit->object.flags & TREESAME;
}

577 578 579 580 581 582 583 584 585 586 587 588 589 590 591
static inline int limiting_can_increase_treesame(const struct rev_info *revs)
{
	/*
	 * TREESAME is irrelevant unless prune && dense;
	 * if simplify_history is set, we can't have a mixture of TREESAME and
	 *    !TREESAME INTERESTING parents (and we don't have treesame[]
	 *    decoration anyway);
	 * if first_parent_only is set, then the TREESAME flag is locked
	 *    against the first parent (and again we lack treesame[] decoration).
	 */
	return revs->prune && revs->dense &&
	       !revs->simplify_history &&
	       !revs->first_parent_only;
}

592 593 594
static void try_to_simplify_commit(struct rev_info *revs, struct commit *commit)
{
	struct commit_list **pp, *parent;
595
	struct treesame_state *ts = NULL;
596 597
	int relevant_change = 0, irrelevant_change = 0;
	int relevant_parents, nth_parent;
598

L
Linus Torvalds 已提交
599 600 601
	/*
	 * If we don't do pruning, everything is interesting
	 */
602
	if (!revs->prune)
L
Linus Torvalds 已提交
603 604
		return;

605 606 607 608
	if (!commit->tree)
		return;

	if (!commit->parents) {
609
		if (rev_same_tree_as_empty(revs, commit))
610
			commit->object.flags |= TREESAME;
611 612 613
		return;
	}

L
Linus Torvalds 已提交
614 615 616 617
	/*
	 * Normal non-merge commit? If we don't want to make the
	 * history dense, we consider it always to be a change..
	 */
618
	if (!revs->dense && !commit->parents->next)
L
Linus Torvalds 已提交
619 620
		return;

621
	for (pp = &commit->parents, nth_parent = 0, relevant_parents = 0;
622 623
	     (parent = *pp) != NULL;
	     pp = &parent->next, nth_parent++) {
624
		struct commit *p = parent->item;
625 626
		if (relevant_commit(p))
			relevant_parents++;
627

628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649
		if (nth_parent == 1) {
			/*
			 * This our second loop iteration - so we now know
			 * we're dealing with a merge.
			 *
			 * Do not compare with later parents when we care only about
			 * the first parent chain, in order to avoid derailing the
			 * traversal to follow a side branch that brought everything
			 * in the path we are limited to by the pathspec.
			 */
			if (revs->first_parent_only)
				break;
			/*
			 * If this will remain a potentially-simplifiable
			 * merge, remember per-parent treesame if needed.
			 * Initialise the array with the comparison from our
			 * first iteration.
			 */
			if (revs->treesame.name &&
			    !revs->simplify_history &&
			    !(commit->object.flags & UNINTERESTING)) {
				ts = initialise_treesame(revs, commit);
650
				if (!(irrelevant_change || relevant_change))
651 652 653
					ts->treesame[0] = 1;
			}
		}
654 655
		if (parse_commit(p) < 0)
			die("cannot simplify commit %s (because of %s)",
656 657
			    oid_to_hex(&commit->object.oid),
			    oid_to_hex(&p->object.oid));
658
		switch (rev_compare_tree(revs, p, commit)) {
659
		case REV_TREE_SAME:
660
			if (!revs->simplify_history || !relevant_commit(p)) {
661 662 663 664 665 666
				/* Even if a merge with an uninteresting
				 * side branch brought the entire change
				 * we are interested in, we do not want
				 * to lose the other branches of this
				 * merge, so we just keep going.
				 */
667 668
				if (ts)
					ts->treesame[nth_parent] = 1;
669 670
				continue;
			}
671 672
			parent->next = NULL;
			commit->parents = parent;
673
			commit->object.flags |= TREESAME;
674 675
			return;

676 677
		case REV_TREE_NEW:
			if (revs->remove_empty_trees &&
678
			    rev_same_tree_as_empty(revs, p)) {
679 680 681 682 683 684 685
				/* We are adding all the specified
				 * paths from this parent, so the
				 * history beyond this parent is not
				 * interesting.  Remove its parents
				 * (they are grandparents for us).
				 * IOW, we pretend this parent is a
				 * "root" commit.
686
				 */
687 688
				if (parse_commit(p) < 0)
					die("cannot simplify commit %s (invalid %s)",
689 690
					    oid_to_hex(&commit->object.oid),
					    oid_to_hex(&p->object.oid));
691
				p->parents = NULL;
692 693
			}
		/* fallthrough */
694
		case REV_TREE_OLD:
695
		case REV_TREE_DIFFERENT:
696 697 698 699
			if (relevant_commit(p))
				relevant_change = 1;
			else
				irrelevant_change = 1;
700 701
			continue;
		}
702
		die("bad tree compare for commit %s", oid_to_hex(&commit->object.oid));
703
	}
704 705 706 707 708 709 710 711 712 713 714 715 716

	/*
	 * TREESAME is straightforward for single-parent commits. For merge
	 * commits, it is most useful to define it so that "irrelevant"
	 * parents cannot make us !TREESAME - if we have any relevant
	 * parents, then we only consider TREESAMEness with respect to them,
	 * allowing irrelevant merges from uninteresting branches to be
	 * simplified away. Only if we have only irrelevant parents do we
	 * base TREESAME on them. Note that this logic is replicated in
	 * update_treesame, which should be kept in sync.
	 */
	if (relevant_parents ? !relevant_change : !irrelevant_change)
		commit->object.flags |= TREESAME;
717 718
}

719
static void commit_list_insert_by_date_cached(struct commit *p, struct commit_list **head,
720 721 722 723 724
		    struct commit_list *cached_base, struct commit_list **cache)
{
	struct commit_list *new_entry;

	if (cached_base && p->date < cached_base->item->date)
725
		new_entry = commit_list_insert_by_date(p, &cached_base->next);
726
	else
727
		new_entry = commit_list_insert_by_date(p, head);
728 729 730 731 732 733 734

	if (cache && (!*cache || p->date < (*cache)->item->date))
		*cache = new_entry;
}

static int add_parents_to_list(struct rev_info *revs, struct commit *commit,
		    struct commit_list **list, struct commit_list **cache_ptr)
735 736
{
	struct commit_list *parent = commit->parents;
J
Junio C Hamano 已提交
737
	unsigned left_flag;
738
	struct commit_list *cached_base = cache_ptr ? *cache_ptr : NULL;
739

740
	if (commit->object.flags & ADDED)
741
		return 0;
742 743
	commit->object.flags |= ADDED;

744 745 746 747
	if (revs->include_check &&
	    !revs->include_check(commit, revs->include_check_data))
		return 0;

748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
	/*
	 * If the commit is uninteresting, don't try to
	 * prune parents - we want the maximal uninteresting
	 * set.
	 *
	 * Normally we haven't parsed the parent
	 * yet, so we won't have a parent of a parent
	 * here. However, it may turn out that we've
	 * reached this commit some other way (where it
	 * wasn't uninteresting), in which case we need
	 * to mark its parents recursively too..
	 */
	if (commit->object.flags & UNINTERESTING) {
		while (parent) {
			struct commit *p = parent->item;
			parent = parent->next;
764 765
			if (p)
				p->object.flags |= UNINTERESTING;
766
			if (parse_commit_gently(p, 1) < 0)
767
				continue;
768 769 770 771 772
			if (p->parents)
				mark_parents_uninteresting(p);
			if (p->object.flags & SEEN)
				continue;
			p->object.flags |= SEEN;
773
			commit_list_insert_by_date_cached(p, list, cached_base, cache_ptr);
774
		}
775
		return 0;
776 777 778 779 780 781 782
	}

	/*
	 * Ok, the commit wasn't uninteresting. Try to
	 * simplify the commit history and find the parent
	 * that has no differences in the path set if one exists.
	 */
L
Linus Torvalds 已提交
783
	try_to_simplify_commit(revs, commit);
784

L
Linus Torvalds 已提交
785
	if (revs->no_walk)
786
		return 0;
L
Linus Torvalds 已提交
787

J
Junio C Hamano 已提交
788
	left_flag = (commit->object.flags & SYMMETRIC_LEFT);
789

790
	for (parent = commit->parents; parent; parent = parent->next) {
791 792
		struct commit *p = parent->item;

793
		if (parse_commit_gently(p, revs->ignore_missing_links) < 0)
794
			return -1;
795 796
		if (revs->show_source && !p->util)
			p->util = commit->util;
J
Junio C Hamano 已提交
797
		p->object.flags |= left_flag;
798 799
		if (!(p->object.flags & SEEN)) {
			p->object.flags |= SEEN;
800
			commit_list_insert_by_date_cached(p, list, cached_base, cache_ptr);
801
		}
J
Junio C Hamano 已提交
802
		if (revs->first_parent_only)
803
			break;
804
	}
805
	return 0;
806 807
}

808
static void cherry_pick_list(struct commit_list *list, struct rev_info *revs)
J
Junio C Hamano 已提交
809 810 811 812 813
{
	struct commit_list *p;
	int left_count = 0, right_count = 0;
	int left_first;
	struct patch_ids ids;
814
	unsigned cherry_flag;
J
Junio C Hamano 已提交
815 816 817 818 819 820 821 822 823 824 825 826 827

	/* First count the commits on the left and on the right */
	for (p = list; p; p = p->next) {
		struct commit *commit = p->item;
		unsigned flags = commit->object.flags;
		if (flags & BOUNDARY)
			;
		else if (flags & SYMMETRIC_LEFT)
			left_count++;
		else
			right_count++;
	}

828 829 830
	if (!left_count || !right_count)
		return;

J
Junio C Hamano 已提交
831 832
	left_first = left_count < right_count;
	init_patch_ids(&ids);
833
	ids.diffopts.pathspec = revs->diffopt.pathspec;
J
Junio C Hamano 已提交
834 835 836 837 838 839 840 841 842 843 844 845 846 847 848

	/* Compute patch-ids for one side */
	for (p = list; p; p = p->next) {
		struct commit *commit = p->item;
		unsigned flags = commit->object.flags;

		if (flags & BOUNDARY)
			continue;
		/*
		 * If we have fewer left, left_first is set and we omit
		 * commits on the right branch in this loop.  If we have
		 * fewer right, we skip the left ones.
		 */
		if (left_first != !!(flags & SYMMETRIC_LEFT))
			continue;
849
		add_commit_patch_id(commit, &ids);
J
Junio C Hamano 已提交
850 851
	}

852 853 854
	/* either cherry_mark or cherry_pick are true */
	cherry_flag = revs->cherry_mark ? PATCHSAME : SHOWN;

J
Junio C Hamano 已提交
855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876
	/* Check the other side */
	for (p = list; p; p = p->next) {
		struct commit *commit = p->item;
		struct patch_id *id;
		unsigned flags = commit->object.flags;

		if (flags & BOUNDARY)
			continue;
		/*
		 * If we have fewer left, left_first is set and we omit
		 * commits on the left branch in this loop.
		 */
		if (left_first == !!(flags & SYMMETRIC_LEFT))
			continue;

		/*
		 * Have we seen the same patch id?
		 */
		id = has_commit_patch_id(commit, &ids);
		if (!id)
			continue;

877 878
		commit->object.flags |= cherry_flag;
		id->commit->object.flags |= cherry_flag;
J
Junio C Hamano 已提交
879 880 881 882 883
	}

	free_patch_ids(&ids);
}

884 885 886
/* How many extra uninteresting commits we want to see.. */
#define SLOP 5

887 888
static int still_interesting(struct commit_list *src, unsigned long date, int slop,
			     struct commit **interesting_cache)
889
{
890 891 892 893 894 895 896 897 898 899
	/*
	 * No source list at all? We're definitely done..
	 */
	if (!src)
		return 0;

	/*
	 * Does the destination list contain entries with a date
	 * before the source list? Definitely _not_ done.
	 */
900
	if (date <= src->item->date)
901 902 903 904 905 906
		return SLOP;

	/*
	 * Does the source list still have interesting commits in
	 * it? Definitely not done..
	 */
907
	if (!everybody_uninteresting(src, interesting_cache))
908 909 910 911
		return SLOP;

	/* Ok, we're closing in.. */
	return slop-1;
912 913
}

J
Junio C Hamano 已提交
914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991
/*
 * "rev-list --ancestry-path A..B" computes commits that are ancestors
 * of B but not ancestors of A but further limits the result to those
 * that are descendants of A.  This takes the list of bottom commits and
 * the result of "A..B" without --ancestry-path, and limits the latter
 * further to the ones that can reach one of the commits in "bottom".
 */
static void limit_to_ancestry(struct commit_list *bottom, struct commit_list *list)
{
	struct commit_list *p;
	struct commit_list *rlist = NULL;
	int made_progress;

	/*
	 * Reverse the list so that it will be likely that we would
	 * process parents before children.
	 */
	for (p = list; p; p = p->next)
		commit_list_insert(p->item, &rlist);

	for (p = bottom; p; p = p->next)
		p->item->object.flags |= TMP_MARK;

	/*
	 * Mark the ones that can reach bottom commits in "list",
	 * in a bottom-up fashion.
	 */
	do {
		made_progress = 0;
		for (p = rlist; p; p = p->next) {
			struct commit *c = p->item;
			struct commit_list *parents;
			if (c->object.flags & (TMP_MARK | UNINTERESTING))
				continue;
			for (parents = c->parents;
			     parents;
			     parents = parents->next) {
				if (!(parents->item->object.flags & TMP_MARK))
					continue;
				c->object.flags |= TMP_MARK;
				made_progress = 1;
				break;
			}
		}
	} while (made_progress);

	/*
	 * NEEDSWORK: decide if we want to remove parents that are
	 * not marked with TMP_MARK from commit->parents for commits
	 * in the resulting list.  We may not want to do that, though.
	 */

	/*
	 * The ones that are not marked with TMP_MARK are uninteresting
	 */
	for (p = list; p; p = p->next) {
		struct commit *c = p->item;
		if (c->object.flags & TMP_MARK)
			continue;
		c->object.flags |= UNINTERESTING;
	}

	/* We are done with the TMP_MARK */
	for (p = list; p; p = p->next)
		p->item->object.flags &= ~TMP_MARK;
	for (p = bottom; p; p = p->next)
		p->item->object.flags &= ~TMP_MARK;
	free_commit_list(rlist);
}

/*
 * Before walking the history, keep the set of "negative" refs the
 * caller has asked to exclude.
 *
 * This is used to compute "rev-list --ancestry-path A..B", as we need
 * to filter the result of "A..B" further to the ones that can actually
 * reach A.
 */
992
static struct commit_list *collect_bottom_commits(struct commit_list *list)
J
Junio C Hamano 已提交
993
{
994 995 996 997
	struct commit_list *elem, *bottom = NULL;
	for (elem = list; elem; elem = elem->next)
		if (elem->item->object.flags & BOTTOM)
			commit_list_insert(elem->item, &bottom);
J
Junio C Hamano 已提交
998 999 1000
	return bottom;
}

1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
/* Assumes either left_only or right_only is set */
static void limit_left_right(struct commit_list *list, struct rev_info *revs)
{
	struct commit_list *p;

	for (p = list; p; p = p->next) {
		struct commit *commit = p->item;

		if (revs->right_only) {
			if (commit->object.flags & SYMMETRIC_LEFT)
				commit->object.flags |= SHOWN;
		} else	/* revs->left_only is set */
			if (!(commit->object.flags & SYMMETRIC_LEFT))
				commit->object.flags |= SHOWN;
	}
}

1018
static int limit_list(struct rev_info *revs)
1019
{
1020 1021
	int slop = SLOP;
	unsigned long date = ~0ul;
1022 1023 1024
	struct commit_list *list = revs->commits;
	struct commit_list *newlist = NULL;
	struct commit_list **p = &newlist;
J
Junio C Hamano 已提交
1025
	struct commit_list *bottom = NULL;
1026
	struct commit *interesting_cache = NULL;
J
Junio C Hamano 已提交
1027 1028

	if (revs->ancestry_path) {
1029
		bottom = collect_bottom_commits(list);
J
Junio C Hamano 已提交
1030
		if (!bottom)
1031
			die("--ancestry-path given but there are no bottom commits");
J
Junio C Hamano 已提交
1032
	}
1033 1034

	while (list) {
1035
		struct commit *commit = pop_commit(&list);
1036
		struct object *obj = &commit->object;
1037
		show_early_output_fn_t show;
1038

1039 1040 1041
		if (commit == interesting_cache)
			interesting_cache = NULL;

1042 1043
		if (revs->max_age != -1 && (commit->date < revs->max_age))
			obj->flags |= UNINTERESTING;
1044
		if (add_parents_to_list(revs, commit, &list, NULL) < 0)
1045
			return -1;
1046 1047
		if (obj->flags & UNINTERESTING) {
			mark_parents_uninteresting(commit);
1048 1049
			if (revs->show_all)
				p = &commit_list_insert(commit, p)->next;
1050
			slop = still_interesting(list, date, slop, &interesting_cache);
1051
			if (slop)
1052
				continue;
1053 1054 1055 1056
			/* If showing all, add the whole pending list to the end */
			if (revs->show_all)
				*p = list;
			break;
1057 1058 1059
		}
		if (revs->min_age != -1 && (commit->date > revs->min_age))
			continue;
1060
		date = commit->date;
1061
		p = &commit_list_insert(commit, p)->next;
1062 1063 1064 1065 1066 1067 1068

		show = show_early_output;
		if (!show)
			continue;

		show(revs, newlist);
		show_early_output = NULL;
1069
	}
1070
	if (revs->cherry_pick || revs->cherry_mark)
1071
		cherry_pick_list(newlist, revs);
J
Junio C Hamano 已提交
1072

1073 1074 1075
	if (revs->left_only || revs->right_only)
		limit_left_right(newlist, revs);

J
Junio C Hamano 已提交
1076 1077 1078 1079 1080
	if (bottom) {
		limit_to_ancestry(bottom, newlist);
		free_commit_list(bottom);
	}

1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092
	/*
	 * Check if any commits have become TREESAME by some of their parents
	 * becoming UNINTERESTING.
	 */
	if (limiting_can_increase_treesame(revs))
		for (list = newlist; list; list = list->next) {
			struct commit *c = list->item;
			if (c->object.flags & (UNINTERESTING | TREESAME))
				continue;
			update_treesame(revs, c);
		}

1093
	revs->commits = newlist;
1094
	return 0;
1095 1096
}

1097 1098 1099 1100
/*
 * Add an entry to refs->cmdline with the specified information.
 * *name is copied.
 */
1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111
static void add_rev_cmdline(struct rev_info *revs,
			    struct object *item,
			    const char *name,
			    int whence,
			    unsigned flags)
{
	struct rev_cmdline_info *info = &revs->cmdline;
	int nr = info->nr;

	ALLOC_GROW(info->rev, nr + 1, info->alloc);
	info->rev[nr].item = item;
1112
	info->rev[nr].name = xstrdup(name);
1113 1114 1115 1116 1117
	info->rev[nr].whence = whence;
	info->rev[nr].flags = flags;
	info->nr++;
}

1118 1119 1120 1121 1122 1123 1124
static void add_rev_cmdline_list(struct rev_info *revs,
				 struct commit_list *commit_list,
				 int whence,
				 unsigned flags)
{
	while (commit_list) {
		struct object *object = &commit_list->item->object;
1125
		add_rev_cmdline(revs, object, oid_to_hex(&object->oid),
1126 1127 1128 1129 1130
				whence, flags);
		commit_list = commit_list->next;
	}
}

1131 1132
struct all_refs_cb {
	int all_flags;
1133
	int warned_bad_reflog;
1134 1135 1136
	struct rev_info *all_revs;
	const char *name_for_errormsg;
};
1137

1138
int ref_excluded(struct string_list *ref_excludes, const char *path)
1139 1140 1141
{
	struct string_list_item *item;

1142
	if (!ref_excludes)
1143
		return 0;
1144
	for_each_string_list_item(item, ref_excludes) {
1145
		if (!wildmatch(item->string, path, 0, NULL))
1146 1147 1148 1149 1150
			return 1;
	}
	return 0;
}

1151 1152
static int handle_one_ref(const char *path, const struct object_id *oid,
			  int flag, void *cb_data)
1153
{
1154
	struct all_refs_cb *cb = cb_data;
1155 1156
	struct object *object;

1157
	if (ref_excluded(cb->all_revs->ref_excludes, path))
1158 1159
	    return 0;

1160
	object = get_reference(cb->all_revs, path, oid->hash, cb->all_flags);
1161
	add_rev_cmdline(cb->all_revs, object, path, REV_CMD_REF, cb->all_flags);
1162
	add_pending_sha1(cb->all_revs, path, oid->hash, cb->all_flags);
1163 1164 1165
	return 0;
}

I
Ilari Liusvaara 已提交
1166 1167 1168 1169 1170 1171 1172
static void init_all_refs_cb(struct all_refs_cb *cb, struct rev_info *revs,
	unsigned flags)
{
	cb->all_revs = revs;
	cb->all_flags = flags;
}

1173
void clear_ref_exclusion(struct string_list **ref_excludes_p)
1174
{
1175 1176 1177
	if (*ref_excludes_p) {
		string_list_clear(*ref_excludes_p, 0);
		free(*ref_excludes_p);
1178
	}
1179
	*ref_excludes_p = NULL;
1180 1181
}

1182
void add_ref_exclusion(struct string_list **ref_excludes_p, const char *exclude)
1183
{
1184 1185 1186
	if (!*ref_excludes_p) {
		*ref_excludes_p = xcalloc(1, sizeof(**ref_excludes_p));
		(*ref_excludes_p)->strdup_strings = 1;
1187
	}
1188
	string_list_append(*ref_excludes_p, exclude);
1189 1190
}

1191 1192
static void handle_refs(const char *submodule, struct rev_info *revs, unsigned flags,
		int (*for_each)(const char *, each_ref_fn, void *))
1193
{
1194
	struct all_refs_cb cb;
I
Ilari Liusvaara 已提交
1195
	init_all_refs_cb(&cb, revs, flags);
1196
	for_each(submodule, handle_one_ref, &cb);
1197 1198
}

1199
static void handle_one_reflog_commit(struct object_id *oid, void *cb_data)
1200 1201
{
	struct all_refs_cb *cb = cb_data;
1202 1203
	if (!is_null_oid(oid)) {
		struct object *o = parse_object(oid->hash);
1204 1205
		if (o) {
			o->flags |= cb->all_flags;
1206
			/* ??? CMDLINEFLAGS ??? */
1207 1208 1209
			add_pending_object(cb->all_revs, o, "");
		}
		else if (!cb->warned_bad_reflog) {
1210
			warning("reflog of '%s' references pruned commits",
1211 1212 1213
				cb->name_for_errormsg);
			cb->warned_bad_reflog = 1;
		}
1214
	}
1215 1216
}

1217
static int handle_one_reflog_ent(struct object_id *ooid, struct object_id *noid,
1218 1219
		const char *email, unsigned long timestamp, int tz,
		const char *message, void *cb_data)
1220
{
1221 1222
	handle_one_reflog_commit(ooid, cb_data);
	handle_one_reflog_commit(noid, cb_data);
1223 1224 1225
	return 0;
}

1226 1227
static int handle_one_reflog(const char *path, const struct object_id *oid,
			     int flag, void *cb_data)
1228 1229
{
	struct all_refs_cb *cb = cb_data;
1230
	cb->warned_bad_reflog = 0;
1231 1232 1233 1234 1235
	cb->name_for_errormsg = path;
	for_each_reflog_ent(path, handle_one_reflog_ent, cb_data);
	return 0;
}

1236
void add_reflogs_to_pending(struct rev_info *revs, unsigned flags)
1237 1238
{
	struct all_refs_cb cb;
1239

1240 1241
	cb.all_revs = revs;
	cb.all_flags = flags;
1242
	for_each_reflog(handle_one_reflog, &cb);
1243 1244
}

J
Jeff King 已提交
1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277
static void add_cache_tree(struct cache_tree *it, struct rev_info *revs,
			   struct strbuf *path)
{
	size_t baselen = path->len;
	int i;

	if (it->entry_count >= 0) {
		struct tree *tree = lookup_tree(it->sha1);
		add_pending_object_with_path(revs, &tree->object, "",
					     040000, path->buf);
	}

	for (i = 0; i < it->subtree_nr; i++) {
		struct cache_tree_sub *sub = it->down[i];
		strbuf_addf(path, "%s%s", baselen ? "/" : "", sub->name);
		add_cache_tree(sub->cache_tree, revs, path);
		strbuf_setlen(path, baselen);
	}

}

void add_index_objects_to_pending(struct rev_info *revs, unsigned flags)
{
	int i;

	read_cache();
	for (i = 0; i < active_nr; i++) {
		struct cache_entry *ce = active_cache[i];
		struct blob *blob;

		if (S_ISGITLINK(ce->ce_mode))
			continue;

1278
		blob = lookup_blob(ce->oid.hash);
J
Jeff King 已提交
1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291
		if (!blob)
			die("unable to add index blob to traversal");
		add_pending_object_with_path(revs, &blob->object, "",
					     ce->ce_mode, ce->name);
	}

	if (active_cache_tree) {
		struct strbuf path = STRBUF_INIT;
		add_cache_tree(active_cache_tree, revs, &path);
		strbuf_release(&path);
	}
}

1292 1293
static int add_parents_only(struct rev_info *revs, const char *arg_, int flags,
			    int exclude_parent)
1294 1295 1296 1297 1298
{
	unsigned char sha1[20];
	struct object *it;
	struct commit *commit;
	struct commit_list *parents;
1299
	int parent_number;
1300
	const char *arg = arg_;
1301 1302

	if (*arg == '^') {
1303
		flags ^= UNINTERESTING | BOTTOM;
1304 1305
		arg++;
	}
1306
	if (get_sha1_committish(arg, sha1))
1307 1308 1309
		return 0;
	while (1) {
		it = get_reference(revs, arg, sha1, 0);
J
Junio C Hamano 已提交
1310 1311
		if (!it && revs->ignore_missing)
			return 0;
1312
		if (it->type != OBJ_TAG)
1313
			break;
1314 1315
		if (!((struct tag*)it)->tagged)
			return 0;
B
brian m. carlson 已提交
1316
		hashcpy(sha1, ((struct tag*)it)->tagged->oid.hash);
1317
	}
1318
	if (it->type != OBJ_COMMIT)
1319 1320
		return 0;
	commit = (struct commit *)it;
1321 1322 1323 1324 1325 1326 1327 1328 1329
	if (exclude_parent &&
	    exclude_parent > commit_list_count(commit->parents))
		return 0;
	for (parents = commit->parents, parent_number = 1;
	     parents;
	     parents = parents->next, parent_number++) {
		if (exclude_parent && parent_number != exclude_parent)
			continue;

1330 1331
		it = &parents->item->object;
		it->flags |= flags;
1332
		add_rev_cmdline(revs, it, arg_, REV_CMD_PARENTS_ONLY, flags);
1333 1334 1335 1336 1337
		add_pending_object(revs, it, arg);
	}
	return 1;
}

1338
void init_revisions(struct rev_info *revs, const char *prefix)
1339 1340
{
	memset(revs, 0, sizeof(*revs));
1341

1342
	revs->abbrev = DEFAULT_ABBREV;
1343
	revs->ignore_merges = 1;
L
Linus Torvalds 已提交
1344
	revs->simplify_history = 1;
1345
	DIFF_OPT_SET(&revs->pruning, RECURSIVE);
1346
	DIFF_OPT_SET(&revs->pruning, QUICK);
1347 1348
	revs->pruning.add_remove = file_add_remove;
	revs->pruning.change = file_change;
J
Junio C Hamano 已提交
1349
	revs->sort_order = REV_SORT_IN_GRAPH_ORDER;
1350
	revs->dense = 1;
1351
	revs->prefix = prefix;
1352 1353
	revs->max_age = -1;
	revs->min_age = -1;
J
Junio C Hamano 已提交
1354
	revs->skip_count = -1;
1355
	revs->max_count = -1;
1356
	revs->max_parents = -1;
1357
	revs->expand_tabs_in_log = -1;
1358

1359
	revs->commit_format = CMIT_FMT_DEFAULT;
1360
	revs->expand_tabs_in_log_default = 8;
1361

1362 1363
	init_grep_defaults();
	grep_init(&revs->grep_filter, prefix);
J
Jeff King 已提交
1364 1365 1366
	revs->grep_filter.status_only = 1;
	revs->grep_filter.regflags = REG_NEWLINE;

1367
	diff_setup(&revs->diffopt);
1368
	if (prefix && !revs->diffopt.prefix) {
1369 1370 1371
		revs->diffopt.prefix = prefix;
		revs->diffopt.prefix_length = strlen(prefix);
	}
1372 1373

	revs->notes_opt.use_default_notes = -1;
1374 1375
}

R
Rene Scharfe 已提交
1376 1377 1378 1379 1380 1381 1382
static void add_pending_commit_list(struct rev_info *revs,
                                    struct commit_list *commit_list,
                                    unsigned int flags)
{
	while (commit_list) {
		struct object *object = &commit_list->item->object;
		object->flags |= flags;
1383
		add_pending_object(revs, object, oid_to_hex(&object->oid));
R
Rene Scharfe 已提交
1384 1385 1386 1387
		commit_list = commit_list->next;
	}
}

1388 1389 1390 1391 1392 1393 1394 1395
static void prepare_show_merge(struct rev_info *revs)
{
	struct commit_list *bases;
	struct commit *head, *other;
	unsigned char sha1[20];
	const char **prune = NULL;
	int i, prune_num = 1; /* counting terminating NULL */

1396
	if (get_sha1("HEAD", sha1))
1397
		die("--merge without HEAD?");
1398 1399
	head = lookup_commit_or_die(sha1, "HEAD");
	if (get_sha1("MERGE_HEAD", sha1))
1400
		die("--merge without MERGE_HEAD?");
1401
	other = lookup_commit_or_die(sha1, "MERGE_HEAD");
1402 1403
	add_pending_object(revs, &head->object, "HEAD");
	add_pending_object(revs, &other->object, "MERGE_HEAD");
1404
	bases = get_merge_bases(head, other);
1405 1406
	add_rev_cmdline_list(revs, bases, REV_CMD_MERGE_BASE, UNINTERESTING | BOTTOM);
	add_pending_commit_list(revs, bases, UNINTERESTING | BOTTOM);
1407 1408
	free_commit_list(bases);
	head->object.flags |= SYMMETRIC_LEFT;
1409 1410 1411 1412

	if (!active_nr)
		read_cache();
	for (i = 0; i < active_nr; i++) {
1413
		const struct cache_entry *ce = active_cache[i];
1414 1415
		if (!ce_stage(ce))
			continue;
1416
		if (ce_path_match(ce, &revs->prune_data, NULL)) {
1417
			prune_num++;
1418
			REALLOC_ARRAY(prune, prune_num);
1419 1420 1421 1422 1423 1424 1425
			prune[prune_num-2] = ce->name;
			prune[prune_num-1] = NULL;
		}
		while ((i+1 < active_nr) &&
		       ce_same_name(ce, active_cache[i+1]))
			i++;
	}
1426
	clear_pathspec(&revs->prune_data);
1427
	parse_pathspec(&revs->prune_data, PATHSPEC_ALL_MAGIC & ~PATHSPEC_LITERAL,
1428
		       PATHSPEC_PREFER_FULL | PATHSPEC_LITERAL_PATH, "", prune);
1429
	revs->limited = 1;
1430 1431
}

1432
int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsigned revarg_opt)
1433
{
1434
	struct object_context oc;
1435
	char *dotdot;
1436
	char *mark;
1437 1438 1439
	struct object *object;
	unsigned char sha1[20];
	int local_flags;
1440
	const char *arg = arg_;
1441
	int cant_be_filename = revarg_opt & REVARG_CANNOT_BE_FILENAME;
1442
	unsigned get_sha1_flags = 0;
1443

1444 1445
	flags = flags & UNINTERESTING ? flags | BOTTOM : flags & ~BOTTOM;

1446 1447 1448 1449 1450 1451 1452 1453
	if (!cant_be_filename && !strcmp(arg, "..")) {
		/*
		 * Just ".."?  That is not a range but the
		 * pathspec for the parent directory.
		 */
		return -1;
	}

1454 1455 1456 1457 1458 1459
	dotdot = strstr(arg, "..");
	if (dotdot) {
		unsigned char from_sha1[20];
		const char *next = dotdot + 2;
		const char *this = arg;
		int symmetric = *next == '.';
1460
		unsigned int flags_exclude = flags ^ (UNINTERESTING | BOTTOM);
1461
		unsigned int a_flags;
1462 1463 1464 1465 1466

		*dotdot = 0;
		next += symmetric;

		if (!*next)
1467
			next = "HEAD";
1468
		if (dotdot == arg)
1469
			this = "HEAD";
1470 1471
		if (!get_sha1_committish(this, from_sha1) &&
		    !get_sha1_committish(next, sha1)) {
1472
			struct object *a_obj, *b_obj;
1473 1474 1475 1476

			if (!cant_be_filename) {
				*dotdot = '.';
				verify_non_filename(revs->prefix, arg);
1477
				*dotdot = '\0';
1478 1479
			}

1480 1481 1482 1483
			a_obj = parse_object(from_sha1);
			b_obj = parse_object(sha1);
			if (!a_obj || !b_obj) {
			missing:
1484
				*dotdot = '.';
1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499
				if (revs->ignore_missing)
					return 0;
				die(symmetric
				    ? "Invalid symmetric difference expression %s"
				    : "Invalid revision range %s", arg);
			}

			if (!symmetric) {
				/* just A..B */
				a_flags = flags_exclude;
			} else {
				/* A...B -- find merge bases between the two */
				struct commit *a, *b;
				struct commit_list *exclude;

1500 1501
				a = lookup_commit_reference(a_obj->oid.hash);
				b = lookup_commit_reference(b_obj->oid.hash);
1502 1503
				if (!a || !b)
					goto missing;
1504
				exclude = get_merge_bases(a, b);
1505 1506 1507
				add_rev_cmdline_list(revs, exclude,
						     REV_CMD_MERGE_BASE,
						     flags_exclude);
1508 1509 1510
				add_pending_commit_list(revs, exclude,
							flags_exclude);
				free_commit_list(exclude);
1511

1512
				a_flags = flags | SYMMETRIC_LEFT;
1513 1514 1515 1516 1517
			}

			a_obj->flags |= a_flags;
			b_obj->flags |= flags;
			add_rev_cmdline(revs, a_obj, this,
1518
					REV_CMD_LEFT, a_flags);
1519
			add_rev_cmdline(revs, b_obj, next,
1520
					REV_CMD_RIGHT, flags);
1521 1522
			add_pending_object(revs, a_obj, this);
			add_pending_object(revs, b_obj, next);
1523
			*dotdot = '.';
1524 1525 1526 1527
			return 0;
		}
		*dotdot = '.';
	}
1528

1529 1530 1531
	mark = strstr(arg, "^@");
	if (mark && !mark[2]) {
		*mark = 0;
1532
		if (add_parents_only(revs, arg, flags, 0))
1533
			return 0;
1534
		*mark = '^';
1535
	}
1536 1537 1538
	mark = strstr(arg, "^!");
	if (mark && !mark[2]) {
		*mark = 0;
1539
		if (!add_parents_only(revs, arg, flags ^ (UNINTERESTING | BOTTOM), 0))
1540
			*mark = '^';
1541
	}
1542 1543
	mark = strstr(arg, "^-");
	if (mark) {
1544 1545
		int exclude_parent = 1;

1546
		if (mark[2]) {
1547
			char *end;
1548
			exclude_parent = strtoul(mark + 2, &end, 10);
1549 1550 1551 1552
			if (*end != '\0' || !exclude_parent)
				return -1;
		}

1553
		*mark = 0;
1554
		if (!add_parents_only(revs, arg, flags ^ (UNINTERESTING | BOTTOM), exclude_parent))
1555
			*mark = '^';
1556 1557
	}

1558 1559
	local_flags = 0;
	if (*arg == '^') {
1560
		local_flags = UNINTERESTING | BOTTOM;
1561 1562
		arg++;
	}
1563 1564 1565 1566 1567

	if (revarg_opt & REVARG_COMMITTISH)
		get_sha1_flags = GET_SHA1_COMMITTISH;

	if (get_sha1_with_context(arg, get_sha1_flags, sha1, &oc))
J
Junio C Hamano 已提交
1568
		return revs->ignore_missing ? 0 : -1;
1569 1570 1571
	if (!cant_be_filename)
		verify_non_filename(revs->prefix, arg);
	object = get_reference(revs, arg, sha1, flags ^ local_flags);
1572
	add_rev_cmdline(revs, object, arg_, REV_CMD_REV, flags ^ local_flags);
1573
	add_pending_object_with_mode(revs, object, arg, oc.mode);
1574 1575 1576
	return 0;
}

1577 1578 1579 1580 1581
struct cmdline_pathspec {
	int alloc;
	int nr;
	const char **path;
};
1582

1583 1584 1585
static void append_prune_data(struct cmdline_pathspec *prune, const char **av)
{
	while (*av) {
F
Felipe Contreras 已提交
1586
		ALLOC_GROW(prune->path, prune->nr + 1, prune->alloc);
1587 1588 1589
		prune->path[prune->nr++] = *(av++);
	}
}
1590

1591 1592 1593
static void read_pathspec_from_stdin(struct rev_info *revs, struct strbuf *sb,
				     struct cmdline_pathspec *prune)
{
1594
	while (strbuf_getline(sb, stdin) != EOF) {
F
Felipe Contreras 已提交
1595
		ALLOC_GROW(prune->path, prune->nr + 1, prune->alloc);
1596
		prune->path[prune->nr++] = xstrdup(sb->buf);
1597 1598 1599
	}
}

1600 1601
static void read_revisions_from_stdin(struct rev_info *revs,
				      struct cmdline_pathspec *prune)
1602
{
1603
	struct strbuf sb;
1604
	int seen_dashdash = 0;
1605 1606 1607 1608
	int save_warning;

	save_warning = warn_on_object_refname_ambiguity;
	warn_on_object_refname_ambiguity = 0;
1609

1610
	strbuf_init(&sb, 1000);
1611
	while (strbuf_getline(&sb, stdin) != EOF) {
1612
		int len = sb.len;
1613 1614
		if (!len)
			break;
1615 1616 1617 1618 1619
		if (sb.buf[0] == '-') {
			if (len == 2 && sb.buf[1] == '-') {
				seen_dashdash = 1;
				break;
			}
1620
			die("options not supported in --stdin mode");
1621
		}
1622
		if (handle_revision_arg(sb.buf, revs, 0,
1623
					REVARG_CANNOT_BE_FILENAME))
1624
			die("bad revision '%s'", sb.buf);
1625
	}
1626 1627
	if (seen_dashdash)
		read_pathspec_from_stdin(revs, &sb, prune);
1628

1629
	strbuf_release(&sb);
1630
	warn_on_object_refname_ambiguity = save_warning;
1631 1632
}

1633
static void add_grep(struct rev_info *revs, const char *ptn, enum grep_pat_token what)
1634
{
J
Jeff King 已提交
1635
	append_grep_pattern(&revs->grep_filter, ptn, "command line", 0, what);
1636 1637
}

1638
static void add_header_grep(struct rev_info *revs, enum grep_header_field field, const char *pattern)
1639
{
1640
	append_header_grep_pattern(&revs->grep_filter, field, pattern);
1641 1642 1643 1644
}

static void add_message_grep(struct rev_info *revs, const char *pattern)
{
1645
	add_grep(revs, pattern, GREP_PATTERN_BODY);
1646 1647
}

1648 1649
static int handle_revision_opt(struct rev_info *revs, int argc, const char **argv,
			       int *unkc, const char **unkv)
1650 1651
{
	const char *arg = argv[0];
1652 1653
	const char *optarg;
	int argcount;
1654 1655 1656 1657 1658

	/* pseudo revision arguments */
	if (!strcmp(arg, "--all") || !strcmp(arg, "--branches") ||
	    !strcmp(arg, "--tags") || !strcmp(arg, "--remotes") ||
	    !strcmp(arg, "--reflog") || !strcmp(arg, "--not") ||
1659
	    !strcmp(arg, "--no-walk") || !strcmp(arg, "--do-walk") ||
1660
	    !strcmp(arg, "--bisect") || starts_with(arg, "--glob=") ||
J
Jeff King 已提交
1661
	    !strcmp(arg, "--indexed-objects") ||
1662
	    starts_with(arg, "--exclude=") ||
1663 1664
	    starts_with(arg, "--branches=") || starts_with(arg, "--tags=") ||
	    starts_with(arg, "--remotes=") || starts_with(arg, "--no-walk="))
1665 1666
	{
		unkv[(*unkc)++] = arg;
1667
		return 1;
1668 1669
	}

1670 1671
	if ((argcount = parse_long_opt("max-count", argv, &optarg))) {
		revs->max_count = atoi(optarg);
1672
		revs->no_walk = 0;
1673 1674 1675 1676
		return argcount;
	} else if ((argcount = parse_long_opt("skip", argv, &optarg))) {
		revs->skip_count = atoi(optarg);
		return argcount;
1677
	} else if ((*arg == '-') && isdigit(arg[1])) {
1678 1679 1680 1681
		/* accept -<digit>, like traditional "head" */
		if (strtol_i(arg + 1, 10, &revs->max_count) < 0 ||
		    revs->max_count < 0)
			die("'%s': not a non-negative integer", arg + 1);
1682
		revs->no_walk = 0;
1683 1684 1685 1686
	} else if (!strcmp(arg, "-n")) {
		if (argc <= 1)
			return error("-n requires an argument");
		revs->max_count = atoi(argv[1]);
1687
		revs->no_walk = 0;
1688
		return 2;
1689
	} else if (starts_with(arg, "-n")) {
1690
		revs->max_count = atoi(arg + 2);
1691
		revs->no_walk = 0;
1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709
	} else if ((argcount = parse_long_opt("max-age", argv, &optarg))) {
		revs->max_age = atoi(optarg);
		return argcount;
	} else if ((argcount = parse_long_opt("since", argv, &optarg))) {
		revs->max_age = approxidate(optarg);
		return argcount;
	} else if ((argcount = parse_long_opt("after", argv, &optarg))) {
		revs->max_age = approxidate(optarg);
		return argcount;
	} else if ((argcount = parse_long_opt("min-age", argv, &optarg))) {
		revs->min_age = atoi(optarg);
		return argcount;
	} else if ((argcount = parse_long_opt("before", argv, &optarg))) {
		revs->min_age = approxidate(optarg);
		return argcount;
	} else if ((argcount = parse_long_opt("until", argv, &optarg))) {
		revs->min_age = approxidate(optarg);
		return argcount;
1710 1711
	} else if (!strcmp(arg, "--first-parent")) {
		revs->first_parent_only = 1;
J
Junio C Hamano 已提交
1712 1713
	} else if (!strcmp(arg, "--ancestry-path")) {
		revs->ancestry_path = 1;
1714
		revs->simplify_history = 0;
J
Junio C Hamano 已提交
1715
		revs->limited = 1;
1716 1717 1718 1719 1720 1721 1722 1723 1724 1725
	} else if (!strcmp(arg, "-g") || !strcmp(arg, "--walk-reflogs")) {
		init_reflog_walk(&revs->reflog_info);
	} else if (!strcmp(arg, "--default")) {
		if (argc <= 1)
			return error("bad --default argument");
		revs->def = argv[1];
		return 2;
	} else if (!strcmp(arg, "--merge")) {
		revs->show_merge = 1;
	} else if (!strcmp(arg, "--topo-order")) {
J
Junio C Hamano 已提交
1726
		revs->sort_order = REV_SORT_IN_GRAPH_ORDER;
1727
		revs->topo_order = 1;
1728 1729
	} else if (!strcmp(arg, "--simplify-merges")) {
		revs->simplify_merges = 1;
1730
		revs->topo_order = 1;
1731 1732 1733
		revs->rewrite_parents = 1;
		revs->simplify_history = 0;
		revs->limited = 1;
1734 1735
	} else if (!strcmp(arg, "--simplify-by-decoration")) {
		revs->simplify_merges = 1;
1736
		revs->topo_order = 1;
1737 1738 1739 1740 1741
		revs->rewrite_parents = 1;
		revs->simplify_history = 0;
		revs->simplify_by_decoration = 1;
		revs->limited = 1;
		revs->prune = 1;
1742
		load_ref_decorations(DECORATE_SHORT_REFS);
1743
	} else if (!strcmp(arg, "--date-order")) {
J
Junio C Hamano 已提交
1744
		revs->sort_order = REV_SORT_BY_COMMIT_DATE;
1745
		revs->topo_order = 1;
J
Junio C Hamano 已提交
1746 1747
	} else if (!strcmp(arg, "--author-date-order")) {
		revs->sort_order = REV_SORT_BY_AUTHOR_DATE;
1748
		revs->topo_order = 1;
1749
	} else if (starts_with(arg, "--early-output")) {
1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769
		int count = 100;
		switch (arg[14]) {
		case '=':
			count = atoi(arg+15);
			/* Fallthrough */
		case 0:
			revs->topo_order = 1;
		       revs->early_output = count;
		}
	} else if (!strcmp(arg, "--parents")) {
		revs->rewrite_parents = 1;
		revs->print_parents = 1;
	} else if (!strcmp(arg, "--dense")) {
		revs->dense = 1;
	} else if (!strcmp(arg, "--sparse")) {
		revs->dense = 0;
	} else if (!strcmp(arg, "--show-all")) {
		revs->show_all = 1;
	} else if (!strcmp(arg, "--remove-empty")) {
		revs->remove_empty_trees = 1;
1770
	} else if (!strcmp(arg, "--merges")) {
1771
		revs->min_parents = 2;
1772
	} else if (!strcmp(arg, "--no-merges")) {
1773
		revs->max_parents = 1;
1774
	} else if (starts_with(arg, "--min-parents=")) {
1775
		revs->min_parents = atoi(arg+14);
1776
	} else if (starts_with(arg, "--no-min-parents")) {
1777
		revs->min_parents = 0;
1778
	} else if (starts_with(arg, "--max-parents=")) {
1779
		revs->max_parents = atoi(arg+14);
1780
	} else if (starts_with(arg, "--no-max-parents")) {
1781
		revs->max_parents = -1;
1782 1783 1784 1785
	} else if (!strcmp(arg, "--boundary")) {
		revs->boundary = 1;
	} else if (!strcmp(arg, "--left-right")) {
		revs->left_right = 1;
1786
	} else if (!strcmp(arg, "--left-only")) {
1787
		if (revs->right_only)
M
Michael J Gruber 已提交
1788 1789
			die("--left-only is incompatible with --right-only"
			    " or --cherry");
1790 1791
		revs->left_only = 1;
	} else if (!strcmp(arg, "--right-only")) {
1792 1793
		if (revs->left_only)
			die("--right-only is incompatible with --left-only");
1794
		revs->right_only = 1;
M
Michael J Gruber 已提交
1795 1796 1797 1798 1799
	} else if (!strcmp(arg, "--cherry")) {
		if (revs->left_only)
			die("--cherry is incompatible with --left-only");
		revs->cherry_mark = 1;
		revs->right_only = 1;
1800
		revs->max_parents = 1;
M
Michael J Gruber 已提交
1801
		revs->limited = 1;
T
Thomas Rast 已提交
1802 1803
	} else if (!strcmp(arg, "--count")) {
		revs->count = 1;
1804 1805 1806 1807 1808
	} else if (!strcmp(arg, "--cherry-mark")) {
		if (revs->cherry_pick)
			die("--cherry-mark is incompatible with --cherry-pick");
		revs->cherry_mark = 1;
		revs->limited = 1; /* needs limit_list() */
1809
	} else if (!strcmp(arg, "--cherry-pick")) {
1810 1811
		if (revs->cherry_mark)
			die("--cherry-pick is incompatible with --cherry-mark");
1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822
		revs->cherry_pick = 1;
		revs->limited = 1;
	} else if (!strcmp(arg, "--objects")) {
		revs->tag_objects = 1;
		revs->tree_objects = 1;
		revs->blob_objects = 1;
	} else if (!strcmp(arg, "--objects-edge")) {
		revs->tag_objects = 1;
		revs->tree_objects = 1;
		revs->blob_objects = 1;
		revs->edge_hint = 1;
1823 1824 1825 1826 1827 1828
	} else if (!strcmp(arg, "--objects-edge-aggressive")) {
		revs->tag_objects = 1;
		revs->tree_objects = 1;
		revs->blob_objects = 1;
		revs->edge_hint = 1;
		revs->edge_hint_aggressive = 1;
J
Junio C Hamano 已提交
1829 1830 1831 1832 1833
	} else if (!strcmp(arg, "--verify-objects")) {
		revs->tag_objects = 1;
		revs->tree_objects = 1;
		revs->blob_objects = 1;
		revs->verify_objects = 1;
1834 1835
	} else if (!strcmp(arg, "--unpacked")) {
		revs->unpacked = 1;
1836
	} else if (starts_with(arg, "--unpacked=")) {
J
Junio C Hamano 已提交
1837
		die("--unpacked=<packfile> no longer supported.");
1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858
	} else if (!strcmp(arg, "-r")) {
		revs->diff = 1;
		DIFF_OPT_SET(&revs->diffopt, RECURSIVE);
	} else if (!strcmp(arg, "-t")) {
		revs->diff = 1;
		DIFF_OPT_SET(&revs->diffopt, RECURSIVE);
		DIFF_OPT_SET(&revs->diffopt, TREE_IN_RECURSIVE);
	} else if (!strcmp(arg, "-m")) {
		revs->ignore_merges = 0;
	} else if (!strcmp(arg, "-c")) {
		revs->diff = 1;
		revs->dense_combined_merges = 0;
		revs->combine_merges = 1;
	} else if (!strcmp(arg, "--cc")) {
		revs->diff = 1;
		revs->dense_combined_merges = 1;
		revs->combine_merges = 1;
	} else if (!strcmp(arg, "-v")) {
		revs->verbose_header = 1;
	} else if (!strcmp(arg, "--pretty")) {
		revs->verbose_header = 1;
1859
		revs->pretty_given = 1;
1860
		get_commit_format(NULL, revs);
1861
	} else if (starts_with(arg, "--pretty=") || starts_with(arg, "--format=")) {
1862 1863 1864 1865
		/*
		 * Detached form ("--pretty X" as opposed to "--pretty=X")
		 * not allowed, since the argument is optional.
		 */
1866
		revs->verbose_header = 1;
1867
		revs->pretty_given = 1;
1868
		get_commit_format(arg+9, revs);
1869
	} else if (!strcmp(arg, "--expand-tabs")) {
1870
		revs->expand_tabs_in_log = 8;
1871 1872
	} else if (!strcmp(arg, "--no-expand-tabs")) {
		revs->expand_tabs_in_log = 0;
1873 1874 1875 1876 1877
	} else if (skip_prefix(arg, "--expand-tabs=", &arg)) {
		int val;
		if (strtol_i(arg, 10, &val) < 0 || val < 0)
			die("'%s': not a non-negative integer", arg);
		revs->expand_tabs_in_log = val;
1878
	} else if (!strcmp(arg, "--show-notes") || !strcmp(arg, "--notes")) {
1879 1880
		revs->show_notes = 1;
		revs->show_notes_given = 1;
1881
		revs->notes_opt.use_default_notes = 1;
J
Junio C Hamano 已提交
1882 1883
	} else if (!strcmp(arg, "--show-signature")) {
		revs->show_signature = 1;
1884 1885
	} else if (!strcmp(arg, "--no-show-signature")) {
		revs->show_signature = 0;
1886 1887 1888 1889 1890 1891 1892 1893
	} else if (!strcmp(arg, "--show-linear-break") ||
		   starts_with(arg, "--show-linear-break=")) {
		if (starts_with(arg, "--show-linear-break="))
			revs->break_bar = xstrdup(arg + 20);
		else
			revs->break_bar = "                    ..........";
		revs->track_linear = 1;
		revs->track_first_time = 1;
1894 1895
	} else if (starts_with(arg, "--show-notes=") ||
		   starts_with(arg, "--notes=")) {
1896 1897 1898
		struct strbuf buf = STRBUF_INIT;
		revs->show_notes = 1;
		revs->show_notes_given = 1;
1899
		if (starts_with(arg, "--show-notes")) {
1900 1901 1902 1903 1904 1905
			if (revs->notes_opt.use_default_notes < 0)
				revs->notes_opt.use_default_notes = 1;
			strbuf_addstr(&buf, arg+13);
		}
		else
			strbuf_addstr(&buf, arg+8);
1906
		expand_notes_ref(&buf);
1907
		string_list_append(&revs->notes_opt.extra_notes_refs,
1908
				   strbuf_detach(&buf, NULL));
1909 1910 1911
	} else if (!strcmp(arg, "--no-notes")) {
		revs->show_notes = 0;
		revs->show_notes_given = 1;
1912 1913 1914 1915 1916 1917
		revs->notes_opt.use_default_notes = -1;
		/* we have been strdup'ing ourselves, so trick
		 * string_list into free()ing strings */
		revs->notes_opt.extra_notes_refs.strdup_strings = 1;
		string_list_clear(&revs->notes_opt.extra_notes_refs, 0);
		revs->notes_opt.extra_notes_refs.strdup_strings = 0;
1918 1919
	} else if (!strcmp(arg, "--standard-notes")) {
		revs->show_notes_given = 1;
1920
		revs->notes_opt.use_default_notes = 1;
1921
	} else if (!strcmp(arg, "--no-standard-notes")) {
1922
		revs->notes_opt.use_default_notes = 0;
1923 1924 1925
	} else if (!strcmp(arg, "--oneline")) {
		revs->verbose_header = 1;
		get_commit_format("oneline", revs);
1926
		revs->pretty_given = 1;
1927
		revs->abbrev_commit = 1;
1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941
	} else if (!strcmp(arg, "--graph")) {
		revs->topo_order = 1;
		revs->rewrite_parents = 1;
		revs->graph = graph_init(revs);
	} else if (!strcmp(arg, "--root")) {
		revs->show_root_diff = 1;
	} else if (!strcmp(arg, "--no-commit-id")) {
		revs->no_commit_id = 1;
	} else if (!strcmp(arg, "--always")) {
		revs->always_show_header = 1;
	} else if (!strcmp(arg, "--no-abbrev")) {
		revs->abbrev = 0;
	} else if (!strcmp(arg, "--abbrev")) {
		revs->abbrev = DEFAULT_ABBREV;
1942
	} else if (starts_with(arg, "--abbrev=")) {
1943 1944 1945 1946 1947 1948 1949
		revs->abbrev = strtoul(arg + 9, NULL, 10);
		if (revs->abbrev < MINIMUM_ABBREV)
			revs->abbrev = MINIMUM_ABBREV;
		else if (revs->abbrev > 40)
			revs->abbrev = 40;
	} else if (!strcmp(arg, "--abbrev-commit")) {
		revs->abbrev_commit = 1;
1950 1951 1952
		revs->abbrev_commit_given = 1;
	} else if (!strcmp(arg, "--no-abbrev-commit")) {
		revs->abbrev_commit = 0;
1953 1954 1955 1956 1957 1958
	} else if (!strcmp(arg, "--full-diff")) {
		revs->diff = 1;
		revs->full_diff = 1;
	} else if (!strcmp(arg, "--full-history")) {
		revs->simplify_history = 0;
	} else if (!strcmp(arg, "--relative-date")) {
1959
		revs->date_mode.type = DATE_RELATIVE;
J
Jeff King 已提交
1960
		revs->date_mode_explicit = 1;
1961
	} else if ((argcount = parse_long_opt("date", argv, &optarg))) {
1962
		parse_date_format(optarg, &revs->date_mode);
J
Jeff King 已提交
1963
		revs->date_mode_explicit = 1;
1964
		return argcount;
1965 1966 1967 1968 1969 1970
	} else if (!strcmp(arg, "--log-size")) {
		revs->show_log_size = 1;
	}
	/*
	 * Grepping the commit log
	 */
1971 1972 1973 1974 1975 1976
	else if ((argcount = parse_long_opt("author", argv, &optarg))) {
		add_header_grep(revs, GREP_HEADER_AUTHOR, optarg);
		return argcount;
	} else if ((argcount = parse_long_opt("committer", argv, &optarg))) {
		add_header_grep(revs, GREP_HEADER_COMMITTER, optarg);
		return argcount;
1977 1978 1979
	} else if ((argcount = parse_long_opt("grep-reflog", argv, &optarg))) {
		add_header_grep(revs, GREP_HEADER_REFLOG, optarg);
		return argcount;
1980 1981 1982
	} else if ((argcount = parse_long_opt("grep", argv, &optarg))) {
		add_message_grep(revs, optarg);
		return argcount;
1983 1984
	} else if (!strcmp(arg, "--grep-debug")) {
		revs->grep_filter.debug = 1;
1985
	} else if (!strcmp(arg, "--basic-regexp")) {
1986
		revs->grep_filter.pattern_type_option = GREP_PATTERN_TYPE_BRE;
1987
	} else if (!strcmp(arg, "--extended-regexp") || !strcmp(arg, "-E")) {
1988
		revs->grep_filter.pattern_type_option = GREP_PATTERN_TYPE_ERE;
1989
	} else if (!strcmp(arg, "--regexp-ignore-case") || !strcmp(arg, "-i")) {
J
Jeff King 已提交
1990
		revs->grep_filter.regflags |= REG_ICASE;
1991
		DIFF_OPT_SET(&revs->diffopt, PICKAXE_IGNORE_CASE);
1992
	} else if (!strcmp(arg, "--fixed-strings") || !strcmp(arg, "-F")) {
1993
		revs->grep_filter.pattern_type_option = GREP_PATTERN_TYPE_FIXED;
1994
	} else if (!strcmp(arg, "--perl-regexp")) {
1995
		revs->grep_filter.pattern_type_option = GREP_PATTERN_TYPE_PCRE;
1996
	} else if (!strcmp(arg, "--all-match")) {
J
Jeff King 已提交
1997
		revs->grep_filter.all_match = 1;
1998 1999
	} else if (!strcmp(arg, "--invert-grep")) {
		revs->invert_grep = 1;
2000 2001 2002
	} else if ((argcount = parse_long_opt("encoding", argv, &optarg))) {
		if (strcmp(optarg, "none"))
			git_log_output_encoding = xstrdup(optarg);
2003 2004
		else
			git_log_output_encoding = "";
2005
		return argcount;
2006 2007 2008 2009 2010
	} else if (!strcmp(arg, "--reverse")) {
		revs->reverse ^= 1;
	} else if (!strcmp(arg, "--children")) {
		revs->children.name = "children";
		revs->limited = 1;
J
Junio C Hamano 已提交
2011 2012
	} else if (!strcmp(arg, "--ignore-missing")) {
		revs->ignore_missing = 1;
2013
	} else {
2014
		int opts = diff_opt_parse(&revs->diffopt, argv, argc, revs->prefix);
2015 2016 2017 2018
		if (!opts)
			unkv[(*unkc)++] = arg;
		return opts;
	}
2019 2020
	if (revs->graph && revs->track_linear)
		die("--show-linear-break and --graph are incompatible");
2021 2022 2023 2024

	return 1;
}

2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038
void parse_revision_opt(struct rev_info *revs, struct parse_opt_ctx_t *ctx,
			const struct option *options,
			const char * const usagestr[])
{
	int n = handle_revision_opt(revs, ctx->argc, ctx->argv,
				    &ctx->cpidx, ctx->out);
	if (n <= 0) {
		error("unknown option `%s'", ctx->argv[0]);
		usage_with_options(usagestr, options);
	}
	ctx->argv += n;
	ctx->argc -= n;
}

2039 2040 2041 2042 2043 2044 2045 2046 2047
static int for_each_bisect_ref(const char *submodule, each_ref_fn fn, void *cb_data, const char *term) {
	struct strbuf bisect_refs = STRBUF_INIT;
	int status;
	strbuf_addf(&bisect_refs, "refs/bisect/%s", term);
	status = for_each_ref_in_submodule(submodule, bisect_refs.buf, fn, cb_data);
	strbuf_release(&bisect_refs);
	return status;
}

2048
static int for_each_bad_bisect_ref(const char *submodule, each_ref_fn fn, void *cb_data)
2049
{
2050
	return for_each_bisect_ref(submodule, fn, cb_data, term_bad);
2051 2052
}

2053
static int for_each_good_bisect_ref(const char *submodule, each_ref_fn fn, void *cb_data)
2054
{
2055
	return for_each_bisect_ref(submodule, fn, cb_data, term_good);
2056 2057
}

2058 2059 2060 2061 2062 2063 2064 2065
static int handle_revision_pseudo_opt(const char *submodule,
				struct rev_info *revs,
				int argc, const char **argv, int *flags)
{
	const char *arg = argv[0];
	const char *optarg;
	int argcount;

2066 2067 2068 2069 2070 2071 2072 2073 2074 2075
	/*
	 * NOTE!
	 *
	 * Commands like "git shortlog" will not accept the options below
	 * unless parse_revision_opt queues them (as opposed to erroring
	 * out).
	 *
	 * When implementing your new pseudo-option, remember to
	 * register it in the list at the top of handle_revision_opt.
	 */
2076 2077 2078
	if (!strcmp(arg, "--all")) {
		handle_refs(submodule, revs, *flags, for_each_ref_submodule);
		handle_refs(submodule, revs, *flags, head_ref_submodule);
2079
		clear_ref_exclusion(&revs->ref_excludes);
2080 2081
	} else if (!strcmp(arg, "--branches")) {
		handle_refs(submodule, revs, *flags, for_each_branch_ref_submodule);
2082
		clear_ref_exclusion(&revs->ref_excludes);
2083
	} else if (!strcmp(arg, "--bisect")) {
2084
		read_bisect_terms(&term_bad, &term_good);
2085
		handle_refs(submodule, revs, *flags, for_each_bad_bisect_ref);
2086
		handle_refs(submodule, revs, *flags ^ (UNINTERESTING | BOTTOM), for_each_good_bisect_ref);
2087 2088 2089
		revs->bisect = 1;
	} else if (!strcmp(arg, "--tags")) {
		handle_refs(submodule, revs, *flags, for_each_tag_ref_submodule);
2090
		clear_ref_exclusion(&revs->ref_excludes);
2091 2092
	} else if (!strcmp(arg, "--remotes")) {
		handle_refs(submodule, revs, *flags, for_each_remote_ref_submodule);
2093
		clear_ref_exclusion(&revs->ref_excludes);
2094 2095 2096
	} else if ((argcount = parse_long_opt("glob", argv, &optarg))) {
		struct all_refs_cb cb;
		init_all_refs_cb(&cb, revs, *flags);
2097
		for_each_glob_ref(handle_one_ref, optarg, &cb);
2098
		clear_ref_exclusion(&revs->ref_excludes);
2099 2100
		return argcount;
	} else if ((argcount = parse_long_opt("exclude", argv, &optarg))) {
2101
		add_ref_exclusion(&revs->ref_excludes, optarg);
2102
		return argcount;
2103
	} else if (starts_with(arg, "--branches=")) {
2104 2105
		struct all_refs_cb cb;
		init_all_refs_cb(&cb, revs, *flags);
2106
		for_each_glob_ref_in(handle_one_ref, arg + 11, "refs/heads/", &cb);
2107
		clear_ref_exclusion(&revs->ref_excludes);
2108
	} else if (starts_with(arg, "--tags=")) {
2109 2110
		struct all_refs_cb cb;
		init_all_refs_cb(&cb, revs, *flags);
2111
		for_each_glob_ref_in(handle_one_ref, arg + 7, "refs/tags/", &cb);
2112
		clear_ref_exclusion(&revs->ref_excludes);
2113
	} else if (starts_with(arg, "--remotes=")) {
2114 2115
		struct all_refs_cb cb;
		init_all_refs_cb(&cb, revs, *flags);
2116
		for_each_glob_ref_in(handle_one_ref, arg + 10, "refs/remotes/", &cb);
2117
		clear_ref_exclusion(&revs->ref_excludes);
2118
	} else if (!strcmp(arg, "--reflog")) {
2119
		add_reflogs_to_pending(revs, *flags);
J
Jeff King 已提交
2120 2121
	} else if (!strcmp(arg, "--indexed-objects")) {
		add_index_objects_to_pending(revs, *flags);
2122
	} else if (!strcmp(arg, "--not")) {
2123
		*flags ^= UNINTERESTING | BOTTOM;
2124
	} else if (!strcmp(arg, "--no-walk")) {
2125
		revs->no_walk = REVISION_WALK_NO_WALK_SORTED;
2126
	} else if (starts_with(arg, "--no-walk=")) {
2127 2128 2129 2130 2131 2132 2133 2134 2135 2136
		/*
		 * Detached form ("--no-walk X" as opposed to "--no-walk=X")
		 * not allowed, since the argument is optional.
		 */
		if (!strcmp(arg + 10, "sorted"))
			revs->no_walk = REVISION_WALK_NO_WALK_SORTED;
		else if (!strcmp(arg + 10, "unsorted"))
			revs->no_walk = REVISION_WALK_NO_WALK_UNSORTED;
		else
			return error("invalid argument to --no-walk");
2137 2138 2139 2140 2141 2142 2143 2144 2145
	} else if (!strcmp(arg, "--do-walk")) {
		revs->no_walk = 0;
	} else {
		return 0;
	}

	return 1;
}

2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160
static void NORETURN diagnose_missing_default(const char *def)
{
	unsigned char sha1[20];
	int flags;
	const char *refname;

	refname = resolve_ref_unsafe(def, 0, sha1, &flags);
	if (!refname || !(flags & REF_ISSYMREF) || (flags & REF_ISBROKEN))
		die(_("your current branch appears to be broken"));

	skip_prefix(refname, "refs/heads/", &refname);
	die(_("your current branch '%s' does not have any commits yet"),
	    refname);
}

2161 2162 2163 2164
/*
 * Parse revision information, filling in the "rev_info" structure,
 * and removing the used arguments from the argument list.
 *
2165 2166
 * Returns the number of arguments left that weren't recognized
 * (which are also moved to the head of the argument list)
2167
 */
2168
int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct setup_revision_opt *opt)
2169
{
2170
	int i, flags, left, seen_dashdash, read_from_stdin, got_rev_arg = 0, revarg_opt;
2171
	struct cmdline_pathspec prune_data;
2172 2173
	const char *submodule = NULL;

2174
	memset(&prune_data, 0, sizeof(prune_data));
2175 2176
	if (opt)
		submodule = opt->submodule;
2177 2178

	/* First, search for "--" */
2179
	if (opt && opt->assume_dashdash) {
2180
		seen_dashdash = 1;
2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193
	} else {
		seen_dashdash = 0;
		for (i = 1; i < argc; i++) {
			const char *arg = argv[i];
			if (strcmp(arg, "--"))
				continue;
			argv[i] = NULL;
			argc = i;
			if (argv[i + 1])
				append_prune_data(&prune_data, argv + i + 1);
			seen_dashdash = 1;
			break;
		}
2194 2195
	}

2196 2197
	/* Second, deal with arguments and options */
	flags = 0;
2198 2199 2200
	revarg_opt = opt ? opt->revarg_opt : 0;
	if (seen_dashdash)
		revarg_opt |= REVARG_CANNOT_BE_FILENAME;
2201
	read_from_stdin = 0;
2202
	for (left = i = 1; i < argc; i++) {
2203 2204
		const char *arg = argv[i];
		if (*arg == '-') {
2205
			int opts;
2206

2207 2208 2209 2210 2211
			opts = handle_revision_pseudo_opt(submodule,
						revs, argc - i, argv + i,
						&flags);
			if (opts > 0) {
				i += opts - 1;
2212 2213
				continue;
			}
2214

2215 2216 2217 2218 2219 2220 2221
			if (!strcmp(arg, "--stdin")) {
				if (revs->disable_stdin) {
					argv[left++] = arg;
					continue;
				}
				if (read_from_stdin++)
					die("--stdin given twice?");
2222
				read_revisions_from_stdin(revs, &prune_data);
2223 2224
				continue;
			}
2225

2226
			opts = handle_revision_opt(revs, argc - i, argv + i, &left, argv);
2227 2228 2229 2230
			if (opts > 0) {
				i += opts - 1;
				continue;
			}
2231 2232
			if (opts < 0)
				exit(128);
2233 2234 2235
			continue;
		}

2236 2237

		if (handle_revision_arg(arg, revs, flags, revarg_opt)) {
2238 2239
			int j;
			if (seen_dashdash || *arg == '^')
2240 2241
				die("bad revision '%s'", arg);

2242 2243 2244 2245 2246 2247
			/* If we didn't have a "--":
			 * (1) all filenames must exist;
			 * (2) all rev-args must not be interpretable
			 *     as a valid filename.
			 * but the latter we have checked in the main loop.
			 */
2248
			for (j = i; j < argc; j++)
2249
				verify_filename(revs->prefix, argv[j], j == i);
2250

2251
			append_prune_data(&prune_data, argv + i);
2252 2253
			break;
		}
2254 2255
		else
			got_rev_arg = 1;
2256
	}
2257

2258
	if (prune_data.nr) {
2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272
		/*
		 * If we need to introduce the magic "a lone ':' means no
		 * pathspec whatsoever", here is the place to do so.
		 *
		 * if (prune_data.nr == 1 && !strcmp(prune_data[0], ":")) {
		 *	prune_data.nr = 0;
		 *	prune_data.alloc = 0;
		 *	free(prune_data.path);
		 *	prune_data.path = NULL;
		 * } else {
		 *	terminate prune_data.alloc with NULL and
		 *	call init_pathspec() to set revs->prune_data here.
		 * }
		 */
F
Felipe Contreras 已提交
2273
		ALLOC_GROW(prune_data.path, prune_data.nr + 1, prune_data.alloc);
2274
		prune_data.path[prune_data.nr++] = NULL;
2275 2276
		parse_pathspec(&revs->prune_data, 0, 0,
			       revs->prefix, prune_data.path);
2277
	}
2278

2279
	if (revs->def == NULL)
2280
		revs->def = opt ? opt->def : NULL;
J
Junio C Hamano 已提交
2281 2282
	if (opt && opt->tweak)
		opt->tweak(revs, opt);
2283
	if (revs->show_merge)
2284
		prepare_show_merge(revs);
2285
	if (revs->def && !revs->pending.nr && !got_rev_arg) {
2286
		unsigned char sha1[20];
2287
		struct object *object;
2288
		struct object_context oc;
2289
		if (get_sha1_with_context(revs->def, 0, sha1, &oc))
2290
			diagnose_missing_default(revs->def);
2291
		object = get_reference(revs, revs->def, sha1, 0);
2292
		add_pending_object_with_mode(revs, object, revs->def, oc.mode);
2293
	}
2294

2295 2296 2297 2298
	/* Did the user ask for any diff output? Run the diff! */
	if (revs->diffopt.output_format & ~DIFF_FORMAT_NO_OUTPUT)
		revs->diff = 1;

A
Arjen Laarhoven 已提交
2299 2300 2301 2302
	/* Pickaxe, diff-filter and rename following need diffs */
	if (revs->diffopt.pickaxe ||
	    revs->diffopt.filter ||
	    DIFF_OPT_TST(&revs->diffopt, FOLLOW_RENAMES))
2303 2304
		revs->diff = 1;

2305
	if (revs->topo_order)
2306 2307
		revs->limited = 1;

2308
	if (revs->prune_data.nr) {
2309
		copy_pathspec(&revs->pruning.pathspec, &revs->prune_data);
2310
		/* Can't prune commits with rename following: the paths change.. */
2311
		if (!DIFF_OPT_TST(&revs->diffopt, FOLLOW_RENAMES))
L
Linus Torvalds 已提交
2312
			revs->prune = 1;
2313
		if (!revs->full_diff)
2314 2315
			copy_pathspec(&revs->diffopt.pathspec,
				      &revs->prune_data);
2316
	}
J
Junio C Hamano 已提交
2317
	if (revs->combine_merges)
2318 2319
		revs->ignore_merges = 0;
	revs->diffopt.abbrev = revs->abbrev;
2320 2321 2322 2323 2324 2325

	if (revs->line_level_traverse) {
		revs->limited = 1;
		revs->topo_order = 1;
	}

T
Thomas Rast 已提交
2326
	diff_setup_done(&revs->diffopt);
2327

2328 2329
	grep_commit_pattern_type(GREP_PATTERN_TYPE_UNSPECIFIED,
				 &revs->grep_filter);
J
Jeff King 已提交
2330
	compile_grep_patterns(&revs->grep_filter);
2331

2332 2333
	if (revs->reverse && revs->reflog_info)
		die("cannot combine --reverse with --walk-reflogs");
2334
	if (revs->rewrite_parents && revs->children.name)
2335
		die("cannot combine --parents and --children");
2336

2337 2338 2339 2340 2341 2342 2343 2344
	/*
	 * Limitations on the graph functionality
	 */
	if (revs->reverse && revs->graph)
		die("cannot combine --reverse with --graph");

	if (revs->reflog_info && revs->graph)
		die("cannot combine --walk-reflogs with --graph");
2345 2346
	if (revs->no_walk && revs->graph)
		die("cannot combine --no-walk with --graph");
2347 2348
	if (!revs->reflog_info && revs->grep_filter.use_reflog_filter)
		die("cannot use --grep-reflog without --walk-reflogs");
2349

2350 2351 2352
	if (revs->first_parent_only && revs->bisect)
		die(_("--first-parent is incompatible with --bisect"));

2353 2354 2355
	if (revs->expand_tabs_in_log < 0)
		revs->expand_tabs_in_log = revs->expand_tabs_in_log_default;

2356 2357
	return left;
}
2358

2359 2360 2361 2362 2363 2364 2365 2366
static void add_child(struct rev_info *revs, struct commit *parent, struct commit *child)
{
	struct commit_list *l = xcalloc(1, sizeof(*l));

	l->item = child;
	l->next = add_decoration(&revs->children, &parent->object, l);
}

2367
static int remove_duplicate_parents(struct rev_info *revs, struct commit *commit)
2368
{
2369
	struct treesame_state *ts = lookup_decoration(&revs->treesame, &commit->object);
2370 2371 2372 2373 2374
	struct commit_list **pp, *p;
	int surviving_parents;

	/* Examine existing parents while marking ones we have seen... */
	pp = &commit->parents;
2375
	surviving_parents = 0;
2376 2377 2378 2379
	while ((p = *pp) != NULL) {
		struct commit *parent = p->item;
		if (parent->object.flags & TMP_MARK) {
			*pp = p->next;
2380 2381
			if (ts)
				compact_treesame(revs, commit, surviving_parents);
2382 2383 2384
			continue;
		}
		parent->object.flags |= TMP_MARK;
2385
		surviving_parents++;
2386 2387
		pp = &p->next;
	}
2388
	/* clear the temporary mark */
2389 2390 2391
	for (p = commit->parents; p; p = p->next) {
		p->item->object.flags &= ~TMP_MARK;
	}
2392
	/* no update_treesame() - removing duplicates can't affect TREESAME */
2393 2394 2395
	return surviving_parents;
}

2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411
struct merge_simplify_state {
	struct commit *simplified;
};

static struct merge_simplify_state *locate_simplify_state(struct rev_info *revs, struct commit *commit)
{
	struct merge_simplify_state *st;

	st = lookup_decoration(&revs->merge_simplification, &commit->object);
	if (!st) {
		st = xcalloc(1, sizeof(*st));
		add_decoration(&revs->merge_simplification, &commit->object, st);
	}
	return st;
}

2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447
static int mark_redundant_parents(struct rev_info *revs, struct commit *commit)
{
	struct commit_list *h = reduce_heads(commit->parents);
	int i = 0, marked = 0;
	struct commit_list *po, *pn;

	/* Want these for sanity-checking only */
	int orig_cnt = commit_list_count(commit->parents);
	int cnt = commit_list_count(h);

	/*
	 * Not ready to remove items yet, just mark them for now, based
	 * on the output of reduce_heads(). reduce_heads outputs the reduced
	 * set in its original order, so this isn't too hard.
	 */
	po = commit->parents;
	pn = h;
	while (po) {
		if (pn && po->item == pn->item) {
			pn = pn->next;
			i++;
		} else {
			po->item->object.flags |= TMP_MARK;
			marked++;
		}
		po=po->next;
	}

	if (i != cnt || cnt+marked != orig_cnt)
		die("mark_redundant_parents %d %d %d %d", orig_cnt, cnt, i, marked);

	free_commit_list(h);

	return marked;
}

2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463
static int mark_treesame_root_parents(struct rev_info *revs, struct commit *commit)
{
	struct commit_list *p;
	int marked = 0;

	for (p = commit->parents; p; p = p->next) {
		struct commit *parent = p->item;
		if (!parent->parents && (parent->object.flags & TREESAME)) {
			parent->object.flags |= TMP_MARK;
			marked++;
		}
	}

	return marked;
}

2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530
/*
 * Awkward naming - this means one parent we are TREESAME to.
 * cf mark_treesame_root_parents: root parents that are TREESAME (to an
 * empty tree). Better name suggestions?
 */
static int leave_one_treesame_to_parent(struct rev_info *revs, struct commit *commit)
{
	struct treesame_state *ts = lookup_decoration(&revs->treesame, &commit->object);
	struct commit *unmarked = NULL, *marked = NULL;
	struct commit_list *p;
	unsigned n;

	for (p = commit->parents, n = 0; p; p = p->next, n++) {
		if (ts->treesame[n]) {
			if (p->item->object.flags & TMP_MARK) {
				if (!marked)
					marked = p->item;
			} else {
				if (!unmarked) {
					unmarked = p->item;
					break;
				}
			}
		}
	}

	/*
	 * If we are TREESAME to a marked-for-deletion parent, but not to any
	 * unmarked parents, unmark the first TREESAME parent. This is the
	 * parent that the default simplify_history==1 scan would have followed,
	 * and it doesn't make sense to omit that path when asking for a
	 * simplified full history. Retaining it improves the chances of
	 * understanding odd missed merges that took an old version of a file.
	 *
	 * Example:
	 *
	 *   I--------*X       A modified the file, but mainline merge X used
	 *    \       /        "-s ours", so took the version from I. X is
	 *     `-*A--'         TREESAME to I and !TREESAME to A.
	 *
	 * Default log from X would produce "I". Without this check,
	 * --full-history --simplify-merges would produce "I-A-X", showing
	 * the merge commit X and that it changed A, but not making clear that
	 * it had just taken the I version. With this check, the topology above
	 * is retained.
	 *
	 * Note that it is possible that the simplification chooses a different
	 * TREESAME parent from the default, in which case this test doesn't
	 * activate, and we _do_ drop the default parent. Example:
	 *
	 *   I------X         A modified the file, but it was reverted in B,
	 *    \    /          meaning mainline merge X is TREESAME to both
	 *    *A-*B           parents.
	 *
	 * Default log would produce "I" by following the first parent;
	 * --full-history --simplify-merges will produce "I-A-B". But this is a
	 * reasonable result - it presents a logical full history leading from
	 * I to X, and X is not an important merge.
	 */
	if (!unmarked && marked) {
		marked->object.flags &= ~TMP_MARK;
		return 1;
	}

	return 0;
}

2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558
static int remove_marked_parents(struct rev_info *revs, struct commit *commit)
{
	struct commit_list **pp, *p;
	int nth_parent, removed = 0;

	pp = &commit->parents;
	nth_parent = 0;
	while ((p = *pp) != NULL) {
		struct commit *parent = p->item;
		if (parent->object.flags & TMP_MARK) {
			parent->object.flags &= ~TMP_MARK;
			*pp = p->next;
			free(p);
			removed++;
			compact_treesame(revs, commit, nth_parent);
			continue;
		}
		pp = &p->next;
		nth_parent++;
	}

	/* Removing parents can only increase TREESAMEness */
	if (removed && !(commit->object.flags & TREESAME))
		update_treesame(revs, commit);

	return nth_parent;
}

2559
static struct commit_list **simplify_one(struct rev_info *revs, struct commit *commit, struct commit_list **tail)
2560 2561
{
	struct commit_list *p;
2562
	struct commit *parent;
2563
	struct merge_simplify_state *st, *pst;
2564 2565
	int cnt;

2566 2567
	st = locate_simplify_state(revs, commit);

2568 2569 2570
	/*
	 * Have we handled this one?
	 */
2571
	if (st->simplified)
2572 2573 2574 2575 2576 2577 2578 2579
		return tail;

	/*
	 * An UNINTERESTING commit simplifies to itself, so does a
	 * root commit.  We do not rewrite parents of such commit
	 * anyway.
	 */
	if ((commit->object.flags & UNINTERESTING) || !commit->parents) {
2580
		st->simplified = commit;
2581 2582 2583 2584
		return tail;
	}

	/*
2585 2586 2587
	 * Do we know what commit all of our parents that matter
	 * should be rewritten to?  Otherwise we are not ready to
	 * rewrite this one yet.
2588 2589
	 */
	for (cnt = 0, p = commit->parents; p; p = p->next) {
2590 2591
		pst = locate_simplify_state(revs, p->item);
		if (!pst->simplified) {
2592 2593 2594
			tail = &commit_list_insert(p->item, tail)->next;
			cnt++;
		}
2595 2596
		if (revs->first_parent_only)
			break;
2597
	}
2598 2599
	if (cnt) {
		tail = &commit_list_insert(commit, tail)->next;
2600
		return tail;
2601
	}
2602 2603

	/*
2604 2605 2606
	 * Rewrite our list of parents. Note that this cannot
	 * affect our TREESAME flags in any way - a commit is
	 * always TREESAME to its simplification.
2607
	 */
2608 2609 2610
	for (p = commit->parents; p; p = p->next) {
		pst = locate_simplify_state(revs, p->item);
		p->item = pst->simplified;
2611 2612
		if (revs->first_parent_only)
			break;
2613
	}
2614

2615
	if (revs->first_parent_only)
2616
		cnt = 1;
2617
	else
2618
		cnt = remove_duplicate_parents(revs, commit);
2619 2620 2621 2622

	/*
	 * It is possible that we are a merge and one side branch
	 * does not have any commit that touches the given paths;
2623 2624
	 * in such a case, the immediate parent from that branch
	 * will be rewritten to be the merge base.
2625 2626 2627 2628 2629
	 *
	 *      o----X		X: the commit we are looking at;
	 *     /    /		o: a commit that touches the paths;
	 * ---o----'
	 *
2630 2631 2632 2633 2634 2635 2636 2637
	 * Further, a merge of an independent branch that doesn't
	 * touch the path will reduce to a treesame root parent:
	 *
	 *  ----o----X		X: the commit we are looking at;
	 *          /		o: a commit that touches the paths;
	 *         r		r: a root commit not touching the paths
	 *
	 * Detect and simplify both cases.
2638 2639
	 */
	if (1 < cnt) {
2640
		int marked = mark_redundant_parents(revs, commit);
2641
		marked += mark_treesame_root_parents(revs, commit);
2642 2643
		if (marked)
			marked -= leave_one_treesame_to_parent(revs, commit);
2644 2645
		if (marked)
			cnt = remove_marked_parents(revs, commit);
2646 2647 2648 2649 2650
	}

	/*
	 * A commit simplifies to itself if it is a root, if it is
	 * UNINTERESTING, if it touches the given paths, or if it is a
2651
	 * merge and its parents don't simplify to one relevant commit
2652 2653 2654
	 * (the first two cases are already handled at the beginning of
	 * this function).
	 *
2655 2656
	 * Otherwise, it simplifies to what its sole relevant parent
	 * simplifies to.
2657 2658 2659 2660
	 */
	if (!cnt ||
	    (commit->object.flags & UNINTERESTING) ||
	    !(commit->object.flags & TREESAME) ||
2661
	    (parent = one_relevant_parent(revs, commit->parents)) == NULL)
2662 2663
		st->simplified = commit;
	else {
2664
		pst = locate_simplify_state(revs, parent);
2665 2666
		st->simplified = pst->simplified;
	}
2667 2668 2669 2670 2671
	return tail;
}

static void simplify_merges(struct rev_info *revs)
{
2672
	struct commit_list *list, *next;
2673
	struct commit_list *yet_to_do, **tail;
2674
	struct commit *commit;
2675

2676 2677
	if (!revs->prune)
		return;
2678

2679 2680
	/* feed the list reversed */
	yet_to_do = NULL;
2681 2682 2683 2684 2685 2686 2687 2688 2689
	for (list = revs->commits; list; list = next) {
		commit = list->item;
		next = list->next;
		/*
		 * Do not free(list) here yet; the original list
		 * is used later in this function.
		 */
		commit_list_insert(commit, &yet_to_do);
	}
2690 2691 2692 2693 2694
	while (yet_to_do) {
		list = yet_to_do;
		yet_to_do = NULL;
		tail = &yet_to_do;
		while (list) {
2695
			commit = pop_commit(&list);
2696
			tail = simplify_one(revs, commit, tail);
2697 2698 2699 2700 2701 2702 2703 2704
		}
	}

	/* clean up the result, removing the simplified ones */
	list = revs->commits;
	revs->commits = NULL;
	tail = &revs->commits;
	while (list) {
2705
		struct merge_simplify_state *st;
2706

2707
		commit = pop_commit(&list);
2708 2709
		st = locate_simplify_state(revs, commit);
		if (st->simplified == commit)
2710 2711 2712 2713
			tail = &commit_list_insert(commit, tail)->next;
	}
}

2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725
static void set_children(struct rev_info *revs)
{
	struct commit_list *l;
	for (l = revs->commits; l; l = l->next) {
		struct commit *commit = l->item;
		struct commit_list *p;

		for (p = commit->parents; p; p = p->next)
			add_child(revs, p->item, commit);
	}
}

2726 2727 2728 2729 2730
void reset_revision_walk(void)
{
	clear_object_flags(SEEN | ADDED | SHOWN);
}

2731
int prepare_revision_walk(struct rev_info *revs)
2732
{
2733 2734
	int i;
	struct object_array old_pending;
2735
	struct commit_list **next = &revs->commits;
2736

2737
	memcpy(&old_pending, &revs->pending, sizeof(old_pending));
2738 2739 2740
	revs->pending.nr = 0;
	revs->pending.alloc = 0;
	revs->pending.objects = NULL;
2741 2742
	for (i = 0; i < old_pending.nr; i++) {
		struct object_array_entry *e = old_pending.objects + i;
2743
		struct commit *commit = handle_commit(revs, e);
2744 2745 2746
		if (commit) {
			if (!(commit->object.flags & SEEN)) {
				commit->object.flags |= SEEN;
2747
				next = commit_list_append(commit, next);
2748 2749 2750
			}
		}
	}
R
René Scharfe 已提交
2751
	if (!revs->leak_pending)
2752
		object_array_clear(&old_pending);
2753

2754
	/* Signal whether we need per-parent treesame decoration */
2755 2756
	if (revs->simplify_merges ||
	    (revs->limited && limiting_can_increase_treesame(revs)))
2757 2758
		revs->treesame.name = "treesame";

2759 2760
	if (revs->no_walk != REVISION_WALK_NO_WALK_UNSORTED)
		commit_list_sort_by_date(&revs->commits);
L
Linus Torvalds 已提交
2761
	if (revs->no_walk)
2762
		return 0;
2763
	if (revs->limited)
2764 2765
		if (limit_list(revs) < 0)
			return -1;
2766
	if (revs->topo_order)
J
Junio C Hamano 已提交
2767
		sort_in_topological_order(&revs->commits, revs->sort_order);
2768 2769
	if (revs->line_level_traverse)
		line_log_filter(revs);
2770 2771
	if (revs->simplify_merges)
		simplify_merges(revs);
2772 2773
	if (revs->children.name)
		set_children(revs);
2774
	return 0;
2775 2776
}

2777
static enum rewrite_result rewrite_one(struct rev_info *revs, struct commit **pp)
2778
{
2779 2780
	struct commit_list *cache = NULL;

2781 2782
	for (;;) {
		struct commit *p = *pp;
2783
		if (!revs->limited)
2784
			if (add_parents_to_list(revs, p, &revs->commits, &cache) < 0)
2785
				return rewrite_one_error;
2786 2787 2788
		if (p->object.flags & UNINTERESTING)
			return rewrite_one_ok;
		if (!(p->object.flags & TREESAME))
2789
			return rewrite_one_ok;
2790
		if (!p->parents)
2791
			return rewrite_one_noparents;
2792 2793 2794
		if ((p = one_relevant_parent(revs, p->parents)) == NULL)
			return rewrite_one_ok;
		*pp = p;
2795 2796 2797
	}
}

B
Bo Yang 已提交
2798 2799
int rewrite_parents(struct rev_info *revs, struct commit *commit,
	rewrite_parent_fn_t rewrite_parent)
2800 2801 2802 2803
{
	struct commit_list **pp = &commit->parents;
	while (*pp) {
		struct commit_list *parent = *pp;
B
Bo Yang 已提交
2804
		switch (rewrite_parent(revs, &parent->item)) {
2805 2806 2807
		case rewrite_one_ok:
			break;
		case rewrite_one_noparents:
2808 2809
			*pp = parent->next;
			continue;
2810 2811
		case rewrite_one_error:
			return -1;
2812 2813 2814
		}
		pp = &parent->next;
	}
2815
	remove_duplicate_parents(revs, commit);
2816
	return 0;
2817 2818
}

2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863
static int commit_rewrite_person(struct strbuf *buf, const char *what, struct string_list *mailmap)
{
	char *person, *endp;
	size_t len, namelen, maillen;
	const char *name;
	const char *mail;
	struct ident_split ident;

	person = strstr(buf->buf, what);
	if (!person)
		return 0;

	person += strlen(what);
	endp = strchr(person, '\n');
	if (!endp)
		return 0;

	len = endp - person;

	if (split_ident_line(&ident, person, len))
		return 0;

	mail = ident.mail_begin;
	maillen = ident.mail_end - ident.mail_begin;
	name = ident.name_begin;
	namelen = ident.name_end - ident.name_begin;

	if (map_user(mailmap, &mail, &maillen, &name, &namelen)) {
		struct strbuf namemail = STRBUF_INIT;

		strbuf_addf(&namemail, "%.*s <%.*s>",
			    (int)namelen, name, (int)maillen, mail);

		strbuf_splice(buf, ident.name_begin - buf->buf,
			      ident.mail_end - ident.name_begin + 1,
			      namemail.buf, namemail.len);

		strbuf_release(&namemail);

		return 1;
	}

	return 0;
}

2864 2865
static int commit_match(struct commit *commit, struct rev_info *opt)
{
2866
	int retval;
2867
	const char *encoding;
J
Jeff King 已提交
2868
	const char *message;
2869
	struct strbuf buf = STRBUF_INIT;
2870

2871
	if (!opt->grep_filter.pattern_list && !opt->grep_filter.header_list)
2872
		return 1;
2873 2874 2875

	/* Prepend "fake" headers as needed */
	if (opt->grep_filter.use_reflog_filter) {
2876 2877 2878 2879
		strbuf_addstr(&buf, "reflog ");
		get_reflog_message(&buf, opt->reflog_info);
		strbuf_addch(&buf, '\n');
	}
2880

2881 2882 2883 2884 2885 2886 2887 2888
	/*
	 * We grep in the user's output encoding, under the assumption that it
	 * is the encoding they are most likely to write their grep pattern
	 * for. In addition, it means we will match the "notes" encoding below,
	 * so we will not end up with a buffer that has two different encodings
	 * in it.
	 */
	encoding = get_log_output_encoding();
2889
	message = logmsg_reencode(commit, NULL, encoding);
2890

2891 2892
	/* Copy the commit to temporary if we are using "fake" headers */
	if (buf.len)
2893
		strbuf_addstr(&buf, message);
2894

2895
	if (opt->grep_filter.header_list && opt->mailmap) {
2896
		if (!buf.len)
2897
			strbuf_addstr(&buf, message);
2898 2899 2900 2901 2902

		commit_rewrite_person(&buf, "\nauthor ", opt->mailmap);
		commit_rewrite_person(&buf, "\ncommitter ", opt->mailmap);
	}

2903 2904 2905
	/* Append "fake" message parts as needed */
	if (opt->show_notes) {
		if (!buf.len)
2906
			strbuf_addstr(&buf, message);
B
brian m. carlson 已提交
2907
		format_display_notes(commit->object.oid.hash, &buf, encoding, 1);
2908 2909
	}

J
Jeff King 已提交
2910 2911 2912 2913 2914 2915 2916 2917
	/*
	 * Find either in the original commit message, or in the temporary.
	 * Note that we cast away the constness of "message" here. It is
	 * const because it may come from the cached commit buffer. That's OK,
	 * because we know that it is modifiable heap memory, and that while
	 * grep_buffer may modify it for speed, it will restore any
	 * changes before returning.
	 */
2918 2919 2920 2921
	if (buf.len)
		retval = grep_buffer(&opt->grep_filter, buf.buf, buf.len);
	else
		retval = grep_buffer(&opt->grep_filter,
J
Jeff King 已提交
2922
				     (char *)message, strlen(message));
2923
	strbuf_release(&buf);
2924
	unuse_commit_buffer(commit, message);
2925
	return opt->invert_grep ? !retval : retval;
2926 2927
}

2928
static inline int want_ancestry(const struct rev_info *revs)
2929
{
2930
	return (revs->rewrite_parents || revs->children.name);
2931 2932
}

2933
enum commit_action get_commit_action(struct rev_info *revs, struct commit *commit)
L
Linus Torvalds 已提交
2934 2935 2936
{
	if (commit->object.flags & SHOWN)
		return commit_ignore;
B
brian m. carlson 已提交
2937
	if (revs->unpacked && has_sha1_pack(commit->object.oid.hash))
L
Linus Torvalds 已提交
2938
		return commit_ignore;
2939 2940
	if (revs->show_all)
		return commit_show;
L
Linus Torvalds 已提交
2941 2942 2943 2944
	if (commit->object.flags & UNINTERESTING)
		return commit_ignore;
	if (revs->min_age != -1 && (commit->date > revs->min_age))
		return commit_ignore;
2945
	if (revs->min_parents || (revs->max_parents >= 0)) {
2946
		int n = commit_list_count(commit->parents);
2947 2948 2949 2950
		if ((n < revs->min_parents) ||
		    ((revs->max_parents >= 0) && (n > revs->max_parents)))
			return commit_ignore;
	}
L
Linus Torvalds 已提交
2951 2952
	if (!commit_match(commit, revs))
		return commit_ignore;
L
Linus Torvalds 已提交
2953
	if (revs->prune && revs->dense) {
L
Linus Torvalds 已提交
2954
		/* Commit without changes? */
2955
		if (commit->object.flags & TREESAME) {
2956 2957
			int n;
			struct commit_list *p;
L
Linus Torvalds 已提交
2958
			/* drop merges unless we want parenthood */
2959
			if (!want_ancestry(revs))
L
Linus Torvalds 已提交
2960
				return commit_ignore;
2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972
			/*
			 * If we want ancestry, then need to keep any merges
			 * between relevant commits to tie together topology.
			 * For consistency with TREESAME and simplification
			 * use "relevant" here rather than just INTERESTING,
			 * to treat bottom commit(s) as part of the topology.
			 */
			for (n = 0, p = commit->parents; p; p = p->next)
				if (relevant_commit(p->item))
					if (++n >= 2)
						return commit_show;
			return commit_ignore;
L
Linus Torvalds 已提交
2973 2974 2975 2976 2977
		}
	}
	return commit_show;
}

2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032
define_commit_slab(saved_parents, struct commit_list *);

#define EMPTY_PARENT_LIST ((struct commit_list *)-1)

/*
 * You may only call save_parents() once per commit (this is checked
 * for non-root commits).
 */
static void save_parents(struct rev_info *revs, struct commit *commit)
{
	struct commit_list **pp;

	if (!revs->saved_parents_slab) {
		revs->saved_parents_slab = xmalloc(sizeof(struct saved_parents));
		init_saved_parents(revs->saved_parents_slab);
	}

	pp = saved_parents_at(revs->saved_parents_slab, commit);

	/*
	 * When walking with reflogs, we may visit the same commit
	 * several times: once for each appearance in the reflog.
	 *
	 * In this case, save_parents() will be called multiple times.
	 * We want to keep only the first set of parents.  We need to
	 * store a sentinel value for an empty (i.e., NULL) parent
	 * list to distinguish it from a not-yet-saved list, however.
	 */
	if (*pp)
		return;
	if (commit->parents)
		*pp = copy_commit_list(commit->parents);
	else
		*pp = EMPTY_PARENT_LIST;
}

static void free_saved_parents(struct rev_info *revs)
{
	if (revs->saved_parents_slab)
		clear_saved_parents(revs->saved_parents_slab);
}

struct commit_list *get_saved_parents(struct rev_info *revs, const struct commit *commit)
{
	struct commit_list *parents;

	if (!revs->saved_parents_slab)
		return commit->parents;

	parents = *saved_parents_at(revs->saved_parents_slab, commit);
	if (parents == EMPTY_PARENT_LIST)
		return NULL;
	return parents;
}

3033 3034 3035 3036 3037 3038 3039
enum commit_action simplify_commit(struct rev_info *revs, struct commit *commit)
{
	enum commit_action action = get_commit_action(revs, commit);

	if (action == commit_show &&
	    !revs->show_all &&
	    revs->prune && revs->dense && want_ancestry(revs)) {
3040 3041 3042 3043 3044 3045 3046 3047
		/*
		 * --full-diff on simplified parents is no good: it
		 * will show spurious changes from the commits that
		 * were elided.  So we save the parents on the side
		 * when --full-diff is in effect.
		 */
		if (revs->full_diff)
			save_parents(revs, commit);
B
Bo Yang 已提交
3048
		if (rewrite_parents(revs, commit, rewrite_one) < 0)
3049 3050 3051 3052 3053
			return commit_error;
	}
	return action;
}

3054 3055 3056 3057 3058 3059 3060 3061 3062
static void track_linear(struct rev_info *revs, struct commit *commit)
{
	if (revs->track_first_time) {
		revs->linear = 1;
		revs->track_first_time = 0;
	} else {
		struct commit_list *p;
		for (p = revs->previous_parents; p; p = p->next)
			if (p->item == NULL || /* first commit */
3063
			    !oidcmp(&p->item->object.oid, &commit->object.oid))
3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074
				break;
		revs->linear = p != NULL;
	}
	if (revs->reverse) {
		if (revs->linear)
			commit->object.flags |= TRACK_LINEAR;
	}
	free_commit_list(revs->previous_parents);
	revs->previous_parents = copy_commit_list(commit->parents);
}

J
Junio C Hamano 已提交
3075
static struct commit *get_revision_1(struct rev_info *revs)
3076
{
J
Junio C Hamano 已提交
3077
	if (!revs->commits)
3078 3079
		return NULL;

3080
	do {
3081
		struct commit *commit = pop_commit(&revs->commits);
3082

3083
		if (revs->reflog_info) {
3084
			save_parents(revs, commit);
3085
			fake_reflog_parent(revs->reflog_info, commit);
3086 3087
			commit->object.flags &= ~(ADDED | SEEN | SHOWN);
		}
3088

3089 3090
		/*
		 * If we haven't done the list limiting, we need to look at
3091 3092
		 * the parents here. We also need to do the date-based limiting
		 * that we'd otherwise have done in limit_list().
3093
		 */
3094
		if (!revs->limited) {
3095
			if (revs->max_age != -1 &&
3096 3097
			    (commit->date < revs->max_age))
				continue;
3098 3099 3100
			if (add_parents_to_list(revs, commit, &revs->commits, NULL) < 0) {
				if (!revs->ignore_missing_links)
					die("Failed to traverse parents of commit %s",
3101
						oid_to_hex(&commit->object.oid));
3102
			}
3103
		}
3104

L
Linus Torvalds 已提交
3105 3106
		switch (simplify_commit(revs, commit)) {
		case commit_ignore:
3107
			continue;
L
Linus Torvalds 已提交
3108
		case commit_error:
3109
			die("Failed to simplify parents of commit %s",
3110
			    oid_to_hex(&commit->object.oid));
L
Linus Torvalds 已提交
3111
		default:
3112 3113
			if (revs->track_linear)
				track_linear(revs, commit);
L
Linus Torvalds 已提交
3114
			return commit;
J
Junio C Hamano 已提交
3115
		}
3116 3117 3118
	} while (revs->commits);
	return NULL;
}
J
Junio C Hamano 已提交
3119

3120 3121 3122 3123 3124
/*
 * Return true for entries that have not yet been shown.  (This is an
 * object_array_each_func_t.)
 */
static int entry_unshown(struct object_array_entry *entry, void *cb_data_unused)
3125
{
3126 3127
	return !(entry->item->flags & SHOWN);
}
3128

3129 3130 3131 3132 3133 3134 3135 3136
/*
 * If array is on the verge of a realloc, garbage-collect any entries
 * that have already been shown to try to free up some space.
 */
static void gc_boundary(struct object_array *array)
{
	if (array->nr == array->alloc)
		object_array_filter(array, entry_unshown, NULL);
3137 3138
}

3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176
static void create_boundary_commit_list(struct rev_info *revs)
{
	unsigned i;
	struct commit *c;
	struct object_array *array = &revs->boundary_commits;
	struct object_array_entry *objects = array->objects;

	/*
	 * If revs->commits is non-NULL at this point, an error occurred in
	 * get_revision_1().  Ignore the error and continue printing the
	 * boundary commits anyway.  (This is what the code has always
	 * done.)
	 */
	if (revs->commits) {
		free_commit_list(revs->commits);
		revs->commits = NULL;
	}

	/*
	 * Put all of the actual boundary commits from revs->boundary_commits
	 * into revs->commits
	 */
	for (i = 0; i < array->nr; i++) {
		c = (struct commit *)(objects[i].item);
		if (!c)
			continue;
		if (!(c->object.flags & CHILD_SHOWN))
			continue;
		if (c->object.flags & (SHOWN | BOUNDARY))
			continue;
		c->object.flags |= BOUNDARY;
		commit_list_insert(c, &revs->commits);
	}

	/*
	 * If revs->topo_order is set, sort the boundary commits
	 * in topological order
	 */
J
Junio C Hamano 已提交
3177
	sort_in_topological_order(&revs->commits, revs->sort_order);
3178 3179
}

3180
static struct commit *get_revision_internal(struct rev_info *revs)
J
Junio C Hamano 已提交
3181 3182
{
	struct commit *c = NULL;
3183 3184 3185
	struct commit_list *l;

	if (revs->boundary == 2) {
3186 3187 3188 3189 3190 3191 3192 3193 3194
		/*
		 * All of the normal commits have already been returned,
		 * and we are now returning boundary commits.
		 * create_boundary_commit_list() has populated
		 * revs->commits with the remaining commits to return.
		 */
		c = pop_commit(&revs->commits);
		if (c)
			c->object.flags |= SHOWN;
3195 3196 3197
		return c;
	}

3198
	/*
3199 3200 3201 3202 3203 3204 3205 3206
	 * If our max_count counter has reached zero, then we are done. We
	 * don't simply return NULL because we still might need to show
	 * boundary commits. But we want to avoid calling get_revision_1, which
	 * might do a considerable amount of work finding the next commit only
	 * for us to throw it away.
	 *
	 * If it is non-zero, then either we don't have a max_count at all
	 * (-1), or it is still counting, in which case we decrement.
3207
	 */
3208 3209 3210
	if (revs->max_count) {
		c = get_revision_1(revs);
		if (c) {
F
Felipe Contreras 已提交
3211
			while (revs->skip_count > 0) {
3212 3213 3214 3215 3216
				revs->skip_count--;
				c = get_revision_1(revs);
				if (!c)
					break;
			}
3217
		}
3218

3219 3220
		if (revs->max_count > 0)
			revs->max_count--;
J
Junio C Hamano 已提交
3221
	}
3222

3223 3224 3225
	if (c)
		c->object.flags |= SHOWN;

F
Felipe Contreras 已提交
3226
	if (!revs->boundary)
J
Junio C Hamano 已提交
3227
		return c;
3228 3229 3230 3231 3232 3233 3234 3235

	if (!c) {
		/*
		 * get_revision_1() runs out the commits, and
		 * we are done computing the boundaries.
		 * switch to boundary commits output mode.
		 */
		revs->boundary = 2;
3236 3237 3238 3239 3240 3241 3242

		/*
		 * Update revs->commits to contain the list of
		 * boundary commits.
		 */
		create_boundary_commit_list(revs);

3243
		return get_revision_internal(revs);
3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255
	}

	/*
	 * boundary commits are the commits that are parents of the
	 * ones we got from get_revision_1() but they themselves are
	 * not returned from get_revision_1().  Before returning
	 * 'c', we need to mark its parents that they could be boundaries.
	 */

	for (l = c->parents; l; l = l->next) {
		struct object *p;
		p = &(l->item->object);
3256
		if (p->flags & (CHILD_SHOWN | SHOWN))
3257 3258 3259 3260 3261 3262 3263
			continue;
		p->flags |= CHILD_SHOWN;
		gc_boundary(&revs->boundary_commits);
		add_object_array(p, NULL, &revs->boundary_commits);
	}

	return c;
J
Junio C Hamano 已提交
3264
}
3265 3266 3267

struct commit *get_revision(struct rev_info *revs)
{
3268 3269 3270 3271 3272
	struct commit *c;
	struct commit_list *reversed;

	if (revs->reverse) {
		reversed = NULL;
F
Felipe Contreras 已提交
3273
		while ((c = get_revision_internal(revs)))
3274 3275 3276 3277 3278 3279
			commit_list_insert(c, &reversed);
		revs->commits = reversed;
		revs->reverse = 0;
		revs->reverse_output_stage = 1;
	}

3280 3281 3282 3283 3284 3285
	if (revs->reverse_output_stage) {
		c = pop_commit(&revs->commits);
		if (revs->track_linear)
			revs->linear = !!(c && c->object.flags & TRACK_LINEAR);
		return c;
	}
3286 3287

	c = get_revision_internal(revs);
3288 3289
	if (c && revs->graph)
		graph_update(revs->graph, c);
3290
	if (!c) {
3291
		free_saved_parents(revs);
3292 3293 3294 3295 3296
		if (revs->previous_parents) {
			free_commit_list(revs->previous_parents);
			revs->previous_parents = NULL;
		}
	}
3297 3298
	return c;
}
3299 3300 3301 3302 3303 3304 3305

char *get_revision_mark(const struct rev_info *revs, const struct commit *commit)
{
	if (commit->object.flags & BOUNDARY)
		return "-";
	else if (commit->object.flags & UNINTERESTING)
		return "^";
3306 3307
	else if (commit->object.flags & PATCHSAME)
		return "=";
3308 3309 3310 3311 3312 3313 3314
	else if (!revs || revs->left_right) {
		if (commit->object.flags & SYMMETRIC_LEFT)
			return "<";
		else
			return ">";
	} else if (revs->graph)
		return "*";
3315 3316
	else if (revs->cherry_mark)
		return "+";
3317 3318
	return "";
}
3319 3320 3321 3322 3323 3324 3325 3326 3327

void put_revision_mark(const struct rev_info *revs, const struct commit *commit)
{
	char *mark = get_revision_mark(revs, commit);
	if (!strlen(mark))
		return;
	fputs(mark, stdout);
	putchar(' ');
}