mirror of
https://github.com/git/git.git
synced 2024-11-23 18:05:29 +08:00
57fb139b5e
When calling `get_oid_oneline()`, we pass in a `struct commit_list` that gets modified by the function. This creates a weird situation where the commit list may sometimes be empty after returning, but sometimes it will continue to carry additional commits. In those cases the remainder of the list leaks. Ultimately, the design where we only pass partial ownership to `get_oid_oneline()` feels shoddy. Refactor the code such that we only pass a constant pointer to the list, creating a local copy as needed. Callers are thus always responsible for freeing the commit list, which then allows us to plug a bunch of memory leaks. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
136 lines
3.2 KiB
Bash
Executable File
136 lines
3.2 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='tests for ref^{stuff}'
|
|
|
|
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' '
|
|
echo blob >a-blob &&
|
|
git tag -a -m blob blob-tag $(git hash-object -w a-blob) &&
|
|
mkdir a-tree &&
|
|
echo moreblobs >a-tree/another-blob &&
|
|
git add . &&
|
|
TREE_SHA1=$(git write-tree) &&
|
|
git tag -a -m tree tree-tag "$TREE_SHA1" &&
|
|
git commit -m Initial &&
|
|
git tag -a -m commit commit-tag &&
|
|
git branch ref &&
|
|
git checkout main &&
|
|
echo modified >>a-blob &&
|
|
git add -u &&
|
|
git commit -m Modified &&
|
|
git branch modref &&
|
|
echo changed! >>a-blob &&
|
|
git add -u &&
|
|
git commit -m !Exp &&
|
|
git branch expref &&
|
|
echo changed >>a-blob &&
|
|
git add -u &&
|
|
git commit -m Changed &&
|
|
echo changed-again >>a-blob &&
|
|
git add -u &&
|
|
git commit -m Changed-again
|
|
'
|
|
|
|
test_expect_success 'ref^{non-existent}' '
|
|
test_must_fail git rev-parse ref^{non-existent}
|
|
'
|
|
|
|
test_expect_success 'ref^{}' '
|
|
git rev-parse ref >expected &&
|
|
git rev-parse ref^{} >actual &&
|
|
test_cmp expected actual &&
|
|
git rev-parse commit-tag^{} >actual &&
|
|
test_cmp expected actual
|
|
'
|
|
|
|
test_expect_success 'ref^{commit}' '
|
|
git rev-parse ref >expected &&
|
|
git rev-parse ref^{commit} >actual &&
|
|
test_cmp expected actual &&
|
|
git rev-parse commit-tag^{commit} >actual &&
|
|
test_cmp expected actual &&
|
|
test_must_fail git rev-parse tree-tag^{commit} &&
|
|
test_must_fail git rev-parse blob-tag^{commit}
|
|
'
|
|
|
|
test_expect_success 'ref^{tree}' '
|
|
echo $TREE_SHA1 >expected &&
|
|
git rev-parse ref^{tree} >actual &&
|
|
test_cmp expected actual &&
|
|
git rev-parse commit-tag^{tree} >actual &&
|
|
test_cmp expected actual &&
|
|
git rev-parse tree-tag^{tree} >actual &&
|
|
test_cmp expected actual &&
|
|
test_must_fail git rev-parse blob-tag^{tree}
|
|
'
|
|
|
|
test_expect_success 'ref^{tag}' '
|
|
test_must_fail git rev-parse HEAD^{tag} &&
|
|
git rev-parse commit-tag >expected &&
|
|
git rev-parse commit-tag^{tag} >actual &&
|
|
test_cmp expected actual
|
|
'
|
|
|
|
test_expect_success 'ref^{/.}' '
|
|
git rev-parse main >expected &&
|
|
git rev-parse main^{/.} >actual &&
|
|
test_cmp expected actual
|
|
'
|
|
|
|
test_expect_success 'ref^{/non-existent}' '
|
|
test_must_fail git rev-parse main^{/non-existent}
|
|
'
|
|
|
|
test_expect_success 'ref^{/Initial}' '
|
|
git rev-parse ref >expected &&
|
|
git rev-parse main^{/Initial} >actual &&
|
|
test_cmp expected actual
|
|
'
|
|
|
|
test_expect_success 'ref^{/!Exp}' '
|
|
test_must_fail git rev-parse main^{/!Exp}
|
|
'
|
|
|
|
test_expect_success 'ref^{/!}' '
|
|
test_must_fail git rev-parse main^{/!}
|
|
'
|
|
|
|
test_expect_success 'ref^{/!!Exp}' '
|
|
git rev-parse expref >expected &&
|
|
git rev-parse main^{/!!Exp} >actual &&
|
|
test_cmp expected actual
|
|
'
|
|
|
|
test_expect_success 'ref^{/!-}' '
|
|
test_must_fail git rev-parse main^{/!-}
|
|
'
|
|
|
|
test_expect_success 'ref^{/!-.}' '
|
|
test_must_fail git rev-parse main^{/!-.}
|
|
'
|
|
|
|
test_expect_success 'ref^{/!-non-existent}' '
|
|
git rev-parse main >expected &&
|
|
git rev-parse main^{/!-non-existent} >actual &&
|
|
test_cmp expected actual
|
|
'
|
|
|
|
test_expect_success 'ref^{/!-Changed}' '
|
|
git rev-parse expref >expected &&
|
|
git rev-parse main^{/!-Changed} >actual &&
|
|
test_cmp expected actual
|
|
'
|
|
|
|
test_expect_success 'ref^{/!-!Exp}' '
|
|
git rev-parse modref >expected &&
|
|
git rev-parse expref^{/!-!Exp} >actual &&
|
|
test_cmp expected actual
|
|
'
|
|
|
|
test_done
|