Библиотека сайта rus-linux.net
Если Вы хотите использовать RCS вместо CVS, то могут пригодиться
следующие скрипты оболочки.
#!/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 |
#!/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 |
#!/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 |