テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

パッチ投稿の仕方

Linuxカーネルに貢献するにはパッチを送らなければいけないようです. パッチを送るためには, 以下のステップをする必要があります.

  1. 開発します.
  2. パッチを作ります.
  3. メールで送ります.

この記事のスコープは, 2と3です.

なぜ, 今時パッチなのでしょうか?なぜPull Requestではないのでしょうか?全部Githubでやれば何もかも楽になると思うけど. たぶんこれは, Gitを使わないオールドタイプの開発者との互換性の問題です. パッチというもっとも低レベルな差分表現によってコミュニケーションをとれば, それを生成する方法はいかにも問われません. 例えば, diffを使ってもよいでしょうし, git-format-patchを使っても構いません. この記事では, 後者を使います. format-patchは, git上のコミットについて差分をパッチ形式で出力します.

環境は以下を想定します.

  • Mac上のThunderbirdから, GMailを使っている.
  • コードは, どっかリモートLinuxマシン上にある.

失敗しましょう

Gitシステムの管理するツリー上で, あるコミットAからあるコミットXへの差分パッチの作り方は,

git co X
git format-path -s -M  A

オプションについて: sは, signed-offをつけるため, -Mは名前変更をパッチ上で表現するためです.

こう打つと.patchファイルが生成されます. ではこいつをMacにコピーしてThunderbirdでメール本文に貼り付けて送れば良いのでしょうか?答えはNOです. 何も考えずに送ったパッチは, am(Apply Mail-patchの略かと思われる)に失敗します. ここからスタートして, 正しく解釈されるパッチ作りにたどり着きましょう.

私のアプローチ

他にも方法があると思いますが, 私がとったアプローチは,

  1. GMailのDraftsディレクトリに, 作ったパッチを保存する.
  2. 本文を付け足して送る.

というものです. より本格的に事をなすならば, すべてLinuxマシンから行うのが効率の面からも最善と思います.

Thunderbirdの設定

Documentation/email-clients.txtを読みましょう.

Thunderbird (GUI)

Thunderbird is an Outlook clone that likes to mangle text, but there are ways
to coerce it into behaving.

- Allows use of an external editor:
  The easiest thing to do with Thunderbird and patches is to use an
  "external editor" extension and then just use your favorite $EDITOR
  for reading/merging patches into the body text.  To do this, download
  and install the extension, then add a button for it using
  View->Toolbars->Customize... and finally just click on it when in the
  Compose dialog.

To beat some sense out of the internal editor, do this:

- Edit your Thunderbird config settings so that it won't use format=flowed.
  Go to "edit->preferences->advanced->config editor" to bring up the
  thunderbird's registry editor, and set "mailnews.send_plaintext_flowed" to
  "false".

- Disable HTML Format: Set "mail.identity.id1.compose_html" to "false".

- Enable "preformat" mode: Set "editor.quotesPreformatted" to "true".

- Enable UTF8: Set "prefs.converted-to-utf8" to "true".

- Install the "toggle wordwrap" extension.  Download the file from:
    https://addons.mozilla.org/thunderbird/addon/2351/
  Then go to "tools->add ons", select "install" at the bottom of the screen,
  and browse to where you saved the .xul file.  This adds an "Enable
  Wordwrap" entry under the Options menu of the message composer.
  • mail.identity.id1.compose_htmlは, 私のThunderbird(バージョン17.0.8)では見つかりませんでした. しかし, id1ではなく, defaultというのは見つかりましたので, これを設定しました. これは, 送ったメールがhtmlに変換されて送られないようにするためです. HTMLでメールを送る必要があるケースが思いつきません.
  • Word Wrapは, この文先頭付近に書かれているGeneral Preferencesの"Don't let your email client do automatic word wrapping for you. This can also corrupt your patch."を実現するためだと思います. 何文字でwrapするかは, mailnews.wraplengthで変更可能のようです(デフォルトは72. 0にすると自動wrapしなくなる). 実は, 私, この設定は省いていました. それでもパッチをちゃんと当てることが出来たと思いましたが, 間違っていたのかな?

GMailサーバに保存しましょう.

まず, 対象となるGitツリーの.git/configに以下のように書きましょう. これは, .gitconfigに書いてもよいかも知れません. passという項目にパスワードを書くことも出来ますが, そんなに何度もパッチを作るわけではないでしょうから, そこまで省力化する意味があるようには思いません.

[imap]
        folder = "[Gmail]/Drafts"
        host = imaps://imap.gmail.com
        user = i.love.you.and.love.and.peace@gmail.com
        port = 993
        #sslverify = false
        preformattedHTML

さらに,

  • GMail側を英語にしましょう. 英語にしないと, folderの場所が日本語になってしまうのか, うまく行きません. not foundと言われます.
  • Gitを手動コンパイルする必要があるかも. DebianではSSL関係のライブラリがgitにリンクされていません. 私は1.8.3を落として手動コンパイルしました.

その上で, 以下のようなことをしましょう. GMailのパスワードを聞かれるので, タイプすると送信されます.

GIT=/usr/local/bin/git
ORIG=A
$GIT format-patch -s -M $ORIG --stdout | $GIT imap-send

あとは, 本文を書いて, 送信しましょう. 以上です.

(追記)
Word Wrapプラグインの効き具合が意味不明なので, wraplengthを0にした. Mailerに自動的にwrapして欲しい場面というのが存在しないので. そういうことは, 自分でやります. 勝手にやらないでください(しかもデフォルト72文字って・・・). Thunderbirdは, デフォルトの設定に対する哲学が狂ってる. 全く分かってないな