Code

Make "--parents" logs also be incremental
authorLinus Torvalds <torvalds@osdl.org>
Sun, 9 Apr 2006 00:05:58 +0000 (17:05 -0700)
committerJunio C Hamano <junkio@cox.net>
Sun, 9 Apr 2006 06:37:21 +0000 (23:37 -0700)
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>
http-push.c
rev-list.c
revision.c
revision.h

index b60fa8d2417c32cf72331e9869d4d3a3208e953f..57cefdea530171c71c72229a85aa0212dedb2c5a 100644 (file)
@@ -59,12 +59,12 @@ enum XML_Status {
 #define LOCK_TIME 600
 #define LOCK_REFRESH 30
 
-/* bits #0-4 in revision.h */
+/* bits #0-6 in revision.h */
 
-#define LOCAL    (1u << 5)
-#define REMOTE   (1u << 6)
-#define FETCHING (1u << 7)
-#define PUSHING  (1u << 8)
+#define LOCAL    (1u << 7)
+#define REMOTE   (1u << 8)
+#define FETCHING (1u << 9)
+#define PUSHING  (1u << 10)
 
 /* We allow "recursive" symbolic refs. Only within reason, though */
 #define MAXDEPTH 5
index 13015026276029bc213972cae234981ee14b06b7..359195b5471d8e4b88fd9a326986e55d48b1dfa6 100644 (file)
@@ -7,9 +7,9 @@
 #include "tree-walk.h"
 #include "revision.h"
 
-/* bits #0-5 in revision.h */
+/* bits #0-6 in revision.h */
 
-#define COUNTED                (1u<<6)
+#define COUNTED                (1u<<7)
 
 static const char rev_list_usage[] =
 "git-rev-list [OPTION] <commit-id>... [ -- paths... ]\n"
index ce35b5a7e6960383debb4541c573ecf02d192cae..fe265623817c7c6b5b4c1af399f4522a75fdaf30 100644 (file)
@@ -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;
index 0caeecf00f1aedf753f9f1fa88c3b5113cc53a52..83d28d520557ae37eea59dd7446e46edb6ef7cf6 100644 (file)
@@ -7,6 +7,7 @@
 #define SHOWN          (1u<<3)
 #define TMP_MARK       (1u<<4) /* for isolated cases; clean after use */
 #define BOUNDARY       (1u<<5)
+#define ADDED          (1u<<6) /* Parents already parsed and added? */
 
 struct rev_info;