#!/bin/bash
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

# Author Brandon Low <lostlogic@gentoo.org>
# Mike Frysinger <vapier@gentoo.org>
#
# Previous version (from which I've borrowed a few bits) by:
# Jochem Kossen <j.kossen@home.nl>
# Leo Lipelis <aeoo@gentoo.org>
# Karl Trygve Kalleberg <karltk@gentoo.org>

cd /

type -P gsed >/dev/null && sed() { gsed "$@"; }

get_config() {
	# the sed here does:
	#  - strip off comments
	#  - match lines that set item in question
	#    - delete the "item =" part
	#    - store the actual value into the hold space
	#  - on the last line, restore the hold space and print it
	# If there's more than one of the same configuration item, then
	# the store to the hold space clobbers previous value so the last
	# setting takes precedence.
	local match=$1
	eval $(sed -n -r \
		-e 's:[[:space:]]*#.*$::' \
		-e "/^[[:space:]]*${match}[[:space:]]*=/{s:^([^=]*)=[[:space:]]*([\"']{0,1})(.*)\2:\1=\2\3\2:;H}" \
		-e '${g;p}' \
		"${PORTAGE_CONFIGROOT}"etc/etc-update.conf)
}

OS_RELEASE_ID=$(cat /etc/os-release 2>/dev/null | grep '^ID=' | cut -d'=' -f2 | sed -e 's/"//g')

case $OS_RELEASE_ID in
	suse|opensuse|opensuse-leap|opensuse-tumbleweed) OS_FAMILY='rpm' ;;
	fedora|rhel) OS_FAMILY='rpm' ;;
	arch|archarm|arch32|manjaro|antergos) OS_FAMILY='arch' NEW_EXT='pacnew';;
	*) OS_FAMILY='gentoo' ;;
esac

if [[ $OS_FAMILY == 'gentoo' ]]; then
	get_basename() {
		printf -- '%s\n' "${1:10}"
	}
	get_basename_find_opt() {
		echo "._cfg????_${1}"
	}
	get_scan_regexp() {
		echo "s:\(^.*/\)\(\._cfg[0-9]*_\)\(.*$\):\1\2\3$b\1$b\2$b\3:"
	}
	get_live_file() {
		echo "${rpath}/${rfile:10}"
	}
elif [[ $OS_FAMILY == 'arch' ]]; then
	get_basename() {
		printf -- '%s\n' "${1%.${NEW_EXT}}"
	}
	get_basename_find_opt() {
		printf -- '%s\n' "${1}.${NEW_EXT}"
	}
	get_scan_regexp() {
		echo "s:\(^.*/\)\(.*\)\(\.${NEW_EXT}\):\1\2\3$b\1$b\3$b\2:"
	}
	get_live_file() {
		printf -- '%s\n' "${cfg_file%.${NEW_EXT}}"
	}
# In rpm we have rpmsave, rpmorig, and rpmnew.
elif [[ $OS_FAMILY == 'rpm' ]]; then
	get_basename() {
		printf -- '%s\n' "${1}" |sed -e 's/\.rpmsave$//' -e 's/\.rpmnew$//' -e 's/\.rpmorig$//'
	}
	get_basename_find_opt() {
		printf -- '%s\n' "${1}.rpm???*"
	}
	get_scan_regexp() {
		echo "s:\(^.*/\)\(.*\)\(\.\(rpmnew|rpmsave|rpmorig\)\):\1\2\3$b\1$b\3$b\2:"
	}
	get_live_file() {
		printf -- '%s\n' "${cfg_file}" |sed -e 's/\.rpmsave$//' -e 's/\.rpmnew$//' -e 's/\.rpmorig$//'
	}
fi

cmd_var_is_valid() {
	# return true if the first whitespace-separated token contained
	# in "${1}" is an executable file, false otherwise
	[[ -x $(type -P ${1%%[[:space:]]*}) ]]
}

diff_command() {
	local cmd=${diff_command//%file1/$1}
	${cmd//%file2/$2}
}

# Usage: do_mv_ln [options] <src> <dst>
# Files have to be the last two args, and has to be
# files so we can handle symlinked target sanely.
do_mv_ln() {
	local opts=( ${@:1:$(( $# - 2 ))} )
	local src=${@:$(( $# - 1 )):1}
	local dst=${@:$(( $# - 0 )):1}

	if [[ ! -L ${src} && -L ${dst} ]] ; then #330221
		local lfile=$(readlink "${dst}")
		[[ ${lfile} == /* ]] || lfile="${dst%/*}/${lfile}"
		echo " Target is a symlink; replacing ${lfile}"
		dst=${lfile}
	elif [[ -d ${dst} && ! -L ${dst} ]] ; then
		# If ${dst} is a directory, do not move the file
		# inside of it if this fails.
		rmdir "${dst}" || return
	fi

	mv "${opts[@]}" "${src}" "${dst}"
}

scan() {
	${QUIET} || echo "Scanning Configuration files..."
	rm -rf "${TMP}"/files > /dev/null 2>&1
	mkdir "${TMP}"/files || die "Failed mkdir command!"
	count=0
	input=0
	local find_opts
	local path

	for path in ${SCAN_PATHS} ; do
		path="${EROOT%/}${path}"

		if [[ ! -d ${path} ]] ; then
			# Protect files that don't exist (bug #523684). If the
			# parent directory doesn't exist, we can safely skip it.
			path=${path%/}
			[[ -d ${path%/*} ]] || continue
			local name_opt=$(get_basename_find_opt "${path##*/}")
			path="${path%/*}"
			find_opts=( -maxdepth 1 )
		else
			# Do not traverse hidden directories such as .svn or .git.
			local name_opt=$(get_basename_find_opt '*')
			find_opts=( -name '.*' -type d -prune -o )
		fi
		${case_insensitive} && \
			find_opts+=( -iname ) || find_opts+=( -name )
		find_opts+=( "$name_opt" )
		find_opts+=( ! -name '.*~' ! -iname '.*.bak' -print )

		if [[ ! -w ${path} ]] ; then
			[[ -e ${path} ]] || continue
			die "Need write access to ${path}"
		fi

		local file ofile b=$'\001'
		local scan_regexp=$(get_scan_regexp)
		for file in $(find "${path}"/ "${find_opts[@]}" |
		              sed \
						-e 's://*:/:g' \
						-e "${scan_regexp}" |
		              sort -t"$b" -k2,2 -k4,4 -k3,3 |
		              LC_ALL=C cut -f1 -d"$b")
		do
			local rpath rfile cfg_file live_file
			rpath=${file%/*}
			rfile=${file##*/}
			cfg_file="${rpath}/${rfile}"
			live_file=$(get_live_file)

			local mpath
			for mpath in ${CONFIG_PROTECT_MASK}; do
				mpath="${EROOT%/}${mpath}"
				if [[ "${rpath}" == "${mpath}"* ]] ; then
					${QUIET} || echo "Updating masked file: ${live_file}"
					mv "${cfg_file}" "${live_file}"
					continue 2
				fi
			done
			if [[ -L ${file} ]] ; then
				if [[ -L ${live_file} && \
					$(readlink "${live_file}") == $(readlink "${file}") ]]
				then
					rm -f "${file}"
					continue
				fi
				if [[ $(get_basename "${ofile}") != $(get_basename "${rfile}") ]] ||
				   [[ ${opath} != ${rpath} ]]
				then
					: $(( ++count ))
					echo "${live_file}" > "${TMP}"/files/${count}
				fi
				echo "${cfg_file}" >> "${TMP}"/files/${count}
				ofile="${rfile}"
				opath="${rpath}"
				continue
			fi
			if [[ ! -f ${file} ]] ; then
				${QUIET} || echo "Skipping non-file ${file} ..."
				continue
			fi

			if [[ $(get_basename "${ofile}") != $(get_basename "${rfile}") ]] ||
			   [[ ${opath} != ${rpath} ]]
			then
				MATCHES=0
				if ! [[ -f ${cfg_file} && -f ${live_file} ]] ; then
					MATCHES=0
				elif [[ ${eu_automerge} == "yes" ]] ; then
					if [[ ! -e ${cfg_file} || ! -e ${live_file} ]] ; then
						MATCHES=0
					else
						diff -Bbua "${cfg_file}" "${live_file}" | \
							sed -n -r \
								-e '/^[+-]/{/^([+-][\t ]*(#|$)|-{3} |\+{3} )/d;q1}'
						: $(( MATCHES = ($? == 0) ))
					fi

				else
					diff -Nbua "${cfg_file}" "${live_file}" |
						sed -n \
							-e '/# .Header:/d' \
							-e '/^[+-][^+-]/q1'
					: $(( MATCHES = ($? == 0) ))
				fi

				if [[ ${MATCHES} == 1 ]] ; then
					${QUIET} || echo "Automerging trivial changes in: ${live_file}"
					do_mv_ln "${cfg_file}" "${live_file}"
					continue
				else
					: $(( ++count ))
					echo "${live_file}" > "${TMP}"/files/${count}
					echo "${cfg_file}" >> "${TMP}"/files/${count}
					ofile="${rfile}"
					opath="${rpath}"
					continue
				fi
			fi

			if ! diff -Nbua "${cfg_file}" "${rpath}/${ofile}" |
				sed -n \
					-e '/# .Header:/d' \
					-e '/^[+-][^+-]/q1'
			then
				echo "${cfg_file}" >> "${TMP}"/files/${count}
				ofile="${rfile}"
				opath="${rpath}"
			else
				mv "${cfg_file}" "${rpath}/${ofile}"
				continue
			fi
		done
	done
}

parse_automode_flag() {
	case $1 in
	-9)
		local reply
		read -p "Are you sure that you want to delete all updates (type YES): " reply
		if [[ ${reply} != "YES" ]] ; then
			echo "Did not get a 'YES', so ignoring request"
			return 1
		else
			parse_automode_flag -7
			export rm_opts=""
		fi
		;;
	-7)
		input=0
		export DELETE_ALL="yes"
		;;
	-5)
		parse_automode_flag -3
		export mv_opts=" ${mv_opts} "
		mv_opts="${mv_opts// -i / }"
		NONINTERACTIVE_MV=true
		;;
	-3)
		input=0
		export OVERWRITE_ALL="yes"
		;;
	*)
		return 1
		;;
	esac
	return 0
}

sel_file() {
	local -i isfirst=0
	until [[ -f ${TMP}/files/${input} ]] || \
	      [[ ${input} == -1 ]] || \
	      [[ ${input} == -3 ]]
	do
		local allfiles=( $(cd "${TMP}"/files/ && printf '%s\n' * | sort -n) )
		local isfirst=${allfiles[0]}

		# Optimize: no point in building the whole file list if
		# we're not actually going to talk to the user.
		if [[ ${OVERWRITE_ALL} == "yes" || ${DELETE_ALL} == "yes" ]] ; then
			input=0
		else
			local numfiles=${#allfiles[@]}
			local numwidth=${#numfiles}
			local file fullfile line
			for file in "${allfiles[@]}" ; do
				fullfile="${TMP}/files/${file}"
				line=$(head -n1 "${fullfile}")
				printf '%*i%s %s' ${numwidth} ${file} "${PAR}" "${line}"
				if [[ ${mode} == 0 ]] ; then
					local numupdates=$(( $(wc -l <"${fullfile}") - 1 ))
					echo " (${numupdates})"
				else
					echo
				fi
			done > "${TMP}"/menuitems

			clear

			if [[ ${mode} == 0 ]] ; then
				cat <<-EOF
					The following is the list of files which need updating, each
					configuration file is followed by a list of possible replacement files.
					$(<"${TMP}"/menuitems)
					Please select a file to edit by entering the corresponding number.
					              (don't use -3, -5, -7 or -9 if you're unsure what to do)
					              (-1 to exit) (${_3_HELP_TEXT})
					                           (${_5_HELP_TEXT})
					                           (${_7_HELP_TEXT})
				EOF
				printf "                           (${_9_HELP_TEXT}): "
				input=$(read_int)
			else
				dialog \
					--title "${title}" \
					--menu "Please select a file to update"	\
					0 0 0 $(<"${TMP}"/menuitems) \
					2> "${TMP}"/input \
					|| die "$(<"${TMP}"/input)\n\nUser termination!" 0
				input=$(<"${TMP}"/input)
			fi
			: ${input:=0}

			if [[ ${input} != 0 ]] ; then
				parse_automode_flag ${input} || continue
			fi
		fi # -3 automerge
		if [[ ${input} == 0 ]] ; then
			input=${isfirst}
		fi
	done
}

user_special() {
	local special="${PORTAGE_CONFIGROOT}etc/etc-update.special"

	if [[ -r ${special} ]] ; then
		if [[ -z $1 ]] ; then
			error "user_special() called without arguments"
			return 1
		fi
		local pat
		while read -r pat ; do
			echo "$1" | grep -q "${pat}" && return 0
		done < "${special}"
	fi
	return 1
}

read_int() {
	# Read an integer from stdin.  Continously loops until a valid integer is
	# read.  This is a workaround for odd behavior of bash when an attempt is
	# made to store a value such as "1y" into an integer-only variable.
	local my_input
	while : ; do
		read my_input
		# failed integer conversions will break a loop unless they're enclosed
		# in a subshell.
		echo "${my_input}" | (declare -i x; read x) 2>/dev/null && break
		printf 'Value "%s" is not valid. Please enter an integer value: ' "${my_input}" >&2
	done
	echo ${my_input}
}

do_file() {
	interactive_echo() { [[ ${OVERWRITE_ALL} != yes ]] && [[ ${DELETE_ALL} != yes ]] && echo; }
	interactive_echo
	local -i my_input
	local -i linecnt
	local fullfile="${TMP}/files/${input}"
	local ofile=$(head -n1 "${fullfile}")

	# Walk through all the pending updates for this one file.
	linecnt=$(wc -l <"${fullfile}")
	while (( linecnt > 1 )) ; do
		if (( linecnt == 2 )) ; then
			# Only one update ... keeps things simple.
			my_input=1
		else
			my_input=0
		fi

		# Optimize: no point in scanning the file list when we know
		# we're just going to consume all the ones available.
		if [[ ${OVERWRITE_ALL} == "yes" || ${DELETE_ALL} == "yes" ]] ; then
			my_input=1
		fi

		# Figure out which file they wish to operate on.
		while (( my_input <= 0 || my_input >= linecnt )) ; do
			local fcount=0
			for line in $(<"${fullfile}"); do
				if (( fcount > 0 )); then
					printf '%i%s %s\n' ${fcount} "${PAR}" "${line}"
				fi
				: $(( ++fcount ))
			done > "${TMP}"/menuitems

			if [[ ${mode} == 0 ]] ; then
				echo "Below are the new config files for ${ofile}:"
				cat "${TMP}"/menuitems
				echo -n "Please select a file to process (-1 to exit this file): "
				my_input=$(read_int)
			else
				dialog \
					--title "${title}" \
					--menu "Please select a file to process for ${ofile}" \
					0 0 0 $(<"${TMP}"/menuitems) \
					2> "${TMP}"/input \
					|| die "$(<"${TMP}"/input)\n\nUser termination!" 0
				my_input=$(<"${TMP}"/input)
			fi

			if [[ ${my_input} == 0 ]] ; then
				# Auto select the first file.
				my_input=1
			elif [[ ${my_input} == -1 ]] ; then
				input=0
				return
			fi
		done

		# First line is the old file while the rest are the config files.
		: $(( ++my_input ))
		local file=$(sed -n -e "${my_input}p" "${fullfile}")
		do_cfg "${file}" "${ofile}"

		sed -i -e "${my_input}d" "${fullfile}"

		: $(( --linecnt ))
	done

	interactive_echo
	rm "${fullfile}"
	: $(( --count ))
}

show_diff() {
	clear
	local file1=$1 file2=$2 files=("$1" "$2") \
		diff_files=() file i tmpdir

	if [[ -L ${file1} && ! -L ${file2} &&
		-f ${file1} && -f ${file2} ]] ; then
		# If a regular file replaces a symlink to a regular file, then
		# show the diff between the regular files (bug #330221).
		diff_files=("${file1}" "${file2}")
	else
		for i in 0 1 ; do
			if [[ ! -L ${files[$i]} && -f ${files[$i]} ]] ; then
				diff_files[$i]=${files[$i]}
				continue
			fi
			[[ -n ${tmpdir} ]] || \
				tmpdir=$(mktemp -d "${TMP}/symdiff-XXX")
			diff_files[$i]=${tmpdir}/${i}
			if [[ ! -L ${files[$i]} && ! -e ${files[$i]} ]] ; then
				echo "/dev/null" > "${diff_files[$i]}"
			elif [[ -L ${files[$i]} ]] ; then
				echo "SYM: ${file1} -> $(readlink "${files[$i]}")" > \
					"${diff_files[$i]}"
			elif [[ -d ${files[$i]} ]] ; then
				echo "DIR: ${file1}" > "${diff_files[$i]}"
			elif [[ -p ${files[$i]} ]] ; then
				echo "FIF: ${file1}" > "${diff_files[$i]}"
			else
				echo "DEV: ${file1}" > "${diff_files[$i]}"
			fi
		done
	fi

	if [[ ${using_editor} == 0 ]] ; then
		(
			echo "Showing differences between ${file1} and ${file2}"
			diff_command "${diff_files[0]}" "${diff_files[1]}"
		) | ${pager}
	else
		echo "Beginning of differences between ${file1} and ${file2}"
		diff_command "${diff_files[0]}" "${diff_files[1]}"
		echo "End of differences between ${file1} and ${file2}"
	fi

	[[ -n ${tmpdir} ]] && rm -rf "${tmpdir}"
}

do_cfg() {
	local file=$1
	local ofile=$2
	local -i my_input=0

	until (( my_input == -1 )) || [[ ! -f ${file} && ! -L ${file} ]] ; do
		if [[ "${OVERWRITE_ALL}" == "yes" ]] && ! user_special "${ofile}"; then
			my_input=1
		elif [[ "${DELETE_ALL}" == "yes" ]] && ! user_special "${ofile}"; then
			my_input=2
		else
			show_diff "${ofile}" "${file}"
			if [[ -L ${file} && ! -L ${ofile} ]] ; then
				cat <<-EOF

					-------------------------------------------------------------
					NOTE: File is a symlink to another file. REPLACE recommended.
					      The original file may simply have moved. Please review.
					-------------------------------------------------------------

				EOF
			fi
			cat <<-EOF

				File: ${file}
				1) Replace original with update
				2) Delete update, keeping original as is
				3) Interactively merge original with update
				4) Show differences again
				5) Save update as example config
			EOF
			printf 'Please select from the menu above (-1 to ignore this update): '
			my_input=$(read_int)
		fi

		case ${my_input} in
			1)	echo "Replacing ${ofile} with ${file}"
				do_mv_ln ${mv_opts} "${file}" "${ofile}"
				[[ -n ${OVERWRITE_ALL} ]] && my_input=-1
				continue
				;;
			2)	echo "Deleting ${file}"
				rm ${rm_opts} "${file}"
				[[ -n ${DELETE_ALL} ]] && my_input=-1
				continue
				;;
			3)	do_merge "${file}" "${ofile}"
				my_input=${?}
#				[[ ${my_input} == 255 ]] && my_input=-1
				continue
				;;
			4)	continue
				;;
			5)	do_distconf "${file}" "${ofile}"
				;;
			*)	continue
				;;
		esac
	done
}

do_merge() {
	# make sure we keep the merged file in the secure tempdir
	# so we dont leak any information contained in said file
	# (think of case where the file has 0600 perms; during the
	# merging process, the temp file gets umask perms!)

	local file="${1}"
	local ofile="${2}"
	local mfile="${TMP}/${2#/}.merged"
	local -i my_input=0

	if [[ -L ${file} && -L ${ofile} ]] ; then
		echo "Both files are symlinks, so they will not be merged."
		return 0
	elif [[ ! -f ${file} ]] ; then
		echo "Non-regular file cannot be merged: ${file}"
		return 0
	elif [[ ! -f ${ofile} ]] ; then
		echo "Non-regular file cannot be merged: ${ofile}"
		return 0
	fi


	echo "${file} ${ofile} ${mfile}"

	if [[ -e ${mfile} ]] ; then
		echo "A previous version of the merged file exists, cleaning..."
		rm ${rm_opts} "${mfile}"
	fi

	# since mfile will be like $TMP/path/to/original-file.merged, we
	# need to make sure the full /path/to/ exists ahead of time
	mkdir -p "${mfile%/*}"

	until (( my_input == -1 )); do
		echo "Merging ${file} and ${ofile}"
		$(echo "${merge_command}" |
		 sed -e "s:%merged:${mfile}:g" \
		 	 -e "s:%orig:${ofile}:g" \
			 -e "s:%new:${file}:g")
		until (( my_input == -1 )); do
			cat <<-EOF
				1) Replace ${ofile} with merged file
				2) Show differences between merged file and original
				3) Remerge original with update
				4) Edit merged file
				5) Return to the previous menu
			EOF
			printf 'Please select from the menu above (-1 to exit, losing this merge): '
			my_input=$(read_int)
			case ${my_input} in
				1)	echo "Replacing ${ofile} with ${mfile}"
					if [[ ${USERLAND} == BSD ]] ; then
						chown "$(stat -f %Su:%Sg "${ofile}")" "${mfile}"
						chmod $(stat -f %Mp%Lp "${ofile}") "${mfile}"
					else
						chown --reference="${ofile}" "${mfile}"
						chmod --reference="${ofile}" "${mfile}"
					fi
					do_mv_ln ${mv_opts} "${mfile}" "${ofile}"
					rm ${rm_opts} "${file}"
					return 255
					;;
				2)	show_diff "${ofile}" "${mfile}"
					continue
					;;
				3)	break
					;;
				4)	${EDITOR:-nano -w} "${mfile}"
					continue
					;;
				5)	rm ${rm_opts} "${mfile}"
					return 0
					;;
				*)	continue
					;;
			esac
		done
	done
	rm ${rm_opts} "${mfile}"
	return 255
}

do_distconf() {
	# search for any previously saved distribution config
	# files and number the current one accordingly

	local file=$1 ofile=$2
	local -i count
	local suffix
	local efile

	for (( count = 0; count <= 9999; ++count )) ; do
		suffix=$(printf ".dist_%04i" ${count})
		efile="${ofile}${suffix}"
		if [[ ! -f ${efile} && ! -L ${efile} ]] ; then
			mv ${mv_opts} "${file}" "${efile}"
			break
		elif [[ -L ${efile} && -L ${file} ]] ; then
			if [[ $(readlink "${efile}") == $(readlink "${file}") ]] ; then
				# replace identical copy
				mv "${file}" "${efile}"
				break
			fi
		elif [[ -L ${efile} || -L ${file} ]] ; then
			# not the same file types
			continue
		else
			local ret=
			if [[ ${using_editor} == 0 ]] ; then
				diff_command "${file}" "${efile}" &> /dev/null
				ret=$?
			else
				# fall back to plain diff
				diff -q "${file}" "${efile}" &> /dev/null
				ret=$?
			fi
			if [[ ${ret} == 0 ]] ; then
				# replace identical copy
				mv "${file}" "${efile}"
				break
			fi
		fi
	done
}

error() { echo "etc-update: ERROR: $*" 1>&2 ; return 1 ; }
die() {
	trap SIGTERM
	trap SIGINT
	local msg=$1 exitcode=${2:-1}

	if [[ ${exitcode} -eq 0 ]] ; then
		${QUIET} || printf 'Exiting: %b\n' "${msg}"
		scan > /dev/null
		! ${QUIET} && [[ ${count} -gt 0 ]] && echo "NOTE: ${count} updates remaining"
	else
		error "${msg}"
	fi

	rm -rf "${TMP}"
	exit ${exitcode}
}

_3_HELP_TEXT="-3 to auto merge all files"
_5_HELP_TEXT="-5 to auto-merge AND not use 'mv -i'"
_7_HELP_TEXT="-7 to discard all updates"
_9_HELP_TEXT="-9 to discard all updates AND not use 'rm -i'"
usage() {
	cat <<-EOF
	etc-update: Handle configuration file updates

	Usage: etc-update [options] [paths to scan]

	If no paths are specified, then \${CONFIG_PROTECT} will be used.

	Options:
	  -d, --debug    Enable shell debugging
	  -h, --help     Show help and run away
	  -p, --preen    Automerge trivial changes only and quit
	  -q, --quiet    Show only essential output
	  -v, --verbose  Show settings and such along the way
	  -V, --version  Show version and trundle away

	  --automode <mode>
	             ${_3_HELP_TEXT}
	             ${_5_HELP_TEXT}
	             ${_7_HELP_TEXT}
	             ${_9_HELP_TEXT}
	EOF

	[[ $# -gt 1 ]] && printf "\nError: %s\n" "${*:2}" 1>&2

	exit ${1:-0}
}

#
# Run the script
#

declare -i count=0
declare input=0
declare title="Gentoo's etc-update tool!"

PREEN=false
SET_X=false
QUIET=false
VERBOSE=false
NONINTERACTIVE_MV=false
while [[ -n $1 ]] ; do
	case $1 in
		-d|--debug)   SET_X=true;;
		-h|--help)    usage;;
		-p|--preen)   PREEN=true;;
		-q|--quiet)   QUIET=true;;
		-v|--verbose) VERBOSE=true;;
		-V|--version) emerge --version; exit 0;;
		--automode)   parse_automode_flag $2 && shift || usage 1 "Invalid mode '$2'";;
		-*)           usage 1 "Invalid option '$1'";;
		*)            break;;
	esac
	shift
done
${SET_X} && set -x

if [[ $OS_FAMILY == 'rpm' ]]; then
	PORTAGE_CONFIGROOT='/'
	PORTAGE_TMPDIR='/tmp'
	CONFIG_PROTECT='/etc /usr/share'
	CONFIG_PROTECT_MASK=''
	[[ -f /etc/sysconfig/etc-update ]] && . /etc/sysconfig/etc-update
elif [[ $OS_FAMILY == 'arch' ]]; then
	PORTAGE_CONFIGROOT='/'
	PORTAGE_TMPDIR='/tmp'
	CONFIG_PROTECT='/etc /usr/lib /usr/share/config'
	CONFIG_PROTECT_MASK=''
fi

portage_vars=(
	CONFIG_PROTECT{,_MASK}
	FEATURES
	PORTAGE_CONFIGROOT
	PORTAGE_INST_{G,U}ID
	PORTAGE_TMPDIR
	EROOT
	USERLAND
	NOCOLOR
)

if type -P portageq > /dev/null; then
	eval $(${PORTAGE_PYTHON:+"${PORTAGE_PYTHON}"} "$(type -P portageq)" envvar -v "${portage_vars[@]}")
else
	[[ $OS_FAMILY == 'gentoo' ]] && die "missing portageq"
fi

export PORTAGE_TMPDIR
SCAN_PATHS=${*:-${CONFIG_PROTECT}}
[[ " ${FEATURES} " == *" case-insensitive-fs "* ]] && \
	case_insensitive=true || case_insensitive=false

TMP="${PORTAGE_TMPDIR}/etc-update-$$"
trap "die terminated" SIGTERM
trap "die interrupted" SIGINT

rm -rf "${TMP}" 2>/dev/null
mkdir "${TMP}" || die "failed to create temp dir"
# make sure we have a secure directory to work in
chmod 0700 "${TMP}" || die "failed to set perms on temp dir"
chown ${PORTAGE_INST_UID:-0}:${PORTAGE_INST_GID:-0} "${TMP}" || \
	die "failed to set ownership on temp dir"

# Get all the user settings from etc-update.conf
cfg_vars=(
	clear_term
	eu_automerge
	rm_opts
	mv_opts
	pager
	diff_command
	using_editor
	merge_command
	mode
)
# default them all to ""
eval "${cfg_vars[@]/%/=}"
# then extract them all from the conf in one shot
# (ugly var at end is due to printf appending a '|' to last item)
get_config "($(printf '%s|' "${cfg_vars[@]}")NOVARFOROLDMEN)"

# finally setup any specific defaults
: ${mode:="0"}
if ! cmd_var_is_valid "${pager}" ; then
	pager=${PAGER}
	cmd_var_is_valid "${pager}" || pager=cat
fi

[[ ${clear_term} == "yes" ]] || clear() { :; }

if [[ ${using_editor} == "0" ]] ; then
	# Sanity check to make sure diff exists and works
	echo > "${TMP}"/.diff-test-1
	echo > "${TMP}"/.diff-test-2

	if ! diff_command "${TMP}"/.diff-test-1 "${TMP}"/.diff-test-2 ; then
		die "'${diff_command}' does not seem to work, aborting"
	fi
else
	# NOTE: cmd_var_is_valid doesn't work with diff_command="eval emacs..."
	# because it uses type -P.
	if ! type ${diff_command%%[[:space:]]*} >/dev/null; then
		die "'${diff_command}' does not seem to work, aborting"
	fi
fi

if [[ ${mode} == "0" ]] ; then
	PAR=")"
else
	PAR=""
	if ! type dialog >/dev/null || ! dialog --help >/dev/null ; then
		die "mode=1 and 'dialog' not found or not executable, aborting"
	fi
fi

if ${NONINTERACTIVE_MV} ; then
	export mv_opts=" ${mv_opts} "
	mv_opts="${mv_opts// -i / }"
fi

if ${VERBOSE} ; then
	for v in "${portage_vars[@]}" "${cfg_vars[@]}" TMP SCAN_PATHS ; do
		echo "${v}=${!v}"
	done
fi

scan

${PREEN} && exit 0

until (( input == -1 )); do
	if (( count == 0 )); then
		die "Nothing left to do; exiting. :)" 0
	fi
	sel_file
	if (( input != -1 )); then
		do_file
	fi
done

die "User termination!" 0
