Sonntag, März 29, 2020

ZSH aktualisieren unter cygwin

DISCLAIMER: Das ist kein ZSH Problem. Um es mal vorweg zu nehmen, der Schuldige sitzt, wie in vielen anderen Fällen, vor dem Monitor.

Was ist ZSH: ZSH ist eine Sammlung von Aliasen und hilfreichen Bash-Shell Skripten zur Verwendung unter Linux. Auf meinem Windows Rechner verwende ich cygwin, um so ein wenig der schönen Linux Welt auf meinem Rechner zu haben.

Vor cygwin 1.7.9 war es möglich, cygwin so zu konfigurieren, dass CRLF Dateien verarbeitet werden können. Diese Option gibt es in den aktuellen Versionen nicht mehr.

GIT lasse ich per cygwin installieren. Und war auch schon da, als ich mich entschied, ZSH zu installieren. Damals habe ich den Schalter core.autocrlf auf true gestellt. Warum? Das erschien mir praktisch…

Cygwin und Linux erwarten ein einfaches LF (LineFeed), während DOS/Windows auf CRLF (Carriage Return und LineFeed) setzt. Das ist vor allem dann problematisch, da der Shell-Interpreter CRLF nicht mag. Die bekannten Texteditoren können mit diesem Problem heute wunderbar umgehen.

Und jetzt das Drama: Nach der ersten Aktualisierung von ZSH waren ein oder zwei Dateien nicht mehr ausführbar. Was habe ich getan? Ich habe die Dateien mit einem Editor geöffnet und das richtige Linefeed eingetragen. Da die ganzen ZSH Dateien in einem GIT Repository liegen, die Änderungen im Anschluss commited. Mit der nächsten ZSH Aktualisierung kam es zu den gleichen Problemen. Zusätzlich hatte ich einige Merge-Konflikte. Und irgendwann habe ich mich auf die Suche nach einer Lösung begeben.

Diese lautet:

git config --global autocrlf false

Und das ist auch die Default-Einstellung, wenn man GIT installiert.

Allerdings gibt es unter Windows noch zwei weitere GIT Konfigurationen, die Einfluß nehmen können:

git config --global --edit
git config --system --edit
git config --local --edit

Letzters funktioniert nur in einem lokalen GIT Repository.

Mit git config --global -l kann man sich alle Schalter anschauen.

Bevor ich auf diese einfache Lösung gekommen bin, habe ich verschiedene andere hilflose Versuche unternommen:

  • Alle Änderungen aus dem Remote-Repository ungesehen übernehmen.

    git pull -s recursive -X theirs <remoterepo or other repo>

    Das verhindert aber nicht die autocrlf Konvertierung.

  • Oder

    git pull -X theirs

  • Oder falls die Dateien bereits in einem konfliktbehaftetem Zustand sind:

    git checkout --theirs path/to/file

  • Ein SED Skript, um die autocrlf Konvertierung wieder rückgängig zu machen: (Entfernt alle \r aus einer Textdatei):

  sed -i 's/\r$//' script

Aber wie gesagt / TLDR: autocrlf = false.

Oder in das lokale ZSH-GIT Repository wechseln:

cd ~/.oh-my-zsh git config core.autocrlf false

AssertJ und java.util.List

AssertJ hat eine praktische Möglichkeit, Listen in JUnit Tests abzuprüfen. Insbesondere, wenn in der Liste komplexe Objekte abgelegt sind, s...