[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: