1#!/usr/bin/env bash
2#
3# This script will generate the test corpus for CR/LF data using git;
4# we create files with all possible line ending varieties (all LF, all
5# CRLF, mixed, etc) on all the possible line ending configurations
6# (`core.autocrlf=true`, `text=auto` in gitattributes, etc).  This
7# allows us to validate that our configuration will match byte-for-byte
8# the configuration that git produces.
9#
10# 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
15set -e
16
17if [ "$1" == "" -o "$2" == "" ]; then
18	echo "usage: $0 crlfrepo directory [tempdir]"
19	exit 1
20fi
21
22input=$1
23output=$2
24tempdir=$3
25
26set -u
27
28create_to_workdir_data() {
29	local input=$1
30	local output=$2
31	local tempdir=$3
32	local systype=$4
33	local autocrlf=$5
34	local attr=$6
35
36	local worktree="${output}/${systype}_to_workdir/autocrlf_${autocrlf}"
37
38	if [ "$attr" != "" ]; then
39		local attrdir=`echo $attr | sed -e "s/ /,/g" | sed -e "s/=/_/g"`
40		worktree="${worktree},${attrdir}"
41	fi
42
43	if [ "$tempdir" = "" ]; then
44		local gitdir="${worktree}/.git"
45	else
46		local gitdir="${tempdir}/generate_crlf_${RANDOM}"
47	fi
48
49	echo "Creating ${worktree}"
50	mkdir -p "${worktree}"
51
52	git clone --no-checkout --quiet --bare "${input}/.gitted" "${gitdir}"
53	git --work-tree="${worktree}" --git-dir="${gitdir}" config core.autocrlf ${autocrlf}
54
55	if [ "$attr" != "" ]; then
56		echo "* ${attr}" >> "${worktree}/.gitattributes"
57	fi
58
59	git --work-tree="${worktree}" --git-dir="${gitdir}" checkout HEAD
60
61	if [ "$attr" != "" ]; then
62		rm "${worktree}/.gitattributes"
63	fi
64
65	if [ "$tempdir" != "" ]; then
66		rm -rf "${gitdir}"
67	fi
68}
69
70create_to_odb_data() {
71	local input=$1
72	local output=$2
73	local tempdir=$3
74	local systype=$4
75	local autocrlf=$5
76	local safecrlf=$6
77	local attr=$7
78
79	local destdir="${output}/${systype}_to_odb/autocrlf_${autocrlf},safecrlf_${safecrlf}"
80
81	if [ "$attr" != "" ]; then
82		local attrdir=`echo $attr | sed -e "s/ /,/g" | sed -e "s/=/_/g"`
83		destdir="${destdir},${attrdir}"
84	fi
85
86	if [ "$tempdir" = "" ]; then
87		local workdir="${destdir}/_workdir"
88	else
89		local workdir="${tempdir}/generate_crlf_${RANDOM}"
90	fi
91
92	echo "Creating ${destdir}"
93	mkdir -p "${destdir}"
94
95	git init "${workdir}" >/dev/null
96	git --work-tree="${workdir}" --git-dir="${workdir}/.git" config core.autocrlf "${autocrlf}"
97	git --work-tree="${workdir}" --git-dir="${workdir}/.git" config core.safecrlf "${safecrlf}"
98
99	if [ "$attr" != "" ]; then
100		echo "* ${attr}" > "${workdir}/.gitattributes"
101	fi
102
103	cp ${input}/* ${workdir}
104
105	for path in ${workdir}/*; do
106		filename=$(basename $path)
107		failed=""
108		output=$(git --work-tree="${workdir}" --git-dir="${workdir}/.git" add ${filename} 2>&1) || failed=1
109
110		if [ ! -z "${failed}" -a "${output:0:35}" == "fatal: LF would be replaced by CRLF" ]; then
111			echo "LF would be replaced by CRLF in '${filename}'" > "${destdir}/${filename}.fail"
112		elif [ ! -z "${failed}" -a "${output:0:35}" == "fatal: CRLF would be replaced by LF" ]; then
113			echo "CRLF would be replaced by LF in '${filename}'" > "${destdir}/${filename}.fail"
114		elif [ ! -z "${failed}" ]; then
115			echo "failed to add ${filename}: ${output}" 1>&2
116			exit 1
117		else
118			git --work-tree="${workdir}" --git-dir="${workdir}/.git" cat-file blob ":${filename}" > "${destdir}/${filename}"
119		fi
120	done
121
122	if [ "$tempdir" != "" ]; then
123		rm -rf "${workdir}"
124	fi
125}
126
127if [[ `uname -s` == MINGW* ]]; then
128	systype="windows"
129else
130	systype="posix"
131fi
132
133for autocrlf in true false input; do
134	for attr in "" text text=auto -text crlf -crlf eol=lf eol=crlf \
135		"text eol=lf" "text eol=crlf" \
136		"text=auto eol=lf" "text=auto eol=crlf"; do
137
138		create_to_workdir_data "${input}" "${output}" "${tempdir}" \
139			"${systype}" "${autocrlf}" "${attr}"
140
141		for safecrlf in true false warn; do
142			create_to_odb_data "${input}" "${output}" "${tempdir}" \
143				"${systype}" "${autocrlf}" "${safecrlf}" "${attr}"
144		done
145	done
146done
147
148