Использование 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.

  1. Настройка 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
    
  2. Использование модулей
       # cvs checkout CVSROOT
       # cd CVSROOT
       # vi modules
    

    В дальнейшем <пакет> будет именем пакета, совпадающим с таковым в файле debian/changelog.

    Добавьте следующие строки, первая необходима, вторая может быть дублирована и является очевидной:

       modules   CVSROOT modules
       <пакет> debian/<пакет>
    
       # cvs commit -m 'Определите первые модули'
    
  3. Подготовка к использованию 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
           ? example1
    
    M означает, что файл изменён (изменение должно быть внесено в репозиторий), 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 <какое-то сообщение>
    
  4. Подготовка выпуска

    До того, как вы сможете запустить некоторые команды Debian, которые соберут пакет, вам следует извлечь модуль без всех подкаталогов CVS. Это делается с помощью команды «export». Но, во-первых, вам следует внести все ваши изменения и пометить их номером выпуска.

       $ cvs commit -m <сообщение>
       $ cvs tag debian_версия_<версия|tr . _>-<debian-ревизия|tr . _>
    
  5. Делаем выпуск

    Вы можете либо использовать механизм cvs-buildpackage (что предпочтительно), либо экспортировать всё вручную. Во-первых, проверьте cvs-buildpackage во время простого выполнения (убедитесь, что теги совпадают) так (нужен настроенный /etc/cvsdeb.conf):

       $ cvs-buildpackage -d -n -rsudo
    

    Затем фактически запустите команду, где sudo — программа, которую вы хотите запустить с правами суперпользователя.

       $ cvs-buildpackage -rsudo
    

    Либо сделайте всё это вручную:

    Извлеките пакет.

       $ cvs export -d <пакет>-<версия> -r debian_версия_<версия|tr . _>-<debian-ревизия|tr . _> <пакет>
    

    Теперь вы можете продолжить выполнение обычного механизма экспорта выпуска.


    Готово! Поздравляем! Вот ещё несколько задач, которые вы можете выполнить на вашем дереве исходного кода:


  6. Удалите или переименуйте файл

    Обычным способом перемещения файла является копирование СТАРОГО файлы в НОВЫЙ, затем вызов обычных команд CVS для удаления СТАРОГО файла из репозитория и добавление НОВОГО файла в репозиторий. (И СТАРЫЙ, и НОВЫЙ файлы могут содержать относительные пути, напр. «foo/bar.c»).

       $ mv СТАРЫЙ НОВЫЙ
       $ cvs remove СТАРЫЙ
       $ cvs add НОВЫЙ
       $ cvs commit -m "Переименовал СТАРЫЙ в НОВЫЙ" СТАРЫЙ НОВЫЙ
    

    Это самый простой способ переместить файл, этот способ не подвержен ошибкам и сохраняет историю того, что было сделано. Заметьте, что для доступа к истории файла, вам следует указать старое или новое имя в зависимости от того, к какой части истории вы хотите получить доступ. Напр., «cvs log СТАРЫЙ» выдаст журнал изменений вплоть до момента переименования файла.

  7. Обновление модуля командой 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
    

    Теперь вы готовы к подготовке выпуска.

  8. Удалите дерево исходного кода для сохранения пространства на диске

    Для удаления фактического рабочего дерева исходного кода, не рекомендуется использовать rm -rf, используйте команду CVS, которая также проверит, сделали ли вы какие-либо локальные изменения, которые ещё не были внесены в репозиторий.

       $ cd /где/будет/находиться/ваше/дерево/исходного/кода/
       $ cvs release -d <пакет>
    
  9. Глоссарий
       Теги		символические имена для ревизий
       Репозиторий	архив исходного кода
    
  10. Дополнение:

    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).