Cách tổ chức, phân nhánh trong TBS
  ==================================

TBS là tập hợp các chỉ thị biên dịch (PKGBUILD) cho tất cả các gói
được hỗ trợ (chính thức hoặc một phần) bởi TheSLinux. Đây là một
kho git, với một số nhánh đặc biệt: TheBigBang, TheSmallBang, _utils,
và các nhánh cho từng gói.

* _utils: nhánh chứa các công cụ, miếng vá cấn thiết cho TBS

* TheBigBang: đây là nhánh khởi đầu cho mỗi gói mới. Nghĩa là, khi
  tạo ra một gói mới, thì sẽ tạo ra nhánh mới bắt đầu từ nó.
  TheSmallBang là một cách khác, do nó có chứa các quy tắc đơn
  giản hơn, trong khi TheBigBang thì dài dòng, không được khuyến
  cáo dùng

Mỗi gói trong TBS được bố trí trong một nhánh riêng trong kho git.
Ví dụ, với gói `pidgin`, thì

* Chỉ thị biên dịch cho gói này nằm trên nhánh `pidgin` [4]
* Các tập tin liên quan nằm trong thư mục '/pidgin/' [4]

Mục đích của việc đặt thư mục riêng, là để khi thực hiện trộn tất
cả các nhánh vào `master` thì mỗi gói sẽ nằm riêng một thư mục,
không gói nào ảnh hưởng tới gói nào. Mặc dù vậy, việc "trộn" này
chỉ được xét tới về mặt lý thuyết, trong thực tế sẽ không thực hiện
như vậy (đọc tiếp).

   Trộn các nhánh thế nào
   ======================

Do mỗi gói nằm trên một nhánh, nên sẽ xuất hiện rất nhiều nhánh
trong kho git. Hiện giờ, con số này là hơn 800 nhánh. Nếu đã quen
với việc dùng git (với các workflow của nó), bạn sẽ ngạc nhiên với
số lượng lớn nhánh như vậy thì việc "trộn" (merge) sẽ như thế nào,
làm sao quản lý hết?

Okay, trong TheSmallBang [2], có quy tắc (thứ ba), là sẽ không bao
giờ thực hiện trộn hai nhánh với nhau (đọc tiếp), đặc biệt nếu hai
nhánh dành cho hai gói khác nhau. Nghĩa là, "việc sử dụng các nhánh
git là để làm cho các chỉ thị biên dịch (PKGBUILD) có một số điểm
chung tiện lợi cho sau này, không phải để merge như git workflow
thông thường".

Việc đặt chung các nhánh (gói) vào cùng một kho này coi có vẻ phức
tạp, nhưng tính ra sẽ đơn giản hơn so với việc dùng mỗi gói một
repo riêng. (Không so sánh với Subversion, chuyện dài kể sau.)

  Feature branch cho mỗi gói
  ==========================

Okay, vậy thì "git workflow" với pull-request thông thường được
thực hiện thế nào? Trước khi tiếp tục, xin bạn nhớ trong TBS
sẽ dùng hai khái niệm nhánh khác nhau

* Package branch: Ví dụ nhánh dành cho pidgin [4] vừa nói trên
* Feature branch: đây chính là cái bạn vừa hỏi (đọc tiếp).

Ví dụ, (một vấn đề phổ biến) là khi bạn muốn biên dịch lại gói
`pidgin` với các cấu hình do bạn tùy chọn (chẳng hạn, để bỏ đi
các protocol không cần thiết như MSN, hoặc để thêm sẵn vài plugin
bạn cần.) Để làm điều này, bạn sẽ tạo (fork) ra một nhánh riêng,
bắt nguồn từ nhánh gốc "pidgin", ví dụ,

   $ git checkout pidgin
   $ git clone -b pidgin@my-crazy-features

Có gì đặc biệt? Nhánh này có tên đặt theo tiêu chuẩn riêng, gồm
3 phần:
 
* tên gốc: pidgin (có thể dùng p_pidgin)
* chỉ thị rẽ nhánh: @ (có thể dùng #, %, ...)
* tên feature: my-crazy-features

Hệ thống TBS sẽ nhận biết được cách đặt tên này, và sẽ tự động đánh
số, lựa chọn thẻ, lựa chọn chỉ số biên dịch (package rel, [1]) một
cách tự động. Mặc khác, vì hai nhánh "pidgin" và "pidgin@...." chia
sẻ cùng phần gốc "pidgin", nên có thể trộn với nhau. Đây chính là
chỗ "git workflow" thông thường.

Nói thêm, "@" được dùng khi gói mới sinh ra gói "conflict" hoặc
thay thế hoàn toàn gói cũ (pidgin), còn "%" nếu gói mới có thể cài
đặt song song với gói gốc (pidgin) [hoặc ít ra không gây xáo trộn
lớn]. Khi dùng "@" hoặc "%" thì TBS sẽ tự động tính toán các phần
phụ thuộc này. Nếu bạn muốn điều chỉnh bằng tay, dùng "="

  Ví dụ về feature branch
  =======================

Ví dụ: Xem [5]: Trong gói `pacman`, phần kịch bản tạo gói `makepkg`
có thể được tạo ra cực kỳ nhanh, không cần phải qua quá trình biên
dịch bất kỳ mã nguồn C nào. Trong quá trình phát triển, nếu phải
thay đổi thường xuyên kịch bản `makepkg` mà mỗi lần phải biên dịch
lại toàn bộ gói `pacman` thì thật hoang phí. Vì thế, chỉ việc tạo
ra một "feature branch" `pacman%makepkg`, mà chỉ thị biên dịch
chính được cho trong kịch bản "thứ cấp"

   PKGBUILD%makepkg [6]

(hãy đọc qua trước khi đọc tiếp bài này.)

Như bạn thấy, TBS còn nhận diện chỉ thị biên dịch PKGBUILD%makepkg 
một khi tập tin này tồn tại:

    Đọc nội dung PKGBUILD
    Đang làm việc trên "feature branch" ?
    Có => Đọc tập tin PKGBUILD [feature] nếu có; tiếp tục [G]
    Không => tiếp tục [G]
    G: (biên dịch gói)

Còn nhiều thứ để nói nữa. Nhưng tạm vậy, bạn đã mệt rồi!


  Các liên kết
  ============

[3] TBS: https://github.com/TheSLinux/buildsystem
[4] TBS @ pidgin: https://github.com/TheSLinux/buildsystem/tree/pidgin
[5] pacman%makepkg: 
https://github.com/TheSLinux/buildsystem/tree/pacman%25makepkg
[6] PKGBUILD%makepkg: 
https://github.com/TheSLinux/buildsystem/blob/pacman%25makepkg/pacman/PKGBUILD%25makepkg

--
I am ... 5.5 dog years old.

--
To ubsubscribe from the list hackers@lists.theslinux.org,
please send an email to ecar...@lists.theslinux.org with subject
  ubsubscribe hackers

To get basic commands to use Ecartis system, use subject 'help'.

Reply via email to