about summary refs log tree commit diff
path: root/third_party/git/t/t9300-fast-import.sh
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/git/t/t9300-fast-import.sh')
-rwxr-xr-xthird_party/git/t/t9300-fast-import.sh3531
1 files changed, 0 insertions, 3531 deletions
diff --git a/third_party/git/t/t9300-fast-import.sh b/third_party/git/t/t9300-fast-import.sh
deleted file mode 100755
index 308c1ef42cd1..000000000000
--- a/third_party/git/t/t9300-fast-import.sh
+++ /dev/null
@@ -1,3531 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2007 Shawn Pearce
-#
-
-test_description='test git fast-import utility'
-. ./test-lib.sh
-. "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash
-
-verify_packs () {
-	for p in .git/objects/pack/*.pack
-	do
-		git verify-pack "$@" "$p" || return
-	done
-}
-
-file2_data='file2
-second line of EOF'
-
-file3_data='EOF
-in 3rd file
- END'
-
-file4_data=abcd
-file4_len=4
-
-file5_data='an inline file.
-  we should see it later.'
-
-file6_data='#!/bin/sh
-echo "$@"'
-
-###
-### series A
-###
-
-test_expect_success 'empty stream succeeds' '
-	git config fastimport.unpackLimit 0 &&
-	git fast-import </dev/null
-'
-
-test_expect_success 'truncated stream complains' '
-	echo "tag foo" | test_must_fail git fast-import
-'
-
-test_expect_success 'A: create pack from stdin' '
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	blob
-	mark :2
-	data <<EOF
-	$file2_data
-	EOF
-
-	blob
-	mark :3
-	data <<END
-	$file3_data
-	END
-
-	blob
-	mark :4
-	data $file4_len
-	$file4_data
-	commit refs/heads/master
-	mark :5
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	initial
-	COMMIT
-
-	M 644 :2 file2
-	M 644 :3 file3
-	M 755 :4 file4
-
-	tag series-A
-	from :5
-	data <<EOF
-	An annotated tag without a tagger
-	EOF
-
-	tag series-A-blob
-	from :3
-	data <<EOF
-	An annotated tag that annotates a blob.
-	EOF
-
-	tag to-be-deleted
-	from :3
-	data <<EOF
-	Another annotated tag that annotates a blob.
-	EOF
-
-	reset refs/tags/to-be-deleted
-	from $ZERO_OID
-
-	tag nested
-	mark :6
-	from :4
-	data <<EOF
-	Tag of our lovely commit
-	EOF
-
-	reset refs/tags/nested
-	from $ZERO_OID
-
-	tag nested
-	mark :7
-	from :6
-	data <<EOF
-	Tag of tag of our lovely commit
-	EOF
-
-	alias
-	mark :8
-	to :5
-
-	INPUT_END
-	git fast-import --export-marks=marks.out <input &&
-	git whatchanged master
-'
-
-test_expect_success 'A: verify pack' '
-	verify_packs
-'
-
-test_expect_success 'A: verify commit' '
-	cat >expect <<-EOF &&
-	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-
-	initial
-	EOF
-	git cat-file commit master | sed 1d >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'A: verify tree' '
-	cat >expect <<-EOF &&
-	100644 blob file2
-	100644 blob file3
-	100755 blob file4
-	EOF
-	git cat-file -p master^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'A: verify file2' '
-	echo "$file2_data" >expect &&
-	git cat-file blob master:file2 >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'A: verify file3' '
-	echo "$file3_data" >expect &&
-	git cat-file blob master:file3 >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'A: verify file4' '
-	printf "$file4_data" >expect &&
-	git cat-file blob master:file4 >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'A: verify tag/series-A' '
-	cat >expect <<-EOF &&
-	object $(git rev-parse refs/heads/master)
-	type commit
-	tag series-A
-
-	An annotated tag without a tagger
-	EOF
-	git cat-file tag tags/series-A >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'A: verify tag/series-A-blob' '
-	cat >expect <<-EOF &&
-	object $(git rev-parse refs/heads/master:file3)
-	type blob
-	tag series-A-blob
-
-	An annotated tag that annotates a blob.
-	EOF
-	git cat-file tag tags/series-A-blob >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'A: verify tag deletion is successful' '
-	test_must_fail git rev-parse --verify refs/tags/to-be-deleted
-'
-
-test_expect_success 'A: verify marks output' '
-	cat >expect <<-EOF &&
-	:2 $(git rev-parse --verify master:file2)
-	:3 $(git rev-parse --verify master:file3)
-	:4 $(git rev-parse --verify master:file4)
-	:5 $(git rev-parse --verify master^0)
-	:6 $(git cat-file tag nested | grep object | cut -d" " -f 2)
-	:7 $(git rev-parse --verify nested)
-	:8 $(git rev-parse --verify master^0)
-	EOF
-	test_cmp expect marks.out
-'
-
-test_expect_success 'A: verify marks import' '
-	git fast-import \
-		--import-marks=marks.out \
-		--export-marks=marks.new \
-		</dev/null &&
-	test_cmp expect marks.new
-'
-
-test_expect_success 'A: tag blob by sha1' '
-	test_tick &&
-	new_blob=$(echo testing | git hash-object --stdin) &&
-	cat >input <<-INPUT_END &&
-	tag series-A-blob-2
-	from $(git rev-parse refs/heads/master:file3)
-	data <<EOF
-	Tag blob by sha1.
-	EOF
-
-	blob
-	mark :6
-	data <<EOF
-	testing
-	EOF
-
-	commit refs/heads/new_blob
-	committer  <> 0 +0000
-	data 0
-	M 644 :6 new_blob
-	#pretend we got sha1 from fast-import
-	ls "new_blob"
-
-	tag series-A-blob-3
-	from $new_blob
-	data <<EOF
-	Tag new_blob.
-	EOF
-	INPUT_END
-
-	cat >expect <<-EOF &&
-	object $(git rev-parse refs/heads/master:file3)
-	type blob
-	tag series-A-blob-2
-
-	Tag blob by sha1.
-	object $new_blob
-	type blob
-	tag series-A-blob-3
-
-	Tag new_blob.
-	EOF
-
-	git fast-import <input &&
-	git cat-file tag tags/series-A-blob-2 >actual &&
-	git cat-file tag tags/series-A-blob-3 >>actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'A: verify marks import does not crash' '
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/verify--import-marks
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	recreate from :5
-	COMMIT
-
-	from :5
-	M 755 :2 copy-of-file2
-
-	INPUT_END
-
-	git fast-import --import-marks=marks.out <input &&
-	git whatchanged verify--import-marks
-'
-
-test_expect_success 'A: verify pack' '
-	verify_packs
-'
-
-test_expect_success 'A: verify diff' '
-	copy=$(git rev-parse --verify master:file2) &&
-	cat >expect <<-EOF &&
-	:000000 100755 $ZERO_OID $copy A	copy-of-file2
-	EOF
-	git diff-tree -M -r master verify--import-marks >actual &&
-	compare_diff_raw expect actual &&
-	test $(git rev-parse --verify master:file2) \
-	    = $(git rev-parse --verify verify--import-marks:copy-of-file2)
-'
-
-test_expect_success 'A: export marks with large values' '
-	test_tick &&
-	mt=$(git hash-object --stdin < /dev/null) &&
-	>input.blob &&
-	>marks.exp &&
-	>tree.exp &&
-
-	cat >input.commit <<-EOF &&
-	commit refs/heads/verify--dump-marks
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	test the sparse array dumping routines with exponentially growing marks
-	COMMIT
-	EOF
-
-	i=0 l=4 m=6 n=7 &&
-	while test "$i" -lt 27
-	do
-		cat >>input.blob <<-EOF &&
-		blob
-		mark :$l
-		data 0
-		blob
-		mark :$m
-		data 0
-		blob
-		mark :$n
-		data 0
-		EOF
-		echo "M 100644 :$l l$i" >>input.commit &&
-		echo "M 100644 :$m m$i" >>input.commit &&
-		echo "M 100644 :$n n$i" >>input.commit &&
-
-		echo ":$l $mt" >>marks.exp &&
-		echo ":$m $mt" >>marks.exp &&
-		echo ":$n $mt" >>marks.exp &&
-
-		printf "100644 blob $mt\tl$i\n" >>tree.exp &&
-		printf "100644 blob $mt\tm$i\n" >>tree.exp &&
-		printf "100644 blob $mt\tn$i\n" >>tree.exp &&
-
-		l=$(($l + $l)) &&
-		m=$(($m + $m)) &&
-		n=$(($l + $n)) &&
-
-		i=$((1 + $i)) || return 1
-	done &&
-
-	sort tree.exp > tree.exp_s &&
-
-	cat input.blob input.commit | git fast-import --export-marks=marks.large &&
-	git ls-tree refs/heads/verify--dump-marks >tree.out &&
-	test_cmp tree.exp_s tree.out &&
-	test_cmp marks.exp marks.large
-'
-
-###
-### series B
-###
-
-test_expect_success 'B: fail on invalid blob sha1' '
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/branch
-	mark :1
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	corrupt
-	COMMIT
-
-	from refs/heads/master
-	M 755 $(echo $ZERO_OID | sed -e "s/0$/1/") zero1
-
-	INPUT_END
-
-	test_when_finished "rm -f .git/objects/pack_* .git/objects/index_*" &&
-	test_must_fail git fast-import <input
-'
-
-test_expect_success 'B: accept branch name "TEMP_TAG"' '
-	cat >input <<-INPUT_END &&
-	commit TEMP_TAG
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	tag base
-	COMMIT
-
-	from refs/heads/master
-
-	INPUT_END
-
-	test_when_finished "rm -f .git/TEMP_TAG
-		git gc
-		git prune" &&
-	git fast-import <input &&
-	test -f .git/TEMP_TAG &&
-	test $(git rev-parse master) = $(git rev-parse TEMP_TAG^)
-'
-
-test_expect_success 'B: accept empty committer' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/empty-committer-1
-	committer  <> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	empty commit
-	COMMIT
-	INPUT_END
-
-	test_when_finished "git update-ref -d refs/heads/empty-committer-1
-		git gc
-		git prune" &&
-	git fast-import <input &&
-	out=$(git fsck) &&
-	echo "$out" &&
-	test -z "$out"
-'
-
-test_expect_success 'B: reject invalid timezone' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/invalid-timezone
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1234567890 +051800
-	data <<COMMIT
-	empty commit
-	COMMIT
-	INPUT_END
-
-	test_when_finished "git update-ref -d refs/heads/invalid-timezone" &&
-	test_must_fail git fast-import <input
-'
-
-test_expect_success 'B: accept invalid timezone with raw-permissive' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/invalid-timezone
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1234567890 +051800
-	data <<COMMIT
-	empty commit
-	COMMIT
-	INPUT_END
-
-	git init invalid-timezone &&
-	git -C invalid-timezone fast-import --date-format=raw-permissive <input &&
-	git -C invalid-timezone cat-file -p invalid-timezone >out &&
-	grep "1234567890 [+]051800" out
-'
-
-test_expect_success 'B: accept and fixup committer with no name' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/empty-committer-2
-	committer <a@b.com> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	empty commit
-	COMMIT
-	INPUT_END
-
-	test_when_finished "git update-ref -d refs/heads/empty-committer-2
-		git gc
-		git prune" &&
-	git fast-import <input &&
-	out=$(git fsck) &&
-	echo "$out" &&
-	test -z "$out"
-'
-
-test_expect_success 'B: fail on invalid committer (1)' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/invalid-committer
-	committer Name email> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	empty commit
-	COMMIT
-	INPUT_END
-
-	test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
-	test_must_fail git fast-import <input
-'
-
-test_expect_success 'B: fail on invalid committer (2)' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/invalid-committer
-	committer Name <e<mail> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	empty commit
-	COMMIT
-	INPUT_END
-
-	test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
-	test_must_fail git fast-import <input
-'
-
-test_expect_success 'B: fail on invalid committer (3)' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/invalid-committer
-	committer Name <email>> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	empty commit
-	COMMIT
-	INPUT_END
-
-	test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
-	test_must_fail git fast-import <input
-'
-
-test_expect_success 'B: fail on invalid committer (4)' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/invalid-committer
-	committer Name <email $GIT_COMMITTER_DATE
-	data <<COMMIT
-	empty commit
-	COMMIT
-	INPUT_END
-
-	test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
-	test_must_fail git fast-import <input
-'
-
-test_expect_success 'B: fail on invalid committer (5)' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/invalid-committer
-	committer Name<email> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	empty commit
-	COMMIT
-	INPUT_END
-
-	test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
-	test_must_fail git fast-import <input
-'
-
-###
-### series C
-###
-
-test_expect_success 'C: incremental import create pack from stdin' '
-	newf=$(echo hi newf | git hash-object -w --stdin) &&
-	oldf=$(git rev-parse --verify master:file2) &&
-	thrf=$(git rev-parse --verify master:file3) &&
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/branch
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	second
-	COMMIT
-
-	from refs/heads/master
-	M 644 $oldf file2/oldf
-	M 755 $newf file2/newf
-	D file3
-
-	INPUT_END
-
-	git fast-import <input &&
-	git whatchanged branch
-'
-
-test_expect_success 'C: verify pack' '
-	verify_packs
-'
-
-test_expect_success 'C: validate reuse existing blob' '
-	test $newf = $(git rev-parse --verify branch:file2/newf) &&
-	test $oldf = $(git rev-parse --verify branch:file2/oldf)
-'
-
-test_expect_success 'C: verify commit' '
-	cat >expect <<-EOF &&
-	parent $(git rev-parse --verify master^0)
-	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-
-	second
-	EOF
-
-	git cat-file commit branch | sed 1d >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'C: validate rename result' '
-	zero=$ZERO_OID &&
-	cat >expect <<-EOF &&
-	:000000 100755 $zero $newf A	file2/newf
-	:100644 100644 $oldf $oldf R100	file2	file2/oldf
-	:100644 000000 $thrf $zero D	file3
-	EOF
-	git diff-tree -M -r master branch >actual &&
-	compare_diff_raw expect actual
-'
-
-###
-### series D
-###
-
-test_expect_success 'D: inline data in commit' '
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/branch
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	third
-	COMMIT
-
-	from refs/heads/branch^0
-	M 644 inline newdir/interesting
-	data <<EOF
-	$file5_data
-	EOF
-
-	M 755 inline newdir/exec.sh
-	data <<EOF
-	$file6_data
-	EOF
-
-	INPUT_END
-
-	git fast-import <input &&
-	git whatchanged branch
-'
-
-test_expect_success 'D: verify pack' '
-	verify_packs
-'
-
-test_expect_success 'D: validate new files added' '
-	f5id=$(echo "$file5_data" | git hash-object --stdin) &&
-	f6id=$(echo "$file6_data" | git hash-object --stdin) &&
-	cat >expect <<-EOF &&
-	:000000 100755 $ZERO_OID $f6id A	newdir/exec.sh
-	:000000 100644 $ZERO_OID $f5id A	newdir/interesting
-	EOF
-	git diff-tree -M -r branch^ branch >actual &&
-	compare_diff_raw expect actual
-'
-
-test_expect_success 'D: verify file5' '
-	echo "$file5_data" >expect &&
-	git cat-file blob branch:newdir/interesting >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'D: verify file6' '
-	echo "$file6_data" >expect &&
-	git cat-file blob branch:newdir/exec.sh >actual &&
-	test_cmp expect actual
-'
-
-###
-### series E
-###
-
-test_expect_success 'E: rfc2822 date, --date-format=raw' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/branch
-	author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> Tue Feb 6 11:22:18 2007 -0500
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> Tue Feb 6 12:35:02 2007 -0500
-	data <<COMMIT
-	RFC 2822 type date
-	COMMIT
-
-	from refs/heads/branch^0
-
-	INPUT_END
-
-	test_must_fail git fast-import --date-format=raw <input
-'
-test_expect_success 'E: rfc2822 date, --date-format=rfc2822' '
-	git fast-import --date-format=rfc2822 <input
-'
-
-test_expect_success 'E: verify pack' '
-	verify_packs
-'
-
-test_expect_success 'E: verify commit' '
-	cat >expect <<-EOF &&
-	author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> 1170778938 -0500
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1170783302 -0500
-
-	RFC 2822 type date
-	EOF
-	git cat-file commit branch | sed 1,2d >actual &&
-	test_cmp expect actual
-'
-
-###
-### series F
-###
-
-test_expect_success 'F: non-fast-forward update skips' '
-	old_branch=$(git rev-parse --verify branch^0) &&
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/branch
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	losing things already?
-	COMMIT
-
-	from refs/heads/branch~1
-
-	reset refs/heads/other
-	from refs/heads/branch
-
-	INPUT_END
-
-	test_must_fail git fast-import <input &&
-	# branch must remain unaffected
-	test $old_branch = $(git rev-parse --verify branch^0)
-'
-
-test_expect_success 'F: verify pack' '
-	verify_packs
-'
-
-test_expect_success 'F: verify other commit' '
-	cat >expect <<-EOF &&
-	tree $(git rev-parse branch~1^{tree})
-	parent $(git rev-parse branch~1)
-	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-
-	losing things already?
-	EOF
-	git cat-file commit other >actual &&
-	test_cmp expect actual
-'
-
-###
-### series G
-###
-
-test_expect_success 'G: non-fast-forward update forced' '
-	old_branch=$(git rev-parse --verify branch^0) &&
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/branch
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	losing things already?
-	COMMIT
-
-	from refs/heads/branch~1
-
-	INPUT_END
-	git fast-import --force <input
-'
-
-test_expect_success 'G: verify pack' '
-	verify_packs
-'
-
-test_expect_success 'G: branch changed, but logged' '
-	test $old_branch != $(git rev-parse --verify branch^0) &&
-	test $old_branch = $(git rev-parse --verify branch@{1})
-'
-
-###
-### series H
-###
-
-test_expect_success 'H: deletall, add 1' '
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/H
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	third
-	COMMIT
-
-	from refs/heads/branch^0
-	M 644 inline i-will-die
-	data <<EOF
-	this file will never exist.
-	EOF
-
-	deleteall
-	M 644 inline h/e/l/lo
-	data <<EOF
-	$file5_data
-	EOF
-
-	INPUT_END
-	git fast-import <input &&
-	git whatchanged H
-'
-
-test_expect_success 'H: verify pack' '
-	verify_packs
-'
-
-test_expect_success 'H: validate old files removed, new files added' '
-	f4id=$(git rev-parse HEAD:file4) &&
-	cat >expect <<-EOF &&
-	:100755 000000 $newf $zero D	file2/newf
-	:100644 000000 $oldf $zero D	file2/oldf
-	:100755 000000 $f4id $zero D	file4
-	:100644 100644 $f5id $f5id R100	newdir/interesting	h/e/l/lo
-	:100755 000000 $f6id $zero D	newdir/exec.sh
-	EOF
-	git diff-tree -M -r H^ H >actual &&
-	compare_diff_raw expect actual
-'
-
-test_expect_success 'H: verify file' '
-	echo "$file5_data" >expect &&
-	git cat-file blob H:h/e/l/lo >actual &&
-	test_cmp expect actual
-'
-
-###
-### series I
-###
-
-test_expect_success 'I: export-pack-edges' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/export-boundary
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	we have a border.  its only 40 characters wide.
-	COMMIT
-
-	from refs/heads/branch
-
-	INPUT_END
-	git fast-import --export-pack-edges=edges.list <input
-'
-
-test_expect_success 'I: verify edge list' '
-	cat >expect <<-EOF &&
-	.git/objects/pack/pack-.pack: $(git rev-parse --verify export-boundary)
-	EOF
-	sed -e s/pack-.*pack/pack-.pack/ edges.list >actual &&
-	test_cmp expect actual
-'
-
-###
-### series J
-###
-
-test_expect_success 'J: reset existing branch creates empty commit' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/J
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	create J
-	COMMIT
-
-	from refs/heads/branch
-
-	reset refs/heads/J
-
-	commit refs/heads/J
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	initialize J
-	COMMIT
-
-	INPUT_END
-	git fast-import <input
-'
-test_expect_success 'J: branch has 1 commit, empty tree' '
-	test 1 = $(git rev-list J | wc -l) &&
-	test 0 = $(git ls-tree J | wc -l)
-'
-
-test_expect_success 'J: tag must fail on empty branch' '
-	cat >input <<-INPUT_END &&
-	reset refs/heads/J2
-
-	tag wrong_tag
-	from refs/heads/J2
-	data <<EOF
-	Tag branch that was reset.
-	EOF
-	INPUT_END
-	test_must_fail git fast-import <input
-'
-
-###
-### series K
-###
-
-test_expect_success 'K: reinit branch with from' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/K
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	create K
-	COMMIT
-
-	from refs/heads/branch
-
-	commit refs/heads/K
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	redo K
-	COMMIT
-
-	from refs/heads/branch^1
-
-	INPUT_END
-	git fast-import <input
-'
-test_expect_success 'K: verify K^1 = branch^1' '
-	test $(git rev-parse --verify branch^1) \
-		= $(git rev-parse --verify K^1)
-'
-
-###
-### series L
-###
-
-test_expect_success 'L: verify internal tree sorting' '
-	cat >input <<-INPUT_END &&
-	blob
-	mark :1
-	data <<EOF
-	some data
-	EOF
-
-	blob
-	mark :2
-	data <<EOF
-	other data
-	EOF
-
-	commit refs/heads/L
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	create L
-	COMMIT
-
-	M 644 :1 b.
-	M 644 :1 b/other
-	M 644 :1 ba
-
-	commit refs/heads/L
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	update L
-	COMMIT
-
-	M 644 :2 b.
-	M 644 :2 b/other
-	M 644 :2 ba
-	INPUT_END
-
-	cat >expect <<-EXPECT_END &&
-	:100644 100644 M	b.
-	:040000 040000 M	b
-	:100644 100644 M	ba
-	EXPECT_END
-
-	git fast-import <input &&
-	GIT_PRINT_SHA1_ELLIPSIS="yes" git diff-tree --abbrev --raw L^ L >output &&
-	cut -d" " -f1,2,5 output >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'L: nested tree copy does not corrupt deltas' '
-	cat >input <<-INPUT_END &&
-	blob
-	mark :1
-	data <<EOF
-	the data
-	EOF
-
-	commit refs/heads/L2
-	committer C O Mitter <committer@example.com> 1112912473 -0700
-	data <<COMMIT
-	init L2
-	COMMIT
-	M 644 :1 a/b/c
-	M 644 :1 a/b/d
-	M 644 :1 a/e/f
-
-	commit refs/heads/L2
-	committer C O Mitter <committer@example.com> 1112912473 -0700
-	data <<COMMIT
-	update L2
-	COMMIT
-	C a g
-	C a/e g/b
-	M 644 :1 g/b/h
-	INPUT_END
-
-	cat >expect <<-\EOF &&
-	g/b/f
-	g/b/h
-	EOF
-
-	test_when_finished "git update-ref -d refs/heads/L2" &&
-	git fast-import <input &&
-	git ls-tree L2 g/b/ >tmp &&
-	cat tmp | cut -f 2 >actual &&
-	test_cmp expect actual &&
-	git fsck $(git rev-parse L2)
-'
-
-###
-### series M
-###
-
-test_expect_success 'M: rename file in same subdirectory' '
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/M1
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	file rename
-	COMMIT
-
-	from refs/heads/branch^0
-	R file2/newf file2/n.e.w.f
-
-	INPUT_END
-
-	cat >expect <<-EOF &&
-	:100755 100755 $newf $newf R100	file2/newf	file2/n.e.w.f
-	EOF
-	git fast-import <input &&
-	git diff-tree -M -r M1^ M1 >actual &&
-	compare_diff_raw expect actual
-'
-
-test_expect_success 'M: rename file to new subdirectory' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/M2
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	file rename
-	COMMIT
-
-	from refs/heads/branch^0
-	R file2/newf i/am/new/to/you
-
-	INPUT_END
-
-	cat >expect <<-EOF &&
-	:100755 100755 $newf $newf R100	file2/newf	i/am/new/to/you
-	EOF
-	git fast-import <input &&
-	git diff-tree -M -r M2^ M2 >actual &&
-	compare_diff_raw expect actual
-'
-
-test_expect_success 'M: rename subdirectory to new subdirectory' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/M3
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	file rename
-	COMMIT
-
-	from refs/heads/M2^0
-	R i other/sub
-
-	INPUT_END
-
-	cat >expect <<-EOF &&
-	:100755 100755 $newf $newf R100	i/am/new/to/you	other/sub/am/new/to/you
-	EOF
-	git fast-import <input &&
-	git diff-tree -M -r M3^ M3 >actual &&
-	compare_diff_raw expect actual
-'
-
-test_expect_success 'M: rename root to subdirectory' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/M4
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	rename root
-	COMMIT
-
-	from refs/heads/M2^0
-	R "" sub
-
-	INPUT_END
-
-	cat >expect <<-EOF &&
-	:100644 100644 $oldf $oldf R100	file2/oldf	sub/file2/oldf
-	:100755 100755 $f4id $f4id R100	file4	sub/file4
-	:100755 100755 $newf $newf R100	i/am/new/to/you	sub/i/am/new/to/you
-	:100755 100755 $f6id $f6id R100	newdir/exec.sh	sub/newdir/exec.sh
-	:100644 100644 $f5id $f5id R100	newdir/interesting	sub/newdir/interesting
-	EOF
-	git fast-import <input &&
-	git diff-tree -M -r M4^ M4 >actual &&
-	compare_diff_raw expect actual
-'
-
-###
-### series N
-###
-
-test_expect_success 'N: copy file in same subdirectory' '
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/N1
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	file copy
-	COMMIT
-
-	from refs/heads/branch^0
-	C file2/newf file2/n.e.w.f
-
-	INPUT_END
-
-	cat >expect <<-EOF &&
-	:100755 100755 $newf $newf C100	file2/newf	file2/n.e.w.f
-	EOF
-	git fast-import <input &&
-	git diff-tree -C --find-copies-harder -r N1^ N1 >actual &&
-	compare_diff_raw expect actual
-'
-
-test_expect_success 'N: copy then modify subdirectory' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/N2
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	clean directory copy
-	COMMIT
-
-	from refs/heads/branch^0
-	C file2 file3
-
-	commit refs/heads/N2
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	modify directory copy
-	COMMIT
-
-	M 644 inline file3/file5
-	data <<EOF
-	$file5_data
-	EOF
-
-	INPUT_END
-
-	cat >expect <<-EOF &&
-	:100644 100644 $f5id $f5id C100	newdir/interesting	file3/file5
-	:100755 100755 $newf $newf C100	file2/newf	file3/newf
-	:100644 100644 $oldf $oldf C100	file2/oldf	file3/oldf
-	EOF
-	git fast-import <input &&
-	git diff-tree -C --find-copies-harder -r N2^^ N2 >actual &&
-	compare_diff_raw expect actual
-'
-
-test_expect_success 'N: copy dirty subdirectory' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/N3
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	dirty directory copy
-	COMMIT
-
-	from refs/heads/branch^0
-	M 644 inline file2/file5
-	data <<EOF
-	$file5_data
-	EOF
-
-	C file2 file3
-	D file2/file5
-
-	INPUT_END
-
-	git fast-import <input &&
-	test $(git rev-parse N2^{tree}) = $(git rev-parse N3^{tree})
-'
-
-test_expect_success 'N: copy directory by id' '
-	cat >expect <<-EOF &&
-	:100755 100755 $newf $newf C100	file2/newf	file3/newf
-	:100644 100644 $oldf $oldf C100	file2/oldf	file3/oldf
-	EOF
-	subdir=$(git rev-parse refs/heads/branch^0:file2) &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/N4
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	copy by tree hash
-	COMMIT
-
-	from refs/heads/branch^0
-	M 040000 $subdir file3
-	INPUT_END
-	git fast-import <input &&
-	git diff-tree -C --find-copies-harder -r N4^ N4 >actual &&
-	compare_diff_raw expect actual
-'
-
-test_expect_success PIPE 'N: read and copy directory' '
-	cat >expect <<-EOF &&
-	:100755 100755 $newf $newf C100	file2/newf	file3/newf
-	:100644 100644 $oldf $oldf C100	file2/oldf	file3/oldf
-	EOF
-	git update-ref -d refs/heads/N4 &&
-	rm -f backflow &&
-	mkfifo backflow &&
-	(
-		exec <backflow &&
-		cat <<-EOF &&
-		commit refs/heads/N4
-		committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-		data <<COMMIT
-		copy by tree hash, part 2
-		COMMIT
-
-		from refs/heads/branch^0
-		ls "file2"
-		EOF
-		read mode type tree filename &&
-		echo "M 040000 $tree file3"
-	) |
-	git fast-import --cat-blob-fd=3 3>backflow &&
-	git diff-tree -C --find-copies-harder -r N4^ N4 >actual &&
-	compare_diff_raw expect actual
-'
-
-test_expect_success PIPE 'N: empty directory reads as missing' '
-	cat <<-\EOF >expect &&
-	OBJNAME
-	:000000 100644 OBJNAME OBJNAME A	unrelated
-	EOF
-	echo "missing src" >expect.response &&
-	git update-ref -d refs/heads/read-empty &&
-	rm -f backflow &&
-	mkfifo backflow &&
-	(
-		exec <backflow &&
-		cat <<-EOF &&
-		commit refs/heads/read-empty
-		committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-		data <<COMMIT
-		read "empty" (missing) directory
-		COMMIT
-
-		M 100644 inline src/greeting
-		data <<BLOB
-		hello
-		BLOB
-		C src/greeting dst1/non-greeting
-		C src/greeting unrelated
-		# leave behind "empty" src directory
-		D src/greeting
-		ls "src"
-		EOF
-		read -r line &&
-		printf "%s\n" "$line" >response &&
-		cat <<-\EOF
-		D dst1
-		D dst2
-		EOF
-	) |
-	git fast-import --cat-blob-fd=3 3>backflow &&
-	test_cmp expect.response response &&
-	git rev-list read-empty |
-	git diff-tree -r --root --stdin |
-	sed "s/$OID_REGEX/OBJNAME/g" >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'N: copy root directory by tree hash' '
-	cat >expect <<-EOF &&
-	:100755 000000 $newf $zero D	file3/newf
-	:100644 000000 $oldf $zero D	file3/oldf
-	EOF
-	root=$(git rev-parse refs/heads/branch^0^{tree}) &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/N6
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	copy root directory by tree hash
-	COMMIT
-
-	from refs/heads/branch^0
-	M 040000 $root ""
-	INPUT_END
-	git fast-import <input &&
-	git diff-tree -C --find-copies-harder -r N4 N6 >actual &&
-	compare_diff_raw expect actual
-'
-
-test_expect_success 'N: copy root by path' '
-	cat >expect <<-EOF &&
-	:100755 100755 $newf $newf C100	file2/newf	oldroot/file2/newf
-	:100644 100644 $oldf $oldf C100	file2/oldf	oldroot/file2/oldf
-	:100755 100755 $f4id $f4id C100	file4	oldroot/file4
-	:100755 100755 $f6id $f6id C100	newdir/exec.sh	oldroot/newdir/exec.sh
-	:100644 100644 $f5id $f5id C100	newdir/interesting	oldroot/newdir/interesting
-	EOF
-	cat >input <<-INPUT_END &&
-	commit refs/heads/N-copy-root-path
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	copy root directory by (empty) path
-	COMMIT
-
-	from refs/heads/branch^0
-	C "" oldroot
-	INPUT_END
-	git fast-import <input &&
-	git diff-tree -C --find-copies-harder -r branch N-copy-root-path >actual &&
-	compare_diff_raw expect actual
-'
-
-test_expect_success 'N: delete directory by copying' '
-	cat >expect <<-\EOF &&
-	OBJID
-	:100644 000000 OBJID OBJID D	foo/bar/qux
-	OBJID
-	:000000 100644 OBJID OBJID A	foo/bar/baz
-	:000000 100644 OBJID OBJID A	foo/bar/qux
-	EOF
-	empty_tree=$(git mktree </dev/null) &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/N-delete
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	collect data to be deleted
-	COMMIT
-
-	deleteall
-	M 100644 inline foo/bar/baz
-	data <<DATA_END
-	hello
-	DATA_END
-	C "foo/bar/baz" "foo/bar/qux"
-	C "foo/bar/baz" "foo/bar/quux/1"
-	C "foo/bar/baz" "foo/bar/quuux"
-	M 040000 $empty_tree foo/bar/quux
-	M 040000 $empty_tree foo/bar/quuux
-
-	commit refs/heads/N-delete
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	delete subdirectory
-	COMMIT
-
-	M 040000 $empty_tree foo/bar/qux
-	INPUT_END
-	git fast-import <input &&
-	git rev-list N-delete |
-		git diff-tree -r --stdin --root --always |
-		sed -e "s/$OID_REGEX/OBJID/g" >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'N: modify copied tree' '
-	cat >expect <<-EOF &&
-	:100644 100644 $f5id $f5id C100	newdir/interesting	file3/file5
-	:100755 100755 $newf $newf C100	file2/newf	file3/newf
-	:100644 100644 $oldf $oldf C100	file2/oldf	file3/oldf
-	EOF
-	subdir=$(git rev-parse refs/heads/branch^0:file2) &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/N5
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	copy by tree hash
-	COMMIT
-
-	from refs/heads/branch^0
-	M 040000 $subdir file3
-
-	commit refs/heads/N5
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	modify directory copy
-	COMMIT
-
-	M 644 inline file3/file5
-	data <<EOF
-	$file5_data
-	EOF
-	INPUT_END
-	git fast-import <input &&
-	git diff-tree -C --find-copies-harder -r N5^^ N5 >actual &&
-	compare_diff_raw expect actual
-'
-
-test_expect_success 'N: reject foo/ syntax' '
-	subdir=$(git rev-parse refs/heads/branch^0:file2) &&
-	test_must_fail git fast-import <<-INPUT_END
-	commit refs/heads/N5B
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	copy with invalid syntax
-	COMMIT
-
-	from refs/heads/branch^0
-	M 040000 $subdir file3/
-	INPUT_END
-'
-
-test_expect_success 'N: reject foo/ syntax in copy source' '
-	test_must_fail git fast-import <<-INPUT_END
-	commit refs/heads/N5C
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	copy with invalid syntax
-	COMMIT
-
-	from refs/heads/branch^0
-	C file2/ file3
-	INPUT_END
-'
-
-test_expect_success 'N: reject foo/ syntax in rename source' '
-	test_must_fail git fast-import <<-INPUT_END
-	commit refs/heads/N5D
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	rename with invalid syntax
-	COMMIT
-
-	from refs/heads/branch^0
-	R file2/ file3
-	INPUT_END
-'
-
-test_expect_success 'N: reject foo/ syntax in ls argument' '
-	test_must_fail git fast-import <<-INPUT_END
-	commit refs/heads/N5E
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	copy with invalid syntax
-	COMMIT
-
-	from refs/heads/branch^0
-	ls "file2/"
-	INPUT_END
-'
-
-test_expect_success 'N: copy to root by id and modify' '
-	echo "hello, world" >expect.foo &&
-	echo hello >expect.bar &&
-	git fast-import <<-SETUP_END &&
-	commit refs/heads/N7
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	hello, tree
-	COMMIT
-
-	deleteall
-	M 644 inline foo/bar
-	data <<EOF
-	hello
-	EOF
-	SETUP_END
-
-	tree=$(git rev-parse --verify N7:) &&
-	git fast-import <<-INPUT_END &&
-	commit refs/heads/N8
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	copy to root by id and modify
-	COMMIT
-
-	M 040000 $tree ""
-	M 644 inline foo/foo
-	data <<EOF
-	hello, world
-	EOF
-	INPUT_END
-	git show N8:foo/foo >actual.foo &&
-	git show N8:foo/bar >actual.bar &&
-	test_cmp expect.foo actual.foo &&
-	test_cmp expect.bar actual.bar
-'
-
-test_expect_success 'N: extract subtree' '
-	branch=$(git rev-parse --verify refs/heads/branch^{tree}) &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/N9
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	extract subtree branch:newdir
-	COMMIT
-
-	M 040000 $branch ""
-	C "newdir" ""
-	INPUT_END
-	git fast-import <input &&
-	git diff --exit-code branch:newdir N9
-'
-
-test_expect_success 'N: modify subtree, extract it, and modify again' '
-	echo hello >expect.baz &&
-	echo hello, world >expect.qux &&
-	git fast-import <<-SETUP_END &&
-	commit refs/heads/N10
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	hello, tree
-	COMMIT
-
-	deleteall
-	M 644 inline foo/bar/baz
-	data <<EOF
-	hello
-	EOF
-	SETUP_END
-
-	tree=$(git rev-parse --verify N10:) &&
-	git fast-import <<-INPUT_END &&
-	commit refs/heads/N11
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	copy to root by id and modify
-	COMMIT
-
-	M 040000 $tree ""
-	M 100644 inline foo/bar/qux
-	data <<EOF
-	hello, world
-	EOF
-	R "foo" ""
-	C "bar/qux" "bar/quux"
-	INPUT_END
-	git show N11:bar/baz >actual.baz &&
-	git show N11:bar/qux >actual.qux &&
-	git show N11:bar/quux >actual.quux &&
-	test_cmp expect.baz actual.baz &&
-	test_cmp expect.qux actual.qux &&
-	test_cmp expect.qux actual.quux'
-
-###
-### series O
-###
-
-test_expect_success 'O: comments are all skipped' '
-	cat >input <<-INPUT_END &&
-	#we will
-	commit refs/heads/O1
-	# -- ignore all of this text
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	# $GIT_COMMITTER_NAME has inserted here for his benefit.
-	data <<COMMIT
-	dirty directory copy
-	COMMIT
-
-	# do not forget the import blank line!
-	#
-	# yes, we started from our usual base of branch^0.
-	# i like branch^0.
-	from refs/heads/branch^0
-	# and we need to reuse file2/file5 from N3 above.
-	M 644 inline file2/file5
-	# otherwise the tree will be different
-	data <<EOF
-	$file5_data
-	EOF
-
-	# do not forget to copy file2 to file3
-	C file2 file3
-	#
-	# or to delete file5 from file2.
-	D file2/file5
-	# are we done yet?
-
-	INPUT_END
-
-	git fast-import <input &&
-	test $(git rev-parse N3) = $(git rev-parse O1)
-'
-
-test_expect_success 'O: blank lines not necessary after data commands' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/O2
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	dirty directory copy
-	COMMIT
-	from refs/heads/branch^0
-	M 644 inline file2/file5
-	data <<EOF
-	$file5_data
-	EOF
-	C file2 file3
-	D file2/file5
-
-	INPUT_END
-
-	git fast-import <input &&
-	test $(git rev-parse N3) = $(git rev-parse O2)
-'
-
-test_expect_success 'O: repack before next test' '
-	git repack -a -d
-'
-
-test_expect_success 'O: blank lines not necessary after other commands' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/O3
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	zstring
-	COMMIT
-	commit refs/heads/O3
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	zof
-	COMMIT
-	checkpoint
-	commit refs/heads/O3
-	mark :5
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	zempty
-	COMMIT
-	checkpoint
-	commit refs/heads/O3
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	zcommits
-	COMMIT
-	reset refs/tags/O3-2nd
-	from :5
-	reset refs/tags/O3-3rd
-	from :5
-	INPUT_END
-
-	cat >expect <<-INPUT_END &&
-	string
-	of
-	empty
-	commits
-	INPUT_END
-
-	git fast-import <input &&
-	test 8 = $(find .git/objects/pack -type f | grep -v multi-pack-index | wc -l) &&
-	test $(git rev-parse refs/tags/O3-2nd) = $(git rev-parse O3^) &&
-	git log --reverse --pretty=oneline O3 | sed s/^.*z// >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'O: progress outputs as requested by input' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/O4
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	zstring
-	COMMIT
-	commit refs/heads/O4
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	zof
-	COMMIT
-	progress Two commits down, 2 to go!
-	commit refs/heads/O4
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	zempty
-	COMMIT
-	progress Three commits down, 1 to go!
-	commit refs/heads/O4
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	zcommits
-	COMMIT
-	progress done!
-	INPUT_END
-	git fast-import <input >actual &&
-	grep "progress " <input >expect &&
-	test_cmp expect actual
-'
-
-###
-### series P (gitlinks)
-###
-
-test_expect_success 'P: superproject & submodule mix' '
-	cat >input <<-INPUT_END &&
-	blob
-	mark :1
-	data 10
-	test file
-
-	reset refs/heads/sub
-	commit refs/heads/sub
-	mark :2
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data 12
-	sub_initial
-	M 100644 :1 file
-
-	blob
-	mark :3
-	data <<DATAEND
-	[submodule "sub"]
-		path = sub
-		url = "$(pwd)/sub"
-	DATAEND
-
-	commit refs/heads/subuse1
-	mark :4
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data 8
-	initial
-	from refs/heads/master
-	M 100644 :3 .gitmodules
-	M 160000 :2 sub
-
-	blob
-	mark :5
-	data 20
-	test file
-	more data
-
-	commit refs/heads/sub
-	mark :6
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data 11
-	sub_second
-	from :2
-	M 100644 :5 file
-
-	commit refs/heads/subuse1
-	mark :7
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data 7
-	second
-	from :4
-	M 160000 :6 sub
-
-	INPUT_END
-
-	git fast-import <input &&
-	git checkout subuse1 &&
-	rm -rf sub &&
-	mkdir sub &&
-	(
-		cd sub &&
-		git init &&
-		git fetch --update-head-ok .. refs/heads/sub:refs/heads/master &&
-		git checkout master
-	) &&
-	git submodule init &&
-	git submodule update
-'
-
-test_expect_success 'P: verbatim SHA gitlinks' '
-	SUBLAST=$(git rev-parse --verify sub) &&
-	SUBPREV=$(git rev-parse --verify sub^) &&
-
-	cat >input <<-INPUT_END &&
-	blob
-	mark :1
-	data <<DATAEND
-	[submodule "sub"]
-		path = sub
-		url = "$(pwd)/sub"
-	DATAEND
-
-	commit refs/heads/subuse2
-	mark :2
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data 8
-	initial
-	from refs/heads/master
-	M 100644 :1 .gitmodules
-	M 160000 $SUBPREV sub
-
-	commit refs/heads/subuse2
-	mark :3
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data 7
-	second
-	from :2
-	M 160000 $SUBLAST sub
-
-	INPUT_END
-
-	git branch -D sub &&
-	git gc &&
-	git prune &&
-	git fast-import <input &&
-	test $(git rev-parse --verify subuse2) = $(git rev-parse --verify subuse1)
-'
-
-test_expect_success 'P: fail on inline gitlink' '
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/subuse3
-	mark :1
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	corrupt
-	COMMIT
-
-	from refs/heads/subuse2
-	M 160000 inline sub
-	data <<DATA
-	$SUBPREV
-	DATA
-
-	INPUT_END
-
-	test_must_fail git fast-import <input
-'
-
-test_expect_success 'P: fail on blob mark in gitlink' '
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	blob
-	mark :1
-	data <<DATA
-	$SUBPREV
-	DATA
-
-	commit refs/heads/subuse3
-	mark :2
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	corrupt
-	COMMIT
-
-	from refs/heads/subuse2
-	M 160000 :1 sub
-
-	INPUT_END
-
-	test_must_fail git fast-import <input
-'
-
-###
-### series Q (notes)
-###
-
-test_expect_success 'Q: commit notes' '
-	note1_data="The first note for the first commit" &&
-	note2_data="The first note for the second commit" &&
-	note3_data="The first note for the third commit" &&
-	note1b_data="The second note for the first commit" &&
-	note1c_data="The third note for the first commit" &&
-	note2b_data="The second note for the second commit" &&
-
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	blob
-	mark :2
-	data <<EOF
-	$file2_data
-	EOF
-
-	commit refs/heads/notes-test
-	mark :3
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	first (:3)
-	COMMIT
-
-	M 644 :2 file2
-
-	blob
-	mark :4
-	data $file4_len
-	$file4_data
-	commit refs/heads/notes-test
-	mark :5
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	second (:5)
-	COMMIT
-
-	M 644 :4 file4
-
-	commit refs/heads/notes-test
-	mark :6
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	third (:6)
-	COMMIT
-
-	M 644 inline file5
-	data <<EOF
-	$file5_data
-	EOF
-
-	M 755 inline file6
-	data <<EOF
-	$file6_data
-	EOF
-
-	blob
-	mark :7
-	data <<EOF
-	$note1_data
-	EOF
-
-	blob
-	mark :8
-	data <<EOF
-	$note2_data
-	EOF
-
-	commit refs/notes/foobar
-	mark :9
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	notes (:9)
-	COMMIT
-
-	N :7 :3
-	N :8 :5
-	N inline :6
-	data <<EOF
-	$note3_data
-	EOF
-
-	commit refs/notes/foobar
-	mark :10
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	notes (:10)
-	COMMIT
-
-	N inline :3
-	data <<EOF
-	$note1b_data
-	EOF
-
-	commit refs/notes/foobar2
-	mark :11
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	notes (:11)
-	COMMIT
-
-	N inline :3
-	data <<EOF
-	$note1c_data
-	EOF
-
-	commit refs/notes/foobar
-	mark :12
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	notes (:12)
-	COMMIT
-
-	deleteall
-	N inline :5
-	data <<EOF
-	$note2b_data
-	EOF
-
-	INPUT_END
-
-	git fast-import <input &&
-	git whatchanged notes-test
-'
-
-test_expect_success 'Q: verify pack' '
-	verify_packs
-'
-
-test_expect_success 'Q: verify first commit' '
-	commit1=$(git rev-parse notes-test~2) &&
-	commit2=$(git rev-parse notes-test^) &&
-	commit3=$(git rev-parse notes-test) &&
-
-	cat >expect <<-EOF &&
-	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-
-	first (:3)
-	EOF
-	git cat-file commit notes-test~2 | sed 1d >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify second commit' '
-	cat >expect <<-EOF &&
-	parent $commit1
-	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-
-	second (:5)
-	EOF
-	git cat-file commit notes-test^ | sed 1d >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify third commit' '
-	cat >expect <<-EOF &&
-	parent $commit2
-	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-
-	third (:6)
-	EOF
-	git cat-file commit notes-test | sed 1d >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify first notes commit' '
-	cat >expect <<-EOF &&
-	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-
-	notes (:9)
-	EOF
-	git cat-file commit refs/notes/foobar~2 | sed 1d >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify first notes tree' '
-	cat >expect.unsorted <<-EOF &&
-	100644 blob $commit1
-	100644 blob $commit2
-	100644 blob $commit3
-	EOF
-	cat expect.unsorted | sort >expect &&
-	git cat-file -p refs/notes/foobar~2^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify first note for first commit' '
-	echo "$note1_data" >expect &&
-	git cat-file blob refs/notes/foobar~2:$commit1 >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify first note for second commit' '
-	echo "$note2_data" >expect &&
-	git cat-file blob refs/notes/foobar~2:$commit2 >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify first note for third commit' '
-	echo "$note3_data" >expect &&
-	git cat-file blob refs/notes/foobar~2:$commit3 >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify second notes commit' '
-	cat >expect <<-EOF &&
-	parent $(git rev-parse --verify refs/notes/foobar~2)
-	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-
-	notes (:10)
-	EOF
-	git cat-file commit refs/notes/foobar^ | sed 1d >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify second notes tree' '
-	cat >expect.unsorted <<-EOF &&
-	100644 blob $commit1
-	100644 blob $commit2
-	100644 blob $commit3
-	EOF
-	cat expect.unsorted | sort >expect &&
-	git cat-file -p refs/notes/foobar^^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify second note for first commit' '
-	echo "$note1b_data" >expect &&
-	git cat-file blob refs/notes/foobar^:$commit1 >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify first note for second commit' '
-	echo "$note2_data" >expect &&
-	git cat-file blob refs/notes/foobar^:$commit2 >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify first note for third commit' '
-	echo "$note3_data" >expect &&
-	git cat-file blob refs/notes/foobar^:$commit3 >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify third notes commit' '
-	cat >expect <<-EOF &&
-	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-
-	notes (:11)
-	EOF
-	git cat-file commit refs/notes/foobar2 | sed 1d >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify third notes tree' '
-	cat >expect.unsorted <<-EOF &&
-	100644 blob $commit1
-	EOF
-	cat expect.unsorted | sort >expect &&
-	git cat-file -p refs/notes/foobar2^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify third note for first commit' '
-	echo "$note1c_data" >expect &&
-	git cat-file blob refs/notes/foobar2:$commit1 >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify fourth notes commit' '
-	cat >expect <<-EOF &&
-	parent $(git rev-parse --verify refs/notes/foobar^)
-	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-
-	notes (:12)
-	EOF
-	git cat-file commit refs/notes/foobar | sed 1d >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify fourth notes tree' '
-	cat >expect.unsorted <<-EOF &&
-	100644 blob $commit2
-	EOF
-	cat expect.unsorted | sort >expect &&
-	git cat-file -p refs/notes/foobar^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: verify second note for second commit' '
-	echo "$note2b_data" >expect &&
-	git cat-file blob refs/notes/foobar:$commit2 >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'Q: deny note on empty branch' '
-	cat >input <<-EOF &&
-	reset refs/heads/Q0
-
-	commit refs/heads/note-Q0
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	Note for an empty branch.
-	COMMIT
-
-	N inline refs/heads/Q0
-	data <<NOTE
-	some note
-	NOTE
-	EOF
-	test_must_fail git fast-import <input
-'
-###
-### series R (feature and option)
-###
-
-test_expect_success 'R: abort on unsupported feature' '
-	cat >input <<-EOF &&
-	feature no-such-feature-exists
-	EOF
-
-	test_must_fail git fast-import <input
-'
-
-test_expect_success 'R: supported feature is accepted' '
-	cat >input <<-EOF &&
-	feature date-format=now
-	EOF
-
-	git fast-import <input
-'
-
-test_expect_success 'R: abort on receiving feature after data command' '
-	cat >input <<-EOF &&
-	blob
-	data 3
-	hi
-	feature date-format=now
-	EOF
-
-	test_must_fail git fast-import <input
-'
-
-test_expect_success 'R: import-marks features forbidden by default' '
-	>git.marks &&
-	echo "feature import-marks=git.marks" >input &&
-	test_must_fail git fast-import <input &&
-	echo "feature import-marks-if-exists=git.marks" >input &&
-	test_must_fail git fast-import <input
-'
-
-test_expect_success 'R: only one import-marks feature allowed per stream' '
-	>git.marks &&
-	>git2.marks &&
-	cat >input <<-EOF &&
-	feature import-marks=git.marks
-	feature import-marks=git2.marks
-	EOF
-
-	test_must_fail git fast-import --allow-unsafe-features <input
-'
-
-test_expect_success 'R: export-marks feature forbidden by default' '
-	echo "feature export-marks=git.marks" >input &&
-	test_must_fail git fast-import <input
-'
-
-test_expect_success 'R: export-marks feature results in a marks file being created' '
-	cat >input <<-EOF &&
-	feature export-marks=git.marks
-	blob
-	mark :1
-	data 3
-	hi
-
-	EOF
-
-	git fast-import --allow-unsafe-features <input &&
-	grep :1 git.marks
-'
-
-test_expect_success 'R: export-marks options can be overridden by commandline options' '
-	cat >input <<-\EOF &&
-	feature export-marks=feature-sub/git.marks
-	blob
-	mark :1
-	data 3
-	hi
-
-	EOF
-	git fast-import --allow-unsafe-features \
-			--export-marks=cmdline-sub/other.marks <input &&
-	grep :1 cmdline-sub/other.marks &&
-	test_path_is_missing feature-sub
-'
-
-test_expect_success 'R: catch typo in marks file name' '
-	test_must_fail git fast-import --import-marks=nonexistent.marks </dev/null &&
-	echo "feature import-marks=nonexistent.marks" |
-	test_must_fail git fast-import --allow-unsafe-features
-'
-
-test_expect_success 'R: import and output marks can be the same file' '
-	rm -f io.marks &&
-	blob=$(echo hi | git hash-object --stdin) &&
-	cat >expect <<-EOF &&
-	:1 $blob
-	:2 $blob
-	EOF
-	git fast-import --export-marks=io.marks <<-\EOF &&
-	blob
-	mark :1
-	data 3
-	hi
-
-	EOF
-	git fast-import --import-marks=io.marks --export-marks=io.marks <<-\EOF &&
-	blob
-	mark :2
-	data 3
-	hi
-
-	EOF
-	test_cmp expect io.marks
-'
-
-test_expect_success 'R: --import-marks=foo --output-marks=foo to create foo fails' '
-	rm -f io.marks &&
-	test_must_fail git fast-import --import-marks=io.marks --export-marks=io.marks <<-\EOF
-	blob
-	mark :1
-	data 3
-	hi
-
-	EOF
-'
-
-test_expect_success 'R: --import-marks-if-exists' '
-	rm -f io.marks &&
-	blob=$(echo hi | git hash-object --stdin) &&
-	echo ":1 $blob" >expect &&
-	git fast-import --import-marks-if-exists=io.marks --export-marks=io.marks <<-\EOF &&
-	blob
-	mark :1
-	data 3
-	hi
-
-	EOF
-	test_cmp expect io.marks
-'
-
-test_expect_success 'R: feature import-marks-if-exists' '
-	rm -f io.marks &&
-
-	git fast-import --export-marks=io.marks \
-			--allow-unsafe-features <<-\EOF &&
-	feature import-marks-if-exists=not_io.marks
-	EOF
-	test_must_be_empty io.marks &&
-
-	blob=$(echo hi | git hash-object --stdin) &&
-
-	echo ":1 $blob" >io.marks &&
-	echo ":1 $blob" >expect &&
-	echo ":2 $blob" >>expect &&
-
-	git fast-import --export-marks=io.marks \
-			--allow-unsafe-features <<-\EOF &&
-	feature import-marks-if-exists=io.marks
-	blob
-	mark :2
-	data 3
-	hi
-
-	EOF
-	test_cmp expect io.marks &&
-
-	echo ":3 $blob" >>expect &&
-
-	git fast-import --import-marks=io.marks \
-			--export-marks=io.marks \
-			--allow-unsafe-features <<-\EOF &&
-	feature import-marks-if-exists=not_io.marks
-	blob
-	mark :3
-	data 3
-	hi
-
-	EOF
-	test_cmp expect io.marks &&
-
-	git fast-import --import-marks-if-exists=not_io.marks \
-			--export-marks=io.marks \
-			--allow-unsafe-features <<-\EOF &&
-	feature import-marks-if-exists=io.marks
-	EOF
-	test_must_be_empty io.marks
-'
-
-test_expect_success 'R: import to output marks works without any content' '
-	cat >input <<-EOF &&
-	feature import-marks=marks.out
-	feature export-marks=marks.new
-	EOF
-
-	git fast-import --allow-unsafe-features <input &&
-	test_cmp marks.out marks.new
-'
-
-test_expect_success 'R: import marks prefers commandline marks file over the stream' '
-	cat >input <<-EOF &&
-	feature import-marks=nonexistent.marks
-	feature export-marks=marks.new
-	EOF
-
-	git fast-import --import-marks=marks.out --allow-unsafe-features <input &&
-	test_cmp marks.out marks.new
-'
-
-
-test_expect_success 'R: multiple --import-marks= should be honoured' '
-	cat >input <<-EOF &&
-	feature import-marks=nonexistent.marks
-	feature export-marks=combined.marks
-	EOF
-
-	head -n2 marks.out > one.marks &&
-	tail -n +3 marks.out > two.marks &&
-	git fast-import --import-marks=one.marks --import-marks=two.marks \
-		--allow-unsafe-features <input &&
-	test_cmp marks.out combined.marks
-'
-
-test_expect_success 'R: feature relative-marks should be honoured' '
-	cat >input <<-EOF &&
-	feature relative-marks
-	feature import-marks=relative.in
-	feature export-marks=relative.out
-	EOF
-
-	mkdir -p .git/info/fast-import/ &&
-	cp marks.new .git/info/fast-import/relative.in &&
-	git fast-import --allow-unsafe-features <input &&
-	test_cmp marks.new .git/info/fast-import/relative.out
-'
-
-test_expect_success 'R: feature no-relative-marks should be honoured' '
-	cat >input <<-EOF &&
-	feature relative-marks
-	feature import-marks=relative.in
-	feature no-relative-marks
-	feature export-marks=non-relative.out
-	EOF
-
-	git fast-import --allow-unsafe-features <input &&
-	test_cmp marks.new non-relative.out
-'
-
-test_expect_success 'R: feature ls supported' '
-	echo "feature ls" |
-	git fast-import
-'
-
-test_expect_success 'R: feature cat-blob supported' '
-	echo "feature cat-blob" |
-	git fast-import
-'
-
-test_expect_success 'R: cat-blob-fd must be a nonnegative integer' '
-	test_must_fail git fast-import --cat-blob-fd=-1 </dev/null
-'
-
-test_expect_success !MINGW 'R: print old blob' '
-	blob=$(echo "yes it can" | git hash-object -w --stdin) &&
-	cat >expect <<-EOF &&
-	${blob} blob 11
-	yes it can
-
-	EOF
-	echo "cat-blob $blob" |
-	git fast-import --cat-blob-fd=6 6>actual &&
-	test_cmp expect actual
-'
-
-test_expect_success !MINGW 'R: in-stream cat-blob-fd not respected' '
-	echo hello >greeting &&
-	blob=$(git hash-object -w greeting) &&
-	cat >expect <<-EOF &&
-	${blob} blob 6
-	hello
-
-	EOF
-	git fast-import --cat-blob-fd=3 3>actual.3 >actual.1 <<-EOF &&
-	cat-blob $blob
-	EOF
-	test_cmp expect actual.3 &&
-	test_must_be_empty actual.1 &&
-	git fast-import 3>actual.3 >actual.1 <<-EOF &&
-	option cat-blob-fd=3
-	cat-blob $blob
-	EOF
-	test_must_be_empty actual.3 &&
-	test_cmp expect actual.1
-'
-
-test_expect_success !MINGW 'R: print mark for new blob' '
-	echo "effluentish" | git hash-object --stdin >expect &&
-	git fast-import --cat-blob-fd=6 6>actual <<-\EOF &&
-	blob
-	mark :1
-	data <<BLOB_END
-	effluentish
-	BLOB_END
-	get-mark :1
-	EOF
-	test_cmp expect actual
-'
-
-test_expect_success !MINGW 'R: print new blob' '
-	blob=$(echo "yep yep yep" | git hash-object --stdin) &&
-	cat >expect <<-EOF &&
-	${blob} blob 12
-	yep yep yep
-
-	EOF
-	git fast-import --cat-blob-fd=6 6>actual <<-\EOF &&
-	blob
-	mark :1
-	data <<BLOB_END
-	yep yep yep
-	BLOB_END
-	cat-blob :1
-	EOF
-	test_cmp expect actual
-'
-
-test_expect_success !MINGW 'R: print new blob by sha1' '
-	blob=$(echo "a new blob named by sha1" | git hash-object --stdin) &&
-	cat >expect <<-EOF &&
-	${blob} blob 25
-	a new blob named by sha1
-
-	EOF
-	git fast-import --cat-blob-fd=6 6>actual <<-EOF &&
-	blob
-	data <<BLOB_END
-	a new blob named by sha1
-	BLOB_END
-	cat-blob $blob
-	EOF
-	test_cmp expect actual
-'
-
-test_expect_success 'setup: big file' '
-	(
-		echo "the quick brown fox jumps over the lazy dog" >big &&
-		for i in 1 2 3
-		do
-			cat big big big big >bigger &&
-			cat bigger bigger bigger bigger >big ||
-			exit
-		done
-	)
-'
-
-test_expect_success 'R: print two blobs to stdout' '
-	blob1=$(git hash-object big) &&
-	blob1_len=$(wc -c <big) &&
-	blob2=$(echo hello | git hash-object --stdin) &&
-	{
-		echo ${blob1} blob $blob1_len &&
-		cat big &&
-		cat <<-EOF
-
-		${blob2} blob 6
-		hello
-
-		EOF
-	} >expect &&
-	{
-		cat <<-\END_PART1 &&
-			blob
-			mark :1
-			data <<data_end
-		END_PART1
-		cat big &&
-		cat <<-\EOF
-			data_end
-			blob
-			mark :2
-			data <<data_end
-			hello
-			data_end
-			cat-blob :1
-			cat-blob :2
-		EOF
-	} |
-	git fast-import >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success PIPE 'R: copy using cat-file' '
-	expect_id=$(git hash-object big) &&
-	expect_len=$(wc -c <big) &&
-	echo $expect_id blob $expect_len >expect.response &&
-
-	rm -f blobs &&
-
-	mkfifo blobs &&
-	(
-		export GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_COMMITTER_DATE &&
-		cat <<-\EOF &&
-		feature cat-blob
-		blob
-		mark :1
-		data <<BLOB
-		EOF
-		cat big &&
-		cat <<-\EOF &&
-		BLOB
-		cat-blob :1
-		EOF
-
-		read blob_id type size <&3 &&
-		echo "$blob_id $type $size" >response &&
-		test_copy_bytes $size >blob <&3 &&
-		read newline <&3 &&
-
-		cat <<-EOF &&
-		commit refs/heads/copied
-		committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-		data <<COMMIT
-		copy big file as file3
-		COMMIT
-		M 644 inline file3
-		data <<BLOB
-		EOF
-		cat blob &&
-		echo BLOB
-	) 3<blobs |
-	git fast-import --cat-blob-fd=3 3>blobs &&
-	git show copied:file3 >actual &&
-	test_cmp expect.response response &&
-	test_cmp big actual
-'
-
-test_expect_success PIPE 'R: print blob mid-commit' '
-	rm -f blobs &&
-	echo "A blob from _before_ the commit." >expect &&
-	mkfifo blobs &&
-	(
-		exec 3<blobs &&
-		cat <<-EOF &&
-		feature cat-blob
-		blob
-		mark :1
-		data <<BLOB
-		A blob from _before_ the commit.
-		BLOB
-		commit refs/heads/temporary
-		committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-		data <<COMMIT
-		Empty commit
-		COMMIT
-		cat-blob :1
-		EOF
-
-		read blob_id type size <&3 &&
-		test_copy_bytes $size >actual <&3 &&
-		read newline <&3 &&
-
-		echo
-	) |
-	git fast-import --cat-blob-fd=3 3>blobs &&
-	test_cmp expect actual
-'
-
-test_expect_success PIPE 'R: print staged blob within commit' '
-	rm -f blobs &&
-	echo "A blob from _within_ the commit." >expect &&
-	mkfifo blobs &&
-	(
-		exec 3<blobs &&
-		cat <<-EOF &&
-		feature cat-blob
-		commit refs/heads/within
-		committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-		data <<COMMIT
-		Empty commit
-		COMMIT
-		M 644 inline within
-		data <<BLOB
-		A blob from _within_ the commit.
-		BLOB
-		EOF
-
-		to_get=$(
-			echo "A blob from _within_ the commit." |
-			git hash-object --stdin
-		) &&
-		echo "cat-blob $to_get" &&
-
-		read blob_id type size <&3 &&
-		test_copy_bytes $size >actual <&3 &&
-		read newline <&3 &&
-
-		echo deleteall
-	) |
-	git fast-import --cat-blob-fd=3 3>blobs &&
-	test_cmp expect actual
-'
-
-test_expect_success 'R: quiet option results in no stats being output' '
-	cat >input <<-EOF &&
-	option git quiet
-	blob
-	data 3
-	hi
-
-	EOF
-
-	git fast-import 2>output <input &&
-	test_must_be_empty output
-'
-
-test_expect_success 'R: feature done means terminating "done" is mandatory' '
-	echo feature done | test_must_fail git fast-import &&
-	test_must_fail git fast-import --done </dev/null
-'
-
-test_expect_success 'R: terminating "done" with trailing gibberish is ok' '
-	git fast-import <<-\EOF &&
-	feature done
-	done
-	trailing gibberish
-	EOF
-	git fast-import <<-\EOF
-	done
-	more trailing gibberish
-	EOF
-'
-
-test_expect_success 'R: terminating "done" within commit' '
-	cat >expect <<-\EOF &&
-	OBJID
-	:000000 100644 OBJID OBJID A	hello.c
-	:000000 100644 OBJID OBJID A	hello2.c
-	EOF
-	git fast-import <<-EOF &&
-	commit refs/heads/done-ends
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<EOT
-	Commit terminated by "done" command
-	EOT
-	M 100644 inline hello.c
-	data <<EOT
-	Hello, world.
-	EOT
-	C hello.c hello2.c
-	done
-	EOF
-	git rev-list done-ends |
-	git diff-tree -r --stdin --root --always |
-	sed -e "s/$OID_REGEX/OBJID/g" >actual &&
-	test_cmp expect actual
-'
-
-test_expect_success 'R: die on unknown option' '
-	cat >input <<-EOF &&
-	option git non-existing-option
-	EOF
-
-	test_must_fail git fast-import <input
-'
-
-test_expect_success 'R: unknown commandline options are rejected' '\
-	test_must_fail git fast-import --non-existing-option < /dev/null
-'
-
-test_expect_success 'R: die on invalid option argument' '
-	echo "option git active-branches=-5" |
-	test_must_fail git fast-import &&
-	echo "option git depth=" |
-	test_must_fail git fast-import &&
-	test_must_fail git fast-import --depth="5 elephants" </dev/null
-'
-
-test_expect_success 'R: ignore non-git options' '
-	cat >input <<-EOF &&
-	option non-existing-vcs non-existing-option
-	EOF
-
-	git fast-import <input
-'
-
-test_expect_success 'R: corrupt lines do not mess marks file' '
-	rm -f io.marks &&
-	blob=$(echo hi | git hash-object --stdin) &&
-	cat >expect <<-EOF &&
-	:3 $ZERO_OID
-	:1 $blob
-	:2 $blob
-	EOF
-	cp expect io.marks &&
-	test_must_fail git fast-import --import-marks=io.marks --export-marks=io.marks <<-\EOF &&
-
-	EOF
-	test_cmp expect io.marks
-'
-
-##
-## R: very large blobs
-##
-test_expect_success 'R: blob bigger than threshold' '
-	blobsize=$((2*1024*1024 + 53)) &&
-	test-tool genrandom bar $blobsize >expect &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/big-file
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	R - big file
-	COMMIT
-
-	M 644 inline big1
-	data $blobsize
-	INPUT_END
-	cat expect >>input &&
-	cat >>input <<-INPUT_END &&
-	M 644 inline big2
-	data $blobsize
-	INPUT_END
-	cat expect >>input &&
-	echo >>input &&
-
-	test_create_repo R &&
-	git --git-dir=R/.git config fastimport.unpackLimit 0 &&
-	git --git-dir=R/.git fast-import --big-file-threshold=1 <input
-'
-
-test_expect_success 'R: verify created pack' '
-	(
-		cd R &&
-		verify_packs -v > ../verify
-	)
-'
-
-test_expect_success 'R: verify written objects' '
-	git --git-dir=R/.git cat-file blob big-file:big1 >actual &&
-	test_cmp_bin expect actual &&
-	a=$(git --git-dir=R/.git rev-parse big-file:big1) &&
-	b=$(git --git-dir=R/.git rev-parse big-file:big2) &&
-	test $a = $b
-'
-
-test_expect_success 'R: blob appears only once' '
-	n=$(grep $a verify | wc -l) &&
-	test 1 = $n
-'
-
-###
-### series S
-###
-#
-# Make sure missing spaces and EOLs after mark references
-# cause errors.
-#
-# Setup:
-#
-#   1--2--4
-#    \   /
-#     -3-
-#
-#   commit marks:  301, 302, 303, 304
-#   blob marks:              403, 404, resp.
-#   note mark:          202
-#
-# The error message when a space is missing not at the
-# end of the line is:
-#
-#   Missing space after ..
-#
-# or when extra characters come after the mark at the end
-# of the line:
-#
-#   Garbage after ..
-#
-# or when the dataref is neither "inline " or a known SHA1,
-#
-#   Invalid dataref ..
-#
-test_expect_success 'S: initialize for S tests' '
-	test_tick &&
-
-	cat >input <<-INPUT_END &&
-	commit refs/heads/S
-	mark :301
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	commit 1
-	COMMIT
-	M 100644 inline hello.c
-	data <<BLOB
-	blob 1
-	BLOB
-
-	commit refs/heads/S
-	mark :302
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	commit 2
-	COMMIT
-	from :301
-	M 100644 inline hello.c
-	data <<BLOB
-	blob 2
-	BLOB
-
-	blob
-	mark :403
-	data <<BLOB
-	blob 3
-	BLOB
-
-	blob
-	mark :202
-	data <<BLOB
-	note 2
-	BLOB
-	INPUT_END
-
-	git fast-import --export-marks=marks <input
-'
-
-#
-# filemodify, three datarefs
-#
-test_expect_success 'S: filemodify with garbage after mark must fail' '
-	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
-	commit refs/heads/S
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	commit N
-	COMMIT
-	M 100644 :403x hello.c
-	EOF
-	test_i18ngrep "space after mark" err
-'
-
-# inline is misspelled; fast-import thinks it is some unknown dataref
-test_expect_success 'S: filemodify with garbage after inline must fail' '
-	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
-	commit refs/heads/S
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	commit N
-	COMMIT
-	M 100644 inlineX hello.c
-	data <<BLOB
-	inline
-	BLOB
-	EOF
-	test_i18ngrep "nvalid dataref" err
-'
-
-test_expect_success 'S: filemodify with garbage after sha1 must fail' '
-	sha1=$(grep :403 marks | cut -d\  -f2) &&
-	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
-	commit refs/heads/S
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	commit N
-	COMMIT
-	M 100644 ${sha1}x hello.c
-	EOF
-	test_i18ngrep "space after SHA1" err
-'
-
-#
-# notemodify, three ways to say dataref
-#
-test_expect_success 'S: notemodify with garbage after mark dataref must fail' '
-	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
-	commit refs/heads/S
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	commit S note dataref markref
-	COMMIT
-	N :202x :302
-	EOF
-	test_i18ngrep "space after mark" err
-'
-
-test_expect_success 'S: notemodify with garbage after inline dataref must fail' '
-	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
-	commit refs/heads/S
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	commit S note dataref inline
-	COMMIT
-	N inlineX :302
-	data <<BLOB
-	note blob
-	BLOB
-	EOF
-	test_i18ngrep "nvalid dataref" err
-'
-
-test_expect_success 'S: notemodify with garbage after sha1 dataref must fail' '
-	sha1=$(grep :202 marks | cut -d\  -f2) &&
-	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
-	commit refs/heads/S
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	commit S note dataref sha1
-	COMMIT
-	N ${sha1}x :302
-	EOF
-	test_i18ngrep "space after SHA1" err
-'
-
-#
-# notemodify, mark in commit-ish
-#
-test_expect_success 'S: notemodify with garbage after mark commit-ish must fail' '
-	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
-	commit refs/heads/Snotes
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	commit S note commit-ish
-	COMMIT
-	N :202 :302x
-	EOF
-	test_i18ngrep "after mark" err
-'
-
-#
-# from
-#
-test_expect_success 'S: from with garbage after mark must fail' '
-	test_must_fail \
-	git fast-import --import-marks=marks --export-marks=marks <<-EOF 2>err &&
-	commit refs/heads/S2
-	mark :303
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	commit 3
-	COMMIT
-	from :301x
-	M 100644 :403 hello.c
-	EOF
-
-
-	# go create the commit, need it for merge test
-	git fast-import --import-marks=marks --export-marks=marks <<-EOF &&
-	commit refs/heads/S2
-	mark :303
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	commit 3
-	COMMIT
-	from :301
-	M 100644 :403 hello.c
-	EOF
-
-	# now evaluate the error
-	test_i18ngrep "after mark" err
-'
-
-
-#
-# merge
-#
-test_expect_success 'S: merge with garbage after mark must fail' '
-	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
-	commit refs/heads/S
-	mark :304
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	merge 4
-	COMMIT
-	from :302
-	merge :303x
-	M 100644 :403 hello.c
-	EOF
-	test_i18ngrep "after mark" err
-'
-
-#
-# tag, from markref
-#
-test_expect_success 'S: tag with garbage after mark must fail' '
-	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
-	tag refs/tags/Stag
-	from :302x
-	tagger $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<TAG
-	tag S
-	TAG
-	EOF
-	test_i18ngrep "after mark" err
-'
-
-#
-# cat-blob markref
-#
-test_expect_success 'S: cat-blob with garbage after mark must fail' '
-	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
-	cat-blob :403x
-	EOF
-	test_i18ngrep "after mark" err
-'
-
-#
-# ls markref
-#
-test_expect_success 'S: ls with garbage after mark must fail' '
-	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
-	ls :302x hello.c
-	EOF
-	test_i18ngrep "space after mark" err
-'
-
-test_expect_success 'S: ls with garbage after sha1 must fail' '
-	sha1=$(grep :302 marks | cut -d\  -f2) &&
-	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
-	ls ${sha1}x hello.c
-	EOF
-	test_i18ngrep "space after tree-ish" err
-'
-
-###
-### series T (ls)
-###
-# Setup is carried over from series S.
-
-test_expect_success 'T: ls root tree' '
-	sed -e "s/Z\$//" >expect <<-EOF &&
-	040000 tree $(git rev-parse S^{tree})	Z
-	EOF
-	sha1=$(git rev-parse --verify S) &&
-	git fast-import --import-marks=marks <<-EOF >actual &&
-	ls $sha1 ""
-	EOF
-	test_cmp expect actual
-'
-
-test_expect_success 'T: delete branch' '
-	git branch to-delete &&
-	git fast-import <<-EOF &&
-	reset refs/heads/to-delete
-	from $ZERO_OID
-	EOF
-	test_must_fail git rev-parse --verify refs/heads/to-delete
-'
-
-test_expect_success 'T: empty reset doesnt delete branch' '
-	git branch not-to-delete &&
-	git fast-import <<-EOF &&
-	reset refs/heads/not-to-delete
-	EOF
-	git show-ref &&
-	git rev-parse --verify refs/heads/not-to-delete
-'
-
-###
-### series U (filedelete)
-###
-
-test_expect_success 'U: initialize for U tests' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/U
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	test setup
-	COMMIT
-	M 100644 inline hello.c
-	data <<BLOB
-	blob 1
-	BLOB
-	M 100644 inline good/night.txt
-	data <<BLOB
-	sleep well
-	BLOB
-	M 100644 inline good/bye.txt
-	data <<BLOB
-	au revoir
-	BLOB
-
-	INPUT_END
-
-	f7id=$(echo "blob 1" | git hash-object --stdin) &&
-	f8id=$(echo "sleep well" | git hash-object --stdin) &&
-	f9id=$(echo "au revoir" | git hash-object --stdin) &&
-	git fast-import <input
-'
-
-test_expect_success 'U: filedelete file succeeds' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/U
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	delete good/night.txt
-	COMMIT
-	from refs/heads/U^0
-	D good/night.txt
-
-	INPUT_END
-
-	git fast-import <input
-'
-
-test_expect_success 'U: validate file delete result' '
-	cat >expect <<-EOF &&
-	:100644 000000 $f8id $ZERO_OID D	good/night.txt
-	EOF
-
-	git diff-tree -M -r U^1 U >actual &&
-
-	compare_diff_raw expect actual
-'
-
-test_expect_success 'U: filedelete directory succeeds' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/U
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	delete good dir
-	COMMIT
-	from refs/heads/U^0
-	D good
-
-	INPUT_END
-
-	git fast-import <input
-'
-
-test_expect_success 'U: validate directory delete result' '
-	cat >expect <<-EOF &&
-	:100644 000000 $f9id $ZERO_OID D	good/bye.txt
-	EOF
-
-	git diff-tree -M -r U^1 U >actual &&
-
-	compare_diff_raw expect actual
-'
-
-test_expect_success 'U: filedelete root succeeds' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/U
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data <<COMMIT
-	must succeed
-	COMMIT
-	from refs/heads/U^0
-	D ""
-
-	INPUT_END
-
-	git fast-import <input
-'
-
-test_expect_success 'U: validate root delete result' '
-	cat >expect <<-EOF &&
-	:100644 000000 $f7id $ZERO_OID D	hello.c
-	EOF
-
-	git diff-tree -M -r U^1 U >actual &&
-
-	compare_diff_raw expect actual
-'
-
-###
-### series V (checkpoint)
-###
-
-# The commands in input_file should not produce any output on the file
-# descriptor set with --cat-blob-fd (or stdout if unspecified).
-#
-# To make sure you're observing the side effects of checkpoint *before*
-# fast-import terminates (and thus writes out its state), check that the
-# fast-import process is still running using background_import_still_running
-# *after* evaluating the test conditions.
-background_import_then_checkpoint () {
-	options=$1
-	input_file=$2
-
-	mkfifo V.input
-	exec 8<>V.input
-	rm V.input
-
-	mkfifo V.output
-	exec 9<>V.output
-	rm V.output
-
-	(
-		git fast-import $options <&8 >&9 &
-		echo $! >&9
-		wait $!
-		echo >&2 "background fast-import terminated too early with exit code $?"
-		# Un-block the read loop in the main shell process.
-		echo >&9 UNEXPECTED
-	) &
-	sh_pid=$!
-	read fi_pid <&9
-	# We don't mind if fast-import has already died by the time the test
-	# ends.
-	test_when_finished "
-		exec 8>&-; exec 9>&-;
-		kill $sh_pid && wait $sh_pid
-		kill $fi_pid && wait $fi_pid
-		true"
-
-	# Start in the background to ensure we adhere strictly to (blocking)
-	# pipes writing sequence. We want to assume that the write below could
-	# block, e.g. if fast-import blocks writing its own output to &9
-	# because there is no reader on &9 yet.
-	(
-		cat "$input_file"
-		echo "checkpoint"
-		echo "progress checkpoint"
-	) >&8 &
-
-	error=1 ;# assume the worst
-	while read output <&9
-	do
-		if test "$output" = "progress checkpoint"
-		then
-			error=0
-			break
-		elif test "$output" = "UNEXPECTED"
-		then
-			break
-		fi
-		# otherwise ignore cruft
-		echo >&2 "cruft: $output"
-	done
-
-	if test $error -eq 1
-	then
-		false
-	fi
-}
-
-background_import_still_running () {
-	if ! kill -0 "$fi_pid"
-	then
-		echo >&2 "background fast-import terminated too early"
-		false
-	fi
-}
-
-test_expect_success PIPE 'V: checkpoint helper does not get stuck with extra output' '
-	cat >input <<-INPUT_END &&
-	progress foo
-	progress bar
-
-	INPUT_END
-
-	background_import_then_checkpoint "" input &&
-	background_import_still_running
-'
-
-test_expect_success PIPE 'V: checkpoint updates refs after reset' '
-	cat >input <<-\INPUT_END &&
-	reset refs/heads/V
-	from refs/heads/U
-
-	INPUT_END
-
-	background_import_then_checkpoint "" input &&
-	test "$(git rev-parse --verify V)" = "$(git rev-parse --verify U)" &&
-	background_import_still_running
-'
-
-test_expect_success PIPE 'V: checkpoint updates refs and marks after commit' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/V
-	mark :1
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data 0
-	from refs/heads/U
-
-	INPUT_END
-
-	background_import_then_checkpoint "--export-marks=marks.actual" input &&
-
-	echo ":1 $(git rev-parse --verify V)" >marks.expected &&
-
-	test "$(git rev-parse --verify V^)" = "$(git rev-parse --verify U)" &&
-	test_cmp marks.expected marks.actual &&
-	background_import_still_running
-'
-
-# Re-create the exact same commit, but on a different branch: no new object is
-# created in the database, but the refs and marks still need to be updated.
-test_expect_success PIPE 'V: checkpoint updates refs and marks after commit (no new objects)' '
-	cat >input <<-INPUT_END &&
-	commit refs/heads/V2
-	mark :2
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data 0
-	from refs/heads/U
-
-	INPUT_END
-
-	background_import_then_checkpoint "--export-marks=marks.actual" input &&
-
-	echo ":2 $(git rev-parse --verify V2)" >marks.expected &&
-
-	test "$(git rev-parse --verify V2)" = "$(git rev-parse --verify V)" &&
-	test_cmp marks.expected marks.actual &&
-	background_import_still_running
-'
-
-test_expect_success PIPE 'V: checkpoint updates tags after tag' '
-	cat >input <<-INPUT_END &&
-	tag Vtag
-	from refs/heads/V
-	tagger $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	data 0
-
-	INPUT_END
-
-	background_import_then_checkpoint "" input &&
-	git show-ref -d Vtag &&
-	background_import_still_running
-'
-
-###
-### series W (get-mark and empty orphan commits)
-###
-
-cat >>W-input <<-W_INPUT_END
-	commit refs/heads/W-branch
-	mark :1
-	author Full Name <user@company.tld> 1000000000 +0100
-	committer Full Name <user@company.tld> 1000000000 +0100
-	data 27
-	Intentionally empty commit
-	LFsget-mark :1
-	W_INPUT_END
-
-test_expect_success !MINGW 'W: get-mark & empty orphan commit with no newlines' '
-	sed -e s/LFs// W-input | tr L "\n" | git fast-import
-'
-
-test_expect_success !MINGW 'W: get-mark & empty orphan commit with one newline' '
-	sed -e s/LFs/L/ W-input | tr L "\n" | git fast-import
-'
-
-test_expect_success !MINGW 'W: get-mark & empty orphan commit with ugly second newline' '
-	# Technically, this should fail as it has too many linefeeds
-	# according to the grammar in fast-import.txt.  But, for whatever
-	# reason, it works.  Since using the correct number of newlines
-	# does not work with older (pre-2.22) versions of git, allow apps
-	# that used this second-newline workaround to keep working by
-	# checking it with this test...
-	sed -e s/LFs/LL/ W-input | tr L "\n" | git fast-import
-'
-
-test_expect_success !MINGW 'W: get-mark & empty orphan commit with erroneous third newline' '
-	# ...but do NOT allow more empty lines than that (see previous test).
-	sed -e s/LFs/LLL/ W-input | tr L "\n" | test_must_fail git fast-import
-'
-
-###
-### series X (other new features)
-###
-
-test_expect_success 'X: handling encoding' '
-	test_tick &&
-	cat >input <<-INPUT_END &&
-	commit refs/heads/encoding
-	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-	encoding iso-8859-7
-	data <<COMMIT
-	INPUT_END
-
-	printf "Pi: \360\nCOMMIT\n" >>input &&
-
-	git fast-import <input &&
-	git cat-file -p encoding | grep $(printf "\360") &&
-	git log -1 --format=%B encoding | grep $(printf "\317\200")
-'
-
-###
-### series Y (submodules and hash algorithms)
-###
-
-cat >Y-sub-input <<\Y_INPUT_END
-blob
-mark :1
-data 4
-foo
-
-reset refs/heads/master
-commit refs/heads/master
-mark :2
-author Full Name <user@company.tld> 1000000000 +0100
-committer Full Name <user@company.tld> 1000000000 +0100
-data 24
-Test submodule commit 1
-M 100644 :1 file
-
-blob
-mark :3
-data 8
-foo
-bar
-
-commit refs/heads/master
-mark :4
-author Full Name <user@company.tld> 1000000001 +0100
-committer Full Name <user@company.tld> 1000000001 +0100
-data 24
-Test submodule commit 2
-from :2
-M 100644 :3 file
-Y_INPUT_END
-
-# Note that the submodule object IDs are intentionally not translated.
-cat >Y-main-input <<\Y_INPUT_END
-blob
-mark :1
-data 4
-foo
-
-reset refs/heads/master
-commit refs/heads/master
-mark :2
-author Full Name <user@company.tld> 2000000000 +0100
-committer Full Name <user@company.tld> 2000000000 +0100
-data 14
-Test commit 1
-M 100644 :1 file
-
-blob
-mark :3
-data 73
-[submodule "sub1"]
-	path = sub1
-	url = https://void.example.com/main.git
-
-commit refs/heads/master
-mark :4
-author Full Name <user@company.tld> 2000000001 +0100
-committer Full Name <user@company.tld> 2000000001 +0100
-data 14
-Test commit 2
-from :2
-M 100644 :3 .gitmodules
-M 160000 0712c5be7cf681388e355ef47525aaf23aee1a6d sub1
-
-blob
-mark :5
-data 8
-foo
-bar
-
-commit refs/heads/master
-mark :6
-author Full Name <user@company.tld> 2000000002 +0100
-committer Full Name <user@company.tld> 2000000002 +0100
-data 14
-Test commit 3
-from :4
-M 100644 :5 file
-M 160000 ff729f5e62f72c0c3978207d9a80e5f3a65f14d7 sub1
-Y_INPUT_END
-
-cat >Y-marks <<\Y_INPUT_END
-:2 0712c5be7cf681388e355ef47525aaf23aee1a6d
-:4 ff729f5e62f72c0c3978207d9a80e5f3a65f14d7
-Y_INPUT_END
-
-test_expect_success 'Y: setup' '
-	test_oid_cache <<-EOF
-	Ymaster sha1:9afed2f9161ddf416c0a1863b8b0725b00070504
-	Ymaster sha256:c0a1010da1df187b2e287654793df01b464bd6f8e3f17fc1481a7dadf84caee3
-	EOF
-'
-
-test_expect_success 'Y: rewrite submodules' '
-	git init main1 &&
-	(
-		cd main1 &&
-		git init sub2 &&
-		git -C sub2 fast-import --export-marks=../sub2-marks <../Y-sub-input &&
-		git fast-import --rewrite-submodules-from=sub:../Y-marks \
-			--rewrite-submodules-to=sub:sub2-marks <../Y-main-input &&
-		test "$(git rev-parse master)" = "$(test_oid Ymaster)"
-	)
-'
-
-test_done