upstream-patches について
upstream-patchesは、Gitサブモジュールで管理されるTerraform provider上流コードへのパッチを保守するスキルです。編集、リベース、削除、検証の手順を提供し、変更を担当するコミットに結び付けて管理します。
主な機能
- 01上流コードの初期化とパッチ適用
- 02コミット単位のチェックアウトによる編集
- 03新しい上流コミットへのリベース
- 04パッチ全体または一部の削除
- 05更新前後のパッチ状態の確認
活用シーン
- 01既存パッチが引き起こした回帰の修正
- 02ローカルパッチを更新済みproviderにリベース
- 03古いパッチを削除して結果を確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ pulumi/ agent-skills --skill upstream-patchesインストール後、Claude Code で/upstream-patchesを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yamluse_cases.yaml
詳細
上流パッチ
upstream/ は、上流の Terraform プロバイダーを指す Git サブモジュールです。patches/ には、その上に適用されるパッチファイルが含まれています。パッチの状態を管理するには、./scripts/upstream.sh を使用します。
デフォルトの動作
- 既存のパッチによって発生したリグレッションを修正する場合は、そのパッチを所有するコミットを修正します。
- ユーザーから明示的に依頼されない限り、新しいパッチを作成しないでください。
コマンドリファレンス
| コマンド | 説明 |
|---|---|
./scripts/upstream.sh init | 上流を初期化し、作業ディレクトリにパッチを適用します |
./scripts/upstream.sh init -f | チェックアウト/リベースの状態を破棄して、上流を再初期化します |
./scripts/upstream.sh checkout | パッチをコミットとして含むブランチを作成し、編集できるようにします |
./scripts/upstream.sh rebase -i | パッチのコミットを対話的に編集します |
./scripts/upstream.sh rebase -o <commit> | パッチを新しい上流コミットにリベースします |
./scripts/upstream.sh check_in | コミットをパッチに書き戻し、チェックアウトモードを終了します |
注意事項
checkout/check_inを使用せずに、upstream/に直接コミットしないでください。- チェックアウトモード外で
upstream/以下を直接編集しても、その変更はupgrade-providerの実行中に一時的なものとなり、ツールによってサブモジュールの状態がリセットされます。 - 意図的にパッチを直接編集する場合を除き、
patches/*.patchを手動で編集しないでください。 - エージェントでは、対話型リベースよりも非対話型の書き換えフローを優先してください。
最初にパッチの所有者を特定する
パッチの内容を編集する前に、該当するパッチ/コミットの所有者を特定します。
./scripts/upstream.sh checkout
# Find candidate patch files by touched file path or unique hunk text
rg -n "path/to/file|unique_symbol" patches/*.patch
# Optional: inspect candidate patch header/hunks
sed -n '1,120p' patches/00NN-Example.patch
# Map patch file to commit in upstream checkout branch
patch=patches/00NN-Example.patch
subject=$(sed -n 's/^Subject: \[PATCH\] //p' "$patch" | head -n1)
cd upstream
git log --oneline pulumi/patch-checkout --grep "$subject"
# If needed, disambiguate by touched path
git log --oneline pulumi/patch-checkout -- path/to/file
cd ..
rg を使用できない場合は、パッチを検索するために grep -En を使用してください。target_sha に所有者のコミットを設定し、HEAD ではなくそのコミットを編集します。
既存のパッチを修正する(推奨、非対話型)
./scripts/upstream.sh checkout
cd upstream
target_sha=<owning-commit-sha>
base_sha=$(git rev-parse "${target_sha}^")
tmp_branch="rewrite-${target_sha:0:8}"
# Rebuild history from parent of target commit
git checkout -b "$tmp_branch" "$base_sha"
git cherry-pick "$target_sha"
# Apply fix and amend target commit
# ...edit files...
git add <files>
git commit --amend --no-edit
# Replay remaining commits
git cherry-pick "${target_sha}..pulumi/patch-checkout"
# If cherry-pick conflicts occur:
# resolve files
# git add <resolved files>
# git cherry-pick --continue
# Move checkout branch to rewritten history
git branch -f pulumi/patch-checkout HEAD
git checkout pulumi/patch-checkout
git branch -D "$tmp_branch"
cd ..
対話型の代替手段:
./scripts/upstream.sh checkout
./scripts/upstream.sh rebase -i
# mark target commit as edit, amend, then continue
パッチ全体を削除する
パッチを完全に削除する場合に使用します。
rm patches/00NN-Description.patch
./scripts/upstream.sh checkout
./scripts/upstream.sh check_in
パッチの一部を削除する
既存のパッチから特定のハンク/ファイルだけを削除する場合に使用します。
- 該当するパッチ/コミット(
target_sha)を特定し、上記の修正ワークフローを使用します。 - 対象のコミットから不要な変更だけを取り消し、その後コミットを修正します。
修正手順での例:
cd upstream
# Restore specific docs-only files from parent of amended commit
git checkout HEAD^ -- path/to/docs-only-file path/to/another-doc-file
git add path/to/docs-only-file path/to/another-doc-file
git commit --amend --no-edit
cd ..
新しいパッチを作成する(依頼があった場合のみ)
./scripts/upstream.sh checkout
cd upstream
# ...make changes...
git add <files>
git commit -m "Describe new patch"
cd ..
./scripts/upstream.sh check_in
パッチを新しい上流バージョンにリベースする
./scripts/upstream.sh checkout
# Rebase onto the new upstream commit
./scripts/upstream.sh rebase -o <new_commit_sha>
# Resolve any conflicts that arise
# Write updated patch files
./scripts/upstream.sh check_in
検証チェックリスト
check_in の前に:
- パッチ数の変更が想定どおりであることを確認します(デフォルトは
0、パッチ全体を削除する場合は-1)。 - 対象のパッチを残すべきか(デフォルトは「はい」)、削除すべきか(明示的な削除の場合)を確認します。
- 新しいコミットを誤って追加するのではなく、所有者のコミットを編集していることを確認します。
check_in の後に:
- パッチ数が想定どおりであることを確認します。
- 想定される場合、対象のパッチ番号/目的が引き続き存在することを確認します。
- 想定外の新しい
00NN-*.patchが作成されていないことを確認します。
チェックアウトまたはリベースが中断された場合
デフォルトでは作業を保持します。git -C upstream status を確認し、進行中の git am/リベースを完了して、すべてのパッチが適用されたことを検証してから、オートメーションを再実行する前に ./scripts/upstream.sh check_in を実行します。チェックアウトが中断された場合、パッチごとに個別に git am が呼び出されるため、後続のパッチファイルまで処理されていない可能性があります。
中断された作業をすべて意図的に破棄する場合に限り、./scripts/upstream.sh init -f を使用してください。これにより、コンフリクトの解消内容、パッチのコミット、操作メタデータ、追跡されていないファイルが削除されることがあります。スタックしたチェックアウトから通常の方法で復旧するために使用するコマンドではありません。