linux|n00b Linux für Ein- und Umsteiger

12Aug/100

SVN-Integration in den Nautilus

Im Windows-Bereich ist man sich mit ToroiseSVN seit jeher eine nahtlose Einbindung von Subversion in den Win-Explorer gewohnt.
Im Linux-Bereich muss man zumeist auf andere Tools zurückgreifen (die nicht im Dateiexplorer eingebunden werden) oder via Terminal mit dem svn-Kommando arbeiten.

Schritt 1: GnubVersion

Screenshot: GnubVersion ohne SVN Diff (Quelle: GnubVersion Projektseite)

Screenshot: GnubVersion ohne SVN Diff (Quelle: GnubVersion Projektseite)

Wer eine TortoiseSVN-ähnliche Lösung für Linux sucht und bislang noch nichts für seinen Gnome-Desktop gefunden hat, dem sei zunächst GnubVersion empfohlen. Ähnlich wie TortoiseSVN in den Windows-Dateiexplorer integriert sich GnubVersion nach dessen Installation in den Nautilus.

Also, erster Schritt: GnubVersion installieren.

Allerdings ist GnubVersion bei Weitem nicht so funktionsumfangreich wie das Windows-Pendant. Viele Funktionen sind im Grunde auch gar nicht nötig und das Wesentliche beherrscht GnubVersion ja auch, aber eine Sache fehlt: der SVN-Diff.

Schritt 2: Meld und die Nautilus-Aktionen

Um diesen Verlust auszugleichen, habe ich mir etwas Abhilfe verschafft. Folgendes wird dafür benötigt:

  • das Tool Meld (wenn ich mich recht entsinne, habe ich mir auch andere Diff-Betrachter angesehen, aber dieser gefiel mir am besten)
  • die Nautilus-Aktionen
  • und ein Skript, welches SVN mit Meld und den Nautilus-Aktionen verbinden soll (siehe Schritt 3)

Das sind die Zutaten - Wollen wir sie mal miteinander vermischen...

Die Nautilus-Aktionen lassen sich zum Beipiel in yum (dem Fedora-Paketmanager) unter dem Paketnamen "nautilus-actions" schnell finden und installieren. Das Gleiche gilt für Meld, der Paketname lautet schlicht und ergreifend "meld".

Schritt 3: Skript für Nautilus-Aktionen erstellen

Sind beide Tools installiert, folgt der spannende Teil: das Sktipt. Dieses ist zwar vergleichsweise simpel, dafür aber sehr nützlich. Zunächst der Inhalt des Skripts, eine kurze Erläuterung folgt darunter:

#!/bin/bash

# --------------------------------------------------------------------------
# Benutzung des Skripts prüfen

# Anzahl Parameter prüfen
if [ ! $# -eq 1 ]; then
 echo "svndiff benötigt genau einen Parameter, nämlich den Pfad zur Datei (wobei diese natürlich unter SVN-Kontrolle stehen muss)" | zenity --text-info --title="Fehler" --width=600 --height=400
 exit 1
fi

# --------------------------------------------------------------------------
# Variablen anlegen und Dateien prüfen

# Anzahl Wörter, die durch Slash getrennt sind
WORD_COUNT=`echo ${1} | sed 's/\// /g' | wc -w`
WORD_COUNT_PLUS_1=`expr $WORD_COUNT + 1`

# Pfad und Dateinamen ermitteln
FILE_PATH="`echo ${1} | cut -d/ -f1-${WORD_COUNT}`/"
FILE_NAME=`echo ${1} | cut -d/ -f${WORD_COUNT_PLUS_1}`

# Pfade für die SVN-Dateien zusammenstöpseln
# Vergleichsdatei aus SVN-Repository: <pfad>/.svn/text-base/<file>.svn-base
SVN_BASE_FILE="${FILE_PATH}.svn/text-base/${FILE_NAME}.svn-base"
# geänderte bzw. zu prüfende Datei <pfad><file> (kommt direkt aus dem Aufrufparameter, daher kein Zusammenstöpseln notwendig)
SVN_CHANGED_FILE=$1

# Pfade prüfen
# die SVN-Base-Datei
if [ ! -f $SVN_BASE_FILE ]; then
 echo "Datei existiert nicht: $SVN_BASE_FILE" | zenity --text-info --title="Fehler" --width=600 --height=100
 exit 1
fi
# die Datei
if [ ! -f $SVN_CHANGED_FILE ]; then
 echo "Datei existiert nicht: $SVN_CHANGED_FILE" | zenity --text-info --title="Fehler" --width=600 --height=100
 exit 1
fi

# --------------------------------------------------------------------------
# den eigentlichen Zweck des Skripts erfüllen

# meld (das Diff-Tool) starten
meld $SVN_BASE_FILE $SVN_CHANGED_FILE &

exit 0

Was passiert in dem Skript im Klartext...? Diese Frage möchte ich dir natürlich sofort beantworten.

1. Pfade ermitteln
Für die Verwendung des Skripts wird beim Aufruf ein Parameter benötigt, nämlich der Pfad zur Datei, für die ein SVN-Diff angezeigt werden soll. Die Angabe des Parameters wird im Block nach der ersten Trennlinie geprüft. Im nächsten Abschnitt wird aus dem Parameter der Verzeichnispfad vom Dateinamen getrennt. Daraus wird der Pfad erschlossen, der zur entsprechenden SVN-Base-Datei führt. Nun sind beide Pfade bekannt: Der Pfad zur eigentlichen Datei und der Pfad der zugehörigen SVN-Base.

2. Diff-Tool starten
Im letzten Block unter dem dritten Trennstrich wird das Tool Meld gestartet, dieses erhält als Parameter die Pfade der beiden Dateien. Das ist auch schon alles, was wir an dieser Stelle brauchen.

3. That's it.
Mehr passiert da auch gar nicht...

Screenshot: SVN Diff mit nautilus-actions

Screenshot: SVN Diff mit nautilus-actions

Schritt 4: Skript und Nautilus-Aktionen vermählen

Lege nun eine Textdatei an und speichere den Inhalt des oben abgebildeten Skripts darin. Pfad und Dateiname sind egal, denn Namen sind bekanntlich Schall und Rauch. Lege die Datei z.B. im Home-Verzeichnis unter ./.nautilus-actions/ ab und nenne sie svndiff (meinethalben auch "schall und rauch"). Starte dann das Programm nautilus-actions unter System > Einstellungen > Nautilus-Aktionen und füge diese Datei einfach hinzu.

Und fertig ist unser SVN-Diff.

Schritt 5: Have fun!

Wähle im Nautilus Dateien aus, die sich unter Versionskontrolle mit Subversion befinden und lasse dir via Rechtsklick auf "SVN-Diff" eben selbigen anzeigen.

Screenshot: Meld mit SVN-Diff

Screenshot: Meld mit SVN-Diff