On Thu, Aug 30, 2007 at 08:01:48PM +0400, Dmitry V. Levin wrote: > On Thu, Aug 30, 2007 at 03:06:41PM +0400, Alexey Tourbin wrote: > > Теперь детализирую эти идеи на псведокоде. Знак "=" касается > > структур данных, знак "::" означает функцию, стрелка "->" > > означает тип (сигнатуру) функции. > > Не смог понять этот псведокод. Где можно ознакомиться с описанием? Шелл-код не позволяет определять сигнатуру функции, то есть данные какого типа функция получает на входе и данные какого типа у неё на выходе. Поэтому сразу писать на шелле смысла нет, если мы определяемся с информацией типа чево куда пойдёт. Вообще-то лучше всего описывать преобразование абстрактных типов данных позволяет язык типа Хаскелль. Я его плохо знаю. Кажется, два человека в team хорошо знают Хаскелль, но это прямо сейчас вряд ли поможет. Мой псевдокод, тем не мене, почти произволен. Я лишь полагаюсь на то, что он вызовет правильные ассоциации. Остается только перевести на русский. gear-request = gear-repo commit-id packager = invoker gear-request -- это структура данных, которая включает в себя путь к gear-репозитарию, commit-id для сборки и packager, которым считается тот, кто дал запрос на сборку. build_arch :: gear-request -> build_arch_status can_build_srpm = gear hsh --build-args=-bs srpm_NSVR = rpm -qp srpm BuildRequires = rpm -qpR srpm buildroot_base = hsh --initroot, hsh-shell rpm -qa buildroot_BR = hsh-install BuildRequires, hsh-shell rpm -qa buildroot_BR = buildroot_BR \setminus buildroot_base hasher_exit_status = gear hsh build_arch_status = gear-request can_build_srpm srpm_NSVR BuildRequires buildroot_base buildroot_BR hasher_exit_status RPMS.hasher/*.rpm Функция build_arch собирает gear-репозитарий для данной архитектуры. На входе она берёт gear-request, а на выходе отдаёт структуру данных build_arch_status, которая включает в себя gear-request, can_build_srpm -- возможность превичной запаковки src.rpm пакета из gear-репозитария, srpm_NSVR -- "%name %serial:%version-%release", BuildRequires -- зависимости src.rpm пакета, buildroot_base -- содержимое сборочного чрута после --initroot, buildroot_BR -- дополнительные пакеты, которые поставились в чрут для сборки, hasher_exit_status -- собрался пакет или нет, и RPMS.hasher/*.rpm -- собранные пакеты. check_build_status :: build_arch_status+ -> pkg_build_status | reject all primary arches must build (hasher_exit_status = 0 for primary_arches) all srpm_NSVR must be the same (map this.srpm_NSVR build_arch_status+ |sort -u |wc -l => 1) require that $(basename gear-request.gear-repo .git) exactly matches srpm_NSVR.name if has public gear-request.gear-repo; then check commit ancestry $(public gear-repo) gear-request.commit-id fi if at least one RPMS.hasher/*.rpm is noarch; then # noarch packages must build essentially the same on all arches # otherwise we DO NOT KNOW how to move them to sisyphus RPMS.hasher/*.rpm set must be the same for all arches rpm -qpl set must be the same for each RPMS.hasher/*.rpm for all arches rpm -qp --requires set must be the same for each RPMS.hasher/*.rpm for all arches rpm -qp --provides set must be the same for each RPMS.hasher/*.rpm for all arches, etc. fi pkg_build_status = pkg = srpm_NSVR build_arch_status+ Фунция check_build_status дает простой ответ на сложный вопрос: собрался пакет или нет. На входе она берёт массив build_arch_status (результаты сборки на всех архитектурах), а на выходе возвращает "maybe pkg_build_status" (в терминах хаскелля), то есть если ответ "да", то она возвращает структуру pkg_build_status, а если ответ "нет" то она возвращает reject (аналог NULL + отлуп maintainer'у -- типа всё дело, закрыто). В псевдокоде подразумевается reject, когда не выполняется какое-то условие. Условия эти такие: Пакет должен собраться на всех основных архитектурах. У всех полученных src.rpm пакетов должен совпадать NSVR. (новое требование) Название gear-репозитария и src.rpm пакета должны совпадать. Если в результатах сборки есть хотя бы один noarch пакет, то На всех архитектурах список RPMS.hasher/*.rpm должен совпадать На всех архитектурах для каждого собранного пакета вывод rpm -qpl должен совпадать. Далее вывод rpm -qp --requires, rpm -qp --provides и т.д. Возвращаемая структура pkg_build_status, по сути содержит всего одно новое поле -- это имя src.rpm пакета (а также версию-релиз), которые теперь удалсь точно установить. В остальном она просто "заворачивает" в себя входной массив build_arch_status.