#!/bin/bash 

# Funktion fuer Fehlermeldung 
fehler()
{
  echo 
  echo Fehler: bitte per Parameter die zu 'diffenden' Dateinamen 
  echo angeben. Wichtig ist es die Dateinamen sortiert zu uebergeben. 
  echo Die Sortierung soll so gewählt sein, das sich zwischen zwei 
  echo Dateien möglichst keine Differenzen befinden. 
  echo
  echo "  ${0}" '$( ls -t * )  # nach Änderungszeit sortiert' 
  echo "  ${0}" '$( ls    * )  # nach Name sortiert' 
  echo 
  echo "                  Oder beispielsweise mit Endung auf YYYY-MM-DD_hh:mm:ss"
  echo 
  echo "  ${0}" '$( ls    *csv_202[0-1]-[0-1][0-9]-[0-3][0-9]_[0-6][0-9]:[0-9][0-9]:[0-9][0-9] )'
  echo 
  echo "                  Oder als sehr einfaches Bsp. fuer Nov. 2021"
  echo 
  echo "  ${0}" '$( ls    WHO-COVID-19-global-data.csv_2021-11-* )'
  echo 
}


# Flags einer urspruenglichen Datei ermitteln und Befehle zur 
# Restauration der Flags generieren
flagrestore_infos()
{
  formatstr=""
  formatstr+="# \n"
  formatstr+="# Dateiname: %n \n"
  formatstr+="# Zugriffsrechte %A setzen \n"
  formatstr+="  chmod %a %n \n"
  formatstr+="# ctime war: %w \n"
  formatstr+="# atime auf    %x  setzen \n"
  formatstr+="  touch -a -d '%x' %n \n"  
  formatstr+="# mtime auf    %y  setzen \n"
  formatstr+="  touch -m -d '%y' %n \n"  
  # Ausgabe des Befehls zur Restauration der Flags
  stat --printf="${formatstr}" ${1}
}


# Wenn kein Parameter uebergeben wurde rufen wir die Funktion 'fehler' auf
[ $# -eq 0 ]  &&  fehler  &&  exit


# Suffix für Scriptdatei
script_suffix='.diff.bash'


# Vor Beginn der for-Schleife die Varible fuer die erste 
# Datei setzen. Wir nehmen /dev/null 
vorgaenger_datei='/dev/null'


# Schleife ueber alle diesem Programm übergebenen Dateien
for aktuelle_datei in "$@"
do
  # Name fuer das zu erzeugnede Patch-Script
  patch_script_datei=${aktuelle_datei}${script_suffix}
  # Heredoc fuer den Header des Patch-Scripts
  cat >              ${patch_script_datei} <<heredoc_1_ausgabedatei
#!/bin/bash
#
#
# Dies ist ein Script um aus der Datei (Vorgaenger) 
#   ${vorgaenger_datei} 
# die Datei 
#   ${aktuelle_datei}
# zu generieren. .
#
# Wenn  sich mehrere Dateien mit Endnug ${script_suffix} im Verz. befinden können 
# sie mit 
#   for datei in \$(ls *${script_suffix}) ;do ./\${datei} ; done
# ausgeführt werden. Wichtig ist, das die Reihenfolge des Aufrufs stimmt 
# weil jedes Script auf das Ergebnis des Vorgängerscripts angewiesen ist. 
#
# Bekannter Fehler: wenn die Originaldatei keinen Zeilenumbruch am Dateiende 
# hatte hängt das ed-Script einen Zeilenumbruch an. 
#
# Am Schluss mit
#   GZIP=-1  tar  -czvf  2022-xx.tar.gz  *bash
# zusammenpacken und die *bash loeschen
/bin/ed ${vorgaenger_datei} <<ed_heredoc
heredoc_1_ausgabedatei
  diff --ed ${vorgaenger_datei} ${aktuelle_datei} >> ${patch_script_datei}
  cat >>             ${patch_script_datei} <<heredoc_2_ausgabedatei
w ${aktuelle_datei}
q

ed_heredoc
heredoc_2_ausgabedatei

  # Befehle zum setzen der ursprünglichen Flags an Scriptdatei anhängen
  flagrestore_infos ${aktuelle_datei} >> $patch_script_datei
  # Scriptdatei als ausführbar markieren 
  chmod u+x                              $patch_script_datei
  
  # Varible für die nächste for-Runde setzen 
  vorgaenger_datei=$aktuelle_datei
done
