#! /bin/bash
# Script to apply patches from qt-copy/patches/.
# See README.qt-copy for details.
#
# Lubos Lunak <l.lunak@kde.org>
# Oswald Buddenhagen <ossi@kde.org>
#

if ! test -d patches; then
    echo "No patches directory found."
    exit 1
fi

reverse=
clever=false
verbose=true
silent=
for i
do
    case $i in
        -r|-R|--reverse) reverse=--reverse;;
        -c|--clever) clever=true;;
        -s|--silent|-q|--quiet) verbose=false; silent=--silent;;
        *) echo "Unknown option '$1'." >&2; exit 1;;
    esac
done

b=../.qt-copy
tdir=$b.temp

if $clever; then
    if test -z "$reverse"; then
        pdir=$b.patched
        odir=$b.cvs
        test -d "$odir" && { echo "Patches were already applied."; exit 2; }
    else
        pdir=$b.cvs
        odir=$b.patched
        test -d "$odir" && { echo "Patches were not applied yet."; exit 2; }
    fi
fi

if $clever; then
  $verbose && echo -n "Creating temporary copy ... "
  cp -al . $tdir || exit
  $verbose && echo "done."
fi

patches=`cd patches/ >/dev/null && ls [0-9]*-* $reverse`
applied=
skipped=
for file in $patches; do
    # skip files that aren't *.diff or *.patch
    test "${file%.patch}" = "$file" -a "${file%.diff}" = "$file" && continue
    # apply only those having 'applied: no' in the header
    head -n 5 patches/$file | grep -iq '^[\t ]*applied[\t ]*:[\t ]*no[\t ]*$' || continue
    if grep -q "^[\\t ]*${file%%-*}[\\t ]*\$" patches/DISABLED; then
        skipped="$skipped $file\n"
        continue; # disabled
    fi
    if true; then # for debugging
        $verbose && echo -e "\nApplying: $file"
        if ! patch -b -z .touched $silent $reverse -p0 < patches/$file; then
            echo -e "\n\nPatch $file failed!"
            exit 1
        fi
    fi
    applied="$applied $file\n"
done

$verbose && echo -e "\n\n\nDone.\n\nApplied patches:\n$applied\nSkipped patches:\n$skipped"

if $clever; then
    $verbose && echo -n "Creating backup ... "
    for j in $(find -name \*.touched); do
        mkdir -p "$odir/${j%/*}" || exit
        mv "$tdir/${j%.touched}" "$odir/${j%.touched}" || exit
        rm "$j"
    done
    $verbose && echo -ne "done.\nDeleting temporary directory ... "
    rm -rf $tdir
    $verbose && echo -ne "done.\nRestoring previous backup ... "
    for j in $(find $pdir -type f 2> /dev/null); do
        cmp -s "$j" "${j#"$pdir/"}" && { mv "$j" "${j#"$pdir/"}" || exit; }
    done
    $verbose && echo -ne "done.\nDeleting previous backup ... "
    rm -rf $pdir
    $verbose && echo "done."
fi

exit 0
