Тонкие вопросы работы CVSup
Salvo
Bartolotta
bartequi@neomedia.it
&tm-attrib.freebsd;
&tm-attrib.cvsup;
&tm-attrib.general;
$FreeBSD$
$FreeBSD$
В этой статье предполагается понимание основ
работы CVSup. В ней описываются некоторые
тонкие вопросы, связанные с синхронизацией исходных текстов при помощи
CVSup, описаны эффективные решения для проблемы
потерянных файлов, а также особые случаи обновления исходных текстов; вопросы,
которые, скорее всего, вызывают неожиданно возникающие проблемы.
Обзор
Этот документ является плодом попыток автора полностью понять
преимущества CVSup & обновления
исходного кода. :-) Хотя автор прилагал все усилия, чтобы сделать
эти страницы максимально информативными и корректными, он всего лишь
человек и мог сделать все типы опечаток, ошибок и так далее. Он будет
очень признателен за любые комментарии и/или пожелания, которые вы пришлете
ему по электронной почте на адрес bartequi@neomedia.it.
Введение
Если вы посещали сайт Джона
Полстра (John Polstra) и прочли его
FAQ, то вы могли отметить вопросы 12 & 13.
При обновлении любого набора исходных текстов (например,
/usr/ports), &man.cvsup.1; использует
соответствующий файл извлечений для того, чтобы выполнять процесс
обновления самым правильным и эффективным способом. В этом примере
(/usr/ports), соответствующим файлом извлечений
является /usr/sup/ports-all/checkouts.cvs:. если
основным каталогом является /usr.
Файл извлечений содержит информацию о текущем состоянии ваших
исходных текстов — нечто вроде фотографии
. Эта
значащая информация позволяет cvsup сгружать
обновления наиболее эффективно. К тому же, и, может быть, более
важно то, что это позволяет cvsup правильно
управлять вашими исходными текстами, удаляя локальные файлы, которых
больше нет в хранилище, таким образом не позволяя появляться в вашей
системе забытым файлам. Действительно, без файла
извлечений cvsup не
будет знать, из каких файлов состоит ваш набор (подробности смотрите в
справочной системе по &man.cvsup.1; относительно метода откатки); в
результате он не может удалить в вашей системе те файлы, которых больше
нет в хранилище. Они (удаленные файлы) будут оставаться в системе, и
могут вызвать некоторые ошибки при построении или другие проблемы. К
примеру, появление этой проблемы весьма вероятно, если вы первый раз
обновили ваш набор портов через несколько недель после получения ваших
установочных компакт-дисков.
По этой причине рекомендуется, что вы последуете двухшаговой
процедуре, описанной в CVSup FAQ (смотрите Q12, Q13); в
последующих разделах вам будут даны конкретные примеры, интересные и
поучительные.
Полезный скрипт на языке python: cvsupchk
Как альтернативу для проверки целостности ваших исходных текстов вы
можете использовать скрипт cvsupchk, написанный на языке
python; этот скрипт в настоящее время находится в
/usr/ports/net/cvsup/work/cvsup-16.1/contrib/cvsupchk,
вместе с хорошим README. Предварительные
требования:
/usr/ports/net/cvsup &prompt.root;
make extract
python (также находится в коллекции портов :-))
Файл извлечений для вашего набора исходных текстов.
Если вы обновляете ваши исходные тексты самый первый раз, конечно же,
у вас нет файла извлечений. После установки python и обновления ваших
исходных текстов (к примеру, /usr/ports), вы можете
проверить их так:
&prompt.user; /path/to/cvsupchk -d /usr -c /usr/sup/ports-all/checkouts.cvs:. | more
Если вы хотите проверить ваши исходные тексты RELENG_4:
&prompt.user; /path/to/cvsupchk -d /usr -c /usr/sup/src-all/checkouts.cvs:RELENG_4 | more
В каждом случае cvsupchk будет проверять ваши исходные
тексты на целостность, используя информацию, находящуюся в соответствующем файле
извлечений. Сообщения о таких аномалиях, как присутствие удаленных
файлов (так называемых забытых файлов), отсутствие извлеченных файлов,
наличие лишних файлов RCS и мертвых каталогов будут выдаваться на
стандартный вывод.
В следующем разделе мы дадим важные, типовые примеры обновления
исходных текстов; эти примеры покажут вам роль файлов извлечений и
опасности небрежного управления исходными текстами.
Примеры более тонкого управления исходными текстами
Как безопасно изменять тэги при обновлении
src-all
Если в вашем sup-файле вы задали, к
примеру, tag=A, то cvsup
создаст файл извлечений с именем checkouts.cvs:A:
например, если tag=RELENG_4, то создаваемый файл
извлечений называется checkouts.cvs:RELENG_4. Этот файл
будет использоваться для получения и/или сохранения информации,
идентифицирующей ваши исходные тексты 4-STABLE.
При отслеживании src-all, если вы хотите перейти
от tag=A к tag=B (не имеет
значения, больше или меньше A, чем B), и ваш файл извлечений
называется checkouts.cvs:A, то
должны быть выполнены следующие действия:
&prompt.root; mv checkouts.cvs:A
checkouts.cvs:B
(Это даст на последующем шаге корректный файл извлечений)
создайте sup-файл, со строкой наборов, которая содержит:
src-all tag=B
при помощи cvsup выполните обновление ваших исходных текстов
с новым sup-файлом.
cvsup будет искать checkouts.cvs:B — так
как целью является B, то cvsup для корректного управления
вашими исходными текстами будет использовать информацию, содержащуюся
здесь.
Выигрыши:
с исходными текстами работа производится корректно (в
частности, не остается забытых файлов)
на сервер ложится меньшая нагрузка, так как cvsup работает
самым эффективным образом.
К примеру, A=RELENG_4, B=. Точка
в B=. означает -CURRENT. Это весьма типичное обновление, от
4-STABLE к -CURRENT. Хотя понятно, как
состарить
ваши исходные тексты (к примеру, от -CURRENT к -STABLE),
понижение версии системы является совсем другим вопросом. Вам
НАСТОЯТЕЛЬНО не рекомендуется выполнять такое действие, если только вы
точно не понимаете, что делаете.
Обновление в одной и той же метке с разными датами
Если вы хотите перейти от tag=A к
tag=A с отличающейся
GMT-датой (скажем, date=D), то выполняйте следующее:
напишите sup-файл с такой строкой, определяющей набор:
src-all tag=A date=D
обновите ваши исходные тексты с помощью нового sup-файла
Не имеет значения, предшествует ли новая дата времени последней
операции синхронизации с tag=A, или нет. Например, для
того, чтобы задать дату August 27, 2000, 10:00:00 GMT
, вы пишете
строку:
src-all tag=RELENG_4 date=2000.08.27.10.00.00
Формат даты строг. Вы задаете все компоненты даты: столетие (20
,
то есть 21 век. должен быть указан, когда как 19
,
прошлое столетие, может быть опущено), год, месяц, день, час, минуты,
секунды — как показано в примере выше. За дополнительной информацией
обратитесь к странице справочной системы по &man.cvsup.1;.
Вне зависимости от того, задана или нет дата, файл извлечений
называется checkouts.cvs:A (например,
checkouts.cvs:RELENG_4). В итоге не нужны
какие-то действия для возврата к предыдущему состоянию: вы изменяете
дату в sup-файле, и запускаете
cvsup снова.
Обновление вашей коллекции портов самый первый раз
Если вы хотите синхронизировать
ваше дерево
портов в первый раз, вы должны использовать тэг, совпадающий с
вашей установленной версией &os;. Например, если вы установили
коллекцию портов во время установки &os; 5.3-RELEASE, то
следует использовать следующую строку:
ports-all tag=RELEASE_5_3_0
cvsup создаст файл извлечений для коллекции
портов. Теперь мы можем использовать тэг .
для
последующего обновления дерева портов:
ports-all tag=.
Все последующие обновления будут обрабатываться гладко.
Если вы прочли тонкие замечания в этих разделах, то, наверное, вы
осознали потенциальные проблемы в процессе обновления исходных
текстов. Многие действительно сталкиваются с проблемами. Вас
предупредили. :-)