複数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適用順序
- Hunk 1(2行目):ハードコードされたURLを環境変数に置換 — 行数変更なし
- Hunk 2(15行目):新しい関数を追加 — 4行追加、オフセット+4
- 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つを適用し、エクスポートの変更は別途対応したい場合に使用します。