mirror of
https://github.com/git/git
synced 2024-11-04 16:17:49 +00:00
a90a089611
There is a todo comment in `release_revisions()` that mentions that we
need to free the diff options, which was added via 54c8a7c379
(revisions
API: add a TODO for diff_free(&revs->diffopt), 2022-04-14). Releasing
the diff options wasn't quite feasible at that time because some call
sites rely on its contents to remain even after the revisions have been
released.
In fact, there really only are a couple of callsites that misbehave
here:
- `cmd_shortlog()` releases the revisions, but continues to access its
file pointer.
- `do_diff_cache()` creates a shallow copy of `struct diff_options`,
but does not set the `no_free` member. Consequently, we end up
releasing resources of the caller-provided diff options.
- `diff_free()` and friends do not play nice when being called
multiple times as they don't unset data structures that they have
just released.
Fix all of those cases and enable the call to `diff_free()`, which plugs
a bunch of memory leaks.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
128 lines
2.7 KiB
Bash
Executable file
128 lines
2.7 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='Revision traversal vs grafts and path limiter'
|
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success setup '
|
|
mkdir subdir &&
|
|
echo >fileA fileA &&
|
|
echo >subdir/fileB fileB &&
|
|
git add fileA subdir/fileB &&
|
|
git commit -a -m "Initial in one history." &&
|
|
A0=$(git rev-parse --verify HEAD) &&
|
|
|
|
echo >fileA fileA modified &&
|
|
git commit -a -m "Second in one history." &&
|
|
A1=$(git rev-parse --verify HEAD) &&
|
|
|
|
echo >subdir/fileB fileB modified &&
|
|
git commit -a -m "Third in one history." &&
|
|
A2=$(git rev-parse --verify HEAD) &&
|
|
|
|
git update-ref -d refs/heads/main &&
|
|
rm -f .git/index &&
|
|
|
|
echo >fileA fileA again &&
|
|
echo >subdir/fileB fileB again &&
|
|
git add fileA subdir/fileB &&
|
|
git commit -a -m "Initial in alternate history." &&
|
|
B0=$(git rev-parse --verify HEAD) &&
|
|
|
|
echo >fileA fileA modified in alternate history &&
|
|
git commit -a -m "Second in alternate history." &&
|
|
B1=$(git rev-parse --verify HEAD) &&
|
|
|
|
echo >subdir/fileB fileB modified in alternate history &&
|
|
git commit -a -m "Third in alternate history." &&
|
|
B2=$(git rev-parse --verify HEAD) &&
|
|
: done
|
|
'
|
|
|
|
check () {
|
|
type=$1
|
|
shift
|
|
|
|
arg=
|
|
which=arg
|
|
rm -f test.expect
|
|
for a
|
|
do
|
|
if test "z$a" = z--
|
|
then
|
|
which=expect
|
|
child=
|
|
continue
|
|
fi
|
|
if test "$which" = arg
|
|
then
|
|
arg="$arg$a "
|
|
continue
|
|
fi
|
|
if test "$type" = basic
|
|
then
|
|
echo "$a"
|
|
else
|
|
if test "z$child" != z
|
|
then
|
|
echo "$child $a"
|
|
fi
|
|
child="$a"
|
|
fi
|
|
done >test.expect
|
|
if test "$type" != basic && test "z$child" != z
|
|
then
|
|
echo >>test.expect $child
|
|
fi
|
|
if test $type = basic
|
|
then
|
|
git rev-list $arg >test.actual
|
|
elif test $type = parents
|
|
then
|
|
git rev-list --parents $arg >test.actual
|
|
elif test $type = parents-raw
|
|
then
|
|
git rev-list --parents --pretty=raw $arg |
|
|
sed -n -e 's/^commit //p' >test.actual
|
|
fi
|
|
test_cmp test.expect test.actual
|
|
}
|
|
|
|
for type in basic parents parents-raw
|
|
do
|
|
test_expect_success 'without grafts' "
|
|
rm -f .git/info/grafts &&
|
|
check $type $B2 -- $B2 $B1 $B0
|
|
"
|
|
|
|
test_expect_success 'with grafts' "
|
|
mkdir -p .git/info &&
|
|
echo '$B0 $A2' >.git/info/grafts &&
|
|
check $type $B2 -- $B2 $B1 $B0 $A2 $A1 $A0
|
|
"
|
|
|
|
test_expect_success 'without grafts, with pathlimit' "
|
|
rm -f .git/info/grafts &&
|
|
check $type $B2 subdir -- $B2 $B0
|
|
"
|
|
|
|
test_expect_success 'with grafts, with pathlimit' "
|
|
echo '$B0 $A2' >.git/info/grafts &&
|
|
check $type $B2 subdir -- $B2 $B0 $A2 $A0
|
|
"
|
|
|
|
done
|
|
|
|
test_expect_success 'show advice that grafts are deprecated' '
|
|
git show HEAD 2>err &&
|
|
test_grep "git replace" err &&
|
|
test_config advice.graftFileDeprecated false &&
|
|
git show HEAD 2>err &&
|
|
test_grep ! "git replace" err
|
|
'
|
|
|
|
test_done
|