Как извлечь версию пакета из debian / changelog?

11

Какой самый надежный способ анализа debian/changelogфайла исходного пакета (или debian/control?), Чтобы получить номер версии пакета? Что-то вроде:

pkgver=$(dpkg-parsechangelog | magic_goes_here)

Я хочу извлечь номер версии (и только номер версии), чтобы я мог манипулировать им в сценарии.

Я ожидал найти dpkg-*утилиту для этой цели, но я еще не нашел ее.

Ричард Хансен
источник

Ответы:

18

Если у вас версия 1.17.0 или выше, вы можете использовать

dpkg-parsechangelog --show-field Version

Нет необходимости обрабатывать вывод дальше. Эта версия (февраль 2014 г.) доступна в тестировании Debian.

Мартин Гайслер
источник
1
@RichardHansen: К сожалению, оказывается, что флаг недоступен в версии, присутствующей в Debian Stable.
Мартин Гайслер
То же самое для Ubuntu 12.04. Это присутствует в Ubuntu 14.04, хотя.
Стефан
7

Есть множество способов сделать это.

dpkg-parsechangelog | sed -n 's/^Version: //p'

или альтернативно:

dpkg-parsechangelog | grep Version: | cut -d' ' -f2-

andrewsomething
источник
Я надеялся на что-то более надежное - deb-control(5)страница руководства не дает четкого описания формата, и я не хочу делать никаких предположений. Например, он не дает понять, что поля должны начинаться со строки («Поля ограничиваются только тегами полей»). В нем также говорится, что поле может занимать несколько строк, и ничего не говорится о расстоянии между тегом и значением, поэтому, возможно, его Version:123следует интерпретировать как продолжение предыдущего поля, а не отдельное поле версии (из-за отсутствия пространства после двоеточия).
Ричард Хансен
На практике выходные данные dpkg-parsechangelogбудут выглядеть так: Version: 0.6.11-2если вы хотите что-то сделать для более надежного разбора debian/controlформата, вы можете использовать python-debianили libparse-debcontrol-perl.
Andrewsomething
1

dpkg-parsechangelogработает, и более ранний ответ, передающий вывод через sed / grep, должен быть полностью устойчивым. Если вы хотите узнать точные детали формата dpkg-parsechangelogвывода и большинства других управляющих файлов в стиле debian, см. RFC 822 . Никогда не допустимо, чтобы версия пакета deb содержала символ новой строки, пробел или любые другие специальные или управляющие символы (см. man deb-version), Поэтому Version: blahстрока " " в выходных данных всегда будет присутствовать и всегда будет одной строкой в ​​ее своя.

Тем не менее, dpkg-parsechangelogэто очень тяжелая программа, запускаемая только для получения номера текущей версии из журнала изменений. Он должен запустить Perl и загрузить впечатляюще большое количество библиотек, чтобы получить результат, большинство из которого вы не будете использовать. На более медленных платформах или с медленными носителями для файлов, или когда вам нужно много раз анализировать эту версию, она будет мучительно медленной. Вместо этого просто используйте все, что находится в первом наборе скобок в первой строке:

head -1 debian/changelog | awk -F'[()]' '{print $2}'

Это даст вам правильную текущую версию пакета с любым допустимым changelogфайлом, использующим стандартный формат (а нестандартные debian/changelogформаты, для всех практических общих целей, никогда не используются).

Пол
источник
-1

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

pkgver=$(dpkg-parsechangelog | head

Я пробовал эту команду для установленных пакетов, например

aptitude changelog shutter | head

&

jai@frank-Jai:~$ aptitude changelog shutter | head
Get: Changelog of shutter
shutter (0.89.0-0ubuntu1) quantal; urgency=low

  * New upstream release.
   - Adds an AppIndicator (LP: #805464).
  * debian/control: Recommend libgtk2-appindicator-perl

 -- Andrew Starr-Bochicchio <a.starr.b@gmail.com>  Sat, 11 Aug 2012 17:36:18 -0400

shutter (0.88.3-1) unstable; urgency=low
jai@frank-Jai:~$ 
rɑːdʒɑ
источник
1
Я хочу номер версии и только номер версии, чтобы я мог манипулировать им в сценарии.
Ричард Хансен