Jak wyodrębnić wersję pakietu z debian / changelog?


11

Jaki jest najbardziej niezawodny sposób na parsowanie debian/changelogpliku pakietu źródłowego (lub debian/control?) W celu uzyskania numeru wersji pakietu? Coś jak:

pkgver=$(dpkg-parsechangelog | magic_goes_here)

Chcę wyodrębnić numer wersji (i tylko numer wersji), aby móc manipulować nim w skrypcie.

Spodziewałem się znaleźć dpkg-*narzędzie do tego celu, ale jeszcze go nie znalazłem.

Odpowiedzi:


18

Jeśli masz wersję 1.17.0 lub nowszą, możesz jej użyć

dpkg-parsechangelog --show-field Version

Nie ma potrzeby dalszego przetwarzania danych wyjściowych. Ta wersja jest obecnie (luty 2014) dostępna w Testach Debiana.


1
@RichardHansen: Przepraszam za to, okazuje się, że flaga nie jest dostępna w wersji obecnej w Debian Stable.
Martin Geisler

To samo dotyczy Ubuntu 12.04. Jest jednak obecny w Ubuntu 14.04.
Stefan

7

Można to zrobić na wiele sposobów.

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

lub alternatywnie:

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


Miałem nadzieję na coś bardziej solidnego - deb-control(5)strona podręcznika nie opisuje jasno formatu i nie chcę przyjmować żadnych założeń. Na przykład nie wyjaśnia, że ​​pola muszą zaczynać się od linii („Pola są ograniczone tylko znacznikami pól”). Mówi także, że pole może obejmować wiele linii i nie mówi nic o odstępach między znacznikiem a wartością, więc może Version:123być interpretowane jako kontynuacja poprzedniego pola, a nie oddzielne pole wersji (z powodu braku spacji po dwukropku).
Richard Hansen

W praktyce dane wyjściowe dpkg-parsechangelogbędą wyglądać następująco: Version: 0.6.11-2Jeśli chcesz zrobić coś bardziej szczegółowego parsowania debian/controlformatu, możesz użyć python-debianlub libparse-debcontrol-perl.
andrewsomething

1

dpkg-parsechangelogdziała, a wcześniejsza odpowiedź przesyłająca dane wyjściowe przez sed / grep powinna być całkowicie niezawodna. Jeśli chcesz poznać dokładne szczegóły formatu dpkg-parsechangelogwyjściowego i większości innych plików kontrolnych w stylu Debiana, zobacz RFC 822 . Nigdy nie jest poprawne, aby wersja pakietu deb zawierała znak nowej linii, spację lub jakiekolwiek inne znaki specjalne lub kontrolne (patrz man deb-version), więc Version: blahwiersz „ ” na wyjściu zawsze będzie obecny i zawsze będzie pojedynczym wierszem posiadać.

Jednak dpkg-parsechangelogjest to bardzo ciężkie do uruchomienia programu wystarczy, aby uzyskać aktualny numer wersji z changelogu. Musi uruchomić Perla i załadować imponująco dużą liczbę bibliotek, aby dać ci wynik, z którego większość nie będziesz używać. Na wolniejszych platformach lub z wolnymi nośnikami do przechowywania plików, lub gdy trzeba tę wersję analizować wiele razy, okaże się ona dość boleśnie powolna. Zamiast tego po prostu użyj tego, co jest w pierwszym zestawie nawiasów w pierwszym wierszu:

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

Dzięki temu otrzymasz poprawną bieżącą wersję pakietu z dowolnym prawidłowym changelogplikiem w standardowym formacie (a niestandardowe debian/changelogformaty, dla wszystkich praktycznych ogólnych celów, nigdy nie są używane).


-1

jak widziałem wersja pakietu składa się z części nagłówka pliku dziennika zmian. więc możesz to zrobić jak

pkgver=$(dpkg-parsechangelog | head

Próbowałem na przykład tego polecenia dla zainstalowanych pakietów

aptitude changelog shutter | head

I

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
Chcę numer wersji i tylko numer wersji, aby móc nim manipulować w skrypcie.
Richard Hansen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.