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/sanscheckout/check_in. - Les éditions directes sous
upstream/en dehors du checkout sont éphémères pendantupgrade-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.
- Trouvez le correctif/commit propriétaire (
target_sha) et utilisez le flux de modification ci-dessus. - 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 (
0par défaut ;-1pour 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-*.patchinattendu n'a été introduit.
Si le mode checkout est bloqué, utilisez ./scripts/upstream.sh init -f pour réinitialiser.