<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>60847</bug_id>
          
          <creation_ts>2026-10-07 10:18:13 +0300</creation_ts>
          <short_desc>apt-get -s ложно сообщает &quot;E: Conf Broken&quot; при замене установленного пакета через Obsoletes (Provides+Obsoletes того же имени)</short_desc>
          <delta_ts>2026-10-07 10:18:13 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>apt</component>
          <version>unstable</version>
          <rep_platform>all</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alexander Makeenkov">amakeenk</reporter>
          <assigned_to name="placeholder@altlinux.org">placeholder</assigned_to>
          <cc>boyarsh</cc>
    
    <cc>glebfm</cc>
    
    <cc>imz</cc>
    
    <cc>ldv</cc>
    
    <cc>placeholder</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>301387</commentid>
    <comment_count>0</comment_count>
    <who name="Alexander Makeenkov">amakeenk</who>
    <bug_when>2026-10-07 10:18:13 +0300</bug_when>
    <thetext>При попытке посмотреть план установки/обновления через симуляцию
(&quot;apt-get install -s&quot;, &quot;apt-get dist-upgrade -s&quot;) apt помечает план
сломанным с ошибкой &quot;E: Conf Broken &lt;пакет&gt;&quot;, если устанавливаемый пакет
заменяет установленный через одновременное Provides и Obsoletes того же
имени (стандартная схема слияния подпакета в основной пакет):

    Provides:  &lt;старое-имя&gt; = %EVR
    Obsoletes: &lt;старое-имя&gt; &lt; %EVR

При этом реальная (без -s) установка/dist-upgrade выполняются штатно, и
&quot;rpm -Uvh --test&quot; пакета проходит успешно — метаданные корректны,
ломается только режим симуляции apt.

Шаги воспроизведения
====================

1. Установить пакет demo-color-1:1.0-alt1:

    Name: demo-color
    Epoch: 1
    Version: 1.0
    Release: alt1

2. Поместить в репозиторий пакет demo-1:2.0-alt1:

    Name: demo
    Epoch: 1
    Version: 2.0
    Release: alt1
    Provides:  demo-color = 1:2.0-alt1
    Obsoletes: demo-color &lt; 1:2.0-alt1

3. Симуляция:

    # apt-get install -s demo
    Следующие пакеты будут ЗАМЕНЕНЫ:
      demo-color  (by  demo)
    Следующие НОВЫЕ пакеты будут установлены:
      demo
    0 будет обновлено, 1 новых установлено, 1 пакетов будет заменено, 0 пакетов будет удалено и 0 не будет обновлено.
    Inst demo (1:2.0-alt1) [demo on demo-color] []
    Conf demo broken
     Obsoletes:demo-color
     []
    E: Conf Broken demo

    (код возврата 100)

4. Реальная установка — успешна:

    # apt-get install demo
    Следующие пакеты будут ЗАМЕНЕНЫ:
      demo-color  (by  demo)
    ...
    Совершаем изменения...
    Обновление / установка...
    Очистка / удаление...
    Завершено.
    (demo-color корректно удаляется, код возврата 0)

5. Для контраста: &quot;rpm -Uvh --test demo-2.0-alt1.noarch.rpm&quot; проходит с
   кодом 0.

Фактический результат
=====================

apt-get -s / dist-upgrade -s помечают пакет &quot;broken&quot; и возвращают
E: Conf Broken &lt;пакет&gt; (rc=100), из-за чего любые инструменты и
автотесты, строящие план через симуляцию, получают ложную ошибку.

Ожидаемый результат
===================

Симуляция строит тот же план, что и реальная установка: замена
demo-color на demo без ошибок, rc=0.

Живой триггер в p11
===================

Задание p11+433924 (fonts-ttf-google-noto-emoji-1:2.051-alt1) слило
бывший подпакет fonts-ttf-google-noto-emoji-color в основной пакет с
такой же парой Provides/Obsoletes. На любой системе p11 с установленным
fonts-ttf-google-noto-emoji-color-1:2.042-alt1 (штатно входит в
Workstation 11.2):

    # apt-get update
    # apt-get dist-upgrade -s
    ...
    E: Conf Broken fonts-ttf-google-noto-emoji

Реальный &quot;apt-get dist-upgrade&quot; при этом проходит штатно.

Анализ (по исходникам packages/gears/a/apt.git)
===============================================

1. Различие путей (cmdline/apt-get.cc): при -s после работы
   pkgProblemResolver вызывается pkgSimulate (apt-pkg/algorithms.cc),
   которая проигрывает операции; реальный прогон идёт через
   pkgRPMPackageManager, и rpm сам корректно обрабатывает obsoletes.

2. Ошибки рождаются в pkgSimulate:
   - algorithms.cc:111  &quot;Fatal, conflicts violated %s&quot;
     (pkgSimulate::Install)
   - algorithms.cc:167  &quot;Conf Broken %s&quot;
     (pkgSimulate::Configure, условие Sim[Pkg].InstBroken()==true)

3. pkgDepCache::CheckDep (apt-pkg/depcache.cc): для Dep::Obsoletes после
   проверки версии base-пакета стоит безусловный &quot;return false&quot; —
   provides не учитываются и, главное, не учитывается пометка цели на
   удаление; удовлетворённость obsoletes-зависимости фактически
   опирается на Now-состояние цели.

4. pkgDepCache::MarkInstallRec (apt-pkg/depcache.cc, обработка
   Conflicts/Obsoletes): цель помечается на удаление только если
   &quot;InstallVer == конфликтующая версия&quot;; для уже помеченной на удаление
   цели (InstallVer==0) происходит continue, что при повторном проходе
   (pkgSimulate::Install вызывает MarkInstall заново) даёт рассинхрон
   состояния depcache и ложный InstBroken().

Возможные направления исправления: либо учитывать Delete-флаг цели в
CheckDep для Obsoletes (obsoletes-зависимость считается удовлетворённой,
если цель помечена на удаление), либо синхронизировать pkgSimulate с
реальным путём pkgRPMPackageManager для этого случая.

Дополнительно
=============

Похожее ложное срабатывание в режиме -s наблюдается и для других
конфликтующих обновлений ветки: на актуальном p11 &quot;apt-get dist-upgrade -s&quot;
дополнительно выдаёт &quot;E: Fatal, conflicts violated xxd&quot; (vim/xxd), хотя
реальный dist-upgrade обновляет xxd штатно. Вероятно, та же категория
проблемы pkgSimulate, но с версионным Conflicts; при необходимости могу
прислать отдельный минимальный пример и для этого случая.

Смежный баг (похожая область кода — обработка Conflicts/Obsoletes при
совпадении имён с Provides, но другой сценарий: self-conflict при
--reinstall и реальный, а не симулированный прогон):
https://bugzilla.altlinux.org/36421

Окружение проверки
==================

- Sisyphus: ALT Server 11.2sisyphus_alpha (Mendelevium),
  apt-0.5.15lorg2-alt103, воспроизведено на синтетических пакетах demo /
  demo-color (локальный репозиторий).
- p11: ALT Workstation 11.2 (Prometheus), apt 0.5.15lorg2 (сборка от
  26.01.2026), воспроизведено на живом примере
  fonts-ttf-google-noto-emoji (p11+433924).</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>