#! /bin/bash
# (c) Christian Boltz - http://www.cboltz.de
# Dieses Script unterliegt der GPL.

usage="Usage: `basename $0` Verzeichnis_alt Verzeichnis_neu Verzeichnis_fuer_diffs

Verzeichnis_alt: Ausgangsverzeichnis
Verzeichnis_neu: geändertes Verzeichnis
Verzeichnis_fuer_diffs: Verzeichnis, in dem geänderte Dateien abgelegt werden sollen
"

if test "x$#" != "x3"; then
    echo "$usage";
    exit 1;
fi

VERZALT="$1"
VERZNEU="$2"
VERZDIFFS="$3"

CP="cp"
MKDIR="mkdir -p"
# DEBUG="ON" # Diff-Zeile und CP/MKDIR-Befehle mit ausgeben, wenn einkommentiert
             # oder DEBUG=ON in der Shell gesetzt
             # z. B. Aufruf mit   DEBUG=ON diffdirs .....

if [ -n "$DEBUG" ]; then
    CP="echo -> "$CP ;
    MKDIR="echo -> "$MKDIR ;
fi;

# mögliche Ausgaben von diff:
# Only in /tmp/verz_a/: test
# Files /tmp/verz_a/test3 and /tmp/verz_b/test3 differ
# Only in /tmp/verz_a/verz_a1: muster

# falls $1 = "Files" -> Datei geändert -> $2 ins Changed-Verzeichnis
# falls $1 = "Only" und $3 = "VERZNEU" -> neue Datei -> $4 ins Changed-Verz.
# falls $1 = "Only" und $3 = "VERZALT" -> gelöschte Datei -> Hinweis ausgeben

################### VERZEICHNISINHALT VERGLEICHEN ################################################

LANG=en diff -r -q $VERZALT/ $VERZNEU/ |
   while read Zeile; do
      set -- $Zeile

if [ -n "$DEBUG" ]; then
     echo "$@"   # Ausgabe von diff anzeigen
fi;

      case "$1" in

################### DATEI GEÄNDERT ###############################################################

          Files)

              SUBDIR="${2%\/*}"

                if [ -n "${SUBDIR}" ]; then
                  SUBDIR=${SUBDIR}/ ;
                fi;

              SUBDIR=${SUBDIR#$VERZALT/}

              FILENAME="${2##*\/}"
              
              if [ ! -d ${VERZDIFFS}/${SUBDIR} ]; then # bei Bedarf Verzeichnis anlegen
                $MKDIR ${VERZDIFFS}/${SUBDIR} ;
              fi;

              $CP $4 $VERZDIFFS/$SUBDIR$FILENAME
              ;;

################### DATEI NUR IN EINEM VERZEICHNIS ###############################################

          Only)

################### DATEI NUR IN $VERZALT -> GELÖSCHT-> HINWEISTEXT #############################

              if [ ${3:0:${#VERZALT}} == $VERZALT ] ; then

                echo -n "*** Datei gelöscht: ";
                SUBDIR="${3:${#VERZALT}+1}";
                SUBDIR="${SUBDIR:0:${#SUBDIR}-1}"; ### verursacht parse error (syntax heighlighting) in vim ###

                test -n "${SUBDIR}" && \
                  echo -n "$SUBDIR/"; # evtl. Name des Unterverzeichnis sowie...
                echo  "$4"; # ... auf jeden Fall den Dateinamen ausgeben.

################### DATEI NUR IN $VERZNEU -> NACH $VERZDIFFS KOPIEREN ##########################

              elif [ ${3:0:${#VERZNEU}}==$VERZNEU ]; then
                SUBDIR=${3:${#VERZNEU}+1};
                SUBDIR=${SUBDIR:0:${#SUBDIR}-1}; ### verursacht parse error (syntax highlighting) in vim ###

                if [ -n "${SUBDIR}" ]; then
                  SUBDIR=${SUBDIR}/ ;
                fi;

                if [ ! -d ${VERZDIFFS}/${SUBDIR} ]; then # bei Bedarf Verzeichnis anlegen
                  $MKDIR ${VERZDIFFS}/${SUBDIR} ;
                fi;

                $CP -R $VERZNEU/${SUBDIR}${4} $VERZDIFFS/${SUBDIR}${4} ;
                # Only in ... kann auch Verzeichnisse liefern, deshalb -R

##### sonstiges (sollte nicht vorkommen)
              else
                echo "Unbekannte Diff-Ausgabe :-(   (if-Block)" >&2;
                echo "$@"
                exit 1;
              fi

              ;;

##### sonstiges (sollte nicht vorkommen)
          *)
              echo "Unbekannte Diff-Ausgabe :-(    (case-Block)" >&2;
              echo "$@"
              exit 1

              ;;
      esac;
   done;

exit 0;

