Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--revision.c49
-rw-r--r--revision.h1
2 files changed, 38 insertions, 12 deletions
diff --git a/revision.c b/revision.c
index 0aaa4c10b9..33cb207f28 100644
--- a/revision.c
+++ b/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;
}
}
diff --git a/revision.h b/revision.h
index dfa06b5210..765ef6c5e2 100644
--- a/revision.h
+++ b/revision.h
@@ -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