Использование CVS с пакетами Debian
Этот короткий документ предназначен для того, чтобы помочь в
переводе пакетов под управление CVS. Вероятно, это
интересно лишь нескольким людям, которые не очень хорошо знакомы с CVS и
управлением версиями. Кроме того, в
/usr/share/doc/cvs-buildpackage имеется сценарий
с именем cvs-pkginit (и сценарий, и его страница руководства сжаты
gzip), который выводит конспект настоящего документа.
Например, чтобы перевести в CVS пакет foo версии bar1 Debian ревизия 3, попробуйте следующую команду:
% cvs-pkginit foo bar1 3и посмотрите вывод.
Oldenburg, 6/2/97 Joey (joey@debian.org)
/ Martin Schulze /
Mobile, Manoj Srivastava
srivasta@debian.org
Замечание: в дальнейшем то, что заключено в угловые скобки, предполагается в качестве изменяемого в зависимости от конкретного случая, всё остальное следует трактовать буквально. Например, если вы говорите о пакете с версией 2.1.82 в основной ветке разработки, то <$версия> означает 2.1.82, а версия_основной_ветки_<$версия | tr . _> означает версия_основной_ветки_2_1_82.
- Настройка CVS
$ CVSROOT=/где/ваш/репозиторий/должен/быть $ export CVSROOT $ cvs init $ mkdir $CVSROOT/debian
Это позволит вам отделить ваши пакеты Debian от всего остального в вашем репозитории, либо в настоящий момент, либо в будущем. Даже если вы думаете, что вам не нужна CVS для чего-либо ещё, проще сейчас отделить ваш репозиторий, чем потом сожалеть о том, что вы этого не сделали (позже в вашем репозитории окажется целая свалка всяческого барахла).
Если планируется, что CVS будет использоваться несколькими людьми, вам следует убедиться, что они могут изменять репозиторий с помощью CVS. Выберите группу (или набор групп), которые имеют доступ к части репозитория, и установите права:
# chgrp <архив> $CVSROOT/debian # chmod g+ws $CVSROOT/debian
Это гарантирует, что члены архивной группы получат права на настройку репозитория. Теперь вам следует убедиться, что правильные группы людей могут изменять части репозитория.
# mkdir $CVSROOT/debian/<пакет1> # chgrp <группа1> $CVSROOT/debian/<пакет1> # chmod g+ws $CVSROOT/debian/<пакет1> # mkdir $CVSROOT/debian/<пакет2> # chgrp <группа2> $CVSROOT/debian/<пакет2> # chmod g+ws $CVSROOT/debian/<пакет2>
Как обычному пользователю вам следует сделать ваш CVS-репозиторий публичным, либо используя "-d /где/ваш/репозиторий/должен/быть", либо помещая такой фрагмент в ваш профиль.
$ CVSROOT=/где/ваш/репозиторий/должен/быть $ export CVSROOT
- Использование модулей
# cvs checkout CVSROOT # cd CVSROOT # vi modules
В дальнейшем <пакет> будет именем пакета, совпадающим с таковым в файле debian/changelog.
Добавьте следующие строки, первая необходима, вторая может быть дублирована и является очевидной:
modules CVSROOT modules <пакет> debian/<пакет>
# cvs commit -m 'Определите первые модули'
- Подготовка к использованию CVS
Вставьте ваше дерево исходного кода с помощью следующих команд (допустим, вы уже подготовили его для Debian, и имеется файл orig.tar.gz). Заметьте, что исходный код из основной ветки разработки импортируется с помощью -ko (проследите за двоичными файлами), но не локальные изменения, которые мы производим. Заметьте, что числа эпохи игнорируются во время определения имени тега CVS (они обычно используются для изменения мнения dpkg о порядке пакетов и не релевантны для тегов CVS).
Измените каталог на тот, где у вас находится распакованное и приведённое к формату Debian разрабатываемое дерево исходного кода вне CVS, которое мы пытаемся ввести в CVS (вообще, оно пока не в CVSROOT).
Я ПОВТОРЯЮ: В дальнейшем <пакет> будет именем пакета, совпадающим с таковым в файле debian/changelog.
$ cd /где/находится/ваше/дерево/исходного/кода $ tar zvfx <пакет>_<версия>.orig.tar.gz $ cd <пакет>_<версия>.orig $ cvs import -ko -m 'Импортирование голого кода' debian/<пакет> source-dist версия_основной_ветки_<версия|tr . _>
Вы можете изменить тег ветви source-dist на что пожелаете. (Сопровождающий cvs-buildpackage обычно использует тег основной ветки разработки (что является упражнением в избыточности ;-))).
Если вы настроили CVS как суперпользователь, и не настроили групповые права на запись, вам нужно создать $CVSROOT/debian/<пакет> от лица суперпользователя и изменить группу или владельца в репозитории на определённую группу или, соответственно, пользователя. Импорт в CVS выведет предупреждение, что не удаётся создать каталог debian/<пакет>, но это нормально.
Следующим шагом является извлечение всего дерева и встраивание всех ваших изменений.
$ cd /где/будет/находиться/ваше/дерево/исходного/кода $ cvs checkout <пакет>
Если вы уже создали версию в формате Debian, но ещё не использовали CVS, вы может потребоваться выполнить следующие команды для того, чтобы встроить ваши изменения. После этого вы должны пометить выпуск тегом, чтобы в дальнейшем иметь возможность извлекать его.
$ cd /где/находится/ваше/дерево/исходного/кода<пакет>-<версия> $ diff -qrBbw . /где/будет/находиться/ваше/дерево/исходного/кода/<пакет>/ | grep -v CVS $ FILES_CHANGED_LOCALLY="<вывод команды выше>" $ tar cf - $FILES_CHANGED_LOCALLY | tar -C /где/будет/находиться/ваше/дерево/исходного/кода/<пакет> -xvpf - $ cd /где/будет/находиться/ваше/дерево/исходного/кода/<пакет>
Убедитесь, что файл debian/rules исполняем, поскольку он должен быть исполняем при экспортировании, и при выполнении dpkg-buildpackage на экспортированном исходном коде не возникнут проблемы. Вообще, убедитесь, что все файлы имеются правильные права до того, как добавлять их в CVS-репозиторий.
$ cd /где/будет/находиться/ваше/дерево/исходного/кода/<пакет> $ cvs add debian <любые другие добавленные файлы>
Кроме того, заметьте, что вы должны добавить все дополнительные файлы, которые должны быть помещены в репозиторий, вручную, в особенности все файлы в подкаталоге debian. Кроме того, заметьте, что команда cvs add не работает рекурсивно, поэтому вам следует вручную добавить все подкаталоги, которые у вас есть. (cd debian; cvs add *)
Запуск cvs update покажет вам статус всех файлов в каталоге.
$ cd /где/будет/находиться/ваше/дерево/исходного/кода/<package> $ cvs update
Вывод может быть таким:
cvs update: Updating . M Makefile cvs update: Updating debian A rules ? example1M означает, что файл изменён (изменение должно быть внесено в репозиторий), A означает, что файл добавлен (изменение должно быть внесено в репозиторий), ? означает, что CVS не известно об этом файле (может быть он должен быть добавлен?). Когда вы будете удовлетворены, и ничего не будет упущено, а все файлы будут иметь правильные права, вы будете готовы поместить изменения в репозиторий.$ cd /где/будет/находиться/ваше/дерево/исходного/кода/<пакет> $ cvs commit -m 'Сделал все debian-изменения' $ cvs tag debian_версия_<версия|tr . _>-<debian-ревизия|tr . _> .
Новое дерево исходного кода будет находиться в каталоге, которые не содержит номера версии. Это, как мы увидим позже, не является проблемой.
Если вы создаёте каталог debian с нуля (это может быть проще, но не так автоматизировано):
$ mkdir debian
Создайте все нужные файлы debian и добавьте в систему контроля.
$ cvs add debian $ cd debian $ cvs add *
После внесите изменения, чтобы все ваши файлы были добавлены.
$ cd /где/будет/находиться/ваше/дерево/исходного/кода/<пакет> $ cvs commit -m <какое-то сообщение>
- Подготовка выпуска
До того, как вы сможете запустить некоторые команды Debian, которые соберут пакет, вам следует извлечь модуль без всех подкаталогов CVS. Это делается с помощью команды «export». Но, во-первых, вам следует внести все ваши изменения и пометить их номером выпуска.
$ cvs commit -m <сообщение> $ cvs tag debian_версия_<версия|tr . _>-<debian-ревизия|tr . _>
- Делаем выпуск
Вы можете либо использовать механизм cvs-buildpackage (что предпочтительно), либо экспортировать всё вручную. Во-первых, проверьте cvs-buildpackage во время простого выполнения (убедитесь, что теги совпадают) так (нужен настроенный /etc/cvsdeb.conf):
$ cvs-buildpackage -d -n -rsudo
Затем фактически запустите команду, где sudo — программа, которую вы хотите запустить с правами суперпользователя.
$ cvs-buildpackage -rsudo
Либо сделайте всё это вручную:
Извлеките пакет.
$ cvs export -d <пакет>-<версия> -r debian_версия_<версия|tr . _>-<debian-ревизия|tr . _> <пакет>
Теперь вы можете продолжить выполнение обычного механизма экспорта выпуска.
Готово! Поздравляем! Вот ещё несколько задач, которые вы можете выполнить на вашем дереве исходного кода:
- Удалите или переименуйте файл
Обычным способом перемещения файла является копирование СТАРОГО файлы в НОВЫЙ, затем вызов обычных команд CVS для удаления СТАРОГО файла из репозитория и добавление НОВОГО файла в репозиторий. (И СТАРЫЙ, и НОВЫЙ файлы могут содержать относительные пути, напр. «foo/bar.c»).
$ mv СТАРЫЙ НОВЫЙ $ cvs remove СТАРЫЙ $ cvs add НОВЫЙ $ cvs commit -m "Переименовал СТАРЫЙ в НОВЫЙ" СТАРЫЙ НОВЫЙ
Это самый простой способ переместить файл, этот способ не подвержен ошибкам и сохраняет историю того, что было сделано. Заметьте, что для доступа к истории файла, вам следует указать старое или новое имя в зависимости от того, к какой части истории вы хотите получить доступ. Напр., «cvs log СТАРЫЙ» выдаст журнал изменений вплоть до момента переименования файла.
- Обновление модуля командой import
Когда появится новый выпуск исходного кода, вы импортируете его в репозиторий с помощью той же команды «import», которую вы использовали для настройки репозитория в начале. Единственная разница состоит в том, что вы указываете в этот раз другой тег выпуска и другое сообщение.
$ cd /где/будет/находиться/ваше/дерево/исходного/кода/<новый каталог исходного кода> $ cvs import -m 'Импортирование нового выпуска' debian/<пакет> source-dist версия_ основной_ветки_<версия|tr . _>
Теперь нам нужно включить сделанные нами изменения в новую ревизию. Лучшим способом сделать это является следующий: выйдете из вашей рабочей копии (основанной на более старом выпуске основной ветки) и извлеките новую копию пакета, добавляя сделанные изменения в исходный код основной ветки. Вот как это сделать:
$ cd /где/будет/находиться/ваше/дерево/исходного/кода $ mv <пакет> <пакет>.old $ cvs checkout -jsource-dist:yesterday -jsource-dist <пакет> $ cd /где/будет/находиться/ваше/дерево/исходного/кода/<пакет>
Команда, приведённая выше, извлекает последнюю ревизию <пакета>, внося изменения, сделанные в ветке поставщика «source-dist» со вчерашнего дня в рабочую копию. Если возникнут какие-либо конфликты во время внесения изменений, они должны быть разрешены обычным путём. Затем, изменённые файлы можно будет внести в репозиторий.
Использование даты, как предложено выше, предполагает, что вы не импортируете более одного выпуска продукта за один день. Если вы импортируете более одного выпуска, вы всегда можете использовать следующую команду:
$ cvs checkout -jверсия_основной_ветки_<старая_версия|tr . _> -jверсия_основной_ветки_<новая_версия|tr . _> <пакет>
В этом случае две команды, приведённые выше, эквивалентны.
Для файлов, которые не были изменены локально, заново созданная ревизия становится головной ревизией.
Поэтому, проверьте, все ли файлы правильно обновлены. В особенности, на забудьте изменить файл debian/changelog!
Когда вы будете удовлетворены, вы можете удалить старую версию его каталога. Убедитесь, что удаляете правильный каталог!
$ rm -rf ../<пакет>.old
Теперь вы готовы к подготовке выпуска.
- Удалите дерево исходного кода для сохранения пространства на диске
Для удаления фактического рабочего дерева исходного кода, не рекомендуется использовать rm -rf, используйте команду CVS, которая также проверит, сделали ли вы какие-либо локальные изменения, которые ещё не были внесены в репозиторий.
$ cd /где/будет/находиться/ваше/дерево/исходного/кода/ $ cvs release -d <пакет>
- Глоссарий
Теги символические имена для ревизий Репозиторий архив исходного кода
- Дополнение:
A: СОГЛАШЕНИЯ О ТЕГАХ В CVS
|================================================================================================| |версия основной ветки разработки | <версия> | |ревизия Debian | <ревизия> | |имя файла orig tar | пакет_<версия>.orig.tar.gz | |имя пакета Debian | пакет_<версия>-<ревизия>_<архитектура>.deb | |CVS тег поставщика | версия_основной_ветки_<версия | tr . _> | |CVS текущий тег | debian_версия_<ревизия | tr . _> | |================================================================================================|
Примеры:
|=================================================================================| | | исходный код основной ветки | пакет Debian | |=================================================================================| |версия основной ветки | 2.76 | 3.38 | |ревизия Debian | 1.2 | | |имя файла orig tar | make_2.76.orig.tar.gz | | |имя пакета Debian | make_2.76-1.2_i386.deb | kpkg_3.38_i386.deb | |CVS тег поставщика | версия_основной_ветки_2_76 | версия_основной_ветки_3_38 | |CVS текущий тег | debian_версия_2_76-1_2 | debian_версия_3_38 | |=================================================================================|
Заметьте, что числа эпох игнорируются во время определения имени тега CVS (обычно они используются для изменения мнения dpkg о порядке пакетов, и не релевантны для тегов CVS).
