Chương 8. Cập nhật gói phần mềm

Mục lục

8.1. Phiên bản tu chỉnh Debian mới
8.2. Thẩm định phiên bản mới phát hành từ thượng nguồn
8.3. Phiên bản phát hành mới từ thượng nguồn.
8.4. Cập nhật kiểu đóng gói
8.5. Chuyển đổi sang UTF-8
8.6. Các nhắc nhở cho việc cập nhật các gói phần mềm

Sau khi bạn tung ra một gói phần mềm, bạn sẽ sớm cần phải cập nhật nó.

Hãy giả sử là một báo cáo lỗi được gửi về gói phần mềm của bạn như #654321, và nó mô tả một vấn đề mà bạn có thể xử lý. Đây là những gì bạn cần làm để tạo một bản tu chỉnh mới của gói phần mềm:

Một tình huống khó có thể xảy ra khi bạn tạo một gói phần mềm tại chỗ để thí nghiệm với quá trình đóng gói trước khi tải phiên bản bình thường lên kho lưu trữ chính thức, ví dụ như 1.0.1-1. Để nâng cấp trơn tru hơn, sẽ là một ý hay nếu tạo một chỉ mục trong tập tin changelog với phiên bản là một chuỗi ký tự như 1.0.1-1~rc1. Bạn có thể sắp xếp lại nội dung tập tin changelog bằng cách gộp nhiều chỉ mục nhật ký thay đổi được tạo ra tại chỗ thành một chỉ mục duy nhất cho gói phần mềm chính thức. Xem Phần 2.6, “Tên và phiên bản gói” để biết thêm về thứ tự của các chuỗi ký tự dành cho phiên bản.

Khi chuẩn bị các gói phần mềm của một phiên bản mới được phát hành từ thượng nguồn cho kho lưu trữ Debian, bạn phải kiểm tra bản phát hành mới từ thượng nguồn trước tiên.

Bắt đầu bằng việc đọc tập tin thượng nguồn changelog, NEWS, và bất kỳ tài liệu nào khác họ có thể vừa phát hành với phiên bản mới.

Bạn có thể tiếp theo thẩm định những thay đổi giữa mã nguồn của bản cũ và bản mới từ thượng nguồn như sau, quan sát kỹ những gì đáng nghi:

$ diff -urN foo-oldversion foo-newversion

Những thay đổi liên quan tới một vài tập tin tự động được tạo ra bởi Autotools như là missing, aclocal.m4, config.guess, config.h.in, config.sub, configure, depcomp, install-sh, ltmain.sh, và Makefile.in có thể bị phớt lờ. Bạn có thể xóa nó đi trước khi chạy lệnh diff trên mã nguồn để thẩm định.

Nếu một gói phần mềm foo được cấu hình đúng cách theo các định dạng mới 3.0 (native) or 3.0 (quilt), đóng gói một phiên bản thượng nguồn mới chủ yếu chỉ là di chuyển thư mục debian cũ sang mã nguồn mới. Công việc này có thể được thực hiện bằng cách chạy lệnh tar xvzf /path/to/foo_oldversion.debian.tar.gz tại nơi giải nén mã nguồn mới. [79] Dĩ nhiên, bạn cần phải làm một số công việc chắc chắn phải làm sau:

  • Tạo một bản sao của mã nguồn từ thượng nguồn như là tập tin foo_newversion.orig.tar.gz.

  • Cập nhật tập tin Debian changelog với lệnh dch -v newversion-1.

    • Tạo một mục mới với chuỗi ký tự New upstream release

    • Mô tả cụ thể những thay đổi trong bản phát hành mới từ thượng nguồn sửa được các lỗi đã báo cáo và đóng các lỗi đó bằng việc chèn thêm Closes: #bug_number.

    • Mô tả cụ thể những thay đổi xảy ra bởi người bảo trì đối với bản phát hành từ thượng nguồn mà sửa được các lỗi đã báo cáo và đóng các lỗi đó bằng hành động chèn thêm Closes: #bug_number.

  • while dquilt push; do dquilt refresh; done để áp dụng tất cả các bản vá trong lúc tháo chúng ra fuzz.

Nếu bản vá/ghép không áp dụng được sạch sẽ, thẩm định tình hình (gợi ý được để trong các tập tin .rej).

  • Nếu một bản vá bạn đã áp dụng với mã nguồn được ghép vào mã nguồn từ thượng nguồn,

    • chạy lệnh dquilt delete để tháo bỏ nó ra.

  • Nếu một bản vá bạn đã áp dụng vào mã nguồn xung đột với những thay đổi mới đến từ mã nguồn mới của thượng nguồn,

    • dquilt push -f để áp dụng những bản vá cũ trong khi ép buộc các từ chối vá từ tập tin baz.rej.

    • Sửa tập tin baz bằng tay để có được hiệu quả mong muốn của tập tin baz.rej.

    • dquilt refresh để cập nhật bản vá

  • Tiếp tục như bình thường với while dquilt push; do dquilt refresh; done.

Quá trình này có thể được tự động hóa bằng cách chạy lệnh uupdate(1) như sau:

$ apt-get source foo
...
dpkg-source: info: extracting foo in foo-oldversion
dpkg-source: info: unpacking foo_oldversion.orig.tar.gz
dpkg-source: info: applying foo_oldversion-1.debian.tar.gz
$ ls -F
foo-oldversion/
foo_oldversion-1.debian.tar.gz
foo_oldversion-1.dsc
foo_oldversion.orig.tar.gz
$ wget http://example.org/foo/foo-newversion.tar.gz
$ cd foo-oldversion
$ uupdate -v newversion ../foo-newversion.tar.gz
$ cd ../foo-newversion
$ while dquilt push; do dquilt refresh; done
$ dch
... document changes made

Nếu bạn tạo một tập tin debian/watch như được mô tả ở Phần 5.21, “watch, bạn nên bỏ qua lệnh wget. Bạn đơn giản chỉ chạy lệnh uscan(1) trong thư mục foo-oldversion thay vì lệnh uupdate. Hành động này tự động tìm mã nguồn mới, tải về, và chạy lệnh uupdate. [80]

Bạn có thể phát hành mã nguồn mới này bằng việc lặp lại những gì bạn đã làm ở Phần 6.1, “(Tái) biên dịch toàn bộ”, Chương 7, Kiểm tra gói để tìm lỗi, và Chương 9, Tải gói phần mềm lên.

Cập nhật cách đóng gói không phải là một hành động bắt buộc cho việc cập nhật một gói phần mềm. Tuy nhiên, làm vậy sẽ cho phép bạn sử dụng toàn bộ khả năng của hệ thống debhelper hiện đại và định dạng gói nguồn 3.0. [81]

  • Nếu bạn cần tái tạo những tập tin khuôn mẫu đã bị xóa vì lý do gì đó, bạn có thể chạy lệnh dh_make lại trong cây thư mục của gói phần mềm nguồn Debian với tham số --addmissing option. Sau đó điều chỉnh chúng cho phù hợp.

  • Nếu gói phần mềm không được cập nhật để sử dụng cú pháp debhelper v7+ dh cho tập tin debian/rules, cập nhật nó để sử dụng dh. Cập nhật tập tin debian/control tương ứng.

  • Nếu bạn muốn cập nhật tập tin rules được tạo với cơ chế đính kèm Makefile của Common Debian Build System (cdbs) (Hệ Thống Biên Dịch Chung Debian) lên cú pháp dh, xem phần sau để hiểu các biến cấu hình DEB_*.

  • Nếu bạn có một gói phần mềm nguồn với định dạng 1.0 mà không có tập tin foo.diff.gz, bạn có thể cập nhật nó lên định dạng nguồn 3.0 (native) mới hơn bằng việc tạo tập tin debian/source/format chứa dòng 3.0 (native). Các tập tin debian/* còn lại có thể được sao chép sang.

  • Nếu bạn có một gói phần mềm nguồn với định dạng 1.0 mà không có tập tin foo.diff.gz, bạn có thể cập nhật nó lên định dạng nguồn 3.0 (native) mới hơn bằng việc tạo tập tin debian/source/format chứa dòng 3.0 (native). Các tập tin debian/* còn lại có thể được sao chép sang. Nhập tập tin big.diff được tạo ra bởi lệnh filterdiff -z -x '*/debian/*' foo.diff.gz > big.diff vào hệ thống quilt của bạn, nếu cần thiết. [82]

  • Nếu nó được đóng gói bằng một hệ thống vá khác như là dpatch, dbs, hay cdbs với -p0, -p1, or -p2, chuyển đổi nó sang quilt bằng việc sử dụng deb3 tại http://bugs.debian.org/581186.

  • Nếu nó được đóng gói với lệnh dh với tham số --with quilt hay với các lệnh dh_quilt_patchdh_quilt_unpatch, bỏ những thứ này và buộc nó sử dụng định dạng gói nguồn 3.0 (quilt) mới hơn.

Bạn nên kiểm tra DEP - Debian Enhancement Proposals(Những đề nghị cải tiến Debian) và sử dụng những đề nghị đã được CHẤP THUẬN.

Bạn cũng cần phải thực hiện các công việc khác mô tả ở Phần 8.3, “Phiên bản phát hành mới từ thượng nguồn.”.

Nếu các văn bản thượng nguồn được mã hóa theo kiểu mã hóa cũ, chuyển đổi nó sang UTF-8 là một ý hay.

  • Sử dụng iconv(1) để chuyển đổi mã hóa của các tập tin văn bản thô.

    iconv -f latin1 -t utf8 foo_in.txt > foo_out.txt
    
  • Sử dụng w3m(1) để chuyển đổi các tập tin HTML sang các tập tin văn bản thô UTF-8. Khi bạn làm điều này, hãy chắc chắn rằng bạn chạy nó dưới môi trường UTF-8.

    LC_ALL=en_US.UTF-8 w3m -o display_charset=UTF-8 \
            -cols 70 -dump -no-graph -T text/html \
            < foo_in.html > foo_out.txt
    

Sau đây là vài nhắc nhở cho việc cập nhật các phần mềm:



[77] Để lấy thông tin ngày dưới định dạng bị bắt buộc, dùng LANG=C date -R.

[78] Nếu bạn sử dụng lệnh dch -r để tạo thay đổi cuối này, vui lòng đảm bảo bạn đã lưu tệp changelog một cách rõ ràng bởi trình soạn thảo

[79] Nếu một gói phần mềm foo được đóng gói theo định dạng cũ 1.0, công việc này có thể được hoàn thành bằng việc chạy lệnh zcat /path/to/foo_oldversion.diff.gz|patch -p1

[80] Nếu lệnh uscan tải về mã nguồn mới nhưng nó không chạy lệnh uupdate, bạn nên sửa tập tin debian/watch để có dòng debian uupdate tại cuối của đường dẫn URL.

[81] Nếu nhà tài trợ của bạn hoặc các nhà bảo trì khác phản đối việc cập nhật cách đóng gói hiện tại, đừng phí thời gian tranh cãi. Có nhiều việc quan trọng hơn cần phải làm.

[82] Bạn có thể chặt tập tin big.diff ra nhiều bản vá nhỏ liên tiếp dùng lệnh splitdiff.