mirror of
https://github.com/git/git.git
synced 2024-11-08 10:13:18 +01:00
Merge branch 'jc/post-simplify' (early part) into tr/filter-branch
* 'jc/post-simplify' (early part): revision --simplify-merges: make it a no-op without pathspec revision --simplify-merges: do not leave commits unprocessed revision --simplify-merges: use decoration instead of commit->util field
This commit is contained in:
commit
e1afaea942
2 changed files with 45 additions and 14 deletions
58
revision.c
58
revision.c
|
@ -1408,16 +1408,34 @@ static int remove_duplicate_parents(struct commit *commit)
|
||||||
return surviving_parents;
|
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 commit_list *p;
|
||||||
|
struct merge_simplify_state *st, *pst;
|
||||||
int cnt;
|
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?
|
* Have we handled this one?
|
||||||
*/
|
*/
|
||||||
if (commit->util)
|
if (st->simplified)
|
||||||
return tail;
|
return tail;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1426,7 +1444,7 @@ static struct commit_list **simplify_one(struct commit *commit, struct commit_li
|
||||||
* anyway.
|
* anyway.
|
||||||
*/
|
*/
|
||||||
if ((commit->object.flags & UNINTERESTING) || !commit->parents) {
|
if ((commit->object.flags & UNINTERESTING) || !commit->parents) {
|
||||||
commit->util = commit;
|
st->simplified = commit;
|
||||||
return tail;
|
return tail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1435,19 +1453,24 @@ static struct commit_list **simplify_one(struct commit *commit, struct commit_li
|
||||||
* Otherwise we are not ready to rewrite this one yet.
|
* Otherwise we are not ready to rewrite this one yet.
|
||||||
*/
|
*/
|
||||||
for (cnt = 0, p = commit->parents; p; p = p->next) {
|
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;
|
tail = &commit_list_insert(p->item, tail)->next;
|
||||||
cnt++;
|
cnt++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (cnt)
|
if (cnt) {
|
||||||
|
tail = &commit_list_insert(commit, tail)->next;
|
||||||
return tail;
|
return tail;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Rewrite our list of parents.
|
* Rewrite our list of parents.
|
||||||
*/
|
*/
|
||||||
for (p = commit->parents; p; p = p->next)
|
for (p = commit->parents; p; p = p->next) {
|
||||||
p->item = p->item->util;
|
pst = locate_simplify_state(revs, p->item);
|
||||||
|
p->item = pst->simplified;
|
||||||
|
}
|
||||||
cnt = remove_duplicate_parents(commit);
|
cnt = remove_duplicate_parents(commit);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1482,9 +1505,11 @@ static struct commit_list **simplify_one(struct commit *commit, struct commit_li
|
||||||
(commit->object.flags & UNINTERESTING) ||
|
(commit->object.flags & UNINTERESTING) ||
|
||||||
!(commit->object.flags & TREESAME) ||
|
!(commit->object.flags & TREESAME) ||
|
||||||
(1 < cnt))
|
(1 < cnt))
|
||||||
commit->util = commit;
|
st->simplified = commit;
|
||||||
else
|
else {
|
||||||
commit->util = commit->parents->item->util;
|
pst = locate_simplify_state(revs, commit->parents->item);
|
||||||
|
st->simplified = pst->simplified;
|
||||||
|
}
|
||||||
return tail;
|
return tail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1493,7 +1518,10 @@ static void simplify_merges(struct rev_info *revs)
|
||||||
struct commit_list *list;
|
struct commit_list *list;
|
||||||
struct commit_list *yet_to_do, **tail;
|
struct commit_list *yet_to_do, **tail;
|
||||||
|
|
||||||
sort_in_topological_order(&revs->commits, revs->lifo);
|
if (!revs->topo_order)
|
||||||
|
sort_in_topological_order(&revs->commits, revs->lifo);
|
||||||
|
if (!revs->prune)
|
||||||
|
return;
|
||||||
|
|
||||||
/* feed the list reversed */
|
/* feed the list reversed */
|
||||||
yet_to_do = NULL;
|
yet_to_do = NULL;
|
||||||
|
@ -1508,7 +1536,7 @@ static void simplify_merges(struct rev_info *revs)
|
||||||
struct commit_list *next = list->next;
|
struct commit_list *next = list->next;
|
||||||
free(list);
|
free(list);
|
||||||
list = next;
|
list = next;
|
||||||
tail = simplify_one(commit, tail);
|
tail = simplify_one(revs, commit, tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1519,9 +1547,11 @@ static void simplify_merges(struct rev_info *revs)
|
||||||
while (list) {
|
while (list) {
|
||||||
struct commit *commit = list->item;
|
struct commit *commit = list->item;
|
||||||
struct commit_list *next = list->next;
|
struct commit_list *next = list->next;
|
||||||
|
struct merge_simplify_state *st;
|
||||||
free(list);
|
free(list);
|
||||||
list = next;
|
list = next;
|
||||||
if (commit->util == commit)
|
st = locate_simplify_state(revs, commit);
|
||||||
|
if (st->simplified == commit)
|
||||||
tail = &commit_list_insert(commit, tail)->next;
|
tail = &commit_list_insert(commit, tail)->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,6 +110,7 @@ struct rev_info {
|
||||||
|
|
||||||
struct reflog_walk_info *reflog_info;
|
struct reflog_walk_info *reflog_info;
|
||||||
struct decoration children;
|
struct decoration children;
|
||||||
|
struct decoration merge_simplification;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define REV_TREE_SAME 0
|
#define REV_TREE_SAME 0
|
||||||
|
|
Loading…
Reference in a new issue