Lignes directrices sur les demandes d'extraction #
Les demandes d'extraction (PR) sont le mécanisme de contribution au code et à la documentation de Matplotlibs.
Résumé pour les réviseurs de pull request #
Noter
Si vous avez des droits de validation, vous êtes autorisé à les utiliser. Aidez-nous à réviser et à fusionner les PR !
Soyez patient et gentil avec les contributeurs.
Sujets de contenu :
La fonctionnalité / correction de bogue est-elle raisonnable ?
Le PR est-il conforme aux directives de codage ?
La documentation (docstrings, exemples, nouveautés, modifications de l'API) est-elle mise à jour ?
Thèmes organisationnels :
Assurez-vous que tous les tests automatisés réussissent.
Le PR doit cibler la branche principale .
Balise avec des étiquettes descriptives .
Définissez le jalon .
Gardez un œil sur le nombre de commits .
Approuvez si tous les sujets ci-dessus sont traités.
Fusionner si un nombre suffisant d'approbations est atteint.
Directives détaillées #
Documents #
Chaque nouvelle fonctionnalité doit être documentée. S'il s'agit d'un nouveau module, n'oubliez pas d'ajouter un nouveau premier fichier à la documentation de l'API.
Chaque fonction de traçage de haut niveau doit avoir un petit exemple dans la
Examples
section de la docstring. Cela devrait être aussi simple que possible pour démontrer la méthode. Les exemples plus complexes doivent aller dans un fichier d'exemple dédié dans leexamples
répertoire, qui sera rendu dans la galerie d'exemples de la documentation.Créez les documents et assurez-vous que tous les avertissements de formatage sont traités.
Voir Rédaction de documentation pour notre guide de style de documentation.
Si votre modification est une nouvelle fonctionnalité majeure, ajoutez une entrée à
doc/users/whats_new.rst
.Si vous modifiez l'API d'une manière incompatible avec les versions antérieures, veuillez le documenter en ajoutant un fichier dans le sous-répertoire approprié de
doc/api/next_api_changes/
, probablement dans le sous-behavior/
répertoire .
Étiquettes #
Si vous avez le droit de définir des étiquettes, étiquetez le PR avec des étiquettes descriptives. Voir la liste des étiquettes .
Si le PR apporte des modifications à l'action de construction de la roue, ajoutez l'étiquette "Exécuter cibuildwheel" pour activer les roues de test.
Jalons #
Définissez le jalon selon ces règles :
Les nouvelles fonctionnalités et les modifications de l'API sont jalonnées pour la prochaine version mineure
v3.X.0
.Les corrections de bogues et les changements de docstring sont jalonnés pour la prochaine version du correctif
v3.X.Y
Les modifications de la documentation (tous les fichiers .rst et les exemples) sont jalonnées
v3.X-doc
Si plusieurs règles s'appliquent, choisissez la première correspondance dans la liste ci-dessus.
La définition d'un jalon n'implique ni ne garantit qu'un PR sera fusionné pour cette version, mais s'il devait être fusionné, dans quelle version il se trouverait.
Tous ces PR doivent cibler la branche principale. La balise de jalon déclenche un rétroportage automatique pour les jalons qui ont une branche correspondante.
Fusion #
La documentation et les exemples peuvent être fusionnés par le premier examinateur. Utilisez le seuil "est-ce mieux qu'il ne l'était ?" comme critères d'examen.
Pour les modifications de code (tout ce qui se trouve dans
src
oulib
), au moins deux développeurs principaux (ceux qui ont des droits de validation) doivent examiner toutes les demandes d'extraction. Si vous êtes le premier à examiner une PR et à approuver les modifications, utilisez l' outil "approuver l'examen" de GitHub pour le marquer comme tel. Si vous êtes un réviseur ultérieur, veuillez approuver la révision et si vous pensez qu'aucune autre révision n'est nécessaire, fusionnez le PR.Assurez-vous que toutes les modifications de l'API sont documentées dans un fichier dans l'un des sous-répertoires de
doc/api/next_api_changes
, et que les nouvelles fonctionnalités importantes ont une entrée dansdoc/user/whats_new
.Si un PR a déjà une évaluation positive, un développeur principal (par exemple, le premier examinateur, mais pas nécessairement) peut défendre ce PR pour la fusion. Pour ce faire, ils doivent envoyer un ping à tous les développeurs principaux à la fois sur GitHub et sur la liste de diffusion des développeurs, et étiqueter le PR avec le "Fusionner avec une seule révision ?" étiquette. Les autres développeurs de base peuvent alors soit examiner le PR et le fusionner ou le rejeter, soit simplement demander qu'il reçoive un deuxième examen avant d'être fusionné. Si personne ne demande un tel deuxième examen dans un délai d'une semaine, le PR peut alors être fusionné sur la base de cet examen unique.
Un développeur principal ne devrait défendre qu'un seul PR à la fois et nous devrions essayer de maintenir un flux raisonnable de PR défendus.
Ne pas fusionner soi-même, sauf pour les "petits" correctifs pour débloquer le CI ou lorsqu'un autre réviseur l'autorise explicitement (par exemple, "Approuver le passage du CI modulo, peut fusionner automatiquement lorsqu'il est vert").
Tests automatisés #
Chaque fois qu'une demande d'extraction est créée ou mise à jour, divers outils de test automatisés s'exécutent sur toutes les plates-formes et versions de Python prises en charge.
Assurez-vous que les pipelines Linting, GitHub Actions, AppVeyor, CircleCI et Azure passent avant la fusion (toutes les vérifications sont répertoriées au bas de la page GitHub de votre demande d'extraction). Voici quelques conseils pour trouver la cause de l'échec du test :
Si Linting échoue, vous avez un problème de style de code, qui sera répertorié sous forme d'annotations sur le diff de la demande d'extraction.
Si une exécution GitHub Actions ou AppVeyor échoue, recherchez dans le journal
FAILURES
. La section suivante contiendra des informations sur les tests échoués.Si CircleCI échoue, vous avez probablement un problème de style reStructuredText dans la documentation. Recherchez dans le journal CircleCI
WARNING
.Si les pipelines Azure échouent avec une erreur de comparaison d'images, vous pouvez trouver les images en tant qu'artefacts de la tâche Azure :
Cliquez sur Détails sur la case à cocher sur la page GitHub PR.
Cliquez sur Afficher plus de détails sur Azure Pipelines pour accéder à Azure.
Sur la page de présentation, les artefacts sont répertoriés dans la section Related .
Codecov et LGTM sont actuellement à titre indicatif. Leur échec n'est pas forcément un bloqueur.
tox n'est pas utilisé dans les tests automatisés. Il est pris en charge pour les tests locaux.
Si vous savez que vos modifications n'ont pas besoin d'être testées (c'est très rare !), tous les CI peuvent être ignorés pour un commit donné en incluant ou dans le message de commit. Si vous savez que seul un sous-ensemble de CI doit être exécuté (par exemple, si vous modifiez un bloc de reStructuredText simple et que vous souhaitez que seul CircleCI s'exécute pour rendre le résultat), les CI individuels peuvent également être ignorés lors de validations individuelles en utilisant ce qui suit sous-chaînes dans les messages de validation :
[ci skip]
[skip ci]
Actions GitHub :
[skip actions]
AppVeyor : (doit être dans la première ligne du commit)
[skip appveyor]
Pipelines Azure :
[skip azp]
CercleCI :
[skip circle]
Nombre de commits et squashing #
L'écrasement est au cas par cas. L'équilibre est entre la charge du contributeur, le maintien d'un historique relativement propre et le maintien d'un historique utilisable pour la bissectrice. La seule fois où nous sommes vraiment stricts à ce sujet est d'éliminer les fichiers binaires (par exemple plusieurs régénérations d'images de test) et de supprimer les fusions en amont.
Ne laissez pas le parfait être l'ennemi du bien, en particulier pour la documentation ou les exemples de relations publiques. Si vous vous retrouvez à faire de nombreuses petites suggestions, ouvrez un PR contre la branche d'origine, poussez les modifications vers la branche contributrice, ou fusionnez le PR puis ouvrez un nouveau PR contre l'amont.
Si vous poussez vers une branche contributeur laissez un commentaire expliquant ce que vous avez fait, ex "j'ai pris la liberté de pousser un petit PR de nettoyage vers votre branche, merci pour votre travail.". Si vous envisagez d'apporter des modifications substantielles au code ou à l'intention du PR, veuillez d'abord vérifier auprès du contributeur.
Branches et backports #
Succursales actuelles #
Les branches actives actuelles sont
- principale
La version de développement actuelle. Les futures versions mineures ( v3.N.0 ) en seront dérivées.
- v3.Nx
Branche de maintenance pour Matplotlib 3.N. Les futures versions de correctifs en seront dérivées.
- v3.NM-doc
Documentation de la version actuelle. Sur une version de correctif, cela sera remplacé par une branche correctement nommée pour la nouvelle version.
Sélection de branche pour les pull requests #
En règle générale, toutes les demandes d'extraction doivent cibler la branche principale.
Les autres branches sont alimentées en automatique ou en manuel . Le ciblage direct d'autres branches n'est que rarement nécessaire pour des travaux de maintenance particuliers.
Stratégie de rétroportage #
Nous rétroporterons toujours vers la branche de publication des correctifs ( v3.Nx ):
corrections de bogues critiques (erreur de segmentation, échec de l'importation, problèmes que l'utilisateur ne peut pas contourner)
correctifs pour les régressions par rapport aux deux dernières versions.
Tout le reste (régressions par rapport aux anciennes versions, bugs/incohérences d'api que l'utilisateur peut contourner dans son code) est au cas par cas, devrait être à faible risque et nécessite quelqu'un pour défendre et guider le backport.
Les seules modifications à rétroporter dans la branche documentation ( v3.NM-doc ) sont les modifications apportées à doc
, examples
ou tutorials
. Toute modification apportée lib
ou src
incluant uniquement les modifications de docstring ne doit pas être rétroportée sur cette branche.
Rétroportages automatisés #
Nous utilisons le bot meeseeksdev pour rétroporter automatiquement les fusions vers la base de branche de maintenance correcte sur le jalon. Pour fonctionner correctement, le jalon doit être défini avant la fusion. Si vous avez des droits de validation, le bot peut également être déclenché manuellement après une fusion en laissant un message
sur le PR. S'il y a des conflits, meeseekdevs vous informera que le rétroportage doit être fait manuellement.@meeseeksdev backport to BRANCH
La branche cible est configurée en plaçant la description du jalon sur sa propre ligne.on-merge: backport to
TARGETBRANCH
Si le bot ne fonctionne pas comme prévu, veuillez signaler les problèmes à Meeseeksdev .
Rétroportages manuels #
Lorsque vous effectuez des rétroportages, veuillez copier le formulaire utilisé par meeseekdev,
. Si vous devez résoudre manuellement des conflits, notez-les et indiquez comment vous les avez résolus dans le message de validation.Backport PR #XXXX: TITLE OF PR
Nous effectuons un rétroportage de main vers v2.2.x en supposant :
matplotlib
est une branche distante en lecture seule du dépôt matplotlib/matplotlib
Il TARGET_SHA
s'agit du hachage du commit de fusion que vous souhaitez rétroporter. Cela peut être lu sur la page GitHub PR (dans l'interface utilisateur avec la notification de fusion) ou via les outils CLI git.
En supposant que vous ayez déjà une branche locale v2.2.x
(sinon, alors
), et que votre télécommande pointant vers
s'appelle :git checkout -b v2.2.x
https://github.com/matplotlib/matplotlib
upstream
git fetch upstream
git checkout v2.2.x # or include -b if you don't already have this.
git reset --hard upstream/v2.2.x
git cherry-pick -m 1 TARGET_SHA
# resolve conflicts and commit if required
Les fichiers en conflit peuvent être répertoriés par , et devront être corrigés à la main (recherche sur ). Une fois le conflit résolu, vous devrez rajouter le(s) fichier(s) à la branche puis continuer la sélection :git status
>>>>>
git add lib/matplotlib/conflicted_file.py
git add lib/matplotlib/conflicted_file2.py
git cherry-pick --continue
Utilisez votre discrétion pour pousser directement en amont ou pour ouvrir un PR ; veillez à pousser ou PR contre la v2.2.x
branche amont, non main
!