{
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;
}
}
/* bits #0..7 in revision.h */
#define PARENT1 (1u<< 8)
#define PARENT2 (1u<< 9)
-#define UNINTERESTING (1u<<10)
+#define STALE (1u<<10)
static struct commit *interesting(struct commit_list *list)
{
while (list) {
struct commit *commit = list->item;
list = list->next;
- if (commit->object.flags & UNINTERESTING)
+ if (commit->object.flags & STALE)
continue;
return commit;
}
*
* Next, we pop B and something very interesting happens. It has flags==3
* so it is also placed on the result list, and its parents are marked
- * uninteresting, retroactively, and placed back on the list:
+ * stale, retroactively, and placed back on the list:
*
* list=C(7), result=C(7) B(3)
*
* Now, list does not have any interesting commit. So we find the newest
- * commit from the result list that is not marked uninteresting. Which is
+ * commit from the result list that is not marked stale. Which is
* commit B.
*
*
* Another pathological example how this thing used to fail to mark an
- * ancestor of a merge base as UNINTERESTING before we introduced the
+ * ancestor of a merge base as STALE before we introduced the
* postprocessing phase (mark_reachable_commits).
*
* 2
* C7 2 3 7 1 3 2 1 2
*
* At this point, unfortunately, everybody in the list is
- * uninteresting, so we fail to complete the following two
- * steps to fully marking uninteresting commits.
+ * stale, so we fail to complete the following two
+ * steps to fully marking stale commits.
*
* D7 2 3 7 7 3 2 1 2
* E7 2 3 7 7 7 2 1 2
*/
for (tmp = result; tmp; tmp = tmp->next) {
struct commit *c = tmp->item;
- /* Reinject uninteresting ones to list,
+ /* Reinject stale ones to list,
* so we can scan their parents.
*/
- if (c->object.flags & UNINTERESTING)
+ if (c->object.flags & STALE)
commit_list_insert(c, &list);
}
while (list) {
list = list->next;
free(tmp);
- /* Anything taken out of the list is uninteresting, so
- * mark all its parents uninteresting. We do not
+ /* Anything taken out of the list is stale, so
+ * mark all its parents stale. We do not
* parse new ones (we already parsed all the relevant
* ones).
*/
while (parents) {
struct commit *p = parents->item;
parents = parents->next;
- if (!(p->object.flags & UNINTERESTING)) {
- p->object.flags |= UNINTERESTING;
+ if (!(p->object.flags & STALE)) {
+ p->object.flags |= STALE;
commit_list_insert(p, &list);
}
}
}
}
-struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2)
+struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2,
+ int cleanup)
{
struct commit_list *list = NULL;
struct commit_list *result = NULL;
struct commit *commit = list->item;
struct commit_list *parents;
int flags = commit->object.flags
- & (PARENT1 | PARENT2 | UNINTERESTING);
+ & (PARENT1 | PARENT2 | STALE);
tmp = list;
list = list->next;
if (flags == (PARENT1 | PARENT2)) {
insert_by_date(commit, &result);
- /* Mark parents of a found merge uninteresting */
- flags |= UNINTERESTING;
+ /* Mark parents of a found merge stale */
+ flags |= STALE;
}
parents = commit->parents;
while (parents) {
}
if (!result)
- return NULL;
+ goto finish;
if (result->next && list)
mark_reachable_commits(result, list);
for (tmp = result, list = NULL; tmp; ) {
struct commit *commit = tmp->item;
struct commit_list *next = tmp->next;
- if (commit->object.flags & UNINTERESTING) {
+ if (commit->object.flags & STALE) {
if (list != NULL)
list->next = next;
free(tmp);
if (list == NULL)
result = tmp;
list = tmp;
- commit->object.flags |= UNINTERESTING;
+ commit->object.flags |= STALE;
}
tmp = next;
}
- 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;
+ finish:
+ if (cleanup) {
+ clear_commit_marks(rev1, PARENT1 | PARENT2 | STALE);
+ clear_commit_marks(rev2, PARENT1 | PARENT2 | STALE);
+ }
return result;
}