ITSUKI.
技術732 文字2 分

Day 12|apply_patch — 変更の意図を、ファイルへの差分にする

#Codex#ソースコードリーディング#図解

この章しょうの答こたえ

パッチを解析かいせきし、適用てきようできるかを確認かくにんしてから実際じっさいの変更へんこうへ進すすむ。

ファイルを丸まるごと書き直かきなおす代かわりに、どこをどう変かえるかを差分さぶんで伝つたえます。apply_patch の読よみどころは、文字列もじれつのパッチが構造化こうぞうかされた変更へんこうになり、ファイル操作そうさへ変換へんかんされる境目さかいめです。

01|図でつかむ

図12|apply_patch

解析かいせきできること、適用てきようできること、変更内容へんこうないようが正ただしいことは、それぞれ別べつの確認かくにん。

02|3つのポイントで理解する

1. 文字列から Hunk へ

parse_patch や Hunk の定義ていぎから、追加ついか・削除さくじょ・更新こうしんをどう表現ひょうげんするかを見みます。構文こうぶんが壊こわれていれば、この段階だんかいでファイル操作そうさへ進すすめないようにする必要ひつようがあります。

2. 既存ファイルとの対応を確認する

更新こうしんする文脈ぶんみゃくやパスを調しらべ、パッチの意図いとを実際じっさいの操作そうさへ変かえます。構文こうぶんとして正ただしくても、対象たいしょうの内容ないようが変かわっていれば適用てきようできないことがあります。

3. 権限と結果を最後まで読む

ApplyPatchHandler から実行じっこう側がわへ進すすみ、許可きょかの確認かくにんと実際じっさいの変更へんこうを区別くべつします。適用てきよう後あとは diff を見みて意図いとしない変更へんこうがないか確認かくにんし、必要ひつような動作どうさ検証けんしょうにつなげます。

03|ソースで確かめる

以下いかの検索けんさくは Codex リポジトリのルートで実行じっこうします。最初さいしょに対象たいしょう commit を記録きろくし、検索結果けんさくけっかから定義ていぎと呼び出よびだし元もとを一ひとつずつ開ひらいてください。

git rev-parse --short HEAD
rg -n "parse_patch|enum Hunk" codex-rs

読よむ入口いりぐち: codex-rs/apply-patch/src/parser.rs 。リンク先さきは照合しょうごうに使つかった固定こてい commit のファイルです。手元てもとの版はんと異ことなる場合ばあいは、上うえの検索語けんさくごから探さがし直なおします。

小さく試す

学習用がくしゅうようの小ちいさなファイルで一箇所いっかしょの変更へんこうを読よみ、パッチの指定してい箇所かしょと生成せいせいされた diff を照合しょうごうします。

04|30秒で復習

  • パッチを構造化こうぞうかされた変更へんこうへ変かえる。
  • 構文こうぶん・適用条件てきようじょうけん・権限けんげんを分わける。
  • 適用てきよう後あとは差分さぶんと動作どうさを確認かくにんする。

全ぜん30章しょうの目次もくじへ