#!/bin/bash

### Diese Zeile muss angepasst werden!
#phpcli='/usr/bin/php74/bin/php-cli';
phpcli='/usr/bin/php';
## automatische Ermittlung(nicht empfohlen)
# phpcli=$(readlink -f "$(which php)");
###

##################
# Dieses Skript versucht Dateien umzuwandeln, 
# bei denen in PHP7.4 folgende Fehlermeldung erscheint:
# "Deprecated: Array and string offset access syntax with curly braces is deprecated in php"

## Run with: ###
## find -name '*.php' -exec /PFAD/ZU/php73to74.sh "{}" 2> php73to74.log \;;
#################


file="$1";
dir=$(dirname "$1");

if [ ! -f "${phpcli}" ] || [ ! -x "${phpcli}" ]; then
	echo "phpcli ('${phpcli}') ist falsch. Exit!" 1>&2;
	exit 1;
fi

if [ -z "${file}" ]; then
	echo "Keine Datei angegeben. Exit!" 1>&2; 
	exit 2;

elif [ -f "${file}]" ]; then
	echo "'${file}' ist keine Datei. Exit!" 1>&2;
	exit 4;

elif [ ! -r "${file}" ]; then
	echo "'${file}' ist nicht lesbar. Exit!" 1>&2;
	exit 8;

elif [ ! -w "${file}" ]; then
	echo "Keine Schreibrechte an '${file}'. Exit!" 1>&2;
	exit 16;

elif [ ! -w "${dir}" ]; then
	echo "Keine Schreibrechte am Verzeichnis '${dir}'. Exit!" 1>&2;
	exit 16;
fi

echo "-------------------------------------------------" 1>&2;
echo "Für Syntaxprüfung benutztes PHP:" 1>&2;
echo "   Pfad: ${phpcli}" 1>&2;
echo -n "Version: " 1>&2;
${phpcli} -v | head -n1 1>&2;
echo "" 1>&2;

err=$(${phpcli} -l "${file}" 2>&1);
if [ 0 -ne $? ]; then
	echo "-------------------------------------------------" 1>&2;
	echo "Misserfolg: Die Umwandlung von '${file}' wurde verweigert."  1>&2;
	echo "-------------------------------------------------" 1>&2;
	echo "Grund: '${file}' enthält folgenden Fehler:"  1>&2;
	echo "${err}" 1>&2 ;
	echo "-------------------------------------------------" 1>&2;
	exit 32;
fi

tmpfile1=$(mktemp);
tmpfile2=$(mktemp);
backupfile="${file}-$(date +%Y%m%d_%H%M)";

sed -E -e 's/\$([a-zA-Z0-9_]+)\{([^\}]*)\}/\$\1[\2]/g' "${file}" > "${tmpfile1}";
${phpcli} -l "${tmpfile1}" 1>/dev/null 2>/dev/null;
if [ 0 -eq $? ]; then
	t=$(diff "${tmpfile1}" "${file}" | wc -l);
	if [ 0 -ne $t ]; then
		cp "${file}" "${backupfile}";
		cp "${tmpfile1}" "${file}";
		echo "-------------------------------------------------" 1>&2;
		echo "Erfolg: '${file}' wurde umgewandelt. Backup in '${backupfile}'." 1>&2;
		echo "-------------------------------------------------" 1>&2;
		echo "diff:" 1>&2;
		echo "-------------------------------------------------" 1>&2;
		diff "${backupfile}" "${file}" 1>&2;
		echo "-------------------------------------------------" 1>&2;
		rm -f "${tmpfile1}" "${tmpfile2}";
		exit 0;
	else 
		echo "Neutral: '${file}' Nichts zu tun."  1>&2;
		rm -f "${tmpfile1}" "${tmpfile2}";
		exit 0;
	fi	
else
	sed -E -e 's/\$([a-zA-Z0-9_]+)\{([^\}]*)\}/\$\1[\2]/g' "${tmpfile1}" > "${tmpfile2}";
	${phpcli} -l "${tmpfile2}" 1>/dev/null 2>/dev/null;
	if [ 0 -eq $? ]; then
		t=$(diff "${tmpfile2}" "${file}" | wc -l);
		if [ 0 -ne $t ]; then
			cp "${file}" "${backupfile}";
			cp "${tmpfile2}" "${file}";
			echo "-------------------------------------------------" 1>&2;
			echo "Erfolg: '${file}' wurde umgewandelt. Backup in '${backupfile}'."  1>&2;
			echo "-------------------------------------------------" 1>&2;
			echo "diff:"
			echo "-------------------------------------------------" 1>&2;
			diff "${backupfile}" "${file}" 1>&2;
			echo "-------------------------------------------------" 1>&2;
			rm -f "${tmpfile1}" "${tmpfile2}";
			exit 0;
		else
			echo "Merkwürdig: '${file}' Nichts umgewandelt'."  1>&2;
			rm -f "${tmpfile1}" "${tmpfile2}";
			exit 0;
		fi		
	fi
fi
echo "-------------------------------------------------" 1>&2;
echo "Misserfolg: '${file}' konnte nicht erfolgreich umgewandelt werden."  1>&2;
echo "-------------------------------------------------" 1>&2;
echo "Grund:";
err=$(${phpcli} -l "${tmpfile1}" 1>&2);
if [ 0 -ne $? ]; then
	echo "Erster Umwandlungsversuch führte zu folgendem Fehler:"  1>&2;
	echo "${err}" 1>&2;
	echo "-------------------------------------------------" 1>&2;

fi
err=$(${phpcli} -l "${tmpfile2}" 1>&2);
if [ 0 -ne $? ]; then
	echo "'Zweiter Umwandlungsversuch führte zu folgendem Fehler:"  1>&2;
	echo "${err}" 1>&2;
	echo "-------------------------------------------------" 1>&2;
fi
rm -f "${tmpfile1}" "${tmpfile2}";
exit 64;
