mirror of
https://github.com/git/git.git
synced 2024-12-12 11:24:02 +08:00
a0b82622cb
When resolving revisions in `get_tags_and_duplicates()`, we only partially manage the lifetime of `full_name`. In fact, managing its lifetime properly is almost impossible because we put direct pointers to that variable into multiple lists without duplicating the string. The consequence is that these strings will ultimately leak. Refactor the code to make the lists we put those names into duplicate the memory. This allows us to properly free the string as required and thus plugs the memory leak. While this requires us to allocate more data overall, it shouldn't be all that bad given that the number of allocations corresponds with the number of command line parameters, which typically aren't all that many. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
143 lines
3.9 KiB
Bash
Executable File
143 lines
3.9 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='basic tests for fast-export --anonymize'
|
|
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 simple repo' '
|
|
test_commit base &&
|
|
test_commit foo &&
|
|
test_commit retain-me &&
|
|
git checkout -b other HEAD^ &&
|
|
mkdir subdir &&
|
|
test_commit subdir/bar &&
|
|
test_commit subdir/xyzzy &&
|
|
fake_commit=$(echo $ZERO_OID | sed s/0/a/) &&
|
|
git update-index --add --cacheinfo 160000,$fake_commit,link1 &&
|
|
git update-index --add --cacheinfo 160000,$fake_commit,link2 &&
|
|
git commit -m "add gitlink" &&
|
|
git tag -m "annotated tag" mytag &&
|
|
git tag -m "annotated tag with long message" longtag
|
|
'
|
|
|
|
test_expect_success 'export anonymized stream' '
|
|
git fast-export --anonymize --all \
|
|
--anonymize-map=retain-me \
|
|
--anonymize-map=xyzzy:should-not-appear \
|
|
--anonymize-map=xyzzy:custom-name \
|
|
--anonymize-map=other \
|
|
>stream
|
|
'
|
|
|
|
# this also covers commit messages
|
|
test_expect_success 'stream omits path names' '
|
|
! grep base stream &&
|
|
! grep foo stream &&
|
|
! grep subdir stream &&
|
|
! grep bar stream &&
|
|
! grep xyzzy stream
|
|
'
|
|
|
|
test_expect_success 'stream contains user-specified names' '
|
|
grep retain-me stream &&
|
|
! grep should-not-appear stream &&
|
|
grep custom-name stream
|
|
'
|
|
|
|
test_expect_success 'stream omits gitlink oids' '
|
|
# avoid relying on the whole oid to remain hash-agnostic; this is
|
|
# plenty to be unique within our test case
|
|
! grep a000000000000000000 stream
|
|
'
|
|
|
|
test_expect_success 'stream retains other as refname' '
|
|
grep other stream
|
|
'
|
|
|
|
test_expect_success 'stream omits other refnames' '
|
|
! grep main stream &&
|
|
! grep mytag stream &&
|
|
! grep longtag stream
|
|
'
|
|
|
|
test_expect_success 'stream omits identities' '
|
|
! grep "$GIT_COMMITTER_NAME" stream &&
|
|
! grep "$GIT_COMMITTER_EMAIL" stream &&
|
|
! grep "$GIT_AUTHOR_NAME" stream &&
|
|
! grep "$GIT_AUTHOR_EMAIL" stream
|
|
'
|
|
|
|
test_expect_success 'stream omits tag message' '
|
|
! grep "annotated tag" stream
|
|
'
|
|
|
|
# NOTE: we chdir to the new, anonymized repository
|
|
# after this. All further tests should assume this.
|
|
test_expect_success 'import stream to new repository' '
|
|
git init new &&
|
|
cd new &&
|
|
git fast-import <../stream
|
|
'
|
|
|
|
test_expect_success 'result has two branches' '
|
|
git for-each-ref --format="%(refname)" refs/heads >branches &&
|
|
test_line_count = 2 branches &&
|
|
other_branch=refs/heads/other &&
|
|
main_branch=$(grep -v $other_branch branches)
|
|
'
|
|
|
|
test_expect_success 'repo has original shape and timestamps' '
|
|
shape () {
|
|
git log --format="%m %ct" --left-right --boundary "$@"
|
|
} &&
|
|
(cd .. && shape main...other) >expect &&
|
|
shape $main_branch...$other_branch >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'root tree has original shape' '
|
|
# the output entries are not necessarily in the same
|
|
# order, but we should at least have the same set of
|
|
# object types.
|
|
git -C .. ls-tree HEAD >orig-root &&
|
|
cut -d" " -f2 <orig-root | sort >expect &&
|
|
git ls-tree $other_branch >root &&
|
|
cut -d" " -f2 <root | sort >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'paths in subdir ended up in one tree' '
|
|
git -C .. ls-tree other:subdir >orig-subdir &&
|
|
cut -d" " -f2 <orig-subdir | sort >expect &&
|
|
tree=$(grep tree root | cut -f2) &&
|
|
git ls-tree $other_branch:$tree >tree &&
|
|
cut -d" " -f2 <tree >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'identical gitlinks got identical oid' '
|
|
awk "/commit/ { print \$3 }" <root | sort -u >commits &&
|
|
test_line_count = 1 commits
|
|
'
|
|
|
|
test_expect_success 'all tags point to branch tip' '
|
|
git rev-parse $other_branch >expect &&
|
|
git for-each-ref --format="%(*objectname)" | grep . | uniq >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'idents are shared' '
|
|
git log --all --format="%an <%ae>" >authors &&
|
|
sort -u authors >unique &&
|
|
test_line_count = 1 unique &&
|
|
git log --all --format="%cn <%ce>" >committers &&
|
|
sort -u committers >unique &&
|
|
test_line_count = 1 unique &&
|
|
! test_cmp authors committers
|
|
'
|
|
|
|
test_done
|