kleine Tools, die einem das Leben erleichtern (1)

Wenn man Code schreibt, der im Anschluss auf einen anderen Rechner hochgeladen werden soll (wie z.B. PHP-Code auf einen Webserver), dann bietet es sich natürlich an, nur die geänderten Dateien zu übertragen. Bei vielen Dateien und tieferen Verzeichnisstrukturen wird das aber schnell ziemlich nervig, sowas per Hand zu machen. Subversion und ein kleines Shellscript vereinfachen diesen Prozess ungemein.

Da ein Versionskontrollsystem wie Subversion grundsätzlich alle Änderungen dokumentiert, bietet es sich natürlich an, dort anzusetzen. Das folgende von mir geschriebene Shellscript ermittelt, welche Dateien zuletzt geändert wurden und kopiert diese samt zugehöriger Verzeichnisstruktur in einen Upload-Ordner:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash
 
### HIER KOMMT DER PFAD ZUM EIGENEN UPLOAD-VERZEICHNIS REIN ###
UPLOAD_DIR=~/upload
 
if [ "$1" == "update" ]; then
	echo "Running svn update..."
	svn update
	if [ -z "$2" ]; then
		exit
	fi
	shift
fi
 
if [ "$1" == "clean" ]; then
	rm -rf $UPLOAD_DIR/*;
	if [ -z "$2" ]; then
		exit
	fi
	shift
fi
 
if [ -z "$1" -o "$1" == "." ]; then
	revision="COMMITTED"
else
	revision=$1
fi
 
svn_url=`svn info | grep "URL: " | cut -d ' ' -f 2`
svn_root=`LANG=C svn info | grep "Repository Root: " | cut -d ' ' -f 3`
svn_prefix=`echo "$svn_url" | sed -e "s#$svn_root##"`
 
for filename in `svn log -v -r$revision:HEAD | tr -s ' ' | grep "^ [MAR]" | cut -d ' ' -f 3 | sort -u | sed -e "s#$svn_prefix/##" `; do
	if [ -f $filename ]; then
		echo $filename
		cp --parents $filename $UPLOAD_DIR
	fi
done

Speichert man diesen Code in einer Datei, z.B. Namens ‚mkupload‘, und schmeißt sie in ein Verzeichnis, das im PATH liegt, dann muss man nur noch in das Verzeichnis mit der Arbeitskopie gehen, ggf. nochmal ein ’svn update‘ ausführen, um die neusten Log-Einträge vom Server zu bekommen, und dann kann es auch schon los gehen.

Mit ‚mkupload clean‘ wird das Upload-Verzeichnis gelöscht. Gibt man stattdessen eine Zahl als Argument an, so wird dies als Revisionsnummer genommen und alle Änderungen seit dieser Revision werden betrachtet (es wird quasi ein svn log -r Argument:HEAD ausgeführt). Wird kein Argument angegeben, so wird ‚COMMITTED‘ als Revision benutzt, was i.d.R. die Änderungen des letzten Commits in diesem Entwicklungszweig liefern sollte.

Da die Arbeitsfolge ’svn update‘, ‚mkupload clean‘ und ‚mkupload‘ eigentlich fast immer hintereinander kommt, kann man auch einfach nachfolgende Zeile eingeben, um alles in einem Rutsch ausführen zu lassen. Der Punkt am Ende sagt dem Script, dass es nach dem Löschen des Upload-Verzeichnisses auch noch die Änderungen des letzten Commits kopieren soll.

mkupload update clean .

Obiges kann man sich natürlich auch in einen kleinen süßen Alias packen, damit man das nicht immer alles tippen muss. 😉

Schreibe einen Kommentar