複数Hunkのリファクタリングパッチの適用

ファイルの異なるセクションにまたがるコードをリファクタリングする複数Hunkパッチを適用します。Hunkが順次適用される仕組みと行オフセットの調整を学びます。

Multi-Hunk Patches

詳細な説明

複数Hunkパッチ

実際のパッチには複数のHunkが含まれることが多く、ファイルの異なるセクションを対象とします。パッチエンジンはHunkを上から下へ順に適用し、前のHunkによる行の追加・削除に応じてオフセットを調整します。

例:モジュールのリファクタリング

--- a/api.js
+++ b/api.js
@@ -2,7 +2,7 @@

-const API_URL = "http://localhost:3000";
+const API_URL = process.env.API_URL || "http://localhost:3000";

 async function fetchUsers() {
   const response = await fetch(API_URL + "/users");
@@ -15,6 +15,10 @@
   return data;
 }

+async function fetchUserById(id) {
+  const response = await fetch(API_URL + "/users/" + id);
+  return response.json();
+}
+
 module.exports = { fetchUsers };
@@ -22,3 +26,3 @@
-module.exports = { fetchUsers };
+module.exports = { fetchUsers, fetchUserById };

Hunk適用順序

  1. Hunk 1(2行目):ハードコードされたURLを環境変数に置換 — 行数変更なし
  2. Hunk 2(15行目):新しい関数を追加 — 4行追加、オフセット+4
  3. Hunk 3(22行目 + オフセット = 26行目):エクスポートを更新 — Hunk 2のオフセットが適用

オフセット追跡

各Hunk後、エンジンは累積行オフセットを追跡します:

  • HunkがN行追加:オフセットがN増加
  • HunkがN行削除:オフセットがN減少
  • 後続のHunkは現在のオフセットで対象行番号が調整される

選択的適用

Diffパッチ適用ツールでは各Hunkを個別に承認・拒否できます。例えば、URL変更(Hunk 1)と新関数(Hunk 2)は受け入れ、エクスポート変更(Hunk 3)は別途対応したい場合に便利です。

ユースケース

コードレビューで同じファイルの異なる箇所に3つの変更が提案されました。最初の2つを適用し、エクスポートの変更は別途対応したい場合に使用します。

試してみる — Diff Patch Applier

フルツールを開く