My code works, I don’t know why.

國王的耳朵是驢耳朵

Quilt初探 - 使用quilt產生和管理patch

| Comments

傳統的組裝的情況,常常會需要處理patch,然而當patch數量資料多到某種程度,加上時間推移原資料更動,套用patch會讓人生不如死。而quilt是Linux下面處理多個patch檔案的管理軟體。因為組裝軟體和打包Linux 套件會使用到,所以花點時間看一下整理一下。目前感覺有點像是先用git format-patch產生一些patch檔,另外一邊用git am 去merge這些patch檔。然後merge完可以用git reset HEAD^幾次來unmerge。

目錄

quilt的格式是quilt 命令而它處理的對象是stack,也就是說你可以使用push, pop。沒有特別指定的話,command處理的對象是stack top。


透過quilt產生patch

  • quilt new 產生的patch檔案名稱
  • quilt add 要監督那個檔案
  • 更動檔案。
  • quilt refresh產生patch

重複前面動作會再產生新的patch,置於stack的top。可以透過quilt series觀察stack的狀態。另外有兩點值得注意:

  • 假設都是重複更動同一份檔案,quilt refresh就是單純和最原始的檔案diff。舉例來說,下了quilt add後修改了三行再執行quilt refresh產生patch,之後再修改另外五行後執行quilt refresh原本的patch檔案會有第一次改的那三行再加上後來改的那五行。
  • 一個檔案a,經過quilt new ,quilt add, quilt refresh後,再用quilt產生另外一份檔案的patch後。要再修改檔案a會需要經過quilt new ,quilt add, quilt refresh產生另外全新的patch檔案。
  • 可以使用quilt header -e去編輯patch檔的詳細說明。另外也可以用quilt header -e patch名稱指定編輯特定patch名稱的詳細說明。

quilt會將產生的patch放在目前目錄下的patches目錄,這部份可以透過更改QUILT_PATCHES的變數更改名稱。


quilt產生的檔案

quilt new 要產生的patch檔案被執行後會產生

  • pactches目錄
    • 紀錄patch 順序的series檔案
  • .pc目錄
    • applied-patches,和series相同
    • 要產生的patch檔案名稱的目錄

quilt add 要監督那個檔案被執行後會產生 * .pc目錄/要產生的patch檔案名稱的目錄/監督檔案路徑/監督檔案 * ex: ./pc/fix_err_no_27113/libs/liba.c

quilt refresh產生patch

  • .pc目錄/要產生的patch檔案名稱的目錄/.timestamp
  • patches/要產生的patch檔案名稱

我們可以觀察發現quilt add後quilt會將未修改的原始檔複製一份到.pc目錄/要產生的patch檔案名稱的目錄/監督檔案路徑/監督檔案。之後quilt refresh就是單純的diff產生結果


透過quilt管理patch

apply patch並管理的步驟是。

  • 取得未apply patch的原始套件目錄。
  • 將前面產生出來的patches目錄複製到未apply patch的原始的套件目錄當中。
  • 透過quilt 操作並管理patch

假設你有了patches目錄,你可以做以下操作

  • 查詢
    • quilt series查詢有哪些patch
    • quilt applied查詢已經applied那些patch
    • quilt unapplied查詢還沒apply那些patch
    • quilt next查詢下一個要apply的patch
    • quilt next查詢前一個已經applied的patch
    • quilt header顯示目前stack top的註解說明資訊及要patch的檔案
    • quilt header patch名稱顯示目前stack中patch名稱的註解說明資訊及要patch的檔案
  • 套用/還原patch
    • quilt push依照stack反順序apply patch
      • quilt push -a可以一口氣apply patch
      • quilt push patch名稱
    • quilt popundo 一次已經applied的patch。
      • quilt pop -a可以一口氣apply patch

舉例來說,假設patches目錄stack有01_fix, 02_fix03_fix。將該目錄複製到未patch的目錄中,下兩次quilt push會分別patch 01_fix, 02_fix。之後再quilt pop會變成只有apply 01_fix而已。


~/.quiltrc

使用者透過~/.quiltrc自訂quilt的行為,列舉如下

  • QUILT_PATCHES:指定產生的patch存放的目錄,預設為patches目錄
  • QUILT_PATCH_OPTS:讓quilt呼叫patch執行檔apply patch時傳遞的參數
  • QUILT_REFRESH_ARGS和QUILT_DIFF_ARGS:讓quilt呼叫diff執行檔時傳遞的參數
  • QUILT_COLORS:不用解釋吧

參考資料

Comments