mirror of
https://github.com/git/git.git
synced 2024-11-23 18:05:29 +08:00
716a6b2c3a
We call repo_get_merge_bases(), which allocates a commit_list, but never free the result, causing a leak. The obvious solution is to free it, but we need to look at the contents of the first item to decide whether to leave the loop. One option is to free it in both code paths. But since the commit that the list points to is longer-lived than the list itself, we can just dereference it immediately, free the list, and then continue with the existing logic. This is about the same amount of code, but keeps the list management all in one place. This lets us mark a number of merge-related test scripts as leak-free. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
352 lines
10 KiB
Bash
Executable File
352 lines
10 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='git log --graph of skewed left octopus merge.'
|
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
|
. ./test-lib.sh
|
|
. "$TEST_DIRECTORY"/lib-log-graph.sh
|
|
|
|
test_cmp_graph () {
|
|
cat >expect &&
|
|
lib_test_cmp_graph --color=never --date-order --format=%s "$@"
|
|
}
|
|
|
|
test_cmp_colored_graph () {
|
|
lib_test_cmp_colored_graph --date-order --format=%s "$@"
|
|
}
|
|
|
|
test_expect_success 'set up merge history' '
|
|
test_commit initial &&
|
|
for i in 1 2 3 4 ; do
|
|
git checkout main -b $i || return $?
|
|
# Make tag name different from branch name, to avoid
|
|
# ambiguity error when calling checkout.
|
|
test_commit $i $i $i tag$i || return $?
|
|
done &&
|
|
git checkout 1 -b merge &&
|
|
test_merge octopus-merge 1 2 3 4 &&
|
|
test_commit after-merge &&
|
|
git checkout 1 -b L &&
|
|
test_commit left &&
|
|
git checkout 4 -b crossover &&
|
|
test_commit after-4 &&
|
|
git checkout initial -b more-L &&
|
|
test_commit after-initial
|
|
'
|
|
|
|
test_expect_success 'log --graph with tricky octopus merge, no color' '
|
|
test_cmp_graph left octopus-merge <<-\EOF
|
|
* left
|
|
| *-. octopus-merge
|
|
|/|\ \
|
|
| | | * 4
|
|
| | * | 3
|
|
| | |/
|
|
| * / 2
|
|
| |/
|
|
* / 1
|
|
|/
|
|
* initial
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'log --graph with tricky octopus merge with colors' '
|
|
test_config log.graphColors red,green,yellow,blue,magenta,cyan &&
|
|
cat >expect.colors <<-\EOF &&
|
|
* left
|
|
<RED>|<RESET> *<MAGENTA>-<RESET><MAGENTA>.<RESET> octopus-merge
|
|
<RED>|<RESET><RED>/<RESET><YELLOW>|<RESET><BLUE>\<RESET> <MAGENTA>\<RESET>
|
|
<RED>|<RESET> <YELLOW>|<RESET> <BLUE>|<RESET> * 4
|
|
<RED>|<RESET> <YELLOW>|<RESET> * <MAGENTA>|<RESET> 3
|
|
<RED>|<RESET> <YELLOW>|<RESET> <MAGENTA>|<RESET><MAGENTA>/<RESET>
|
|
<RED>|<RESET> * <MAGENTA>/<RESET> 2
|
|
<RED>|<RESET> <MAGENTA>|<RESET><MAGENTA>/<RESET>
|
|
* <MAGENTA>/<RESET> 1
|
|
<MAGENTA>|<RESET><MAGENTA>/<RESET>
|
|
* initial
|
|
EOF
|
|
test_cmp_colored_graph left octopus-merge
|
|
'
|
|
|
|
# Repeat the previous two tests with "normal" octopus merge (i.e.,
|
|
# without the first parent skewing to the "left" branch column).
|
|
|
|
test_expect_success 'log --graph with normal octopus merge, no color' '
|
|
test_cmp_graph octopus-merge <<-\EOF
|
|
*---. octopus-merge
|
|
|\ \ \
|
|
| | | * 4
|
|
| | * | 3
|
|
| | |/
|
|
| * / 2
|
|
| |/
|
|
* / 1
|
|
|/
|
|
* initial
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'log --graph with normal octopus merge with colors' '
|
|
cat >expect.colors <<-\EOF &&
|
|
*<YELLOW>-<RESET><YELLOW>-<RESET><BLUE>-<RESET><BLUE>.<RESET> octopus-merge
|
|
<RED>|<RESET><GREEN>\<RESET> <YELLOW>\<RESET> <BLUE>\<RESET>
|
|
<RED>|<RESET> <GREEN>|<RESET> <YELLOW>|<RESET> * 4
|
|
<RED>|<RESET> <GREEN>|<RESET> * <BLUE>|<RESET> 3
|
|
<RED>|<RESET> <GREEN>|<RESET> <BLUE>|<RESET><BLUE>/<RESET>
|
|
<RED>|<RESET> * <BLUE>/<RESET> 2
|
|
<RED>|<RESET> <BLUE>|<RESET><BLUE>/<RESET>
|
|
* <BLUE>/<RESET> 1
|
|
<BLUE>|<RESET><BLUE>/<RESET>
|
|
* initial
|
|
EOF
|
|
test_config log.graphColors red,green,yellow,blue,magenta,cyan &&
|
|
test_cmp_colored_graph octopus-merge
|
|
'
|
|
|
|
test_expect_success 'log --graph with normal octopus merge and child, no color' '
|
|
test_cmp_graph after-merge <<-\EOF
|
|
* after-merge
|
|
*---. octopus-merge
|
|
|\ \ \
|
|
| | | * 4
|
|
| | * | 3
|
|
| | |/
|
|
| * / 2
|
|
| |/
|
|
* / 1
|
|
|/
|
|
* initial
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'log --graph with normal octopus and child merge with colors' '
|
|
cat >expect.colors <<-\EOF &&
|
|
* after-merge
|
|
*<BLUE>-<RESET><BLUE>-<RESET><MAGENTA>-<RESET><MAGENTA>.<RESET> octopus-merge
|
|
<GREEN>|<RESET><YELLOW>\<RESET> <BLUE>\<RESET> <MAGENTA>\<RESET>
|
|
<GREEN>|<RESET> <YELLOW>|<RESET> <BLUE>|<RESET> * 4
|
|
<GREEN>|<RESET> <YELLOW>|<RESET> * <MAGENTA>|<RESET> 3
|
|
<GREEN>|<RESET> <YELLOW>|<RESET> <MAGENTA>|<RESET><MAGENTA>/<RESET>
|
|
<GREEN>|<RESET> * <MAGENTA>/<RESET> 2
|
|
<GREEN>|<RESET> <MAGENTA>|<RESET><MAGENTA>/<RESET>
|
|
* <MAGENTA>/<RESET> 1
|
|
<MAGENTA>|<RESET><MAGENTA>/<RESET>
|
|
* initial
|
|
EOF
|
|
test_config log.graphColors red,green,yellow,blue,magenta,cyan &&
|
|
test_cmp_colored_graph after-merge
|
|
'
|
|
|
|
test_expect_success 'log --graph with tricky octopus merge and its child, no color' '
|
|
test_cmp_graph left after-merge <<-\EOF
|
|
* left
|
|
| * after-merge
|
|
| *-. octopus-merge
|
|
|/|\ \
|
|
| | | * 4
|
|
| | * | 3
|
|
| | |/
|
|
| * / 2
|
|
| |/
|
|
* / 1
|
|
|/
|
|
* initial
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'log --graph with tricky octopus merge and its child with colors' '
|
|
test_config log.graphColors red,green,yellow,blue,magenta,cyan &&
|
|
cat >expect.colors <<-\EOF &&
|
|
* left
|
|
<RED>|<RESET> * after-merge
|
|
<RED>|<RESET> *<CYAN>-<RESET><CYAN>.<RESET> octopus-merge
|
|
<RED>|<RESET><RED>/<RESET><BLUE>|<RESET><MAGENTA>\<RESET> <CYAN>\<RESET>
|
|
<RED>|<RESET> <BLUE>|<RESET> <MAGENTA>|<RESET> * 4
|
|
<RED>|<RESET> <BLUE>|<RESET> * <CYAN>|<RESET> 3
|
|
<RED>|<RESET> <BLUE>|<RESET> <CYAN>|<RESET><CYAN>/<RESET>
|
|
<RED>|<RESET> * <CYAN>/<RESET> 2
|
|
<RED>|<RESET> <CYAN>|<RESET><CYAN>/<RESET>
|
|
* <CYAN>/<RESET> 1
|
|
<CYAN>|<RESET><CYAN>/<RESET>
|
|
* initial
|
|
EOF
|
|
test_cmp_colored_graph left after-merge
|
|
'
|
|
|
|
test_expect_success 'log --graph with crossover in octopus merge, no color' '
|
|
test_cmp_graph after-4 octopus-merge <<-\EOF
|
|
* after-4
|
|
| *---. octopus-merge
|
|
| |\ \ \
|
|
| |_|_|/
|
|
|/| | |
|
|
* | | | 4
|
|
| | | * 3
|
|
| |_|/
|
|
|/| |
|
|
| | * 2
|
|
| |/
|
|
|/|
|
|
| * 1
|
|
|/
|
|
* initial
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'log --graph with crossover in octopus merge with colors' '
|
|
test_config log.graphColors red,green,yellow,blue,magenta,cyan &&
|
|
cat >expect.colors <<-\EOF &&
|
|
* after-4
|
|
<RED>|<RESET> *<BLUE>-<RESET><BLUE>-<RESET><RED>-<RESET><RED>.<RESET> octopus-merge
|
|
<RED>|<RESET> <GREEN>|<RESET><YELLOW>\<RESET> <BLUE>\<RESET> <RED>\<RESET>
|
|
<RED>|<RESET> <GREEN>|<RESET><RED>_<RESET><YELLOW>|<RESET><RED>_<RESET><BLUE>|<RESET><RED>/<RESET>
|
|
<RED>|<RESET><RED>/<RESET><GREEN>|<RESET> <YELLOW>|<RESET> <BLUE>|<RESET>
|
|
* <GREEN>|<RESET> <YELLOW>|<RESET> <BLUE>|<RESET> 4
|
|
<MAGENTA>|<RESET> <GREEN>|<RESET> <YELLOW>|<RESET> * 3
|
|
<MAGENTA>|<RESET> <GREEN>|<RESET><MAGENTA>_<RESET><YELLOW>|<RESET><MAGENTA>/<RESET>
|
|
<MAGENTA>|<RESET><MAGENTA>/<RESET><GREEN>|<RESET> <YELLOW>|<RESET>
|
|
<MAGENTA>|<RESET> <GREEN>|<RESET> * 2
|
|
<MAGENTA>|<RESET> <GREEN>|<RESET><MAGENTA>/<RESET>
|
|
<MAGENTA>|<RESET><MAGENTA>/<RESET><GREEN>|<RESET>
|
|
<MAGENTA>|<RESET> * 1
|
|
<MAGENTA>|<RESET><MAGENTA>/<RESET>
|
|
* initial
|
|
EOF
|
|
test_cmp_colored_graph after-4 octopus-merge
|
|
'
|
|
|
|
test_expect_success 'log --graph with crossover in octopus merge and its child, no color' '
|
|
test_cmp_graph after-4 after-merge <<-\EOF
|
|
* after-4
|
|
| * after-merge
|
|
| *---. octopus-merge
|
|
| |\ \ \
|
|
| |_|_|/
|
|
|/| | |
|
|
* | | | 4
|
|
| | | * 3
|
|
| |_|/
|
|
|/| |
|
|
| | * 2
|
|
| |/
|
|
|/|
|
|
| * 1
|
|
|/
|
|
* initial
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'log --graph with crossover in octopus merge and its child with colors' '
|
|
test_config log.graphColors red,green,yellow,blue,magenta,cyan &&
|
|
cat >expect.colors <<-\EOF &&
|
|
* after-4
|
|
<RED>|<RESET> * after-merge
|
|
<RED>|<RESET> *<MAGENTA>-<RESET><MAGENTA>-<RESET><RED>-<RESET><RED>.<RESET> octopus-merge
|
|
<RED>|<RESET> <YELLOW>|<RESET><BLUE>\<RESET> <MAGENTA>\<RESET> <RED>\<RESET>
|
|
<RED>|<RESET> <YELLOW>|<RESET><RED>_<RESET><BLUE>|<RESET><RED>_<RESET><MAGENTA>|<RESET><RED>/<RESET>
|
|
<RED>|<RESET><RED>/<RESET><YELLOW>|<RESET> <BLUE>|<RESET> <MAGENTA>|<RESET>
|
|
* <YELLOW>|<RESET> <BLUE>|<RESET> <MAGENTA>|<RESET> 4
|
|
<CYAN>|<RESET> <YELLOW>|<RESET> <BLUE>|<RESET> * 3
|
|
<CYAN>|<RESET> <YELLOW>|<RESET><CYAN>_<RESET><BLUE>|<RESET><CYAN>/<RESET>
|
|
<CYAN>|<RESET><CYAN>/<RESET><YELLOW>|<RESET> <BLUE>|<RESET>
|
|
<CYAN>|<RESET> <YELLOW>|<RESET> * 2
|
|
<CYAN>|<RESET> <YELLOW>|<RESET><CYAN>/<RESET>
|
|
<CYAN>|<RESET><CYAN>/<RESET><YELLOW>|<RESET>
|
|
<CYAN>|<RESET> * 1
|
|
<CYAN>|<RESET><CYAN>/<RESET>
|
|
* initial
|
|
EOF
|
|
test_cmp_colored_graph after-4 after-merge
|
|
'
|
|
|
|
test_expect_success 'log --graph with unrelated commit and octopus tip, no color' '
|
|
test_cmp_graph after-initial octopus-merge <<-\EOF
|
|
* after-initial
|
|
| *---. octopus-merge
|
|
| |\ \ \
|
|
| | | | * 4
|
|
| |_|_|/
|
|
|/| | |
|
|
| | | * 3
|
|
| |_|/
|
|
|/| |
|
|
| | * 2
|
|
| |/
|
|
|/|
|
|
| * 1
|
|
|/
|
|
* initial
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'log --graph with unrelated commit and octopus tip with colors' '
|
|
test_config log.graphColors red,green,yellow,blue,magenta,cyan &&
|
|
cat >expect.colors <<-\EOF &&
|
|
* after-initial
|
|
<RED>|<RESET> *<BLUE>-<RESET><BLUE>-<RESET><MAGENTA>-<RESET><MAGENTA>.<RESET> octopus-merge
|
|
<RED>|<RESET> <GREEN>|<RESET><YELLOW>\<RESET> <BLUE>\<RESET> <MAGENTA>\<RESET>
|
|
<RED>|<RESET> <GREEN>|<RESET> <YELLOW>|<RESET> <BLUE>|<RESET> * 4
|
|
<RED>|<RESET> <GREEN>|<RESET><RED>_<RESET><YELLOW>|<RESET><RED>_<RESET><BLUE>|<RESET><RED>/<RESET>
|
|
<RED>|<RESET><RED>/<RESET><GREEN>|<RESET> <YELLOW>|<RESET> <BLUE>|<RESET>
|
|
<RED>|<RESET> <GREEN>|<RESET> <YELLOW>|<RESET> * 3
|
|
<RED>|<RESET> <GREEN>|<RESET><RED>_<RESET><YELLOW>|<RESET><RED>/<RESET>
|
|
<RED>|<RESET><RED>/<RESET><GREEN>|<RESET> <YELLOW>|<RESET>
|
|
<RED>|<RESET> <GREEN>|<RESET> * 2
|
|
<RED>|<RESET> <GREEN>|<RESET><RED>/<RESET>
|
|
<RED>|<RESET><RED>/<RESET><GREEN>|<RESET>
|
|
<RED>|<RESET> * 1
|
|
<RED>|<RESET><RED>/<RESET>
|
|
* initial
|
|
EOF
|
|
test_cmp_colored_graph after-initial octopus-merge
|
|
'
|
|
|
|
test_expect_success 'log --graph with unrelated commit and octopus child, no color' '
|
|
test_cmp_graph after-initial after-merge <<-\EOF
|
|
* after-initial
|
|
| * after-merge
|
|
| *---. octopus-merge
|
|
| |\ \ \
|
|
| | | | * 4
|
|
| |_|_|/
|
|
|/| | |
|
|
| | | * 3
|
|
| |_|/
|
|
|/| |
|
|
| | * 2
|
|
| |/
|
|
|/|
|
|
| * 1
|
|
|/
|
|
* initial
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'log --graph with unrelated commit and octopus child with colors' '
|
|
test_config log.graphColors red,green,yellow,blue,magenta,cyan &&
|
|
cat >expect.colors <<-\EOF &&
|
|
* after-initial
|
|
<RED>|<RESET> * after-merge
|
|
<RED>|<RESET> *<MAGENTA>-<RESET><MAGENTA>-<RESET><CYAN>-<RESET><CYAN>.<RESET> octopus-merge
|
|
<RED>|<RESET> <YELLOW>|<RESET><BLUE>\<RESET> <MAGENTA>\<RESET> <CYAN>\<RESET>
|
|
<RED>|<RESET> <YELLOW>|<RESET> <BLUE>|<RESET> <MAGENTA>|<RESET> * 4
|
|
<RED>|<RESET> <YELLOW>|<RESET><RED>_<RESET><BLUE>|<RESET><RED>_<RESET><MAGENTA>|<RESET><RED>/<RESET>
|
|
<RED>|<RESET><RED>/<RESET><YELLOW>|<RESET> <BLUE>|<RESET> <MAGENTA>|<RESET>
|
|
<RED>|<RESET> <YELLOW>|<RESET> <BLUE>|<RESET> * 3
|
|
<RED>|<RESET> <YELLOW>|<RESET><RED>_<RESET><BLUE>|<RESET><RED>/<RESET>
|
|
<RED>|<RESET><RED>/<RESET><YELLOW>|<RESET> <BLUE>|<RESET>
|
|
<RED>|<RESET> <YELLOW>|<RESET> * 2
|
|
<RED>|<RESET> <YELLOW>|<RESET><RED>/<RESET>
|
|
<RED>|<RESET><RED>/<RESET><YELLOW>|<RESET>
|
|
<RED>|<RESET> * 1
|
|
<RED>|<RESET><RED>/<RESET>
|
|
* initial
|
|
EOF
|
|
test_cmp_colored_graph after-initial after-merge
|
|
'
|
|
|
|
test_done
|