Make clear_commit_marks() clean harder
[gitweb.git] / commit.c
index 0431027ef2398a8fc48b5d4fff251d87efcd62c0..70a4effe5b28d49a0228ec182f0d89b356537924 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -397,13 +397,12 @@ void clear_commit_marks(struct commit *commit, unsigned int mark)
 {
        struct commit_list *parents;
 
+       if (!commit)
+               return;
        parents = commit->parents;
        commit->object.flags &= ~mark;
        while (parents) {
-               struct commit *parent = parents->item;
-               if (parent && parent->object.parsed &&
-                   (parent->object.flags & mark))
-                       clear_commit_marks(parent, mark);
+               clear_commit_marks(parents->item, mark);
                parents = parents->next;
        }
 }
@@ -849,9 +848,10 @@ void sort_in_topological_order_fn(struct commit_list ** list, int lifo,
 
 /* merge-rebase stuff */
 
-#define PARENT1 1
-#define PARENT2 2
-#define UNINTERESTING 4
+/* bits #0..7 in revision.h */
+#define PARENT1                (1u<< 8)
+#define PARENT2                (1u<< 9)
+#define UNINTERESTING  (1u<<10)
 
 static struct commit *interesting(struct commit_list *list)
 {
@@ -1080,9 +1080,20 @@ struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2)
                tmp = next;
        }
 
-       /* reset flags */
+       return result;
+}
+
+struct commit_list *get_merge_bases_clean(struct commit *rev1,
+                                          struct commit *rev2)
+{
+       unsigned int flags1 = rev1->object.flags;
+       unsigned int flags2 = rev2->object.flags;
+       struct commit_list *result = get_merge_bases(rev1, rev2);
+
        clear_commit_marks(rev1, PARENT1 | PARENT2 | UNINTERESTING);
        clear_commit_marks(rev2, PARENT1 | PARENT2 | UNINTERESTING);
+       rev1->object.flags = flags1;
+       rev2->object.flags = flags2;
 
        return result;
 }