зеркало из https://github.com/microsoft/git.git
Topo-sort before --simplify-merges
This makes the algorithm more honest about what it is doing. We start from an already limited, topo-sorted list, and postprocess it by simplifying the irrelevant merges away. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
6546b5931e
Коммит
6534703059
|
@ -1493,6 +1493,8 @@ 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);
|
||||||
|
|
||||||
/* feed the list reversed */
|
/* feed the list reversed */
|
||||||
yet_to_do = NULL;
|
yet_to_do = NULL;
|
||||||
for (list = revs->commits; list; list = list->next)
|
for (list = revs->commits; list; list = list->next)
|
||||||
|
@ -1522,9 +1524,6 @@ static void simplify_merges(struct rev_info *revs)
|
||||||
if (commit->util == commit)
|
if (commit->util == commit)
|
||||||
tail = &commit_list_insert(commit, tail)->next;
|
tail = &commit_list_insert(commit, tail)->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sort topologically at the end */
|
|
||||||
sort_in_topological_order(&revs->commits, revs->lifo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_children(struct rev_info *revs)
|
static void set_children(struct rev_info *revs)
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='merge simplification'
|
||||||
|
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
note () {
|
||||||
|
git tag "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
_x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
|
||||||
|
_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
|
||||||
|
|
||||||
|
unnote () {
|
||||||
|
git name-rev --tags --stdin | sed -e "s|$_x40 (tags/\([^)]*\)) |\1 |g"
|
||||||
|
}
|
||||||
|
|
||||||
|
test_expect_success setup '
|
||||||
|
echo "Hi there" >file &&
|
||||||
|
git add file &&
|
||||||
|
test_tick && git commit -m "Initial file" &&
|
||||||
|
note A &&
|
||||||
|
|
||||||
|
git branch other-branch &&
|
||||||
|
|
||||||
|
echo "Hello" >file &&
|
||||||
|
git add file &&
|
||||||
|
test_tick && git commit -m "Modified file" &&
|
||||||
|
note B &&
|
||||||
|
|
||||||
|
git checkout other-branch &&
|
||||||
|
|
||||||
|
echo "Hello" >file &&
|
||||||
|
git add file &&
|
||||||
|
test_tick && git commit -m "Modified the file identically" &&
|
||||||
|
note C &&
|
||||||
|
|
||||||
|
echo "This is a stupid example" >another-file &&
|
||||||
|
git add another-file &&
|
||||||
|
test_tick && git commit -m "Add another file" &&
|
||||||
|
note D &&
|
||||||
|
|
||||||
|
test_tick && git merge -m "merge" master &&
|
||||||
|
note E &&
|
||||||
|
|
||||||
|
echo "Yet another" >elif &&
|
||||||
|
git add elif &&
|
||||||
|
test_tick && git commit -m "Irrelevant change" &&
|
||||||
|
note F &&
|
||||||
|
|
||||||
|
git checkout master &&
|
||||||
|
echo "Yet another" >elif &&
|
||||||
|
git add elif &&
|
||||||
|
test_tick && git commit -m "Another irrelevant change" &&
|
||||||
|
note G &&
|
||||||
|
|
||||||
|
test_tick && git merge -m "merge" other-branch &&
|
||||||
|
note H &&
|
||||||
|
|
||||||
|
echo "Final change" >file &&
|
||||||
|
test_tick && git commit -a -m "Final change" &&
|
||||||
|
note I
|
||||||
|
'
|
||||||
|
|
||||||
|
FMT='tformat:%P %H | %s'
|
||||||
|
|
||||||
|
check_result () {
|
||||||
|
for c in $1
|
||||||
|
do
|
||||||
|
echo "$c"
|
||||||
|
done >expect &&
|
||||||
|
shift &&
|
||||||
|
param="$*" &&
|
||||||
|
test_expect_success "log $param" '
|
||||||
|
git log --pretty="$FMT" --parents $param |
|
||||||
|
unnote >actual &&
|
||||||
|
sed -e "s/^.* \([^ ]*\) .*/\1/" >check <actual &&
|
||||||
|
test_cmp expect check || {
|
||||||
|
cat actual
|
||||||
|
false
|
||||||
|
}
|
||||||
|
'
|
||||||
|
}
|
||||||
|
|
||||||
|
check_result 'I H G F E D C B A' --full-history
|
||||||
|
check_result 'I H E C B A' --full-history -- file
|
||||||
|
check_result 'I H E C B A' --full-history --topo-order -- file
|
||||||
|
check_result 'I H E C B A' --full-history --date-order -- file
|
||||||
|
check_result 'I E C B A' --simplify-merges -- file
|
||||||
|
check_result 'I B A' -- file
|
||||||
|
check_result 'I B A' --topo-order -- file
|
||||||
|
|
||||||
|
test_done
|
Загрузка…
Ссылка в новой задаче