ฉันจะแยกรุ่นแพคเกจจาก 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
Martin Geisler

เหมือนกันสำหรับ Ubuntu 12.04 มันมีอยู่ใน Ubuntu 14.04 แม้ว่า
Stefan

7

มีหลายวิธีในการทำเช่นนี้

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

หรืออีกทางหนึ่ง:

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


ฉันหวังว่าจะมีอะไรที่แข็งแกร่งกว่านี้เล็กน้อย - deb-control(5)หน้า man ไม่ได้อธิบายรูปแบบที่ชัดเจนและฉันไม่ต้องการตั้งสมมติฐานใด ๆ ตัวอย่างเช่นมันไม่ได้ทำให้ชัดเจนว่าเขตข้อมูลจะต้องเริ่มต้นในบรรทัด ("เขตข้อมูลที่คั่นด้วยแท็กสนามเท่านั้น") นอกจากนี้ยังบอกว่าเขตข้อมูลสามารถขยายได้หลายบรรทัดและไม่ได้พูดอะไรเกี่ยวกับระยะห่างระหว่างแท็กและค่าดังนั้นจึงVersion:123ควรตีความว่าเป็นความต่อเนื่องของเขตข้อมูลก่อนหน้าและไม่ใช่เขตข้อมูลรุ่นแยกต่างหาก (เนื่องจากขาด ของช่องว่างหลังเครื่องหมายจุดคู่)
Richard Hansen

ในทางปฏิบัติการส่งออกจากdpkg-parsechangelogเป็นไปลักษณะเช่นVersion: 0.6.11-2ถ้าคุณต้องการสิ่งที่จะทำแยกที่แข็งแกร่งมากขึ้นในdebian/controlรูปแบบที่คุณสามารถใช้หรือpython-debian libparse-debcontrol-perl
andrewsomething

1

dpkg-parsechangelogทำงานได้และคำตอบก่อนหน้านี้การส่งออกท่อผ่าน sed / grep ควรมีประสิทธิภาพอย่างสมบูรณ์ หากคุณต้องการทราบรายละเอียดที่แม่นยำของรูปแบบของdpkg-parsechangelogการส่งออกและส่วนใหญ่ไฟล์ควบคุมเดเบียนแบบอื่นดูRFC 822 จะไม่เป็นไรสำหรับรุ่นแพคเกจ deb ที่มีการขึ้นบรรทัดใหม่เว้นวรรคหรืออักขระพิเศษหรือตัวควบคุมอื่น ๆ (ดูman deb-version) ดังนั้นVersion: blahบรรทัด "" ในเอาต์พุตจะมีอยู่เสมอและมันจะเป็นบรรทัดเดียวบนเสมอ ด้วยตัวเอง

อย่างไรก็ตามdpkg-parsechangelogเป็นโปรแกรมที่หนักมากในการรันเพื่อรับหมายเลขเวอร์ชันปัจจุบันจากรายการเปลี่ยนแปลง มันต้องรัน Perl และโหลดไลบรารีจำนวนมากอย่างน่าประทับใจเพื่อที่จะให้ผลลัพธ์ที่คุณไม่ต้องใช้ บนแพลตฟอร์มที่ช้าลงหรือด้วยสื่อเก็บข้อมูลไฟล์ที่ช้าหรือเมื่อคุณจำเป็นต้องทำการแยกวิเคราะห์รุ่นนี้หลายครั้งมันจะพิสูจน์ว่าค่อนข้างช้า ให้ใช้อะไรก็ตามที่อยู่ในวงเล็บชุดแรกในบรรทัดแรกแทน

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

ที่คุณจะได้รับแพคเกจที่ถูกต้องรุ่นปัจจุบันที่มีถูกต้องใด ๆchangelogไฟล์โดยใช้รูปแบบมาตรฐาน (และไม่เป็นมาตรฐานdebian/changelogรูปแบบที่มีวัตถุประสงค์เพื่อการทั่วไปในทางปฏิบัติไม่เคยใช้)


-1

ที่ฉันได้เห็นรุ่นแพคเกจประกอบด้วยส่วนหัวของไฟล์ changelog เพื่อให้คุณสามารถทำเช่นนั้น

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
ฉันต้องการหมายเลขรุ่นและหมายเลขรุ่นเท่านั้นเพื่อให้สามารถจัดการกับมันในสคริปต์
Richard Hansen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.