Як витягти версію пакета з 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 Testing.


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-


Я сподівався на щось трохи більш надійне - deb-control(5)сторінка man чітко не описує формат, і я не хочу робити жодних припущень. Наприклад, не дає зрозуміти, що поля повинні починатися в рядку ("Поля розмежовані лише тегами полів."). Він також говорить, що поле може охоплювати кілька рядків, і воно нічого не говорить про пробіл між тегом і значенням, тому, можливо, його 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 . Ніколи не нормально, щоб версія версії пакета деб містила новий рядок, пробіл або будь-які інші спеціальні або контрольні символи (див. 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:~$ 

1
Я хочу номер версії та лише номер версії, щоб я міг маніпулювати ним у сценарії.
Річард Хансен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.