summaryrefslogtreecommitdiffstats
path: root/tests/resources/generate_crlf.sh
blob: 068cad05388654fedd2e3427ef38346e2a60e125 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/usr/bin/env bash
#
# 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:
#     git rm -r ./crlf_data/{posix,windows}
#     sh ./generate_crlf.sh ./crlf ./crlf_data /tmp/crlf_gitdirs
#     git add ./crlf_data/{posix,windows}

set -e

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

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

set -u

create_to_workdir_data() {
	local input=$1
	local output=$2
	local tempdir=$3
	local systype=$4
	local autocrlf=$5
	local attr=$6

	local worktree="${output}/${systype}_to_workdir/autocrlf_${autocrlf}"

	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
}

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
}

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

		create_to_workdir_data "${input}" "${output}" "${tempdir}" \
			"${systype}" "${autocrlf}" "${attr}"

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