[devel] пакеты копировать нельзя

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Пн Фев 16 12:28:55 MSK 2009


Нельзя копировать собранные пакеты из одного репозитария
в другой (напр. между sisyphus и 5.0).

Сборку пакета можно (и нужно) рассматривать как процесс,
который реализует функцию

B(S,C)->P

где
B - процедура сборки (реализуется хешером),
S - src.rpm пакет с исходным кодом,
С - содержимое сборочной среды.

Это означает, что есть два основных фактора, которые определяют
результат сборки пакетов: исходный код и среда, в которой был собран
пакет.

Распишем подробнее C.  Пусть

U - полный набор пакетов в репозитарии (универсум пакетов).

Тогда среда C для сборки пакета S - это

C = C(S,U) = C0(U) + C1(S,U)

где

C0 - процедура инициализации базового сборочного чрута (и соответствующий
список пакетов в базовом сборочном чруте),
C1 - процедура установки в базовый сборочный чрут дополнительных
зависимостей BuildRequires пакета S (и соответствующий список пакетов,
который является замыканием зависимостей BuildRequires пакета S).

Если один и тот же пакет с исходным кодом S был собран в разных средах
Ca и Cb, то необходимо считать, что результат сборки отличается:

B(S,Ca)->Pa
B(S,Cb)->Pb
Ca!=Cb => Pa!=Pb

Принцип "B(S,C)->P" ложится в основу модели данных репозитария с
условным названием "метерепозитарий".  Метарепозитарий должен точно
описывать историю развития репозитария и изменения всех его
характеристик.  История метарепозитария описывается в терминах
"коммитов".  Коммит описывает прохождение одного нового пакета
в репозитарий, используя набор данных (S,C0,C1,P).  (Если в задание
добавлено несколько пакетов на сборку, а не один пакет, то будет
несколько таких наборов данных; коммит соответствует транзакции,
а задания проводятся транзакционно).  То есть история изменения
репозитария описывается в терминах коммитов, которые фиксируют
характеристики исходного пакета для сборки, характеристики базовой
сборочной среды C0 и дополнительных пакетов C1 из BuildReuires,
и характеристики собранных пакетов.

Целостная история репозитария -- это когда каждый вновь входящий пакет
собирается на свежем, текущем состоянии репозитария.  Тогда собранные
пакеты добавляются/обновляются/замещаются в репозитарии:

Ub = Ua + P.

Если данный пакет был собран на универсуме Ua, то следующий пакет уже
будет собран на другом универсуме - Ub.

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

Вообще, не существует пакетов в отрыве от той среды, в которой они были
собраны, и, значит, в отрыве от истории репозитария.  Нельзя войти в
одну реку дважды.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 197 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20090216/746032d8/attachment.bin>


Подробная информация о списке рассылки Devel