generate_crlf.sh 3.89 KB
Newer Older
1
#!/usr/bin/env bash
2 3 4 5 6 7 8 9 10
#
# This script will generate the test corpus for CR/LF data using git;
# we create files with all possible line ending varieties (all LF, all
# CRLF, mixed, etc) on all the possible line ending configurations
# (`core.autocrlf=true`, `text=auto` in gitattributes, etc).  This
# allows us to validate that our configuration will match byte-for-byte
# the configuration that git produces.
#
# To update the test resource data, from the test resource directory:
11
#     git rm -r ./crlf_data/{posix,windows}
12
#     sh ./generate_crlf.sh ./crlf ./crlf_data /tmp/crlf_gitdirs
13
#     git add ./crlf_data/{posix,windows}
14 15 16 17 18 19 20 21 22 23 24 25 26 27

set -e

if [ "$1" == "" -o "$2" == "" ]; then
	echo "usage: $0 crlfrepo directory [tempdir]"
	exit 1
fi

input=$1
output=$2
tempdir=$3

set -u

28
create_to_workdir_data() {
29 30 31 32 33 34 35
	local input=$1
	local output=$2
	local tempdir=$3
	local systype=$4
	local autocrlf=$5
	local attr=$6

36
	local worktree="${output}/${systype}_to_workdir/autocrlf_${autocrlf}"
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

	if [ "$attr" != "" ]; then
		local attrdir=`echo $attr | sed -e "s/ /,/g" | sed -e "s/=/_/g"`
		worktree="${worktree},${attrdir}"
	fi

	if [ "$tempdir" = "" ]; then
		local gitdir="${worktree}/.git"
	else
		local gitdir="${tempdir}/generate_crlf_${RANDOM}"
	fi

	echo "Creating ${worktree}"
	mkdir -p "${worktree}"

	git clone --no-checkout --quiet --bare "${input}/.gitted" "${gitdir}"
	git --work-tree="${worktree}" --git-dir="${gitdir}" config core.autocrlf ${autocrlf}

	if [ "$attr" != "" ]; then
		echo "* ${attr}" >> "${worktree}/.gitattributes"
	fi

	git --work-tree="${worktree}" --git-dir="${gitdir}" checkout HEAD

	if [ "$attr" != "" ]; then
		rm "${worktree}/.gitattributes"
	fi

	if [ "$tempdir" != "" ]; then
		rm -rf "${gitdir}"
	fi
}

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
create_to_odb_data() {
	local input=$1
	local output=$2
	local tempdir=$3
	local systype=$4
	local autocrlf=$5
	local safecrlf=$6
	local attr=$7

	local destdir="${output}/${systype}_to_odb/autocrlf_${autocrlf},safecrlf_${safecrlf}"

	if [ "$attr" != "" ]; then
		local attrdir=`echo $attr | sed -e "s/ /,/g" | sed -e "s/=/_/g"`
		destdir="${destdir},${attrdir}"
	fi

	if [ "$tempdir" = "" ]; then
		local workdir="${destdir}/_workdir"
	else
		local workdir="${tempdir}/generate_crlf_${RANDOM}"
	fi

	echo "Creating ${destdir}"
	mkdir -p "${destdir}"

	git init "${workdir}" >/dev/null
	git --work-tree="${workdir}" --git-dir="${workdir}/.git" config core.autocrlf "${autocrlf}"
	git --work-tree="${workdir}" --git-dir="${workdir}/.git" config core.safecrlf "${safecrlf}"

	if [ "$attr" != "" ]; then
		echo "* ${attr}" > "${workdir}/.gitattributes"
	fi

	cp ${input}/* ${workdir}

	for path in ${workdir}/*; do
		filename=$(basename $path)
		failed=""
		output=$(git --work-tree="${workdir}" --git-dir="${workdir}/.git" add ${filename} 2>&1) || failed=1

		if [ ! -z "${failed}" -a "${output:0:35}" == "fatal: LF would be replaced by CRLF" ]; then
			echo "LF would be replaced by CRLF in '${filename}'" > "${destdir}/${filename}.fail"
		elif [ ! -z "${failed}" -a "${output:0:35}" == "fatal: CRLF would be replaced by LF" ]; then
			echo "CRLF would be replaced by LF in '${filename}'" > "${destdir}/${filename}.fail"
		elif [ ! -z "${failed}" ]; then
			echo "failed to add ${filename}: ${output}" 1>&2
			exit 1
		else
			git --work-tree="${workdir}" --git-dir="${workdir}/.git" cat-file blob ":${filename}" > "${destdir}/${filename}"
		fi
	done

	if [ "$tempdir" != "" ]; then
		rm -rf "${workdir}"
	fi
}

127 128 129 130 131 132 133 134 135 136 137
if [[ `uname -s` == MINGW* ]]; then
	systype="windows"
else
	systype="posix"
fi

for autocrlf in true false input; do
	for attr in "" text text=auto -text crlf -crlf eol=lf eol=crlf \
		"text eol=lf" "text eol=crlf" \
		"text=auto eol=lf" "text=auto eol=crlf"; do

138
		create_to_workdir_data "${input}" "${output}" "${tempdir}" \
139
			"${systype}" "${autocrlf}" "${attr}"
140 141 142 143 144

		for safecrlf in true false warn; do
			create_to_odb_data "${input}" "${output}" "${tempdir}" \
				"${systype}" "${autocrlf}" "${safecrlf}" "${attr}"
		done
145 146 147
	done
done