RCS Скрипты оболочки

Если Вы хотите использовать RCS вместо CVS, то могут пригодиться следующие скрипты оболочки.

cotree.sh

#!/bin/ksh

# cotree.sh (Скрипт оболочки для извлечения дерева каталогов)
# cotree.sh - Извлечение целого RCS-каталога

# Вызов:
# Для получения всех каталогов:
#       unix> cotree.sh 
#
# Для получения дерева единственного каталога:
#       unix> cotree.sh <имя каталога>

# Смотрите также cofiles.sh

###############################################################
# Установка RCS (Revision Control System)
# Инсталлируйте программы RCS -- появятся команды co, ci, rcslog
# Создайте домашний каталог RCS, куда Вы поместите репозиторий
# исходного кода. Выполните $RCSDIR=/home/rcs_version_control
# Задайте переменную окружения RCSDIR=/home/rcs_version_control
# в файле $HOME/.profile. Так:
#               export RCSDIR=/home/rcs_version_control
# Создайте структуру каталогов в $RCSDIR и занесите туда все
# ваши файлы с помощью ci. Смотрите "man ci"
# Теперь создайте связь из Вашего домашнего каталога со своим
# проектом в $RCSDIR
#               cd $HOME
#               mkdir $HOME/myproject
#               cd $HOME/myproject
# и запустите следующий скрипт чтобы получить все файлы и дерево
# каталогов:
#               cotree.sh
# Данный скрипт создаст целое дерево исходного кода в домашнем 
# каталоге пользователя и будет иметь мягкую ссылку на каталоги
# RCS. Каждый пользователь запустит этот скрипт в своем домашнем
# каталоге.
###############################################################

check_out_directory()
{
        # Корневой каталог RCS (Revision Control System)
        # подобно RCSDIR=/home/rcs_version_control
        RCSDIR=$1
        DIRNAME=$2

        # Заданный каталог должен существовать в корневом каталоге RCS
        if [ "$DIRNAME" = "" -o  ! -d $RCSDIR/$DIRNAME ]; then
                print "\nКаталог DIRNAME=$DIRNAME не существует!!"
                print "\nЗавершение программы... и выход...\n"
                exit
        fi
        
        mkdir -p $DIRNAME
        ln -s $RCSDIR/$DIRNAME/RCS $DIRNAME
        (
                cd $DIRNAME

                # Неудача, если имя_файла=sample,vv что в RCS
                # будет RCS/sample,vv,v
                # ls RCS | cut -d',' -f1 | xargs co
                # Используем сопоставление с концом имени $, как ниже
                # Используем ls RCS/* во избежание прибавления к 
                # именам ./ и ../
                #ls RCS/* | cut -d'/' -f2 | sed -e's/,v$//g' | xargs co
                if [ -d RCS ]; then
                        ls RCS/* | cut -d'/' -f2 | sed -e's/,v$//g' | \
                        while read ii
                        do
                                #echo "ii is : $ii"
                                if [ -f "RCS/$ii,v" ]; then
                                        co $ii
                                fi
                        done
                fi
        )
}

# Корневой каталог RCS (Revision Control System)
# подобно RCSDIR=/home/rcs_version_control
if [ "$RCSDIR" = "" -o ! -d $RCSDIR ]; then
        print "\nКаталог RCSDIR=$RCSDIR не существует!!"
        print "\nЗавершение программы... и выход...\n"
        exit
fi
#echo "rcsdir is : $RCSDIR"

# Если передан аргумент-каталог, то извлекаем все файлы
# только для этого каталога и выходим.
if [ "$1" != "" ]; then
        (cd $RCSDIR; find $1 -type d -print ) | 
        while read DIRNAME
        do
                #echo DIRNAME=$DIRNAME
                #DIRNAME=c_src
                # Передай корневой каталог RCS и имя каталога относительно
                # корневого каталога RCS
                tmpaa=` basename $DIRNAME `
                if [ "$tmpaa" != "RCS" ]; then
                        check_out_directory $RCSDIR $DIRNAME
                fi
        done
else
        (cd $RCSDIR; find * -type d -print ) | 
        while read DIRNAME
        do
                echo DIRNAME=$DIRNAME
                #DIRNAME=c_src
                # Передай корневой каталог RCS и имя каталога относительно
                # корневового каталога RCS
                tmpaa=` basename $DIRNAME `
                if [ "$tmpaa" != "RCS" ]; then
                        check_out_directory $RCSDIR $DIRNAME
                fi
        done
fi

cofiles.sh

#!/bin/ksh

# cofiles.sh (Скрипт оболочки для извлечения файлов)
# cofiles.sh - Извлечь все файлы из RCS в текущий каталог
# Смотрите также cotree.sh и "man rcsclean"

if [ ! -d RCS ]; then
        print "\nКаталог RCS не существует!!"
        print "\nЗавершение программы... и выход...\n"
        exit
fi

#echo "No. of args = " $# " and all args " $@

while true
do
        print -n "\n\nИзвлечь все файлы в режиме чтения-записи? <y/n> [n]: "
        read ans
        if [ "$ans" = "" -o "$ans" = "n" -o "$ans" = "N" ]; then
                ans="N"
                break
        elif [ "$ans" = "y" -o "$ans" = "Y" ]; then
                ans="Y"
                break
        else
                print "\nОшибочный ввод! Попробуйте снова!!"
        fi
done
#echo "The ans is : " $ans

if [ $# -eq 0 ]; then
        # "ls RCS" терпит неудачу в случае имя_файла=sample,vv в RCS/sample,vv,v
        # ls RCS | cut -d',' -f1 | xargs co
        # Используем сопоставление с концом имени $, как ниже
        if [ "$ans" = "Y" ]; then
                ls RCS | sed -e's/,v$//g' | xargs co -l 
        else
                ls RCS | sed -e's/,v$//g' | xargs co
        fi
elif [ $# -eq 1 ]; then
        if [ -f "RCS/$1,v" ]; then
                # Здесь, в этом случае $1 будет подобен dbalter.sql,
                # а не db*.sql...
                #echo "One arg, no. of args = " $# " and all args " $@
                if [ "$ans" = "Y" ]; then
                        co -l "$1"
                else
                        co "$1"
                fi
        else
                # Для случая, когда $1=db*.sql и нет db*.sql в
                # текущем каталоге
                #echo "No files... no. of args = " $# " and all args " $@
                tmpaa="RCS/$1,v"  # будет вроде RCS/db*.sql,v
                ls $tmpaa | \
                while read ii
                do
                        #echo "ii is : $ii"
                        if [ "$ans" = "Y" ]; then
                                co -l "$ii"
                        else
                                co "$ii"
                        fi
                done
        fi
else
        for ii in $@
        do
                #echo "ii is : $ii,v"
                if [ "$ans" = "Y" ]; then
                        co -l "$ii"
                else
                        co "$ii"
                fi
        done
fi

ciall.sh

#!/bin/ksh

# ciall.sh (Скрипт оболочки для фиксации файлов)
# ciall.sh - Загрузка всех файлов текущего каталога в RCS
# Данный скрипт очень полезен для загрузки огромного количества
# новых файлов в RCS. Экономит время, избегая необходимости
# набора "описания" для каждого файла
# Для файлов уже в RCS, выполняет обычную команду check-in


# Чтобы преобразовать имена файлов в нижний регистр,
# воспользуйтесь следующей техникой; используйте "tr",
# смотрите "man tr"
#ls * | \
#while read ii
#do
#       jj=`echo $ii | tr [A-Z] [a-z] `
#       echo "ii is : $ii"
#       echo "jj is : $jj"
#       mv $ii $jj
#done

if [ ! -d RCS ]; then
        print "\nКаталог RCS не существует!!"
        print "\nСоздаю каталог RCS...\n"
        mkdir RCS
fi

print "\n\nВНИМАНИЕ: это не лог-сообщение!"
print "Пожалуйста, введите описание (будет использовано для"
print -n "всех фиксируемых файлов): "
read description

#find * -prune -type f | 

# Количество аргументов нулевое или больше.... 
if  [ $# -eq 0 ]; then
        listoffiles="*"
else
        listoffiles="$@"
fi

find $listoffiles -prune -type f | 
while read ii
do
        #echo $ii
        if [ -f "RCS/$ii,v" ]; then
                #print "The file $ii already in RCS"
                ci -m"$description" $ii 
        else
                #print "The file $ii is new file"
                ci $ii << EOF
$description
EOF
        fi
done