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

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

    <bug>
          <bug_id>36872</bug_id>
          
          <creation_ts>2019-06-06 12:24:10 +0300</creation_ts>
          <short_desc>сломался pkgfind(kernel-image-std-def#1:4.19.46-alt1)</short_desc>
          <delta_ts>2019-06-13 14:26:36 +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>CLOSED</bug_status>
          <resolution>WORKSFORME</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>35529</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Sergey V Turchin">zerg</reporter>
          <assigned_to name="Ivan Zakharyaschev">imz</assigned_to>
          <cc>boyarsh</cc>
    
    <cc>glebfm</cc>
    
    <cc>imz</cc>
    
    <cc>ldv</cc>
    
    <cc>placeholder</cc>
    
    <cc>vt</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>182263</commentid>
    <comment_count>0</comment_count>
    <who name="Sergey V Turchin">zerg</who>
    <bug_when>2019-06-06 12:24:10 +0300</bug_when>
    <thetext>pkgfind() в скриптах перестал находить пакет ядра при агрументе вида kernel-image-std-def#1:4.19.46-alt1

Предлагаю починить или хотя бы сказать, что указать для
rpmbuiqry -qf --qf &apos;%{ХРЕНЗНАЕТ}&apos; /boot/vmlinuz-4.19.46-std-def-alt1`
чтоб добыть тот ID.

Конкретно, в apt-scripts-nvidia проблема.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182266</commentid>
    <comment_count>1</comment_count>
    <who name="Ivan Zakharyaschev">imz</who>
    <bug_when>2019-06-06 12:32:48 +0300</bug_when>
    <thetext>Я ещё посмотрю в apt-scripts-nvidia -- что можно сделать попереносимее.

&gt; Предлагаю починить или хотя бы сказать, что указать для
rpmbuiqry -qf --qf &apos;%{ХРЕНЗНАЕТ}&apos; /boot/vmlinuz-4.19.46-std-def-alt1`
чтоб добыть тот ID.

Ну да, я бы исходил из того, что нельзя полагаться на конкретный формат этого ID. (Как его сформирует APT, может меняться от версии к версии.)

Например, в remove-old-kernels теперь даётся команда apt-get remove kernel-image-std-def=1:4.19.46-alt1 (со знаком &quot;равно&quot;).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182267</commentid>
    <comment_count>2</comment_count>
    <who name="Sergey V Turchin">zerg</who>
    <bug_when>2019-06-06 12:49:59 +0300</bug_when>
    <thetext>(В ответ на комментарий №1)
&gt; kernel-image-std-def=1:4.19.46-alt1 (со знаком &quot;равно&quot;).
Для pkgfind() не работает.
В каком формате можно указать для pkgfind()?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182274</commentid>
    <comment_count>3</comment_count>
    <who name="Sergey V Turchin">zerg</who>
    <bug_when>2019-06-06 14:52:02 +0300</bug_when>
    <thetext>При этом pkgfind(&quot;kernel-image-std-def#1:4.19.46-alt1@1559056711&quot;) работает</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182287</commentid>
    <comment_count>4</comment_count>
    <who name="Ivan Zakharyaschev">imz</who>
    <bug_when>2019-06-07 12:01:18 +0300</bug_when>
    <thetext>(In reply to comment #0)
&gt; pkgfind() в скриптах перестал находить пакет ядра при агрументе вида
&gt; kernel-image-std-def#1:4.19.46-alt1
&gt; 
&gt; Предлагаю починить или хотя бы сказать, что указать для
&gt; rpmbuiqry -qf --qf &apos;%{ХРЕНЗНАЕТ}&apos; /boot/vmlinuz-4.19.46-std-def-alt1`
&gt; чтоб добыть тот ID.
&gt; 
&gt; Конкретно, в apt-scripts-nvidia проблема.

Предлагаю присвоить значение (pkg_kernel_prov_name, pkg_kernel_prov_verstr) прямо из результата

os.getexecout(&quot;rpmquery-strictdep -f /boot/vmlinuz-&quot; .. kernel_name)

разрезав по знаку =.

Вместо вот этого кода поиска Provides пакета с ядром (rpmquery-strictdep тоже ищет его лучший Provides):

kernel_pkg_nameversion = os.getexecout(&quot;rpmquery -f --qf &apos;%{NAME}#%{EPOCH}:%{VERSION}-%{RELEASE}&apos; /boot/vmlinuz-&quot; .. kernel_name)
pkg_kernel = pkgfind(kernel_pkg_nameversion)
if pkg_kernel == nil then
    kernel_pkg_nameversion = os.getexecout(&quot;rpmquery -f --qf &apos;%{NAME}&apos; /boot/vmlinuz-&quot; .. kernel_name)
    pkg_kernel = pkgfind(kernel_pkg_nameversion)
    if pkg_kernel == nil then
	apterror(_(&quot;Package not found for your current kernel &quot;) .. kernel_name .. &quot; .&quot;)
	return
    end
end
-- print(&quot;Kernel &quot; .. kernel_pkg_nameversion)
pkg_kernel_name = pkgname(pkg_kernel)
pkg_kernel_ver = pkgvercur(pkg_kernel)

pkg_kernel_prov_name = {}
pkg_kernel_prov_verstr = {}
kernel_provlist = verprovlist(pkg_kernel_ver)
for i, kprov in ipairs(kernel_provlist) do
    if string.find(kprov.name, &quot;kernel-image-&quot;, 0, true) == 1 then
	pkg_kernel_prov_name = kprov.name
	pkg_kernel_prov_verstr = kprov.verstr
	-- print(&quot;Kernel provide &quot; .. pkg_kernel_prov_name .. &quot;#&quot; .. pkg_kernel_prov_verstr)
    end
end

Пример работы в p8 (пакет rpmquery-strictdep):

[root@prodesk ~]# rpmquery-strictdep -f /boot/vmlinuz-4.4.14-std-def-alt0.M80P.1 
kernel-image-std-def = 1:4.4.14-alt0.M80P.1
[root@prodesk ~]# rpmquery-strictdep -f /boot/vmlinuz-4.9.180-std-def-alt0.M80P.1 
kernel-image-std-def = 1:4.9.180-alt0.M80P.1


Пример работы в Sisyphus:

[root@prodesk /]# rpmquery-strictdep -f /boot/vmlinuz-5.0.19-un-def-alt1 
kernel-image-un-def = 1:5.0.19-alt1:sisyphus+230627.100.1.3

Пример работы в p8 в другом режиме:

[root@prodesk ~]# allow_deps_with_beginning_dot=1 rpmquery-strictdep -f /boot/vmlinuz-4.9.180-std-def-alt0.M80P.1 
.p8.231262.100.1.1-kernel-image-std-def-1:4.9.180-alt0.M80P.1  
[root@prodesk ~]# 

Я могу попробовать реализовать эту идею чуть позже.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182289</commentid>
    <comment_count>5</comment_count>
    <who name="Sergey V Turchin">zerg</who>
    <bug_when>2019-06-07 16:49:00 +0300</bug_when>
    <thetext>(В ответ на комментарий №4)
&gt; Вместо вот этого кода поиска Provides пакета с ядром (rpmquery-strictdep тоже
&gt; ищет его лучший Provides):
1. Этот код у меня работает с момента появления пакета и я уже обновлял его в c7, например. Не хочу попасть когда-нибудь на несовместимость.
2. Ты по сути предлагаешь всё переписывать на bash.
3. Скриптинг от этого не починится. Эти идентификаторы негде не возьмёшь даже чтоб захакать.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182290</commentid>
    <comment_count>6</comment_count>
    <who name="Ivan Zakharyaschev">imz</who>
    <bug_when>2019-06-07 17:11:06 +0300</bug_when>
    <thetext>(In reply to comment #5)
&gt; (В ответ на комментарий №4)
&gt; &gt; Вместо вот этого кода поиска Provides пакета с ядром (rpmquery-strictdep тоже
&gt; &gt; ищет его лучший Provides):
&gt; 1. Этот код у меня работает с момента появления пакета и я уже обновлял его в
&gt; c7, например. Не хочу попасть когда-нибудь на несовместимость.

Я сделал rpmquery-strictdep, чтобы облегчить переносимость. (Для потребностей kernel-build-tools и rpmrebuild-arepo)

$ ls -1 /ALT/*/noarch/RPMS.classic/rpmquery-strictdep-*
/ALT/c7.1/noarch/RPMS.classic/rpmquery-strictdep-1-alt1.noarch.rpm
/ALT/c8.1/noarch/RPMS.classic/rpmquery-strictdep-1-alt1.noarch.rpm
/ALT/p8/noarch/RPMS.classic/rpmquery-strictdep-1-alt1.noarch.rpm
/ALT/Sisyphus/noarch/RPMS.classic/rpmquery-strictdep-1-alt1.noarch.rpm
$ 

&gt; 2. Ты по сути предлагаешь всё переписывать на bash.

Та часть, которая вызывает rpm -qf и получает некую полезную информацию. (Это необязательно APT-овый идентификатор для твоего скрипта судя по нему.)

Этот вызов и так делается с помощью внешнего инструмента, потому что владельца файла через APT не получается определить, надо обращаться к rpm.

&gt; 3. Скриптинг от этого не починится. Эти идентификаторы негде не возьмёшь даже
&gt; чтоб захакать.

Судя по скрипту, нам необязательно брать эти идентификаторы. (Сконструировать --qf можно, но это будет не очень переносимо.)

Там же дальше в том куске, который я процитировал, в итоге нам интересен только Provides, который мы сравниваем с Requires пакетов с модулями. Идентификатор для других целей вроде не нужен.

    pkg_kernel_prov_name = kprov.name
    pkg_kernel_prov_verstr = kprov.verstr</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182291</commentid>
    <comment_count>7</comment_count>
    <who name="Sergey V Turchin">zerg</who>
    <bug_when>2019-06-07 17:23:08 +0300</bug_when>
    <thetext>(В ответ на комментарий №6)
&gt; &gt; 3. Скриптинг от этого не починится.
&gt; Судя по скрипту
Нет. Я имел ввиду, что желания соваться в скриптинг apt более не предвидится с такими плясками.

&gt; Я сделал rpmquery-strictdep, чтобы облегчить переносимость. (Для потребностей
&gt; kernel-build-tools и rpmrebuild-arepo)
Уже хорошо.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182292</commentid>
    <comment_count>8</comment_count>
    <who name="Ivan Zakharyaschev">imz</who>
    <bug_when>2019-06-07 17:37:43 +0300</bug_when>
    <thetext>(In reply to comment #7)
&gt; (В ответ на комментарий №6)
&gt; &gt; &gt; 3. Скриптинг от этого не починится.
&gt; &gt; Судя по скрипту
&gt; Нет. Я имел ввиду, что желания соваться в скриптинг apt более не предвидится с
&gt; такими плясками.

Со скриптингом не ожидается проблем, если в скрипте используются только внутренние сущности apt. Все такие скрипты после последних изменений будут так же хорошо работать, даже лучше (потому что verstrcmp будет правильно определять направление upgrade -- раньше он не мог учесть buildtime, хотя у нас быо позволено иметь пакеты, различающиеся только им).

Если используются не только внутренние сущности APT, то тогда ой, может не совпасть. (Я вижу другой потенциальный выход для обсуждаемого скрипта в том, чтобы делать аналог rpm -qf функциями apt, но таких мне неизвестно.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182293</commentid>
    <comment_count>9</comment_count>
    <who name="Ivan Zakharyaschev">imz</who>
    <bug_when>2019-06-07 17:47:14 +0300</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #7)
&gt; &gt; (В ответ на комментарий №6)
&gt; &gt; &gt; &gt; 3. Скриптинг от этого не починится.
&gt; &gt; &gt; Судя по скрипту
&gt; &gt; Нет. Я имел ввиду, что желания соваться в скриптинг apt более не предвидится с
&gt; &gt; такими плясками.
&gt; 
&gt; Со скриптингом не ожидается проблем, если в скрипте используются только
&gt; внутренние сущности apt. Все такие скрипты после последних изменений будут так
&gt; же хорошо работать, даже лучше (потому что verstrcmp будет правильно определять
&gt; направление upgrade -- раньше он не мог учесть buildtime, хотя у нас быо
&gt; позволено иметь пакеты, различающиеся только им).

В lua, правда, кажется, не хватет помимо verstrcmp() (интерфейса к CmpVersion(), определяющего направление upgrade) аналогичного интерфейса к CheckDep() для определения удовлетворения зависимости.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182295</commentid>
    <comment_count>10</comment_count>
    <who name="Sergey V Turchin">zerg</who>
    <bug_when>2019-06-07 17:53:07 +0300</bug_when>
    <thetext>(В ответ на комментарий №8)
&gt; Я вижу другой потенциальный выход для обсуждаемого скрипта в том,
&gt; чтобы делать аналог rpm -qf функциями apt
Для обсуждаемого скрипта я бы сразу попросил current_kernel_pkg().

А так да. pkg_by_file() и installed_kernel_pkgs() было бы прекрасно.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182324</commentid>
    <comment_count>11</comment_count>
    <who name="Sergey V Turchin">zerg</who>
    <bug_when>2019-06-10 12:10:47 +0300</bug_when>
    <thetext>(В ответ на комментарий №8)
&gt; Если используются не только внутренние сущности APT, то тогда ой, может не совпасть.
Чтобы apt обслуживал сам себя -- вообще не обязательно на lua делать, а в остальных случаях будет необходимость использования внешних сущностей.

(В ответ на комментарий №9)
&gt; В lua, правда, кажется, не хватет помимо verstrcmp() (интерфейса к
&gt; CmpVersion(), определяющего направление upgrade) аналогичного интерфейса к
&gt; CheckDep() для определения удовлетворения зависимости.
Это да. Чтобы можно было определить зависимость, например, по version-release, не указывая epoch, disttag и т.д.. В spec-файле ж можно зависимости без disttag указывать.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182325</commentid>
    <comment_count>12</comment_count>
    <who name="Sergey V Turchin">zerg</who>
    <bug_when>2019-06-10 12:11:53 +0300</bug_when>
    <thetext>Сделал через rpmquery-strictdep.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182336</commentid>
    <comment_count>13</comment_count>
    <who name="Sergey V Turchin">zerg</who>
    <bug_when>2019-06-10 17:26:58 +0300</bug_when>
    <thetext>(В ответ на комментарий №9)
&gt; В lua, правда, кажется, не хватет помимо verstrcmp() (интерфейса к
&gt; CmpVersion(), определяющего направление upgrade) аналогичного интерфейса к
&gt; CheckDep() для определения удовлетворения зависимости.
Какой-нибудь resolvedep(str1, str2), чтоб говорило больше, меньше или удовлетворяет. Причём, полагаю, именно строковые параметры, т.к. вытащить строку из зависимости легко при помощи dep.verstr .</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182337</commentid>
    <comment_count>14</comment_count>
    <who name="Sergey V Turchin">zerg</who>
    <bug_when>2019-06-10 17:39:41 +0300</bug_when>
    <thetext>(В ответ на комментарий №13)
&gt; Какой-нибудь resolvedep(str1, str2), чтоб говорило больше, меньше или удовлетворяет.
Ой, в зависимости же не только версия.
lazyverstrcmp(str1, str2) :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182387</commentid>
    <comment_count>15</comment_count>
    <who name="Ivan Zakharyaschev">imz</who>
    <bug_when>2019-06-13 14:26:36 +0300</bug_when>
    <thetext>(In reply to comment #12)
&gt; Сделал через rpmquery-strictdep.

Спасибо! Добавил соотвествующий Conflicts во все новые apt (Sisyphus, p9, p8, c8.1, c7.1) вместе с копированием этого пакета в те бранчи.</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>