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

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

Việc viết lại tài liệu này với các nội dung cập nhật và nhiều các ví dụ thực tế hơn đã có ở Guide for Debian Maintainers. Vui lòng sử dụng tài liệu mới này như là tài liệu hướng dẫn chính.

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ó.

## 8.1. Phiên bản tu chỉnh Debian mới

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:

- Nếu nó sẽ được ghi lại như là một bản vá, hãy làm như sau:

  - `dquilt new `bugname.patch`` để đặt tên cho bản vá;

  - `dquilt add `buggy-file`` để khai báo tập tin sẽ được điều chỉnh;

  - Sửa vấn đề trong nguồn của gói phần mềm cho một lỗi từ thượng nguồn

  - `dquilt refresh` để ghi lại vào ``bugname.patch``;

  - `dquilt header -e` để thêm vào mô tả của nó;

- Nếu nó dùng để cập nhật một bản vá đang tồn tại, hãy làm như sau:

  - `dquilt pop `foo.patch`` để hủy bỏ bản vá hiện tại ``foo.patch``;

  - Sửa vấn đề trong bản cũ ``foo.patch``;

  - `dquilt refresh` để cập nhật ``foo.patch``;

  - `dquilt header -e` để cập nhật mô tả của nó;

  - `while dquilt push; do dquilt refresh; done` để áp dụng tất cả bản vá trong khi tháo bỏ fuzz;

- Thêm một bản tu chỉnh mới vào đầu của tập tin Debian `changelog`, ví dụ như chạy lệnh `dch -i`, hoặc cụ thể hơn với lệnh `dch -v `version`-`revision`` và sau đó chèn ghi chú vào bằng trình soạn thảo văn bản bạn thích. [76]

- Chèn một đoạn mô tả ngắn của lỗi và giải pháp trong mục nhật ký thay đổi, theo sau bởi `Closes: #654321`. Bằng cách đó, báo cáo lỗi sẽ được tự động đóng bởi phần mềm bảo trì kho lưu trữ ngay lúc gói phần mềm của bạn được nhận vào kho lưu trữ của Debian.

- Lặp lại những gì bạn đã làm phía trên để sửa nhiều lỗi trong quá trình cập nhật tập tin Debian `changelog` với lệnh `dch` nếu cần thiết.

- Lặp lại những gì bạn đã làm ở Phần 6.1, “(Tái) biên dịch toàn bộ” và Chương 7, Kiểm tra gói để tìm lỗi.

- Khi bạn đã hài lòng, bạn nên thay đổi giá trị bản phân phối trong tập tin `changelog` từ `UNRELEASED` sang giá trị bản phân phối đích `unstable` (hoặc thậm chí `experimental`).[77]

- Tải lên gói phần như ở Chương 9, Tải gói phần mềm lên. Sự khác biệt là lần này, tập tin nén chứa mã nguồn nguyên vẹn ban đầu sẽ không được đính kèm, bởi vì nó không có thay đổi gì và nó đã tồn tại trong kho lưu trữ của Debian.

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.

## 8.2. Thẩm định phiên bản mới phát hành từ thượng nguồ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.

## 8.3. Phiên bản phát hành mới từ thượng nguồn.

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. [78] 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. [79]

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.

## 8.4. Cập nhật kiểu đóng gói

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`. [80]

- 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_*`.

  - bản sao tại chỗ của `/usr/share/doc/cdbs/cdbs-doc.pdf.gz`

  - The Common Debian Build System (CDBS), FOSDEM 2009

- 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. [81]

- 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_patch và dh_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.”.

## 8.5. Chuyển đổi sang UTF-8

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

## 8.6. Các nhắc nhở cho việc cập nhật các gói phần mềm

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

- Bảo tồn các chỉ mục cũ trong tập tin `changelog` (nghe có vẻ quá dĩ nhiên, nhưng đã có các tình huống nhiều người đánh lệnh `dch` trong khi họ đáng lẽ phải đánh `dch -i`.)

- Các thay đổi Debian hiện tại cần phải được đánh giá lại; ném đi những thứ thượng nguồn đã tích hợp (dưới kiểu này hay kiểu khác) và ghi nhớ giữ những thứ mà thượng nguồn chưa tích hợp, trừ khi có một lý do đáng để không làm thế.

- Nếu bất kỳ thay đổi nào được tạo ra đối với hệ thống biên dịch (hi vọng bạn sẽ biết từ việc thẩm định các thay đổi từ thượng nguồn), hãy cập nhật các điều kiện biên dịch của `debian/rules` và `debian/control` nếu cần thiết.

- Kiểm tra Debian Bug Tracking System (BTS) (Hệ thống theo dõi lỗi Debian) để xem có ai đã cung cấp bản vá cho các lỗi đang mở.

- Kiểm tra những nội dung của tập tin `.changes` để chắc chắn rằng bạn đang tải lên đúng bản phân phối, các lỗi được đóng đúng cách được liệt kê trong trường `Closes`, trường `Maintainer` và `Changed-By` phải khớp, tập tin phải được ký bằng GPG, v.v.

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

[77] 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

[78] 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`

[79] 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.

[80] 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.

[81] 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.

Chương 7. Kiểm tra gói để tìm lỗi |  | Chương 9. Tải gói phần mềm lên