 2f040a9671
			
		
	
	2f040a9671
	
	
	
		
			
			Commit 7f40759496 (fast-export: tighten anonymize_mem() interface to
handle only strings, 2020-06-23) changed the interface used in anonymizing
strings, but failed to update the size of annotated tag messages to match
the new anonymized string.
As a result, exporting tags having messages longer than 13 characters
would create output that couldn't be parsed by fast-import,
as the data length indicated was larger than the data output.
Reset the message size when anonymizing, and add a tag with a "long"
message to the test.
Signed-off-by: Tal Kelrich <hasturkun@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
	
		
			
				
	
	
		
			140 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.8 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-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: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 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
 |