#!/bin/sh
# PCP QA Test No. 517
# Test logic for config file migration, harvesting, cleanup as
# part of a packaged install.
#
# Copyright (c) 2012 Ken McDonell.  All Rights Reserved.
#

seq=`basename $0`
echo "QA output created by $seq"

# get standard environment, filters and checks
. ./common.product
. ./common.filter
. ./common.check

status=1	# failure is the default!
$sudo rm -rf $tmp.* $seq.full
trap "rm -rf $tmp.*; exit \$status" 0 1 2 3 15

# ... copied directly from ../debian/cleanconfigs
#

# Function to do all of the configuration file migration work
#
_clean_configs()
{
    #
    # Usage: _clean_configs [-v] new_dir old_dir ...
    #
    # Across all the files in the new_dir and old_dir args, match
    # names and pick the most recently modified version and leave
    # this (same mode and modification date) in new_dir
    #
    # -v option is verbose mode for debugging
    #

    _verbose=false
    if [ $# -gt 0 -a X"$1" = "X-v" ]
    then
	_verbose=true
	shift
    fi

    if [ $# -lt 2 ]
    then
	echo >&2 "Usage: _clean_configs [-v] new_dir old_dir ..."
	return
    fi

    _new="$1"
    if [ ! -d "$_new" ]
    then
	$verbose && echo >&2 + mkdir -p "$_new"
	mkdir -p "$_new"
    fi

    shift
    for _dir
    do
	[ "$_dir" = "$_new" ] && continue
	if [ -d "$_dir" ]
	then
	    ( cd "$_dir" ; find . -type f -print ) \
	    | sed -e 's/^\.\///' \
	    | while read _file
	    do
		_want=false
		if [ -f "$_new/$_file" ]
		then
		    # file exists in both directories, pick the more
		    # recently modified one
		    #
		    _try=`find "$_dir/$_file" -newer "$_new/$_file" -print`
		    [ -n "$_try" ] && _want=true
		else
		    _want=true
		fi
		if $_want
		then
		    _dest=`dirname $_new/$_file`
		    if [ ! -d "$_dest" ]
		    then
			$verbose && >&2 echo + mkdir "$_dest"
			mkdir "$_dest"
		    fi
		    $_verbose && echo >&2 + cp -p "$_dir/$_file" "$_new/$_file"
		    cp -p "$_dir/$_file" "$_new/$_file"
		fi
	    done
	fi
    done
}


_filter()
{
    sed \
	-e "s;$tmp;/TMP;g" \
    | LC_COLLATE=POSIX sort
}

_show()
{
    cd $1
    find * -type f \
    | while read x
    do
	$PCP_ECHO_PROG $PCP_ECHO_N "$x: ""$PCP_ECHO_C"
	cat $x
    done
    cd $here
}

# real QA test starts here
echo "Usage cases ..."
_clean_configs
_clean_configs "one_arg"
_clean_configs -v "-v+one_arg"

echo; echo "No dirs exist"
_clean_configs -v $tmp.new old1 old2 2>&1 | _filter

echo; echo "Empty new dir, harvest all, no name matches"
mkdir $tmp.old1
mkdir $tmp.old2
echo foo >$tmp.old1/foo
echo bar >$tmp.old1/bar
echo mumble >$tmp.old2/mumble
echo fumble >$tmp.old2/fumble
echo stumble >$tmp.old2/stumble
_clean_configs -v $tmp.new $tmp.old1 $tmp.old2 2>&1 | _filter
_show $tmp.new

yesterday=`pmdate -1d %Y%m%d%H%M`
echo; echo "All names match, some older files"
touch -t $yesterday $tmp.new/mumble
echo "newer mumble" >$tmp.old2/mumble
touch -t $yesterday $tmp.old1/bar
echo "newer bar" >$tmp.new/bar
_clean_configs -v $tmp.new $tmp.old1 $tmp.old2 2>&1 | _filter
_show $tmp.new

echo; echo "Hybid cases"
echo "older bar" >$tmp.old2/bar
touch -t $yesterday $tmp.old2/bar
rm $tmp.new/foo
echo "older foo" >$tmp.old1/foo
touch -t $yesterday $tmp.old1/foo
echo foo >$tmp.old2/foo
rm $tmp.new/fumble
_clean_configs -v $tmp.new $tmp.old1 $tmp.old2 2>&1 | _filter
_show $tmp.new

status=0
exit
