#pragma section-numbers on
/!\ Ich empfehle inzwischen dringendst, anstatt RCS bazaar für die Konfigurationsverwaltung zu verwenden. Eine Anleitung findet man hier: [[bazaar-ng/KonfigurationsVerwaltung]]. Diesen Artikel möchte ich unverändert lassen. Evtl. findet jemand Nutzen darin, z.B. auf einem System, wo ihm kein bzr zur Verfügung steht. -- RomanKreisel <<DateTime(2007-02-17T11:59:41Z)>>

'''Inhalt'''

<<TableOfContents>>

= Vorwort =
Auch wenn von den Autoren vielleicht nicht vorgesehen, habe ich mir vorgenommen mein /etc mit RCS zu verwalten. Die Vorteile, die daraus entstehen, sind klar:

 * Keine alten Konfigurations-Dateien wie z.B. smb.conf.old-20041224
 * Klare Versionierung
 * Logs, um zu überprüfen, welche Veränderungen eine Datei durchlaufen hat
 * "Zeitmaschine", um alte Versionen zurückzuholen

Jeder, bei dem eine Änderung schon einmal Probleme verursacht hat, weiß, wie hilfreich eine Rückverfolgung der Veränderungen gewesen wäre.

= Was es nicht ist =
RCS sollte nicht als einzige Instanz eines Backups dienen. Nichts geht über ein Backup auf einen vom System vollständig getrennten Datenträger wie z.B. CD-R oder Band.

= Howto =

Leider ist RCS nicht in der Lage die DateiRechte im Arbeitsverzeichnis beizubehalten. Deshalb habe ich für den Checkin und den Checkout zwei Wrapper-Skripte geschrieben, die mithilfe von getfacl und setfacl die DateiRechte sichern und wiederherstellen. Alle anderen Funktionen außer aus- und einchecken können mit den üblichen RCS-Utilites durchgeführt werden.

Das Einchecken von Dateien geht ganz einfach mit 
{{{ cmci datei1 datei2 datei3 --binary datei4 -b datei5 }}}
Die Dateien 4 und 5 sind hierbei Binärdateien.

Das Auschecken geht wiederum mit cmco:
{{{ cmco -r1.1 datei1 -r1.2 datei2 datei3 }}}
Dies würde die Version 1.1 von datei1, die Version 1.2 von datei2 und die aktuelle Version von datei3 auschecken.

Für die restlichen Funktionen können die normalen RCS-Programme benutzt werden, so z.B.

||rlog foobar || Um die Historie der datei "foobar" zu betrachten ||
||rcsdiff -r1.2 -r1.3 foobar || Um die Veränderungen von 1.2 auf 1.3 anzuzeigen ||
||rcs -kb foobar || Um die Datei nachträglich als Binärdatei zu definieren ||

= Die Skripte =

WARNUNG: Die Skripte sind noch weitestgehend ungetestet! Anwendung (wie immer) auf eigene Gefahr!

Verbesserungsvorschläge/Code willkommen! (RomanKreisel)

cmci:
{{{
#!/bin/bash
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.


if [ -z $1 ]
then
	echo "You need to specify at least one file for checkin"
	exit
fi

case $1 in 
	"--help" | "-h" )
		echo "Usage: cmci [Flags] FILE [[Flags] FILE,...]"
		echo ""
		echo "-b, --binary       Check this file in as binary"
		echo "-h, --help	   This Page"
		echo ""
		echo "Example:"
		echo "cmci foo --binary bar # Checks in foo as normal file, bar as binary"
		exit
	;;
esac

until [ -z "$1" ]
do
	BINARY=""
	# Check in binary file?
	case $1 in 
		"--binary" | "-b" )
			BINARY="TRUE"
			shift
			echo BINARY FILE
		;;
	esac

	if [ ! -f $1 ]
	then
		echo "Sorry, but $1 is no regular file."
		echo ""
		exit 0
	fi

	
	# First of all, create a RCS-Subdir, if it doesn't exist
	if [ -e `dirname $1`/RCS ]
	then
		if [ ! -d `dirname $1`/RCS ]
		then
			echo "`dirname $1`/RCS already exists but isn't a directory!"
			exit
		fi
	else
		echo "Creating RCS-Directory"
		mkdir `dirname $1`/RCS
	fi

	# Now, first get the permissions of the file to be remembered
	echo "Getting Permissions..."
	getfacl $1 > `dirname $1`/RCS/`basename $1`.permissions
	echo "DONE"
	echo ""

	# Time to Checkin (and automatically out again)
	echo "Checking in and out again..."
	if [ "$BINARY" == "TRUE" ]
	then
		test -e `dirname $1`/RCS/`basename $1`,v || rcs -i -kb $1
	fi
	ci -l $1
        if [ "$BINARY" == "TRUE" ]
	then
		rcs -kb $1
	fi
				
	echo "DONE"
	echo ""

	# Now, since the file was checked out again, we need to re-set the 
	# permissions
	echo "Re-applying Permissions..."
	setfacl --restore=`dirname $1`/RCS/`basename $1`.permissions
	echo "DONE"
	echo ""
	
shift	
done
}}}

cmco:
{{{
#!/bin/bash
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

if [ -z $1 ]
then
	echo "You need to specify at least one file for checkout"
	exit
fi

case $1 in
	"--help" | "-h" )
		echo "Usage: cmco [-rREVISION] FILE [[-rREVISION] FILE]"
		echo ""
		echo "-rx.y		   Checkout this revision"
		echo "-h, --help           This Page"
		echo ""
		echo "Example:"
		echo "cmco foo -r1.1 bar # Checks out foo and version 1.1 of bar"
		exit
	;;
esac

until [ -z "$1" ]
do
	REVISION=""
	RCSOPTIONS=""
	if echo $1 | grep -q "^-r" # Shall we check out a specified revision?
	then
		REVISION=`echo $1 | cut -d r -f 2`
		shift
	fi

	if [ ! -z $REVISION ]
	then
		RCSOPTIONS="-r$REVISION"
	fi

	echo "Checking in and out again..."
	co $RCSOPTIONS $1
	echo "DONE"

        # Now, since the file was checked out again, we need to re-set the
        # permissions
        echo "Re-applying Permissions..."
        setfacl --restore=`dirname $1`/RCS/`basename $1`.permissions
        echo "DONE"
						
	
		

shift
done
}}}

= Tipps und Tricks =
In RCS kann man auch schöne Felder definieren wie z.B. $Id$, $Header$ und so weiter. Ist hilfreich, um z.B. zu erkennen, um welchen Stand es sich bei der Datei handelt.

= Kommentare =

Danke, hab schon mal versucht sowas zu basteln, hab aber das Sichern der Rechte nicht hingekriegt. Funktioniert super, die acl-utils müssen natürlich installiert sein.

 * [[http://russell.rucus.net/blog/Geek/bzr-etc-howto]] Dies hier beschreibt eine wohl bessere Lösung mit BZR anstatt RCS