revision --simplify-merges: use decoration instead of commit->util field
authorJunio C Hamano <gitster@pobox.com>
Thu, 14 Aug 2008 17:59:44 +0000 (10:59 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 14 Aug 2008 22:45:16 +0000 (15:45 -0700)
The users of revision walking machinery may want to use the util pointer
for their own use.  Use decoration to hold the data needed during merge
simplification instead.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
revision.c
revision.h

index 0aaa4c1..33cb207 100644 (file)
@@ -1408,16 +1408,34 @@ static int remove_duplicate_parents(struct commit *commit)
        return surviving_parents;
 }
 
-static struct commit_list **simplify_one(struct commit *commit, struct commit_list **tail)
+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;
+}
+
+static struct commit_list **simplify_one(struct rev_info *revs, struct commit *commit, struct commit_list **tail)
 {
        struct commit_list *p;
+       struct merge_simplify_state *st, *pst;
        int cnt;
 
+       st = locate_simplify_state(revs, commit);
+
        /*
-        * We store which commit each one simplifies to in its util field.
         * Have we handled this one?
         */
-       if (commit->util)
+       if (st->simplified)
                return tail;
 
        /*
@@ -1426,7 +1444,7 @@ static struct commit_list **simplify_one(struct commit *commit, struct commit_li
         * anyway.
         */
        if ((commit->object.flags & UNINTERESTING) || !commit->parents) {
-               commit->util = commit;
+               st->simplified = commit;
                return tail;
        }
 
@@ -1435,7 +1453,8 @@ static struct commit_list **simplify_one(struct commit *commit, struct commit_li
         * Otherwise we are not ready to rewrite this one yet.
         */
        for (cnt = 0, p = commit->parents; p; p = p->next) {
-               if (!p->item->util) {
+               pst = locate_simplify_state(revs, p->item);
+               if (!pst->simplified) {
                        tail = &commit_list_insert(p->item, tail)->next;
                        cnt++;
                }
@@ -1446,8 +1465,10 @@ static struct commit_list **simplify_one(struct commit *commit, struct commit_li
        /*
         * Rewrite our list of parents.
         */
-       for (p = commit->parents; p; p = p->next)
-               p->item = p->item->util;
+       for (p = commit->parents; p; p = p->next) {
+               pst = locate_simplify_state(revs, p->item);
+               p->item = pst->simplified;
+       }
        cnt = remove_duplicate_parents(commit);
 
        /*
@@ -1482,9 +1503,11 @@ static struct commit_list **simplify_one(struct commit *commit, struct commit_li
            (commit->object.flags & UNINTERESTING) ||
            !(commit->object.flags & TREESAME) ||
            (1 < cnt))
-               commit->util = commit;
-       else
-               commit->util = commit->parents->item->util;
+               st->simplified = commit;
+       else {
+               pst = locate_simplify_state(revs, commit->parents->item);
+               st->simplified = pst->simplified;
+       }
        return tail;
 }
 
@@ -1508,7 +1531,7 @@ static void simplify_merges(struct rev_info *revs)
                        struct commit_list *next = list->next;
                        free(list);
                        list = next;
-                       tail = simplify_one(commit, tail);
+                       tail = simplify_one(revs, commit, tail);
                }
        }
 
@@ -1519,9 +1542,11 @@ static void simplify_merges(struct rev_info *revs)
        while (list) {
                struct commit *commit = list->item;
                struct commit_list *next = list->next;
+               struct merge_simplify_state *st;
                free(list);
                list = next;
-               if (commit->util == commit)
+               st = locate_simplify_state(revs, commit);
+               if (st->simplified == commit)
                        tail = &commit_list_insert(commit, tail)->next;
        }
 }
index dfa06b5..765ef6c 100644 (file)
@@ -110,6 +110,7 @@ struct rev_info {
 
        struct reflog_walk_info *reflog_info;
        struct decoration children;
+       struct decoration merge_simplification;
 };
 
 #define REV_TREE_SAME          0