revision --simplify-merges: use decoration instead of commit->util field
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>
This commit is contained in:
parent
6534703059
commit
faf0156b27
49
revision.c
49
revision.c
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user