Bagaimana cara mengekstrak versi paket dari debian / changelog?

11

Apa cara paling ampuh untuk mem-parsing debian/changelogfile paket sumber (atau debian/control?) Untuk mendapatkan nomor versi paket? Sesuatu seperti:

pkgver=$(dpkg-parsechangelog | magic_goes_here)

Saya ingin mengekstrak nomor versi (dan hanya nomor versi) sehingga saya dapat memanipulasinya dalam sebuah skrip.

Saya mengharapkan untuk menemukan dpkg-*utilitas untuk tujuan ini, tetapi saya belum menemukannya.

Richard Hansen
sumber

Jawaban:

18

Jika Anda memiliki versi 1.17.0 atau lebih baru, Anda dapat menggunakan

dpkg-parsechangelog --show-field Version

Tidak perlu memproses output lebih jauh. Versi ini saat ini (Februari 2014) tersedia di Pengujian Debian.

Martin Geisler
sumber
1
@RichardHansen: Maaf tentang itu, ternyata flag tidak tersedia dalam versi yang ada di Debian Stable.
Martin Geisler
Sama untuk Ubuntu 12.04. Itu hadir di Ubuntu 14.04 sekalipun.
Stefan
7

Ada banyak cara untuk melakukan ini.

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

atau sebagai alternatif:

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

andrewsomething
sumber
Saya berharap untuk sesuatu yang sedikit lebih kuat - deb-control(5)halaman manual tidak dengan jelas menggambarkan format dan saya tidak ingin membuat asumsi. Misalnya, tidak menjelaskan bahwa bidang harus dimulai pada suatu baris ("Bidang hanya dibatasi oleh tag bidang."). Ia juga mengatakan bahwa suatu bidang dapat menjangkau beberapa baris, dan itu tidak mengatakan apa-apa tentang penspasian antara tag dan nilainya, jadi mungkin Version:123harus ditafsirkan sebagai kelanjutan dari bidang sebelumnya dan bukan bidang Versi yang terpisah (karena kurangnya dari ruang setelah usus besar).
Richard Hansen
Dalam praktiknya, output dari dpkg-parsechangelogakan terlihat seperti Version: 0.6.11-2Jika Anda menginginkan sesuatu untuk melakukan parsing debian/controlformat yang lebih kuat , Anda bisa menggunakan python-debianatau libparse-debcontrol-perl.
andrewsomething
1

dpkg-parsechangelogberfungsi, dan jawaban sebelumnya menyalurkan output melalui sed / grep harus sepenuhnya kuat. Jika Anda ingin mengetahui detail yang tepat dari format dpkg-parsechangelogoutput, dan sebagian besar file kontrol gaya debian lainnya, lihat RFC 822 . Tidak pernah ok untuk versi paket deb mengandung baris baru, spasi, atau karakter khusus atau kontrol lainnya (lihat man deb-version), jadi baris " Version: blah" dalam output akan selalu ada, dan akan selalu ada satu baris pada barisnya sendiri.

Namun, dpkg-parsechangelogini adalah program yang sangat berat untuk dijalankan hanya untuk mendapatkan nomor versi saat ini dari changelog. Itu harus menjalankan Perl dan memuat sejumlah besar perpustakaan yang mengesankan untuk memberi Anda hasil, yang sebagian besar tidak akan Anda gunakan. Pada platform yang lebih lambat, atau dengan media penyimpanan file yang lambat, atau ketika Anda perlu melakukan parsing versi ini berkali-kali, itu akan terbukti sangat lambat. Sebagai gantinya, cukup gunakan apa pun yang ada di dalam set kurung pertama di baris pertama:

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

Itu akan memberi Anda versi paket saat ini yang benar dengan changelogfile yang valid menggunakan format standar (dan debian/changelogformat tidak standar , untuk semua keperluan umum praktis, tidak pernah digunakan).

paul
sumber
-1

seperti yang saya lihat versi paket terdiri dari bagian header dari file changelog. jadi kamu bisa melakukannya seperti

pkgver=$(dpkg-parsechangelog | head

Saya telah mencoba perintah ini untuk paket yang diinstal, misalnya

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 <[email protected]>  Sat, 11 Aug 2012 17:36:18 -0400

shutter (0.88.3-1) unstable; urgency=low
jai@frank-Jai:~$ 
rɑːdʒɑ
sumber
1
Saya ingin nomor versi dan hanya nomor versi sehingga saya bisa memanipulasinya dalam skrip.
Richard Hansen