1
0
Fork 0
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:
Junio C Hamano 2008-08-30 16:03:40 -07:00
commit e1afaea942
2 changed files with 45 additions and 14 deletions

View 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,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.
*/
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++;
}
}
if (cnt)
if (cnt) {
tail = &commit_list_insert(commit, tail)->next;
return tail;
}
/*
* 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 +1505,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;
}
@ -1493,7 +1518,10 @@ static void simplify_merges(struct rev_info *revs)
struct commit_list *list;
struct commit_list *yet_to_do, **tail;
if (!revs->topo_order)
sort_in_topological_order(&revs->commits, revs->lifo);
if (!revs->prune)
return;
/* feed the list reversed */
yet_to_do = NULL;
@ -1508,7 +1536,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 +1547,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;
}
}

View 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