Сводка — это одна строка, которая вводится пользователем и описывает изменения.
Для работы с версиями используются две команды:
get
выделяет версию из файла истории, a
put
заносит новую версию в файл истории после запроса на ввод сводки изменений. Прежде чем привести программу, покажем, как выполняются
get
и
put
и как сохраняется файл истории:
$ echo строка текста > junk
$ put junk
Summary:
создадим новый файл
Введите описание
get: no file junk.H
Файл-история не существует
put: creating junk.H
…и put создает его
$ cat junk.H
строка текста
@@@ you Sat Oct 1 13:31:03 EDT 1983
сделаем новый файл
$ echo еще строка >>junk
$ put junk
Summary: одна строка добавлена
$ cat junk.H
строка текста
еще одна строка текста
@@@ you Sat Oct 1 13:31:28 EDT 1983 одна строка добавлена
2d
@@@ you Sat Oct 1 13:31:03 EDT 1983 сделаем новый файл
$
Команды редактирования представляют собой одну строку 2, которая исключает вторую строку файла, преобразуя новую версию в исходную:
$ rm junk
$ get junk
Самая новая версия
$ cat junk строка текста еще строка текста
$ get -l junk
$ cat junk
Версия новейшая, но одна
строка текста
$ get junk
Опять самая новая версия
$ replace еще 'другая' junk
Изменим ее
$ put junk
Summary: изменена вторая строка
$ cat junk.H
строка текста
другая строка
@@@ you Sat Oct 1 13:34:07 EDT 1983 одна строка добавлена
2d
@@@ you Sat Oct 1 13:31:03 EDT 1983 создадим новый файл
$
Для получения нужной версии файла в файле истории записаны команды редактирования. Первая группа команд преобразует самую последнюю версию в предыдущую, вторая группа преобразует предыдущую в пред-предыдущую версию и т.д. Таким образом, мы преобразуем новый файл в его старую версию, запуская каждый раз редактор
ed
.
Очевидно, может возникнуть проблема, если в изменяемом файле есть строки, начинающиеся с трех символов. Кроме того, в разделе ошибок описания команды
diff(1)
(см. справочное руководство по UNIX) есть предупреждение о строках, состоящих из одной точки. Мы выбрали
@@@
для разделения команд редактирования, поскольку такая строка является редкостью для обычного текста.
Конечно, было бы полезно показать здесь процесс развития команд
put
и
get
, но из-за ограниченного объема книги мы приведем только их окончательные варианты. Команда
sed -n '/^@@@/,$p' <$HIST >>/tmp/put.b$$ # old diffs
overwrite $HIST cat /tmp/put.b$$ # put it back
else # make a new one
echo "put: creating $HIST"
cp $1 $HIST
echo "@@@ `getname` `date` $Summary" >>$HIST
fi
rm -f /tmp/put.[ab]$$
После считывания одной строки сводки команда
put
обращается к
get
для получения предыдущей версии файла из файла истории. Флаг
– о
команды
get
указывает на переключение выходного файла. В том случае, когда
get
не может найти файл истории, она возвращает код завершения ошибки, и
put
создает файл истории. Если файл истории существует, то в командах после
then
создается временный файл такого формата: самая последняя версия, строка
@@@
, команды редактора для преобразования этой версии в предыдущую, старые команды редактора и строки В конце временный файл копируется в файл истории с помощью команды