projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
rev-list --bisect: limit list before bisecting.
[git.git]
/
revision.c
diff --git
a/revision.c
b/revision.c
index
ce35b5a
..
0505f3f
100644
(file)
--- a/
revision.c
+++ b/
revision.c
@@
-233,25
+233,20
@@
static void file_change(struct diff_options *options,
tree_difference = REV_TREE_DIFFERENT;
}
tree_difference = REV_TREE_DIFFERENT;
}
-static struct diff_options diff_opt = {
- .recursive = 1,
- .add_remove = file_add_remove,
- .change = file_change,
-};
-
-int rev_compare_tree(struct tree *t1, struct tree *t2)
+int rev_compare_tree(struct rev_info *revs, struct tree *t1, struct tree *t2)
{
if (!t1)
return REV_TREE_NEW;
if (!t2)
return REV_TREE_DIFFERENT;
tree_difference = REV_TREE_SAME;
{
if (!t1)
return REV_TREE_NEW;
if (!t2)
return REV_TREE_DIFFERENT;
tree_difference = REV_TREE_SAME;
- if (diff_tree_sha1(t1->object.sha1, t2->object.sha1, "", &diff_opt) < 0)
+ if (diff_tree_sha1(t1->object.sha1, t2->object.sha1, "",
+ &revs->diffopt) < 0)
return REV_TREE_DIFFERENT;
return tree_difference;
}
return REV_TREE_DIFFERENT;
return tree_difference;
}
-int rev_same_tree_as_empty(struct tree *t1)
+int rev_same_tree_as_empty(struct
rev_info *revs, struct
tree *t1)
{
int retval;
void *tree;
{
int retval;
void *tree;
@@
-269,7
+264,7
@@
int rev_same_tree_as_empty(struct tree *t1)
empty.size = 0;
tree_difference = 0;
empty.size = 0;
tree_difference = 0;
- retval = diff_tree(&empty, &real, "", &
diff_
opt);
+ retval = diff_tree(&empty, &real, "", &
revs->diff
opt);
free(tree);
return retval >= 0 && !tree_difference;
free(tree);
return retval >= 0 && !tree_difference;
@@
-284,7
+279,7
@@
static void try_to_simplify_commit(struct rev_info *revs, struct commit *commit)
return;
if (!commit->parents) {
return;
if (!commit->parents) {
- if (!rev_same_tree_as_empty(commit->tree))
+ if (!rev_same_tree_as_empty(
revs,
commit->tree))
commit->object.flags |= TREECHANGE;
return;
}
commit->object.flags |= TREECHANGE;
return;
}
@@
-294,7
+289,7
@@
static void try_to_simplify_commit(struct rev_info *revs, struct commit *commit)
struct commit *p = parent->item;
parse_commit(p);
struct commit *p = parent->item;
parse_commit(p);
- switch (rev_compare_tree(p->tree, commit->tree)) {
+ switch (rev_compare_tree(
revs,
p->tree, commit->tree)) {
case REV_TREE_SAME:
if (p->object.flags & UNINTERESTING) {
/* Even if a merge with an uninteresting
case REV_TREE_SAME:
if (p->object.flags & UNINTERESTING) {
/* Even if a merge with an uninteresting
@@
-312,7
+307,7
@@
static void try_to_simplify_commit(struct rev_info *revs, struct commit *commit)
case REV_TREE_NEW:
if (revs->remove_empty_trees &&
case REV_TREE_NEW:
if (revs->remove_empty_trees &&
- rev_same_tree_as_empty(p->tree)) {
+ rev_same_tree_as_empty(
revs,
p->tree)) {
/* We are adding all the specified
* paths from this parent, so the
* history beyond this parent is not
/* We are adding all the specified
* paths from this parent, so the
* history beyond this parent is not
@@
-340,6
+335,10
@@
static void add_parents_to_list(struct rev_info *revs, struct commit *commit, st
{
struct commit_list *parent = commit->parents;
{
struct commit_list *parent = commit->parents;
+ if (commit->object.flags & ADDED)
+ return;
+ commit->object.flags |= ADDED;
+
/*
* If the commit is uninteresting, don't try to
* prune parents - we want the maximal uninteresting
/*
* If the commit is uninteresting, don't try to
* prune parents - we want the maximal uninteresting
@@
-480,6
+479,9
@@
static void handle_all(struct rev_info *revs, unsigned flags)
void init_revisions(struct rev_info *revs)
{
memset(revs, 0, sizeof(*revs));
void init_revisions(struct rev_info *revs)
{
memset(revs, 0, sizeof(*revs));
+ revs->diffopt.recursive = 1;
+ revs->diffopt.add_remove = file_add_remove;
+ revs->diffopt.change = file_change;
revs->lifo = 1;
revs->dense = 1;
revs->prefix = setup_git_directory();
revs->lifo = 1;
revs->dense = 1;
revs->prefix = setup_git_directory();
@@
-703,15
+705,8
@@
int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
revs->limited = 1;
if (revs->prune_data) {
revs->limited = 1;
if (revs->prune_data) {
- diff_tree_setup_paths(revs->prune_data);
+ diff_tree_setup_paths(revs->prune_data
, &revs->diffopt
);
revs->prune_fn = try_to_simplify_commit;
revs->prune_fn = try_to_simplify_commit;
-
- /*
- * If we fix up parent data, we currently cannot
- * do that on-the-fly.
- */
- if (revs->parents)
- revs->limited = 1;
}
return left;
}
return left;
@@
-728,10
+723,12
@@
void prepare_revision_walk(struct rev_info *revs)
revs->topo_getter);
}
revs->topo_getter);
}
-static int rewrite_one(struct commit **pp)
+static int rewrite_one(struct
rev_info *revs, struct
commit **pp)
{
for (;;) {
struct commit *p = *pp;
{
for (;;) {
struct commit *p = *pp;
+ if (!revs->limited)
+ add_parents_to_list(revs, p, &revs->commits);
if (p->object.flags & (TREECHANGE | UNINTERESTING))
return 0;
if (!p->parents)
if (p->object.flags & (TREECHANGE | UNINTERESTING))
return 0;
if (!p->parents)
@@
-740,12
+737,12
@@
static int rewrite_one(struct commit **pp)
}
}
}
}
-static void rewrite_parents(struct commit *commit)
+static void rewrite_parents(struct
rev_info *revs, struct
commit *commit)
{
struct commit_list **pp = &commit->parents;
while (*pp) {
struct commit_list *parent = *pp;
{
struct commit_list **pp = &commit->parents;
while (*pp) {
struct commit_list *parent = *pp;
- if (rewrite_one(&parent->item) < 0) {
+ if (rewrite_one(
revs,
&parent->item) < 0) {
*pp = parent->next;
continue;
}
*pp = parent->next;
continue;
}
@@
-802,7
+799,7
@@
struct commit *get_revision(struct rev_info *revs)
if (!(commit->object.flags & TREECHANGE))
continue;
if (revs->parents)
if (!(commit->object.flags & TREECHANGE))
continue;
if (revs->parents)
- rewrite_parents(commit);
+ rewrite_parents(
revs,
commit);
}
commit->object.flags |= SHOWN;
return commit;
}
commit->object.flags |= SHOWN;
return commit;