From: Junio C Hamano Date: Mon, 26 Mar 2007 00:47:07 +0000 (-0700) Subject: Merge branch 'jc/fpl' X-Git-Tag: v1.5.1-rc2~3 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/3a81b9f571a6b7edd83b3d5f27c3c95d9b1c9d5c?ds=inline;hp=-c Merge branch 'jc/fpl' * jc/fpl: git-log --first-parent: show only the first parent log --- 3a81b9f571a6b7edd83b3d5f27c3c95d9b1c9d5c diff --combined revision.c index adc381c268,8afc196847..f23c1d5226 --- a/revision.c +++ b/revision.c @@@ -62,7 -62,8 +62,7 @@@ void mark_tree_uninteresting(struct tre if (parse_tree(tree) < 0) die("bad tree %s", sha1_to_hex(obj->sha1)); - desc.buf = tree->buffer; - desc.size = tree->size; + init_tree_desc(&desc, tree->buffer, tree->size); while (tree_entry(&desc, &entry)) { if (S_ISDIR(entry.mode)) mark_tree_uninteresting(lookup_tree(entry.sha1)); @@@ -212,13 -213,6 +212,13 @@@ static int everybody_uninteresting(stru return 1; } +/* + * The goal is to get REV_TREE_NEW as the result only if the + * diff consists of all '+' (and no other changes), and + * REV_TREE_DIFFERENT otherwise (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. + */ static int tree_difference = REV_TREE_SAME; static void file_add_remove(struct diff_options *options, @@@ -242,8 -236,6 +242,8 @@@ diff = REV_TREE_NEW; } tree_difference = diff; + if (tree_difference == REV_TREE_DIFFERENT) + options->has_changes = 1; } static void file_change(struct diff_options *options, @@@ -253,7 -245,6 +253,7 @@@ const char *base, const char *path) { tree_difference = REV_TREE_DIFFERENT; + options->has_changes = 1; } int rev_compare_tree(struct rev_info *revs, struct tree *t1, struct tree *t2) @@@ -263,7 -254,6 +263,7 @@@ if (!t2) return REV_TREE_DIFFERENT; tree_difference = REV_TREE_SAME; + revs->pruning.has_changes = 0; if (diff_tree_sha1(t1->object.sha1, t2->object.sha1, "", &revs->pruning) < 0) return REV_TREE_DIFFERENT; @@@ -274,24 -264,24 +274,24 @@@ int rev_same_tree_as_empty(struct rev_i { int retval; void *tree; + unsigned long size; struct tree_desc empty, real; if (!t1) return 0; - tree = read_object_with_reference(t1->object.sha1, tree_type, &real.size, NULL); + tree = read_object_with_reference(t1->object.sha1, tree_type, &size, NULL); if (!tree) return 0; - real.buf = tree; + init_tree_desc(&real, tree, size); + init_tree_desc(&empty, "", 0); - empty.buf = ""; - empty.size = 0; - - tree_difference = 0; + tree_difference = REV_TREE_SAME; + revs->pruning.has_changes = 0; retval = diff_tree(&empty, &real, "", &revs->pruning); free(tree); - return retval >= 0 && !tree_difference; + return retval >= 0 && (tree_difference == REV_TREE_SAME); } static void try_to_simplify_commit(struct rev_info *revs, struct commit *commit) @@@ -360,6 -350,7 +360,7 @@@ static void add_parents_to_list(struct { struct commit_list *parent = commit->parents; unsigned left_flag; + int add, rest; if (commit->object.flags & ADDED) return; @@@ -405,18 -396,19 +406,19 @@@ return; left_flag = (commit->object.flags & SYMMETRIC_LEFT); - parent = commit->parents; - while (parent) { + + rest = !revs->first_parent_only; + for (parent = commit->parents, add = 1; parent; add = rest) { struct commit *p = parent->item; parent = parent->next; - parse_commit(p); p->object.flags |= left_flag; if (p->object.flags & SEEN) continue; p->object.flags |= SEEN; - insert_by_date(p, list); + if (add) + insert_by_date(p, list); } } @@@ -555,7 -547,6 +557,7 @@@ void init_revisions(struct rev_info *re revs->ignore_merges = 1; revs->simplify_history = 1; revs->pruning.recursive = 1; + revs->pruning.quiet = 1; revs->pruning.add_remove = file_add_remove; revs->pruning.change = file_change; revs->lifo = 1; @@@ -847,6 -838,10 +849,10 @@@ int setup_revisions(int argc, const cha handle_all(revs, flags); continue; } + if (!strcmp(arg, "--first-parent")) { + revs->first_parent_only = 1; + continue; + } if (!strcmp(arg, "--reflog")) { handle_reflog(revs, flags); continue; @@@ -1036,7 -1031,7 +1042,7 @@@ if (!prefixcmp(arg, "--encoding=")) { arg += 11; if (strcmp(arg, "none")) - git_log_output_encoding = strdup(arg); + git_log_output_encoding = xstrdup(arg); else git_log_output_encoding = ""; continue;