Re: aptitude search работает на паре (package,version) или только на 1 параметре package?
On 2016-01-21, Oleksandr Gavenko wrote:
> aptitude search работает на паре (package,version) или только на 1 параметре
> package?
>
> Из https://www.debian.org/doc/manuals/aptitude/ch02s04s05.ru.html#searchAnd
>
> ?and(pattern1, pattern2), pattern1 pattern2
> Matches packages that match both pattern1 and pattern2.
>
> ничего не говорится об версиях.
>
> Мне кажется что aptitude просто работает с множеством пакетов безотносительно
> к версии. Для работы с версиями есть специальная форме:
>
> ?narrow(filter, pattern), ~S filter pattern
>
> This term “narrows” the search to package versions matching filter. In
> particular, it matches any package version which matches both filter and
> pattern. The string value of the match is the string value of pattern.
>
> Kali базируется на stable. Я на testing. Потому временно включил stable что бы
> узнать чем Kali отличается от Debian (т.е. не только именем пакета - но и
> версии различны!!):
>
>
> $ aptitude search '?narrow(?origin(Kali),!?origin(Debian))'
> ...
В общем "aptitude search" работает на списке пакетов (над множествами с
именами пакетов в качестве элементов).
Есть пару специальных опреаторов типа "?narrow(X, Y)" которые учитывают версии
и только на равенство.
Я хотел тест на новизну:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=812444
aptitude: REQUEST: operator to version order test in "aptitude search" query syntax.
но не учел что aptitude не имеет синтаксиса для вывода нескольких версий
одновременно с доп. информацией (через ключ "-F").
Т.е. и просьба бессмысленая оказалась.
По итогу за пол часика exploration analysis "python-apt" API получил
работающий пример:
import apt_pkg
apt_pkg.init()
cache = apt_pkg.Cache()
for pkg in cache.packages:
vkali = []
vdeb = []
for ver in pkg.version_list:
for fl, _ in ver.file_list:
if fl.origin == 'Kali':
vkali.append(ver.ver_str)
elif fl.origin == 'Debian':
vdeb.append(ver.ver_str)
if len(vdeb) == 0:
continue
diff = set(vkali) - set(vdeb)
if len(diff) == 0:
continue
ver0 = vkali[0]
if all(apt_pkg.version_compare(x, ver0) < 0 for x in vdeb):
print pkg.name, vkali, vdeb
Код находит пакеты в Kali с версиями старше чем в Debian.
Такое через aptitude не выразишь. И не надо мучится с парсингом текстового
вывода и вызывать "dpkg --compare-versions".
Теперь мини-язык aptitude для выборки пакетов кажется тусклым и не интересно
бится над его особенностями.
--
http://defun.work/
Reply to: