Тонкие вопросы работы 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: <command>cvsupchk</command> Как альтернативу для проверки целостности ваших исходных текстов вы можете использовать скрипт 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 и мертвых каталогов будут выдаваться на стандартный вывод. В следующем разделе мы дадим важные, типовые примеры обновления исходных текстов; эти примеры покажут вам роль файлов извлечений и опасности небрежного управления исходными текстами. Примеры более тонкого управления исходными текстами Как безопасно изменять тэги при обновлении <literal>src-all</literal> Если в вашем 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=. Все последующие обновления будут обрабатываться гладко. Если вы прочли тонкие замечания в этих разделах, то, наверное, вы осознали потенциальные проблемы в процессе обновления исходных текстов. Многие действительно сталкиваются с проблемами. Вас предупредили. :-)