/!\ 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 2007-02-17 11:59:41

Inhalt

1. 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:

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

2. 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.

3. 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

4. Die Skripte

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

Verbesserungsvorschläge/Code willkommen! (RomanKreisel)

cmci:

# 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:

# 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

5. 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.

6. 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.

RCS/KonfigurationsVerwaltung (zuletzt geändert am 2007-12-23 22:47:06 durch localhost)