summaryrefslogtreecommitdiff
path: root/revision.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@osdl.org>2006-04-09 00:05:58 (GMT)
committerJunio C Hamano <junkio@cox.net>2006-04-09 06:37:21 (GMT)
commit3381c790e5ca04326d26e1dd9ff482961c6e425b (patch)
tree818873fa577518a411361646f45aafdd5753715c /revision.c
parent0ed49a3ed9ab9747f7916c928d50aa0bf4d2c81d (diff)
downloadgit-3381c790e5ca04326d26e1dd9ff482961c6e425b.zip
git-3381c790e5ca04326d26e1dd9ff482961c6e425b.tar.gz
git-3381c790e5ca04326d26e1dd9ff482961c6e425b.tar.bz2
Make "--parents" logs also be incremental
The parent rewriting feature caused us to create the whole history in one go, and then simplify it later, because of how rewrite_parents() had been written. However, with a little tweaking, it's perfectly possible to do even that one incrementally. Right now, this doesn't really much matter, because every user of "--parents" will probably generally _also_ use "--topo-order", which will cause the old non-incremental behaviour anyway. However, I'm hopeful that we could make even the topological sort incremental, or at least _partially_ so (for example, make it incremental up to the first merge). In the meantime, this at least moves things in the right direction, and removes a strange special case. Signed-off-by: Linus Torvalds <torvalds@osdl.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'revision.c')
-rw-r--r--revision.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/revision.c b/revision.c
index ce35b5a..fe26562 100644
--- a/revision.c
+++ b/revision.c
@@ -340,6 +340,10 @@ static void add_parents_to_list(struct rev_info *revs, struct commit *commit, st
{
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
@@ -705,13 +709,6 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
if (revs->prune_data) {
diff_tree_setup_paths(revs->prune_data);
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;
@@ -728,10 +725,12 @@ void prepare_revision_walk(struct rev_info *revs)
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;
+ if (!revs->limited)
+ add_parents_to_list(revs, p, &revs->commits);
if (p->object.flags & (TREECHANGE | UNINTERESTING))
return 0;
if (!p->parents)
@@ -740,12 +739,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;
- if (rewrite_one(&parent->item) < 0) {
+ if (rewrite_one(revs, &parent->item) < 0) {
*pp = parent->next;
continue;
}
@@ -802,7 +801,7 @@ struct commit *get_revision(struct rev_info *revs)
if (!(commit->object.flags & TREECHANGE))
continue;
if (revs->parents)
- rewrite_parents(commit);
+ rewrite_parents(revs, commit);
}
commit->object.flags |= SHOWN;
return commit;