From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:subject:message-id:mime-version:content-disposition :content-transfer-encoding:user-agent; bh=h/Mq94uiQasSUNC7ZcKGscf29DxFV2IzdlSLmrIlmaE=; b=lEk+SorbXpnjdSdbLwAyvsRU83U1SC5jbFdjdDtZbYOKY7by+prtngK5gX7gPtOPwT KvRFAAkR2L0J3rK9/3DkzW0ObTKAYPAxSXljmLwQjlfHjr9qGrC5sHVu+RJk8LfOYRN/ dsqfrwC1EfTNNeqLEWY/X2KnF4M2bujjtw6dTXQo1Vw3tvZBE4yt7KKxm2pbdcajfMIa C5978u5d4J37T/jX+TGDzt2P5eKF3h+McG6tIIXYjL/49SWABleVC6jgTxZtKzcedz/1 TvjqBJo66rHJvfuY4pM2TbNga09HvBHixEu65RGVilGqoOzbYzgTyW5d7QsCTzgxc0TV p/+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:subject:message-id:mime-version :content-disposition:content-transfer-encoding:user-agent; bh=h/Mq94uiQasSUNC7ZcKGscf29DxFV2IzdlSLmrIlmaE=; b=m/a9g8LZxXXEWhZJ0aMITwg66RT7O3gALP05ELWNi7svZV5Gg6Xxzrz9n49enSckvG DFcEj3fz6a1zhmVCTBGJKk7jwBm2c1c/eM88thDx6rqJR5NqMwqDJBhmBN6ZxTciwHpq 4hk2IExL1A8B3fE/o4xh20+7Lmt4ryDRo5xwZEam2hbgNGyFBc+8RgRl/8rzZ6LYaThl rq3pTGLNlruYORt0YhOXTCfVbU3itWLFmzfgqobKQ/WCtYi2y82kyWGG9VW5TmDY1l5t AKEGf7dhHVpkZNMdXIRj+7CUbpN1VSB3K4wMmT2TMZ9co8wg91rkCuPZGwAUyU8D10yC 9lWA== X-Gm-Message-State: APjAAAV5erLCMeYEeEzAFhEcomg9VirPU4LdQ9thEhxKoWAru3Frr6Ry RvintXQ9qzY+bBnk1AmVBkhJrQZ1 X-Google-Smtp-Source: APXvYqzsatwDH72AHGQVHCHEnvEdYq4sJrfuyTYYprhljuPzwCfSsFpn2w63yMWv7LytCdM4vf0H8g== X-Received: by 2002:a2e:4504:: with SMTP id s4mr25974271lja.150.1553856232778; Fri, 29 Mar 2019 03:43:52 -0700 (PDT) Date: Fri, 29 Mar 2019 13:43:48 +0300 From: Alexey Tourbin To: devel@lists.altlinux.org Message-ID: <20190329104348.GA32566@celery.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit User-Agent: Mutt/1.10.1 (2018-07-13) Subject: [devel] rebuild without bumping release X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux Team development discussions List-Id: ALT Linux Team development discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 29 Mar 2019 10:43:56 -0000 Archived-At: List-Archive: List-Post: Мужчины, оказывается у вас теперь можно пересобирать пакеты без увеличения релиса. Файлы %{Name}-%{Version}-%{Release}.%{Arch}.rpm в репозитории переписываются поверх старых, а apt будет обновлять их по изменившемуся %{BuildTime}. В связи с этим несколько технических замечаний. == Перезапись .src.rpm == При пересборке из /gears будет замещен .src.rpm пакет https://bugzilla.altlinux.org/show_bug.cgi?id=27840#c16 тогда как почти всегда этого можно не делать. В частности, если у .src.rpm пакета не изменились запакованные файлы и зависимости, то этого точно можно не делать (это похоже на критерий "extensional equality", который советует делать noarch пакеты). Репозиторий src.rpm пакетов не бесполезен, на нем можно проверять сборочные зависимости (почти так же, как apt-cache unmet проверят установочные зависимости). Строгая проверка, которая не дает ложных срабатываний, возможна только для той архитектуры, для которой .src.rpm файлы отбираются в files/SRPMS; по-моему сейчас это i586. Вероятно, есть смысл отбирать пакеты в files/SRPMS из x86_64, поскольку именно она давно уже стала основной архитектурой. == Перезапись .noarch.rpm == Пересборка без увеличения релиса удобна в случае пересборки клиентов с новыми версиями библиотек; при этом noarch-подпакеты, такие как foo-doc, должны остаться без изменений; их тоже можно было бы не замещать. Но теперь они получат зависимости с disttag+task, и поэтому критерий extensional equality к ним не применим (пересобранные пакеты всегда будут отличаться из-за таска). Возможно, стоило бы ослабить межпакетные зависимости при пересечении границы arch/noarch: вместо EVR:disttag+task требовать только EVR:disttag. Это дало бы возможность не переписывать noarch-пакеты. Но ведь noarch-пакетами все не ограничивается. Так, при пересборке библиотеки по идее должен измениться только подпакет libfoo, а libfoo-devel должен остаться прежним. Хорошо бы не переписывать и libfoo-devel. Сделать это, к сожалению, сложно. Я продумывал схему, как передать в rpmbuild информацию об уже имеющихся собранных подпакетах. Тогда в конце сборки rpmbuild сможет решить, какие подпакеты экзистенционально равны, и скорректировать зависимости у некоторых подпакетов, чтобы исключить переписывание/обновление. Но это не работает как следует, потому что у зависимостей есть направление: пакет libfoo-devel требует libfoo. Если в libfoo-devel зашита строгая зависимость на libfoo, то не обновлять его нельзя. Почему не удается придумать хорошей схемы с частичным переписыванием подпакетов? Может, это очевидно, но до меня почему-то не сразу дошло. Строгие зависимости с EVR:disttag+task направлены на то, чтобы запретить совмещение пакетов из разных сборок. А частичное переписывание как раз направлено на совмещение пакетов из разных сборок. Это не просто разные, а противоположные цели. == Пропатчивание индексов == Переписывание *.rpm пакетов поверх старых усложняет генерацию нового pkglist.classic файла на основе старого pkglist.classic файла (это еще как следует не реализовано). Если исходить из того, что сборочная система не переписывает *.rpm пакеты, то перекомпоновка записей в pkglist.classic реализуется легко: пусть имеется предыдущее состояние pkglist.classic и новое состояние RPMS.classic/. Тогда все записи из pkglist.classic, для которых в RPMS.classic/ есть пакет, кочуют в новый pkglist.classic (совпадения по имени .rpm файла достаточно). Теперь же совпадения по имени .rpm файла становится недостаточно. Причем чтобы схема перекомпоновки работала быстро, нужно ограничиваться только stat-информацией (читать каждый .rpm пакет - гиблое дело). На практике для идентификации пакетов st_size+st_mtime работают достаточно хорошо. Тогда для сравнения записей и пакетов нужно хранить в записи дополнительный таг, CRPMTAG_FILEMTIME (а CRPMTAG_FILESIZE уже хранится). Поскольку там уже хранится и RPMTAG_BUILDTIME, то можно попытаться отождествить FILEMTIME и BUILDTIME. Для этого придется выставлять st_mtime в BUILDTIME. Но может это и не очень хорошо, поскольку st_mtime может меняться по уважительной причине (из-за подписывания пакета). Вообще, чтобы перекомпоновка работала как следует, нужно держать две версии записей: более полную версию в pkglist.classic+bloat и обычную версию для пользователя pkglist.classic. В pkglist.classic+bloat у каждой записи будет полный список файлов, а в pkglist.classic - урезанный, направленный на удовлетворение файловых зависимостей. Поэтому обычный pkglist.classic использовать для перекомпоновки нельзя. Потому что список требуемых файлов у каждой записи зависит от других записей. Так что новый genpkglist должен концептуально работать в два прохода: сначала перекомпоновать pkglist.classic+bloat, а потом отжать из него pkglist.classic. При такой схеме хранить таг CRPMTAG_FILEMTIME можно только в pkglist.classic+bloat. Индекс pkglist.classic+bloat и псевдорепозиторий classic+bloat не бесполезны, у них просматривается несколько применений: - сборочная система в любом случае генерирует bloat-репозиторий, когда пакетов в таске больше одного; - аналогично при сборке нескольких пакетов в хешере иногда возникают неудовлетворенные файловые зависимости; для обхода этой проблемы можно вручную скопировать пакет из репозитория в RPMS.hasher, но это тяжело автоматизировать; вместо этого можно будет настроить хешер на classic+bloat; - генерация contents_index; - отслеживание файловых конфликтов (об этом - в другой раз).