# Тонкие вопросы работы CVSup

### Salvo Bartolotta

`<bartequi@neomedia.it>`

$FreeBSD: doc/ru_RU.KOI8-R/articles/cvsup-advanced/article.sgml,v 1.1 2005/06/14 06:47:37 andy Exp $

FreeBSD это зарегистрированная торговая марка FreeBSD Foundation.

CVSup это зарегистрированная торговая марка John D. Polstra.

Многие из обозначений, используемые производителями и продавцами для обозначения своих продуктов, заявляются в качестве торговых марок. Когда такие обозначения появляются в этом документе, и Проекту FreeBSD известно о торговой марке, к обозначению добавляется знак ''™'' или ''®''.

В этой статье предполагается понимание основ работы CVSup. В ней описываются некоторые тонкие вопросы, связанные с синхронизацией исходных текстов при помощи CVSup, описаны эффективные решения для проблемы потерянных файлов, а также особые случаи обновления исходных текстов; вопросы, которые, скорее всего, вызывают неожиданно возникающие проблемы.

[ По разделам / Одним файлом ]

## 1. Обзор

Этот документ является плодом попыток автора полностью понять преимущества CVSup & обновления исходного кода. :-) Хотя автор прилагал все усилия, чтобы сделать эти страницы максимально информативными и корректными, он всего лишь человек и мог сделать все типы опечаток, ошибок и так далее. Он будет очень признателен за любые комментарии и/или пожелания, которые вы пришлете ему по электронной почте на адрес `<bartequi@neomedia.it>`.

## 2. Введение

Если вы посещали сайт Джона Полстра (John Polstra) и прочли его FAQ, то вы могли отметить вопросы 12 & 13.

При обновлении любого набора исходных текстов (например, `/usr/ports`), cvsup(1) использует соответствующий файл извлечений для того, чтобы выполнять процесс обновления самым правильным и эффективным способом. В этом примере (`/usr/ports`), соответствующим файлом извлечений является `/usr/sup/ports-all/checkouts.cvs:.` если основным каталогом является `/usr`.

Файл извлечений содержит информацию о текущем состоянии ваших исходных текстов -- нечто вроде ''фотографии''. Эта значащая информация позволяет `cvsup` сгружать обновления наиболее эффективно. К тому же, и, может быть, более важно то, что это позволяет `cvsup` правильно управлять вашими исходными текстами, удаляя локальные файлы, которых больше нет в хранилище, таким образом не позволяя появляться в вашей системе забытым файлам. Действительно, без файла извлечений `cvsup` не будет знать, из каких файлов состоит ваш набор (подробности смотрите в справочной системе по cvsup(1) относительно метода откатки); в результате он не может удалить в вашей системе те файлы, которых больше нет в хранилище. Они (удаленные файлы) будут оставаться в системе, и могут вызвать некоторые ошибки при построении или другие проблемы. К примеру, появление этой проблемы весьма вероятно, если вы первый раз обновили ваш набор портов через несколько недель после получения ваших установочных компакт-дисков.

По этой причине рекомендуется, что вы последуете двухшаговой процедуре, описанной в CVSup FAQ (смотрите Q12, Q13); в последующих разделах вам будут даны конкретные примеры, интересные и поучительные.

## 3. Полезный скрипт на языке python: `cvsupchk`

Как альтернативу для проверки целостности ваших исходных текстов вы можете использовать скрипт `cvsupchk`, написанный на языке python; этот скрипт в настоящее время находится в `/usr/ports/net/cvsup/work/cvsup-16.1/contrib/cvsupchk`, вместе с хорошим `README`. Предварительные требования:

1. `/usr/ports/net/cvsup` `#` `make extract`

2. python (также находится в коллекции портов :-))

3. Файл извлечений для вашего набора исходных текстов.

Если вы обновляете ваши исходные тексты самый первый раз, конечно же, у вас нет файла извлечений. После установки python и обновления ваших исходных текстов (к примеру, `/usr/ports`), вы можете проверить их так:

    % /path/to/cvsupchk -d /usr -c /usr/sup/ports-all/checkouts.cvs:. | more

Если вы хотите проверить ваши исходные тексты RELENG_4:

    % /path/to/cvsupchk -d /usr -c /usr/sup/src-all/checkouts.cvs:RELENG_4 | more

В каждом случае `cvsupchk` будет проверять ваши исходные тексты на целостность, используя информацию, находящуюся в соответствующем файле извлечений. Сообщения о таких аномалиях, как присутствие удаленных файлов (так называемых забытых файлов), отсутствие извлеченных файлов, наличие лишних файлов RCS и мертвых каталогов будут выдаваться на стандартный вывод.

В следующем разделе мы дадим важные, типовые примеры обновления исходных текстов; эти примеры покажут вам роль файлов извлечений и опасности небрежного управления исходными текстами.

## 4. Примеры более тонкого управления исходными текстами

### 4.1. Как безопасно изменять тэги при обновлении `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`, то должны быть выполнены следующие действия:

1. `#` `mv checkouts.cvs:A checkouts.cvs:B` (Это даст на последующем шаге корректный файл извлечений)

2. создайте `sup-файл`, со строкой наборов, которая содержит:

       src-all tag=B

3. при помощи cvsup выполните обновление ваших исходных текстов с новым `sup-файлом`.

`cvsup` будет искать `checkouts.cvs:B` -- так как целью является B, то `cvsup` для корректного управления вашими исходными текстами будет использовать информацию, содержащуюся здесь.

Выигрыши:

- с исходными текстами работа производится корректно (в частности, не остается забытых файлов)

- на сервер ложится меньшая нагрузка, так как `cvsup` работает самым эффективным образом.

К примеру, `A=RELENG_4`, `B=.` Точка в `B=.` означает -CURRENT. Это весьма типичное обновление, от 4-STABLE к -CURRENT. Хотя понятно, как ''состарить'' ваши исходные тексты (к примеру, от -CURRENT к -STABLE), понижение версии системы является совсем другим вопросом. Вам НАСТОЯТЕЛЬНО не рекомендуется выполнять такое действие, если только вы точно не понимаете, что делаете.

### 4.2. Обновление в одной и той же метке с разными датами

Если вы хотите перейти от `tag=A` к `tag=A` с отличающейся GMT-датой (скажем, `date=D`), то выполняйте следующее:

1. напишите `sup-файл` с такой строкой, определяющей набор:

       src-all tag=A date=D

2. обновите ваши исходные тексты с помощью нового `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'', прошлое столетие, может быть опущено), год, месяц, день, час, минуты, секунды -- как показано в примере выше. За дополнительной информацией обратитесь к странице справочной системы по cvsup(1).

Вне зависимости от того, задана или нет дата, файл извлечений называется `checkouts.cvs:A` (например, `checkouts.cvs:RELENG_4`). В итоге не нужны какие-то действия для возврата к предыдущему состоянию: вы изменяете дату в `sup-файле`, и запускаете `cvsup` снова.

### 4.3. Обновление вашей коллекции портов самый первый раз

Если вы хотите ''синхронизировать'' ваше дерево портов в первый раз, вы должны использовать тэг, совпадающий с вашей установленной версией FreeBSD. Например, если вы установили коллекцию портов во время установки FreeBSD 5.3-RELEASE, то следует использовать следующую строку:

    ports-all tag=RELEASE_5_3_0

`cvsup` создаст файл извлечений для коллекции портов. Теперь мы можем использовать тэг ''.'' для последующего обновления дерева портов:

    ports-all tag=.

Все последующие обновления будут обрабатываться гладко.

Если вы прочли тонкие замечания в этих разделах, то, наверное, вы осознали потенциальные проблемы в процессе обновления исходных текстов. Многие действительно сталкиваются с проблемами. Вас предупредили. :-)

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.