upstream-patches

Par pulumi · agent-skills

Créez, modifiez, supprimez et rebasez des patches pour les sous-modules de providers Terraform à l'aide de `./scripts/upstream.sh`. À utiliser lorsque `upgrade-provider` ou un travail de patch manuel nécessite une recherche de patch propriétaire, des corrections de conflits de patches, la suppression de patches/hunks, ou un rebase upstream.

npx skills add https://github.com/pulumi/agent-skills --skill upstream-patches

Correctifs en amont

upstream/ est un sous-module git pointant vers le fournisseur Terraform en amont. patches/ contient des fichiers de correctif appliqués par-dessus. Utilisez ./scripts/upstream.sh pour gérer l'état des correctifs.

Comportement par défaut

  • Si vous corrigez une régression introduite par un correctif existant, modifiez le commit du correctif propriétaire.
  • Ne créez un nouveau correctif que si l'utilisateur le demande explicitement.

Référence des commandes

Commande Description
./scripts/upstream.sh init Initialise l'amont et applique les correctifs au répertoire de travail
./scripts/upstream.sh init -f Force la réinitialisation, en abandonnant les modifications
./scripts/upstream.sh checkout Crée une branche avec les correctifs en tant que commits pour édition
./scripts/upstream.sh rebase -i Édite interactivement les commits de correctif
./scripts/upstream.sh rebase -o <commit> Réapplique les correctifs sur un nouveau commit en amont
./scripts/upstream.sh check_in Écrit les commits dans les correctifs et quitte le mode checkout

Garde-fous

  • Ne commitez jamais directement sur upstream/ sans checkout/check_in.
  • Les éditions directes sous upstream/ en dehors du checkout sont éphémères pendant upgrade-provider ; l'outil réinitialise l'état du sous-module.
  • N'éditez pas à la main patches/*.patch à moins de faire intentionnellement une chirurgie brute sur les correctifs.
  • Préférez le flux de réécriture non-interactif au rebase interactif pour les agents.

Identifiez d'abord le correctif propriétaire

Avant d'éditer le contenu d'un correctif, identifiez le correctif/commit propriétaire.

./scripts/upstream.sh checkout

# Trouvez les fichiers de correctif candidats par chemin de fichier touché ou texte de hunk unique
rg -n "path/to/file|unique_symbol" patches/*.patch

# Optionnel : inspectez l'en-tête/les hunks du correctif candidat
sed -n '1,120p' patches/00NN-Example.patch

# Mappez le fichier de correctif au commit dans la branche checkout en amont
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"

# Si nécessaire, levez l'ambiguïté par chemin touché
git log --oneline pulumi/patch-checkout -- path/to/file
cd ..

Définissez target_sha sur le commit propriétaire et éditez ce commit, pas HEAD.

Modifiez un correctif existant (Préféré, Non-interactif)

./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}"

# Reconstruisez l'historique à partir du parent du commit cible
git checkout -b "$tmp_branch" "$base_sha"
git cherry-pick "$target_sha"

# Appliquez la correction et modifiez le commit cible
# ...éditez les fichiers...
git add <files>
git commit --amend --no-edit

# Rejouez les commits restants
git cherry-pick "${target_sha}..pulumi/patch-checkout"

# Si des conflits de cherry-pick surviennent :
#   résolvez les fichiers
#   git add <fichiers résolus>
#   git cherry-pick --continue

# Déplacez la branche checkout vers l'historique réécrit
git branch -f pulumi/patch-checkout HEAD
git checkout pulumi/patch-checkout
git branch -D "$tmp_branch"
cd ..

Secours interactif :

./scripts/upstream.sh checkout
./scripts/upstream.sh rebase -i
# marquez le commit cible comme édition, modifiez, puis continuez

Supprimez un correctif entier

À utiliser quand un correctif doit être supprimé complètement.

rm patches/00NN-Description.patch
./scripts/upstream.sh checkout
./scripts/upstream.sh check_in

Supprimez une partie d'un correctif

À utiliser quand seuls des hunks/fichiers sélectionnés doivent être supprimés d'un correctif existant.

  1. Trouvez le correctif/commit propriétaire (target_sha) et utilisez le flux de modification ci-dessus.
  2. Annulez uniquement les modifications indésirables du commit cible, puis modifiez.

Exemple lors de l'étape de modification :

cd upstream
# Restaurez les fichiers spécifiques à la documentation du parent du commit modifié
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 ..

Créez un nouveau correctif (Seulement si demandé)

./scripts/upstream.sh checkout
cd upstream
# ...apportez des modifications...
git add <files>
git commit -m "Describe new patch"
cd ..
./scripts/upstream.sh check_in

Réappliquez les correctifs à une nouvelle version en amont

./scripts/upstream.sh checkout

# Réappliquez sur le nouveau commit en amont
./scripts/upstream.sh rebase -o <new_commit_sha>
# Résolvez les conflits qui surviennent

# Écrivez les fichiers de correctif mis à jour
./scripts/upstream.sh check_in

Liste de vérification

Avant check_in :

  • Confirmez le changement du nombre de correctifs attendus (0 par défaut ; -1 pour la suppression complète d'un correctif).
  • Confirmez si le correctif cible doit rester présent (par défaut oui) ou être supprimé (cas de suppression explicite).
  • Confirmez que vous éditez le commit propriétaire, sans ajouter accidentellement un nouveau commit.

Après check_in :

  • Vérifiez que le nombre de correctifs correspond à l'attente.
  • Vérifiez que le numéro/l'objectif du correctif cible est toujours présent quand attendu.
  • Vérifiez qu'aucun nouveau 00NN-*.patch inattendu n'a été introduit.

Si le mode checkout est bloqué, utilisez ./scripts/upstream.sh init -f pour réinitialiser.

Skills similaires