Dans une base de code source, certaines parties sont plus modifiées que d’autres. cpython ne déroge pas à la règle. En analysant les fichiers modifiés durant l’année 2020, on peut voir l’activité intégrée à la branche principale (nommée master
).
L’activité d’un fichier est estimée en comptant le nombre de fois où il a été modifié. Dans cet article, l’estimation de l’activité d’un répertoire est la somme de l’activité des répertoires et des fichiers qu’il contient. Par exemple, avec un répertoire R contenant 3 fichiers F1, F2 et F3, un premier commit modifiant F1 et F2, un second modifiant uniquement F2, alors l’activité de F1 vaut 1, F2 vaut 2 et F3 vaut 0. L’activité de R vaut (1 + 2 + 0).
Activité globale
La quantité totale de modifications enregistrées est de 9956.
L’activité dans les répertoires à la racine du dépôt est principalement dans :
Lib
: code python de la bibliothèque standardDoc
: documentation au format reStructuredText. Elle permet la génération de plusieurs documentations visibles sur python.org (dont celle de la bibliothèque standard)Misc
: quelques fichiers divers et un répertoire résumant les nouveautés de chaque versionModules
: code python et C
Ces quatre répertoires représentent 2/3 de l’activité.
Il existe aussi quelques fichiers à la racine mais leur activité est négligeable.
Dans le répertoire Lib
60% de l’activité dans Lib
se situent dans Lib/test
et sont donc liés à la modification ou l’ajout de tests unitaires. Étant donné que la bibliothèque standard est couverte par des tests unitaires, il est assez logique que cela représente une part importante de l’activité. Ce répertoire ne contient pas l’intégralité des tests : certains sont placés ailleurs dans l’arborescence. Par exemple Lib/idlelib/idle_test
, Lib/distutils/tests
, etc.
Loin derrière, et pourtant deuxième en terme d’activité dans Lib
, le répertoire idlelib
contient du code de l’éditeur IDLE (4%).
Les onze premiers modules actifs (en excluant les tests) représentent 19% de l’activité :
L’activité autour de IDLE me semble étonnante car j’ai l’impression que cet éditeur est peu utilisé et donc je l’imaginais peu actif. De même pour tkinter mais son activité est probablement liée à IDLE qui l’utilise comme interface graphique.
Dans le répertoire Doc
La moitié de l’activité dans ce répertoire est liée à la bibliothèque standard (dans Doc/library
). C’est assez logique puisque Lib
est très modifié donc la documentation correspondante doit être mise à jour (pour signaler une changement de comportement, un nouveau paramètre, etc.).
Ensuite, avec 20% de l’activité, le répertoire Doc/whatsnew
contient les notes de version. L’année a vu la sortie de python 3.9 et le début du développement de la version 3.10 donc on retrouve principalement des modifications pour ces deux fichiers. Je suppose que les autres versions sont dues à des rétroportages ou des modifications cosmétiques.
whatsnew (267) 3.9.rst (150) 3.10.rst (95) 3.8.rst (10) 3.7.rst (5) 3.2.rst (3) 3.3.rst (1) 3.5.rst (1) 3.6.rst (1) index.rst (1)
Ce répertoire contient de nombreux autres fichiers de version, commençant avec 2.0.rst, qui n’ont eu aucune activité.
Dans le répertoire Misc
L’activité dans le répertoire Misc
est due à l’ajout des nouvelles qui sont placées dans Misc/NEWS.d
(94%). Chaque nouveauté ou changement de comportement ajouté à une nouvelle version publiée donne lieu à un nouveau fichier. Contrairement à des fichiers .py qui sont régulièrement modifiés, ces fichiers sont ajoutés en grand nombre mais ne sont plus jamais modifiés. Cet ajout est la dernière étapeà effectuer pour proposer une modification sur le code de cpython.
Le fichier ACKS
contient 5% des modifications : ce fichier regroupe le nom de toutes les personnes qui ont au moins contribué une fois. Il est donc logique que ce répertoire soit souvent modifié.
Dans le répertoire Modules
Le répertoire Modules
contient une partie du code C de l’interpréteur. Contrairement aux répertoires précédents, l’activité est répartie beaucoup plus largement.
Il faut les 14 premiers répertoires et fichiers pour représenter 50% de l’activité de Modules
.
Méthode de calcul et limites
Le code source ayant permis de produire l’arborescence d’activité est disponible à https://github.com/sblondon/commitstats. J’espère qu’il n’y a pas d’anomalie (ou sans impact réel) sur les calculs de stats.
L’arborescence est affichée sur la sortie standard :
. (9956) Lib (2765) test (1695) test_asyncio (74) test_events.py (11) test_tasks.py (10) [...] README.rst (12) .travis.yml (10) aclocal.m4 (6) .gitattributes (2) .gitignore (2) LICENSE (2) m4 (2) ax_c_float_words_bigendian.m4 (1) ax_check_openssl.m4 (1)
Les fichiers de statistiques générés sont téléchargeables. Les scripts de génération des graphiques y sont aussi (et ont encore moins d’intérêt).
Seule la branche master
est prise en compte donc les développements en cours et ceux en attente d’intégration sont ignorés.
Les modifications considèrent l’ensemble de l’année 2020 donc une partie des développements de la version 3.9 et le début de 3.10 puisque la version 3.9 est sortie en octobre 2020.
Plutôt que de compter le nombre de fois qu’un fichier a été modifié, il serait peut-être préférable de compter le nombre total de lignes modifiées.
La bibliothèque tree_output https://pypi.org/project/tree_output/ permettrait une sortie plus élégante.