The scheme of a git negotiation came from the request line the client
writes, so "ssh://any-host/x.git/info/refs" made the cache run git clone
over ssh, with its service account keys, toward a host the client chose.
A git client reaches an HTTP proxy only over HTTP(S), so nothing cached
is lost. DepotDeURL now refuses other schemes, the clone ends its options
with "--", and GIT_ALLOW_PROTOCOL=http:https bounds git itself.
Checked: ssh, git, file and ext refused, a real clone through the mirror
still passes, full qemu_cache Go suite green.
--- FR ---
[FIX] qemu cache : le miroir git ne clone qu'en http et https
Le schéma d'une négociation git venait de la ligne de requête écrite par
le client : « ssh://hôte-quelconque/x.git/info/refs » faisait lancer au
cache un git clone en ssh, avec les clés de son compte de service, vers
un hôte choisi par le client. Un client git ne joint un mandataire HTTP
qu'en HTTP(S) : rien de ce qui se met en cache n'est perdu. DepotDeURL
refuse les autres schémas, le clone clôt ses options par « -- », et
GIT_ALLOW_PROTOCOL=http:https borne git lui-même.
Vérifié : ssh, git, file et ext refusés, un vrai clone à travers le
miroir passe toujours, suite Go de qemu_cache au vert.
Assisted-by: Claude Opus 5.5
[UPD] requirement: Odoo 18 aws 1.43.75, requests 2.32.4, no examples
6 commits. aiobotocore 3.9.1 accepts botocore only below 1.43.76, so the
AWS trio moves together to 1.43.75. requests is pinned to 2.32.4 against
the 2.31.0 of Odoo 18 and its two CVEs; its version had followed an
example requirements file, which poetry_update.py now skips along with
anything under doc and examples directories. factur-x gets the floor
already locked, openpyxl and xlsxwriter move for Transform data.
Checked: poetry lock resolves at each commit, the Transform data leak
test passes, 511 tests.
--- FR ---
[UPD] requirement : Odoo 18 aws 1.43.75, requests 2.32.4, sans exemples
6 commits. aiobotocore 3.9.1 n'accepte botocore que sous 1.43.76 : le trio
AWS passe ensemble à 1.43.75. requests est épinglé à 2.32.4 contre le
2.31.0 d'Odoo 18 et ses deux CVE ; sa version suivait un requirements
d'exemple, que poetry_update.py écarte désormais avec tout ce qui est
sous un répertoire doc ou examples. factur-x reçoit le plancher déjà
verrouillé, openpyxl et xlsxwriter montent pour Transform data.
Vérifié : poetry lock résout à chaque commit, le test de fuite de
Transform data passe, 511 tests.
Assisted-by: Claude Opus 5.5
The Unreleased entry named botocore 1.43.49 with aiobotocore 3.9.0,
which the branch replaces by 1.43.75 with 3.9.1; the entry now matches
what installs. Added: openpyxl and xlsxwriter for Transform data and the
factur-x floor under Changed, the doc and examples filter of
poetry_update.py under Fixed, requests 2.32.4 under Security.
Checked: make doc_markdown regenerates both files, each language only
in its own.
--- FR ---
[UPD] changelog : aws 1.43.75, requests 2.32.4, exemples doc écartés
L'entrée Unreleased nommait botocore 1.43.49 avec aiobotocore 3.9.0,
que la branche remplace par 1.43.75 avec 3.9.1 ; l'entrée colle désormais
à ce qui s'installe. Ajoutés : openpyxl et xlsxwriter pour Transform data
et le plancher de factur-x sous Modifié, le filtre doc et examples de
poetry_update.py sous Corrigé, requests 2.32.4 sous Sécurité.
Vérifié : make doc_markdown régénère les deux fichiers, chaque langue
dans le sien seulement.
Assisted-by: Claude Opus 5.5
poetry_update.py read every requirements.txt of the addon repositories,
illustrations included: an example file declaring a loose ">=" moved a
dependency for the whole environment, past the pin Odoo sets. A path
with a directory named doc, docs, example or examples, compared by exact
name, is now skipped for requirements and manifests alike; the ERPLibre
requirements file is still added without filtering.
Checked on a tree with the extra repositories: 70 requirements and 4016
manifests found, the one example file skipped, no manifest lost.
--- FR ---
[FIX] poetry update : ignorer les requirements sous doc et examples
poetry_update.py lisait tout requirements.txt des dépôts d'addons,
illustrations comprises : un fichier d'exemple déclarant un « >= » lâche
déplaçait une dépendance pour tout l'environnement, par-delà l'épingle
d'Odoo. Un chemin dont un répertoire s'appelle doc, docs, example ou
examples, comparé au nom exact, est désormais écarté, requirements comme
manifestes ; le requirements d'ERPLibre reste ajouté sans filtre.
Vérifié sur une arborescence avec les dépôts extra : 70 requirements et
4016 manifestes trouvés, le seul fichier d'exemple écarté, aucun manifeste
perdu.
Assisted-by: Claude Opus 5.5
Odoo 18 pins requests 2.31.0, affected by CVE-2024-35195 and
CVE-2024-47081, both fixed in 2.32.4. Left to the generated resolution,
the version followed whatever an addon repository declared, down to an
example requirements file under a doc/ directory. The ERPLibre pin now
wins the conflict and states its reason.
Checked: poetry lock resolves, requests is the only package that moves.
--- FR ---
[UPD] requirement : requests 2.32.4 plutôt que le 2.31.0 d'Odoo 18
Odoo 18 épingle requests 2.31.0, touchée par CVE-2024-35195 et
CVE-2024-47081, toutes deux corrigées en 2.32.4. Livrée à la résolution
générée, la version suivait ce qu'un dépôt d'addons déclarait, jusqu'à un
requirements d'exemple sous un répertoire doc/. L'épingle d'ERPLibre
l'emporte désormais et dit sa raison.
Vérifié : poetry lock résout, requests est le seul paquet qui bouge.
Assisted-by: Claude Opus 5.5
aiobotocore 3.9.1 accepts botocore only in >=1.43.66,<1.43.76, so
botocore 1.43.49 failed the resolution against it. botocore and boto3
move to 1.43.75, the highest release in that range; boto3 1.43.75 needs
botocore>=1.43.75 and s3transfer <0.20, which the lock already holds.
Checked: poetry lock resolves, only the three AWS packages change
version.
--- FR ---
[UPD] requirement : aiobotocore 3.9.1 avec botocore et boto3 1.43.75
aiobotocore 3.9.1 n'accepte botocore que dans >=1.43.66,<1.43.76 :
botocore 1.43.49 faisait échouer la résolution. botocore et boto3
passent à 1.43.75, la plus haute version de cette plage ; boto3 1.43.75
exige botocore>=1.43.75 et s3transfer <0.20, que le lock porte déjà.
Vérifié : poetry lock résout, seuls les trois paquets AWS changent de
version.
Assisted-by: Claude Opus 5.5
The lock already resolves factur-x 6.8 on every architecture but s390x,
which keeps its <4 branch; >=4.2 let a regeneration fall back to a 4.x
or 5.x that no install has run. The floor now matches what is locked,
so no installed version changes.
Checked: the lock changes only its content-hash; the calls OCA_edi makes
(generate_from_file, xml_check_xsd, get_flavor, get_level,
get_xml_namespaces, get_facturx_level) match the 6.8 signatures.
--- FR ---
[UPD] requirement : plancher de factur-x à 6.8 hors s390x
Le lock résout déjà factur-x 6.8 sur toute architecture sauf s390x, qui
garde sa branche <4 ; >=4.2 laissait une régénération retomber sur une
4.x ou 5.x qu'aucune installation n'a fait tourner. Le plancher suit
désormais le lock : aucune version installée ne change.
Vérifié : le lock ne change que son content-hash ; les appels d'OCA_edi
(generate_from_file, xml_check_xsd, get_flavor, get_level,
get_xml_namespaces, get_facturx_level) collent aux signatures de 6.8.
Assisted-by: Claude Opus 5.5
The xlsx cleaning of Transform data reaches openpyxl private attributes
(_external_links, _charts, _pivots, _images, _cf_rules), which is why
openpyxl is pinned exactly and each bump has to pass the leak test.
Checked: test_transform_external passes, 511 tests, none skipped,
TestFuiteXlsx included, in a .venv.todo.external_data built from this
file.
--- FR ---
[UPD] todo external data : openpyxl 3.1.5, xlsxwriter 3.2.9
Le nettoyage xlsx de Transform data touche des attributs privés
d'openpyxl (_external_links, _charts, _pivots, _images, _cf_rules) :
d'où une épingle exacte, et chaque montée doit passer le test de fuite.
Vérifié : test_transform_external passe, 511 tests, aucun ignoré,
TestFuiteXlsx compris, dans un .venv.todo.external_data bâti de ce
fichier.
Assisted-by: Claude Opus 5.5
[UPD] requirement: Odoo 18 on pandas 3, cryptography 50, aws 1.43
3 commits. botocore 1.43.49 failed the resolution against aiobotocore
3.1.3, which caps it below 1.42.50; aiobotocore 3.9.0 is the only release
whose range holds it, and Dependabot now proposes the three AWS packages
in one pull request so they stay aligned. pandas moves to 3.0.6: the
seven modules importing it run their pandas calls unchanged, and no
installed package caps it below 3 outside test extras. Checked: the lock
keeps its 362 packages and an installation with the extras succeeds.
--- FR ---
[UPD] requirement : Odoo 18 sur pandas 3, cryptography 50, aws 1.43
3 commits. botocore 1.43.49 faisait échouer la résolution face à
aiobotocore 3.1.3, qui le plafonne sous 1.42.50 ; aiobotocore 3.9.0 est la
seule version dont la plage le contient, et Dependabot propose désormais
les trois paquets AWS dans une seule demande de fusion pour qu'ils restent
alignés. pandas passe en 3.0.6 : les sept modules qui l'importent
exécutent leurs appels pandas sans changement, et aucun paquet installé ne
le borne sous 3 hors extras de test. Vérifié : le lock garde ses 362
paquets et une installation avec les extras réussit.
Assisted-by: Claude Opus 5.5
Records the branch for the next release under Changed: the Odoo 18 move
to pandas 3.0.6, cryptography 50, Pillow 12.3 and the AWS trio aligned on
aiobotocore 3.9.0, with the pandas 4 warning left in a third-party
attendance dashboard, and the Dependabot group that keeps the three AWS
packages in one pull request.
Checked: make doc_markdown regenerates both files, each language only
in its own.
--- FR ---
[UPD] changelog : Odoo 18 sur pandas 3, aws 1.43, groupe aws Dependabot
Consigne la branche pour la prochaine version sous Modifié : le passage
d'Odoo 18 à pandas 3.0.6, cryptography 50, Pillow 12.3 et le trio AWS
aligné sur aiobotocore 3.9.0, avec l'avertissement pandas 4 laissé dans
un tableau de bord de présence tiers, et le groupe Dependabot qui garde
les trois paquets AWS dans une seule demande de fusion.
Vérifié : make doc_markdown régénère les deux fichiers, chaque langue
dans le sien seulement.
Assisted-by: Claude Opus 5.5
botocore 1.43.49 needs aiobotocore 3.9.0, the only release whose range
(>=1.43.3,<1.43.57) holds it; 3.1.3 capped botocore below 1.42.50 and
failed the resolution. pandas 3.0.6: the seven modules importing it run
their pandas calls unchanged, and no installed package caps it below 3
outside test extras. pyopenssl 26.4.0 accepts cryptography 50.
Pillow 12.3.0 is aligned in todo_external_data.txt.
Checked: the lock keeps its 362 packages, PyMuPDF keeps its s390x
marker, and an installation with the extras succeeds.
--- FR ---
[UPD] requirement : Odoo 18 sur pandas 3, cryptography 50, aws 1.43
botocore 1.43.49 exige aiobotocore 3.9.0, la seule version dont la plage
(>=1.43.3,<1.43.57) le contient ; la 3.1.3 plafonnait botocore sous
1.42.50 et faisait échouer la résolution. pandas 3.0.6 : les sept modules
qui l'importent exécutent leurs appels pandas sans changement, et aucun
paquet installé ne le borne sous 3 hors extras de test. pyopenssl 26.4.0
accepte cryptography 50. Pillow 12.3.0 est aligné dans todo_external_data.
Vérifié : le lock garde ses 362 paquets, PyMuPDF son marqueur s390x, et
une installation avec les extras réussit.
Assisted-by: Claude Opus 5.5
Each aiobotocore release accepts only a narrow botocore range, and boto3
pins botocore. Proposed one by one, a botocore bump against an unchanged
aiobotocore fails the resolution. The aws group brings the three version
updates in one pull request; security fixes still arrive on their own.
Dependabot does not solve constraints in a requirements file, so the
grouped versions may still need aligning by hand.
Checked: the YAML parses.
--- FR ---
[UPD] dependabot : grouper aiobotocore, botocore et boto3
Chaque version d'aiobotocore n'accepte qu'une plage étroite de botocore,
et boto3 épingle botocore. Proposées une à une, une montée de botocore
face à un aiobotocore inchangé fait échouer la résolution. Le groupe aws
réunit les trois mises à jour de version dans une seule demande de
fusion ; les correctifs de sécurité arrivent toujours seuls. Dependabot
ne résout pas les contraintes d'un requirements : les versions groupées
peuvent encore demander un alignement à la main.
Vérifié : le YAML se lit.
Assisted-by: Claude Opus 5.5
[UPD] requirement: Odoo 18 lock, poetry update venv, dependabot scope
6 commits. Dependabot opened pull requests against the frozen requirements
of Odoo 12 to 17; its security updates now fall under the exclusions, and
meteostat 2.x, which caps pytz below 2024, is ignored. poetry_update.py
names make switch_odoo_XX when pyproject.toml is missing and runs Poetry in
the Odoo venv, not in an active .venv.erplibre. The Odoo 18 lock resolves
again with openai, fsspec and idna pinned. Checked: no dependency leaves the
pyproject or the lock. Not tested: majors ujson 6, plotly 7, sqlalchemy 2.1.
--- FR ---
[UPD] requirement : lock Odoo 18, venv poetry update, portée dependabot
6 commits. Dependabot ouvrait des demandes de fusion sur les requirements
figés d'Odoo 12 à 17 ; ses mises à jour de sécurité tombent désormais sous
les exclusions, et meteostat 2.x, qui plafonne pytz sous 2024, est ignoré.
poetry_update.py nomme make switch_odoo_XX quand pyproject.toml manque et
fait tourner Poetry dans le venv Odoo, pas dans un .venv.erplibre actif. Le
lock d'Odoo 18 se résout de nouveau, openai, fsspec et idna épinglés.
Vérifié : aucune dépendance ne quitte le pyproject ni le lock. Non testé :
majeures ujson 6, plotly 7, sqlalchemy 2.1.
Assisted-by: Claude Opus 5.5
Records the dev/github_bot branch for the next release: Dependabot out
of the frozen Odoo 12 to 17 requirements, poetry_update.py on a missing
pyproject.toml and in the Odoo venv, the refreshed Odoo 18 lock with its
untested majors, and idna 3.20 under Security.
Checked: make doc_markdown regenerates both files, each language only
in its own.
--- FR ---
[UPD] changelog : portée dependabot, venv poetry update, lock Odoo 18
Consigne la branche dev/github_bot pour la prochaine version : Dependabot
hors des requirements figés d'Odoo 12 à 17, poetry_update.py sur un
pyproject.toml absent et dans le venv Odoo, le lock d'Odoo 18 rafraîchi
avec ses majeures non testées, et idna 3.20 sous Sécurité.
Vérifié : make doc_markdown régénère les deux fichiers, chaque langue
dans le sien seulement.
Assisted-by: Claude Opus 5.5
Unpinned, openai and fsspec float to releases that break resolution:
openai 3.x needs idna>=3.18 against the idna==3.6 of Odoo, and s3fs
wants fsspec at its own exact version. openai stays on 2.x, fsspec moves
with s3fs, idna 3.20 overrides Odoo (3.6 carries CVE-2024-3651).
meteostat returns to 1.x, every 2.x caps pytz below 2024. The s390x
exclusion of PyMuPDF now lives in the requirements, so it survives.
Checked: no dependency leaves the pyproject (194 to 196) or the lock.
Not tested: majors ujson 6, plotly 7, python-slugify 9, sqlalchemy 2.1.
--- FR ---
[UPD] requirement : lock Odoo 18 à jour, épingles openai, idna et fsspec
Sans borne, openai et fsspec dérivent vers des versions qui cassent la
résolution : openai 3.x exige idna>=3.18 contre l'idna==3.6 d'Odoo, et
s3fs veut fsspec à sa propre version exacte. openai reste en 2.x, fsspec
suit s3fs, idna 3.20 supplante Odoo (la 3.6 porte CVE-2024-3651).
meteostat revient en 1.x, toute 2.x plafonne pytz sous 2024. L'exclusion
s390x de PyMuPDF vit désormais dans les requirements : elle survit.
Vérifié : aucune dépendance ne quitte le pyproject (194 à 196) ni le lock.
Non testé : majeures ujson 6, plotly 7, python-slugify 9, sqlalchemy 2.1.
Assisted-by: Claude Opus 5.5
Every meteostat 2.x release, 2.0.0 to 2.1.5, requires pytz <2024.0.
Odoo leaves pytz unpinned, so the resolution takes the current release
and meteostat 2.x makes it fail; forcing pytz down instead would freeze
the timezone data of every Odoo instance. meteostat 1.x leaves pytz
free, so only its minor and patch updates are proposed.
Checked: requires_dist of each 2.x release on PyPI; the YAML parses.
--- FR ---
[UPD] dependabot : ignorer les versions majeures de meteostat
Chaque version 2.x de meteostat, de 2.0.0 à 2.1.5, exige pytz <2024.0.
Odoo laisse pytz libre, la résolution prend donc la version courante et
meteostat 2.x la fait échouer ; forcer pytz vers le bas figerait les
données de fuseaux horaires de toute instance Odoo. meteostat 1.x laisse
pytz libre : seules ses versions mineures et correctives sont proposées.
Vérifié : requires_dist de chaque version 2.x sur PyPI ; le YAML se lit.
Assisted-by: Claude Opus 5.5
Poetry works in the active virtualenv when VIRTUAL_ENV is set. Launched
from a shell under .venv.erplibre, poetry add and poetry lock inherited
its Python, outside the pyproject bounds, and failed with
InvalidCurrentPythonVersionError. Both calls now activate the Odoo venv
of the ERPLibre version, as install_locally.sh already does.
Checked: poetry env info -p reports .venv.erplibre before, the Odoo
venv after, for the shell script and for the Python call alike.
--- FR ---
[FIX] poetry update : poetry dans le venv Odoo, pas dans le venv actif
Poetry travaille dans le virtualenv actif quand VIRTUAL_ENV est posé.
Lancés d'un shell sous .venv.erplibre, poetry add et poetry lock en
héritaient le Python, hors des bornes du pyproject, et échouaient sur
InvalidCurrentPythonVersionError. Les deux appels activent désormais le
venv Odoo de la version ERPLibre, comme le fait déjà install_locally.sh.
Vérifié : poetry env info -p donne .venv.erplibre avant, le venv Odoo
après, pour le script shell comme pour l'appel Python.
Assisted-by: Claude Opus 5.5
The root pyproject.toml and poetry.lock are unversioned symlinks to the
active version's files in requirement/, created by the version switch.
Without them the script died on a FileNotFoundError traceback. It now
names the fix, make switch_odoo_XX for the active Odoo version; on a
terminal it offers to run it and restarts with the same arguments.
Checked: an existing file passes, a missing one exits 1 off a terminal
and on a declined prompt. The accepted path, which runs the switch, is
not tested.
--- FR ---
[FIX] poetry update : arrêt sur pyproject.toml absent, switch proposé
pyproject.toml et poetry.lock à la racine sont des liens non versionnés
vers les fichiers de la version active dans requirement/, créés par le
switch de version. Sans eux, le script mourait sur un FileNotFoundError.
Il nomme désormais le remède, make switch_odoo_XX pour la version Odoo
active ; dans un terminal, il propose de le lancer et se relance avec
les mêmes arguments. Vérifié : un fichier présent passe, un absent sort
en 1 hors terminal et sur un refus. L'acceptation, qui lance le switch,
n'est pas testée.
Assisted-by: Claude Opus 5.5
Security updates reuse a dependabot.yml entry only when its directory
matches the manifest's; they scan requirement/ as "/requirement", which
no entry declared, so their pull requests bumped the frozen pins of
Odoo 12 to 17. Only Odoo 18 now receives updates. Globs replace the
exact names and also cover ignore_requirements, pyproject and poetry.lock.
Checked: the YAML parses and the globs match 27 files in requirement/,
none for odoo18. Not yet checked on GitHub: takes effect once on master.
--- FR ---
[FIX] dependabot : exclure aussi Odoo 12-17 des mises à jour de sécurité
Les mises à jour de sécurité ne reprennent une entrée de dependabot.yml
que si son répertoire correspond à celui du manifeste ; elles lisent
requirement/ comme « /requirement », qu'aucune entrée ne déclarait, d'où
des PR qui modifiaient les versions figées d'Odoo 12 à 17. Seul Odoo 18
reçoit désormais les mises à jour. Des globs remplacent les noms exacts
et couvrent aussi ignore_requirements, pyproject et poetry.lock.
Vérifié : le YAML se lit et les globs ciblent 27 fichiers de requirement/,
aucun pour odoo18. Non vérifié sur GitHub : effectif une fois sur master.
Assisted-by: Claude Opus 5.5
[IMP] todo: safe startup, Claude command sync, English-first commits
8 commits. make runs todo.sh, whose name says a menu opens; install.sh keeps
choosing the interpreter, now probed by running code, since python -V
vouched for a venv built on another machine that could not start. The
install, which deletes an existing .venv.erplibre, runs only on a yes. The
Claude command list shows missing and outdated copies, their diff, and
redeploys them; commit messages open in English with a French title under
--- FR ---, enforced by the hook; language and Fork move to Configuration.
Checked: unit suites of each piece pass, 108 in test_todo and i18n.
--- FR ---
[IMP] todo : démarrage sûr, commandes Claude à jour, commits en anglais
8 commits. make lance todo.sh, dont le nom annonce un menu ; install.sh garde
le choix de l'interpréteur, sondé désormais en exécutant du code, puisque
python -V cautionnait un venv bâti sur une autre machine incapable de
démarrer. L'installation, qui supprime un .venv.erplibre existant, ne part
que sur un oui. La liste des commandes Claude montre les copies absentes et
périmées, leur diff, et les redéploie ; les messages de commit s'ouvrent en
anglais avec un titre français sous --- FR ---, que le hook exige ; la
langue et Fork passent dans Configuration.
Vérifié : suites unitaires de chaque partie au vert, 108 pour test_todo et i18n.
Assisted-by: Claude Opus 5.5
Four entries record what the branch changes for a user: a .venv.erplibre
built elsewhere is reported instead of launched, the Claude command list
shows missing and outdated copies and redeploys them, commit messages open
in English, and the language and Fork entries move to Configuration.
Checked: make doc_markdown regenerates both files, bullets aligned.
--- FR ---
[UPD] changelog : sonde du venv, liste des commandes, règle, menus TODO
Quatre entrées disent ce que la branche change pour l'utilisateur : un
.venv.erplibre bâti ailleurs est signalé plutôt que lancé, la liste des
commandes Claude montre les copies absentes et périmées et les redéploie, les
messages de commit s'ouvrent en anglais, et la langue et Fork passent dans
Configuration.
Vérifié : make doc_markdown régénère les deux fichiers, puces alignées.
Assisted-by: Claude Opus 5.5
Execute carried a Preferences section whose one entry, the language, is
already Configuration's first item: two places for one setting. It is
removed, with its two unused translations. Fork, which opens a second TODO,
leaves the main menu for Configuration; the main menu now numbers Telemetry
4 and Configuration 5, and Reset all preferences becomes 6.
Checked: Configuration displayed with Fork at 5; 108 tests pass.
--- FR ---
[IMP] menus todo : langue dans Configuration seule, Fork y déménage
Execute portait une section Préférences dont la seule entrée, la langue, est
déjà la première de Configuration : deux endroits pour un réglage. Elle part,
avec ses deux traductions devenues inutiles. Fork, qui ouvre un second TODO,
quitte le menu principal pour Configuration ; le menu principal numérote
désormais Télémétrie 4 et Configuration 5, et la réinitialisation devient 6.
Vérifié : Configuration affichée avec Fork en 5 ; 108 tests passent.
Assisted-by: Claude Opus 5.5
The language chooser was the only TODO screen without icons, and it spelled
Francais without its accent. The first-launch prompt and the one reached
from Configuration now open on a globe and mark each language with its flag;
the label reads Français in both.
Checked: both prompts displayed; test_todo and i18n tests, 108, pass.
--- FR ---
[IMP] todo : icônes au choix de la langue, accent sur Français
Le choix de la langue était le seul écran de TODO sans icône, et il écrivait
Francais sans accent. L'invite du premier lancement et celle de Configuration
s'ouvrent désormais sur un globe et marquent chaque langue de son drapeau ;
le libellé se lit Français dans les deux.
Vérifié : les deux invites affichées ; test_todo et tests i18n, 108, passent.
Assisted-by: Claude Opus 5.5
The command list showed only what sat in ~/.claude/commands, with a date:
a command never installed stayed invisible, and a copy older than its
template in conf/ looked the same as a current one. Each ERPLibre template is
now compared with its copy, ignoring the git identity line: not installed,
up to date, or to redeploy with its +/- line count; other commands are
marked not from ERPLibre. On y/N it shows the diff, then redeploys the
outdated copies, keeping the name and e-mail /commit carried.
Checked: 7 new tests on a temporary directory; test_todo, 81 tests, passes.
--- FR ---
[IMP] todo configs claude : commandes absentes, périmées, redéploiement
La liste des commandes ne montrait que le contenu de ~/.claude/commands,
avec une date : une commande jamais installée restait invisible, et une copie
plus vieille que son gabarit de conf/ ressemblait à une copie à jour. Chaque
gabarit d'ERPLibre est désormais comparé à sa copie, hors ligne d'identité
git : non installée, à jour, ou à redéployer avec son compte +/- ; les autres
commandes sont marquées hors ERPLibre. Sur o/N elle montre le diff, puis
redéploie les copies périmées en gardant le nom et le courriel de /commit.
Vérifié : 7 nouveaux tests sur un dossier temporaire ; test_todo, 81 tests.
Assisted-by: Claude Opus 5.5
git log --oneline shows only the subject, and it read in whichever language
the author was thinking in. The subject and the body under it are now in
English, then --- FR --- opens the French section, which starts with the
subject translated under the same tag. The hook refuses a --- EN --- marker
and a French section without that title, and checks the title like a
subject; it does not count against the body budget. Whether the subject is
really English is not checked. /commit and /git_prepare_merge follow.
Checked: 55 hook tests, 7 of them new; i18n tests pass.
--- FR ---
[UPD] règle de commit : sujet anglais d'abord, titre FR sous --- FR ---
git log --oneline ne montre que le sujet, et il se lisait dans la langue où
l'auteur pensait. Le sujet et le corps qui le suit sont désormais en anglais,
puis --- FR --- ouvre la section française, qui commence par le sujet traduit
sous le même tag. Le hook refuse un marqueur --- EN --- et une section
française sans ce titre, et juge ce titre comme un sujet ; il ne compte pas
dans le budget du corps. Que le sujet soit vraiment en anglais ne se vérifie
pas. /commit et /git_prepare_merge suivent.
Vérifié : 55 tests du hook, dont 7 nouveaux ; tests i18n au vert.
Assisted-by: Claude Opus 5.5
On a system too old to read TODO, install.sh ran the install without asking,
and the install DELETES an existing .venv.erplibre. It now runs only on a yes
typed in a terminal: o, oui, y or yes, any case. Enter alone means no, and
with no terminal no question is asked and nothing is installed. « aucun
python3 » finally shows when the probe is silent: the || fallback never fired
behind a pipe.
Checked: 16 tests, each answer on a pseudo-terminal; install.sh run in an
isolated copy exits 1 on « n » and installs on « o ».
--- FR ---
[IMP] install.sh : demander o/N avant d'installer le venv d'outillage
Sur un système trop ancien pour lire TODO, install.sh lançait l'installation
sans rien demander, et celle-ci SUPPRIME un .venv.erplibre existant. Elle ne
part plus que sur un oui tapé au terminal : o, oui, y ou yes, toute casse.
Entrée seule vaut non, et sans terminal aucune question n'est posée ni
installation lancée. « aucun python3 » s'affiche enfin quand la sonde est
muette : le repli par || ne se déclenchait jamais derrière un tube.
Vérifié : 16 tests, dont chaque réponse sur un pseudo-terminal ; install.sh
lancé dans une copie isolée sort en 1 sur « n » et installe sur « o ».
Assisted-by: Claude Opus 5.5
make prints the recipe it runs, and « ./install.sh » offered an installation
to read where one opens a menu. The launcher adds nothing but a name and
passes every argument to install.sh, which alone keeps picking an interpreter
able to READ the code and stays the entry point of a fresh machine.
A test caps todo.sh at six lines of code and refuses it python3, bin/python
and sort -V: two copies of that choice would drift. The changelog names the
launcher.
Checked: chain run through to the menu, exit 0; 9 tests.
--- FR ---
[ADD] todo : lanceur todo.sh, que make affiche à la place d'install.sh
make affiche la recette qu'il exécute, et « ./install.sh » y donnait à lire
une installation là où l'on ouvre un menu. Le lanceur n'ajoute qu'un nom et
passe chaque argument à install.sh, qui garde seul le choix d'un interpréteur
capable de LIRE le code et reste le point d'entrée d'une machine neuve.
Un test plafonne todo.sh à six lignes de code et lui refuse python3,
bin/python et sort -V : deux copies de ce choix dériveraient. Le changelog
nomme le lanceur.
Vérifié : chaîne lancée jusqu'au menu, sortie 0 ; 9 tests.
Assisted-by: Claude Opus 5
Assisted-by: Claude Opus 5.5
"python -V" answers before loading the standard library. A venv whose
interpreter cannot find it, such as a checkout mounted from another machine,
still reported its version and passed as healthy. install.sh then handed TODO
to it, which died on "No module named 'encodings'", and the "venv built
elsewhere" guard never printed. The probe now runs "import sys": an
interpreter that cannot start returns nothing.
Checked: a fake python that answers -V but fails otherwise makes the test
fail on the old code and pass with the fix.
--- FR ---
[FIX] install.sh : sonder la version en exécutant du code, non par -V
« python -V » répond avant de charger la bibliothèque standard. Un venv dont
l'interpréteur ne la trouve pas, comme un checkout monté depuis une autre
machine, rendait donc sa version et passait pour sain. install.sh lui passait
alors TODO, qui mourait sur « No module named 'encodings' », et le garde
« venv bâti ailleurs » ne s'affichait jamais. La sonde exécute maintenant
« import sys » : un interpréteur qui ne démarre pas ne rend rien.
Vérifié : un faux python sain à -V mais mort ailleurs fait échouer le test
sur l'ancien code et le réussit avec la correction.
Assisted-by: Claude Opus 5.5
« python -V » répond avant de charger la bibliothèque standard. Un venv dont
l'interpréteur ne la trouve pas, comme un checkout monté depuis une autre
machine, rendait donc sa version et passait pour sain. install.sh lui passait
alors TODO, qui mourait sur « No module named 'encodings' », et le garde
« venv bâti ailleurs » ne s'affichait jamais. La sonde exécute maintenant
« import sys » : un interpréteur qui ne démarre pas ne rend rien.
Vérifié : un faux python sain à -V mais mort ailleurs fait échouer le test
sur l'ancien code et le réussit avec la correction.
--- EN ---
"python -V" answers before loading the standard library. A venv whose
interpreter cannot find it, such as a checkout mounted from another machine,
still reported its version and passed as healthy. install.sh then handed TODO
to it, which died on "No module named 'encodings'", and the "venv built
elsewhere" guard never printed. The probe now runs "import sys": an
interpreter that cannot start returns nothing.
Checked: a fake python that answers -V but fails otherwise makes the test
fail on the old code and pass with the fix.
Assisted-by: Claude Opus 5.5
Le formateur de ce dépôt est ruff depuis qu'il remplace black, qui ne connaît
aucune cible au-delà de py313 ; ce passage applique sa norme à l'arbre entier,
d'un coup, pour qu'aucun commit de fond n'ait à porter du style. L'écart tient
presque entièrement aux chaînes coupées à la main que ruff recolle quand elles
tiennent sur une ligne, et aux « with » multiples qu'il regroupe : aucune
valeur ne change, et les clés de traduction non plus.
Vérifié : la suite unitaire reste verte après le passage, et le contrôle de
syntaxe ne signale rien.
--- EN ---
This repository's formatter is ruff since it replaced black, which knows no
target beyond py313; this pass applies its standard to the whole tree at once,
so that no substantive commit has to carry style. The difference is almost
entirely the hand-split strings ruff joins back when they fit on one line, and
the multiple "with" it merges: no value changes, nor do the translation keys.
Checked: the unit suite stays green after the pass, and the syntax check
reports nothing.
Assisted-by: Claude Opus 5
[UPD] outillage : un Python à lui, un formateur par contexte, des gardes
17 commits. Le venv d'outillage prenait le python3 du système, quel qu'il
soit : sur une machine en 3.10, TODO mourait sur une SyntaxError avant tout
message, et rien ne permettait plus de lancer l'installation qui en serait
sorti. Il a désormais sa version, distincte de celle d'Odoo, et le patch ne
borne que cette dernière — l'exiger partout écartait un Python de
distribution d'un cran en retard et faisait compiler CPython pour rien. Le
formatage suit le contexte : ruff ici, la norme OCA pour les modules Odoo.
Debian 11 part, sa suite de sécurité n'étant ni servie ni archivée.
Vérifié : 6764 tests verts, et l'arbre Python parse de 3.10 à 3.14.
--- EN ---
17 commits. The tooling venv took the system python3, whatever it was: on a
3.10 machine TODO died on a SyntaxError before any message, and nothing could
start the install that would have rescued it. It now has its own version,
distinct from Odoo's, and the patch bounds only the latter — requiring it
everywhere turned away a distribution Python one step behind and compiled
CPython for nothing. Formatting follows context: ruff here, the OCA standard
for Odoo modules. Debian 11 goes, its security suite being neither served nor
archived.
Checked: 6764 tests green, and the Python tree parses from 3.10 to 3.14.
Assisted-by: Claude Opus 5
Cinq livraisons de cette branche manquaient à la liste du non-publié : le proxy
SOCKS du menu de déploiement et la cible qui formate les tests, côté ajouts ;
la reprise d'un téléchargement coupé, le faisceau de certificats désigné
seulement s'il existe, et « make version » qui nomme les deux Python, côté
corrections. Un lecteur qui choisit de mettre à jour n'y voyait donc ni la
commande neuve ni les trois pannes levées.
Vérifié : les quatre sections du non-publié comptent autant de puces en
français qu'en anglais, et les deux fichiers générés suivent leur source.
--- EN ---
Five of this branch's deliveries were missing from the unreleased list: the
SOCKS proxy of the deployment menu and the target formatting the tests, on the
added side; the resume of an interrupted download, the certificate bundle named
only when it exists, and "make version" naming both Pythons, on the fixed side.
A reader choosing whether to upgrade saw neither the new command nor the three
failures lifted.
Checked: the four unreleased sections carry as many bullets in French as in
English, and both generated files follow their source.
Assisted-by: Claude Opus 5
tasks/ porte les notes de travail que la convention garde hors du dépôt, et
.erplibre-state.json l'état de ce qu'un checkout a installé, écrit par
erplibre_state.py. Non ignorés, un « git add -A » les emportait.
--- EN ---
tasks/ holds the working notes the convention keeps out of the repository,
and .erplibre-state.json the state of what a checkout has installed, written
by erplibre_state.py. Left unignored, a "git add -A" swept them in.
Assisted-by: Claude Opus 5
« make version » lit .python-odoo-version et l'affichait sous le libellé nu
« Python version ». Tant que les deux venvs partageaient leur interpréteur, le
libellé suffisait ; depuis qu'ils divergent, il laisse croire que le dépôt n'a
qu'une version de Python, et le chiffre affiché n'est pas celui du venv dans
lequel l'utilisateur travaille. Les deux sont désormais nommées, celle d'Odoo
comme celle de l'outillage. Seule la sortie change : cette valeur ne participe
à aucun identifiant, et l'absence du fichier reste sans conséquence.
Vérifié : les deux versions s'affichent, puis la conclusion reste la même.
--- EN ---
"make version" reads .python-odoo-version and printed it under the bare label
"Python version". While both venvs shared their interpreter the label was
enough; now that they diverge, it suggests the repository has a single Python
version, and the figure shown is not that of the venv the user works in. Both
are now named, Odoo's and the tooling's. Only the output changes: this value
takes part in no identifier, and a missing file stays without consequence.
Checked: both versions print, then the conclusion stays the same.
Assisted-by: Claude Opus 5
Elle faisait ajouter bullseye-security pour y prendre libssl1.1 sur Debian 13.
Ce dépôt n'existe plus : son index est encore publié mais son pool ne porte
plus les fichiers, et rien n'en a été archivé. La recette ne pouvait donc que
donner une source morte, puis une erreur qui n'en désigne pas la cause.
Elle était en outre inutile : le build de wkhtmltopdf qu'on installe là-bas
est celui de bookworm, qui réclame libssl3 — que trixie fournit sous le nom
libssl3t64, en déclarant « Provides: libssl3 ». L'installation se résout donc
seule. La section qui suit garde l'issue de secours, un service en conteneur.
Vérifié : plus aucune mention de bullseye ni de libssl1.1 dans la FAQ.
--- EN ---
It had the reader add bullseye-security to take libssl1.1 from it on Debian
13. That repository is gone: its index is still published but its pool no
longer holds the files, and nothing was archived. The recipe could therefore
only yield a dead source, then an error naming none of its cause. It was
useless besides: the wkhtmltopdf build installed there is bookworm's, which
requires libssl3 — which trixie supplies as libssl3t64, declaring "Provides:
libssl3". The install resolves on its own. The next section keeps the fallback,
a containerised service.
Checked: no mention of bullseye or libssl1.1 left in the FAQ.
Assisted-by: Claude Opus 5
Odoo 13, 14 et 15 bâtissaient encore sur bullseye, dont le dépôt de sécurité
est démantelé. Rien ne les y obligeait : la base est
« python:<version>-slim-<version Debian> », donc l'interpréteur vient de
l'image officielle et non de Debian — les variantes bookworm existent jusqu'à
3.7.17. L'aiguillage portait en outre une branche « buster » INATTEIGNABLE,
sa condition étant la négation de celle qui la précédait ; elle part avec le
reste. Le build de wkhtmltopdf suit la version : celui de bullseye réclame
libssl1.1, absente de bookworm.
Vérifié : les images 3.7.17 et 3.8.20 slim-bookworm existent, le .deb bookworm
rend l'empreinte déclarée, et ses quinze dépendances sont dans bookworm.
--- EN ---
Odoo 13, 14 and 15 still built on bullseye, whose security repository is
dismantled. Nothing required it: the base is
"python:<version>-slim-<suite>", so the interpreter comes from the official
image and not from Debian — the bookworm variants exist down to 3.7.17. The
switch also carried an UNREACHABLE "buster" branch, its condition being the
negation of the one before it; it goes with the rest. The wkhtmltopdf build
follows the suite: bullseye's requires libssl1.1, absent from bookworm.
Checked: the 3.7.17 and 3.8.20 slim-bookworm images exist, the bookworm .deb
matches the declared checksum, and its fifteen dependencies are in bookworm.
Assisted-by: Claude Opus 5
Son LTS est terminé, et sa suite de sécurité n'est ni servie ni archivée :
security.debian.org publie encore un index qui nomme des paquets dont le pool
ne porte plus le fichier, et archive.debian.org ne connaît pas bullseye. apt
s'arrête donc avant d'installer git, sur une version qui ne recevra plus rien.
Elle quitte le catalogue de déploiement et le script de dépendances, où la
variable qui la distinguait n'a plus d'usage. Debian 12 et 13 restent, et
l'image de la 13 est toujours le dernier point de version — sans rien à
changer ici quand le suivant paraît.
Vérifié : plus aucune trace de bullseye dans script/, hors la base des
conteneurs, traitée à part.
--- EN ---
Its LTS has ended, and its security suite is neither served nor archived:
security.debian.org still publishes an index naming packages whose pool no
longer holds the file, and archive.debian.org does not know bullseye. apt
therefore stops before installing git, on a version that will receive nothing
more. It leaves the deployment catalogue and the dependency script, where the
variable telling it apart has no use left. Debian 12 and 13 stay, and 13's
image is always the latest point release — with nothing to change here when
the next one appears.
Checked: no trace of bullseye left in script/, beyond the container base,
handled separately.
Assisted-by: Claude Opus 5
Les variables du cache — PIP_CERT et ses voisines — recevaient le chemin
canonique de la famille de paquets, sans que rien ne vérifie qu'il soit là. Une
image peut ne pas le porter : sur une Fedora récente,
« /etc/pki/tls/certs/ca-bundle.crt » manque alors que le faisceau extrait
existe. pip refuse alors TOUT téléchargement, y compris ce qui n'a rien à voir
avec le cache, et l'installation s'arrête sur des paquets publics. Le faisceau
de la famille est essayé d'abord, les autres connus ensuite ; aucun trouvé
n'écrit aucune variable, et pip garde son propre jeu de certificats.
Vérifié : la commande produite parcourt les quatre chemins avant de renoncer.
--- EN ---
The cache variables — PIP_CERT and its neighbours — received the canonical path
of the package family, with nothing checking it was there. An image may not
carry it: on a recent Fedora, "/etc/pki/tls/certs/ca-bundle.crt" is missing
while the extracted bundle exists. pip then refuses EVERY download, including
what has nothing to do with the cache, and the install stops on public
packages. The family bundle is tried first, the other known ones next; none
found writes no variable, and pip keeps its own certificate set.
Checked: the produced command walks the four paths before giving up.
Assisted-by: Claude Opus 5
Une image de VM pèse un demi-gigaoctet : une coupure y est bien plus probable
que sur une page. Le contrôle de complétude existait — sans lui un .part
tronqué passait pour une image, donnant un qcow2 valide mais VIDE — mais il
jetait les octets reçus et renvoyait l'utilisateur à un « curl -C - » tapé à
la main. Le transfert se reprend désormais sur le même miroir, trois essais,
par un « Range » qui demande la suite ; on ne change de miroir qu'ensuite. Un
serveur qui ignore le Range rend le fichier entier, et l'on repart alors de
zéro plutôt que de doubler les octets déjà là.
Vérifié : 5 tests contre un serveur qui coupe au tiers, image reconstituée à
l'octet près, et le .part tronqué part quand les reprises s'épuisent.
--- EN ---
A VM image weighs half a gigabyte: an interruption is far likelier there than
on a page. The completeness check existed — without it a truncated .part
passed for an image, giving a valid but EMPTY qcow2 — but it threw away the
bytes received and sent the user back to a hand-typed "curl -C -". The
transfer now resumes on the same mirror, three attempts, through a "Range"
asking for the rest; only then does it change mirror. A server ignoring the
Range returns the whole file, and we restart from zero rather than doubling
the bytes already there.
Checked: 5 tests against a server cutting at one third, image reassembled byte
for byte, and the truncated .part goes when the retries run out.
Assisted-by: Claude Opus 5
Les six cibles d'addons visaient « ./addons/<dépôt>/ », une disposition que
seul un manifeste produit : la production les range sous
« odoo<version>/addons/ ». isort s'arrêtait donc sur une trace pour un chemin
inexistant, et « make format_all » échouait sans avoir formaté un module. Les
dépôts sont maintenant NOMMÉS, cherchés sous les deux dispositions, et celui
qu'un manifeste ne rapatrie pas s'annonce puis est ignoré. Le formateur est
celui de la communauté, qui a quitté black : ruff en 88 colonnes, avec les
sections d'imports « odoo » et « odoo.addons » qu'isort ne sait pas produire.
Vérifié : trois des six dépôts sont présents ici, les autres s'annoncent
absents sans faire échouer la cible.
--- EN ---
The six addons targets aimed at "./addons/<repo>/", a layout only one manifest
produces: production files them under "odoo<version>/addons/". isort therefore
stopped on a traceback for a non-existent path, and "make format_all" failed
without formatting a module. Repositories are now NAMED, looked up under both
layouts, and one a manifest does not check out announces itself then is
skipped. The formatter is the community's, which left black: ruff at 88
columns, with the "odoo" and "odoo.addons" import sections isort cannot
produce.
Checked: three of the six repositories are present here, the others announce
themselves absent without failing the target.
Assisted-by: Claude Opus 5
Un échec de « repo forall » arrêtait tout : la liste des fichiers locaux, déjà
obtenue, était jetée, et « make format » rendait 0 sans avoir formaté une
ligne. Sa sortie d'erreur, capturée puis jetée, emportait la seule explication,
et seule l'exception Python restait à l'écran. Google Repo n'ajoute pourtant
que les dépôts rapatriés : il est joué sans check, ce qu'il a écrit est relayé,
et les fichiers locaux sont formatés quand même. « Rien à formater » se dit au
lieu d'une sortie muette, et un échec du dépôt lui-même rend non nul.
Vérifié : avec un repo bouchonné qui échoue, son message s'affiche et le
fichier local est formaté.
--- EN ---
A failing "repo forall" stopped everything: the local file list, already
gathered, was dropped, and "make format" returned 0 without formatting a line.
Its error output, captured then thrown away, carried the only explanation, and
only the Python exception stayed on screen. Google Repo only adds the checked
out repositories: it runs without check, whatever it wrote is relayed, and
local files are formatted anyway. "Nothing to format" is said instead of a
silent exit, and a failure of the repository itself returns non-zero.
Checked: with a stub repo that fails, its message shows and the local file is
formatted.
Assisted-by: Claude Opus 5
« -L » relaie UN service ; « -D » ouvre un relais SOCKS, par lequel le
navigateur atteint n'importe quelle destination depuis la machine distante —
une interface qui n'écoute que sur sa boucle locale, un hôte de son réseau sans
route depuis ici. Le port par défaut est 1080, modifiable, et contrôlé libre
avant d'ouvrir. La saisie de l'adresse est celle de sshfs, désormais partagée :
l'alias de ~/.ssh/config part tel quel à ssh, faute de quoi son ProxyJump se
perdrait et une VM imbriquée deviendrait injoignable. Le réglage de Firefox
s'affiche AVANT le lancement, la commande ne rendant la main qu'au Ctrl+C.
Vérifié : 9 tests neufs, et la numérotation du menu que deux autres gardent.
--- EN ---
"-L" relays ONE service; "-D" opens a SOCKS relay, through which the browser
reaches any destination from the remote machine — an interface listening only
on its loopback, a host of its network with no route from here. The default
port is 1080, changeable, and checked free before opening. The address prompt
is sshfs's, now shared: the ~/.ssh/config alias goes to ssh as is, failing
which its ProxyJump would be lost and a nested VM become unreachable. The
Firefox settings print BEFORE the launch, the command only returning on
Ctrl+C.
Checked: 9 new tests, and the menu numbering two others guard.
Assisted-by: Claude Opus 5
install.sh et make lançaient todo.py par son hashbang, donc par le python3 du
PATH, sans rien garantir de sa version : une syntaxe plus récente l'arrête en
SyntaxError au chargement, et le poste hors d'âge perd tout moyen de lancer
l'installation qui l'en sortirait. L'ordre est désormais le venv d'outillage,
sinon le python3 du PATH s'il suffit, sinon l'installation. TODO lui-même se
relance dans le venv, vérifie version et modules avant ses imports, et propose
l'installation en terminal — ce que « make » sur un clone neuf promet depuis
toujours sans le tenir.
Vérifié : venv à jour, venv périmé, systèmes en 3.10, 3.14 et 3.15 vont chacun
où il faut ; un import du module ne relance rien et lève comme avant.
--- EN ---
install.sh and make ran todo.py through its hashbang, so through the python3 of
the PATH, with no guarantee about its version: a newer syntax stops it with a
SyntaxError at load, and the ageing machine loses every way to start the
install that would rescue it. The order is now the tools venv, else the python3
of the PATH when it suffices, else the install. TODO itself relaunches in the
venv, checks version and modules before its imports, and offers the install in
a terminal — what "make" on a fresh clone has always promised without
keeping.
Checked: fresh venv, stale venv, systems on 3.10, 3.14 and 3.15 each go where
they should; importing the module relaunches nothing and raises as before.
Assisted-by: Claude Opus 5
install_erplibre.sh bâtissait .venv.erplibre avec le python3 du système, quelle
que soit sa version : un 3.10 y donnait un venv que l'outillage ne sait pas
charger. Il délègue à install_venv.sh, qui obtient la version par mise, pyenv
ou la distribution, et rebâtit un venv hors service. Le PATCH ne borne que le
venv d'Odoo, dont le pyproject exige « >=3.12.10,<3.13 » : l'exiger ailleurs
écartait un Python de distribution d'un cran en retard — NixOS 25.11 livre
3.14.2 — et faisait compiler CPython pour rien. Le module NixOS déclare
désormais les DEUX Python, substitués depuis les fichiers de version.
Vérifié : 15 tests sur des venvs factices, conservés, rebâtis ou refusés selon
leur état, et un chemin sans pyvenv.cfg garde son contenu.
--- EN ---
install_erplibre.sh built .venv.erplibre with the system python3, whatever its
version: a 3.10 gave a venv the tooling cannot load. It delegates to
install_venv.sh, which obtains the version through mise, pyenv or the
distribution, and rebuilds a venv out of service. The PATCH bounds only Odoo's
venv, whose pyproject requires ">=3.12.10,<3.13": requiring it elsewhere turned
away a distribution Python one step behind — NixOS 25.11 ships 3.14.2 — and
compiled CPython for nothing. The NixOS module now declares BOTH Pythons,
substituted from the version files.
Checked: 15 tests on stub venvs, kept, rebuilt or refused by their state, and a
path without pyvenv.cfg keeps its content.
Assisted-by: Claude Opus 5
Une syntaxe plus récente que le Python du dépôt ne casse qu'au chargement, et
aucun outil en place ne la voyait : la cible de black borne ce qu'il ÉCRIT,
jamais ce qu'il accepte, et flake8 analyse avec l'interpréteur courant. Le
contrôle compile les fichiers indexés avec un vrai interpréteur de la version
déclarée, trouvé sans réseau par mise, pyenv ou le PATH, et se prend lui-même
quand il y tourne déjà. Sans interpréteur, il DIT qu'il n'a pas vérifié plutôt
que de laisser croire le contraire. Le hook relaie, sans bloquer le commit, et
écarte les dépôts rapatriés dont ce dépôt ne répond pas.
Vérifié : les f-strings PEP 701 de la révision précédente sont signalées, rien
ne l'est sur l'arbre courant, et l'absence du fichier de version se dit.
--- EN ---
A syntax newer than the repository's Python only breaks at load, and no tool in
place saw it: black's target bounds what it WRITES, never what it accepts, and
flake8 parses with the running interpreter. The check compiles staged files
with a real interpreter of the declared version, found without network through
mise, pyenv or the PATH, and takes itself when it already runs under it.
Without one, it SAYS it did not check rather than implying it did. The hook
relays, without blocking the commit, and skips the checked-out repositories
this one does not answer for.
Checked: the PEP 701 f-strings of the previous revision are reported, nothing
is on the current tree, and a missing version file is announced.
Assisted-by: Claude Opus 5
Cinq fichiers employaient des f-strings PEP 701 — guillemets imbriqués du même
type, backslash dans l'expression, expression sur plusieurs lignes — que
Python refuse avant 3.12. Or les hooks de script/git/hooks portent
« #!/usr/bin/env python3 » et tournent donc sur l'interpréteur du système,
qu'une distribution livre encore en 3.10 : la SyntaxError tombe au chargement,
sans qu'aucun garde puisse nommer la commande à taper. Les chaînes traduites
gardent leur texte à l'octet près, sans quoi leur clé se perdrait. Les
commentaires de ces fichiers passent du récit au présent, comme la règle le
demande de ce qu'on touche.
Vérifié : tout l'arbre Python parse sous 3.10, 3.11, 3.12 et 3.14.
--- EN ---
Five files used PEP 701 f-strings — quotes of the same kind nested, a backslash
in the expression, an expression spanning lines — which Python refuses before
3.12. The hooks in script/git/hooks carry "#!/usr/bin/env python3" and so run
on the system interpreter, which a distribution still ships as 3.10: the
SyntaxError lands at load, before any guard can name the command to type.
Translated strings keep their text byte for byte, else their key would be lost.
The comments of those files move from tale to present tense, as the rule asks
of what one touches.
Checked: the whole Python tree parses under 3.10, 3.11, 3.12 and 3.14.
Assisted-by: Claude Opus 5
Aucune cible ne formatait les tests : « make format_all » couvre script/ et les
six dépôts d'addons, et rien d'autre. Seul « make format » les atteignait, et
seulement ceux qu'un diff signalait, si bien que 75 fichiers sur 210 ne
suivaient aucune norme — de la dérive silencieuse dans un arbre qui sert de
référence au reste. Les tests tournent dans le venv d'outillage : ils suivent
donc ruff, comme script/, et la cible entre dans format_all.
Vérifié : « make -n format_test » nomme bien ruff, et format_all l'inclut.
--- EN ---
No target formatted the tests: "make format_all" covers script/ and the six
addons repositories, nothing else. Only "make format" reached them, and only
those a diff reported, so that 75 files out of 210 followed no standard —
silent drift in a tree the rest takes as reference. The tests run in the
tooling venv: they therefore follow ruff, like script/, and the target joins
format_all.
Checked: "make -n format_test" names ruff, and format_all includes it.
Assisted-by: Claude Opus 5
« make format » donnait isort et black à tout fichier Python : la cible py37,
plus petit dénominateur commun de six dépôts d'addons, imposait son style au
code de ce dépôt. Le contexte décide désormais — les modules Odoo gardent isort
et black, le reste passe par ruff, réglé dans .ruff.toml, comme la norme OCA
depuis qu'elle a quitté black. Les dépôts rapatriés sous script/ en sont
écartés, chemin nommé compris. La cible y reste py310 : dès 3.14 ruff écrit
« except A, B: » sans parenthèses, que le python3 des hooks ne sait pas lire.
Vérifié : un fichier reçoit deux normes selon son chemin, et aucun dépôt
rapatrié n'est touché.
--- EN ---
"make format" gave isort and black to every Python file: the py37 target,
lowest common denominator of six addons repositories, imposed its style on this
repository's code. Context now decides — Odoo modules keep isort and black,
everything else goes through ruff, set in .ruff.toml, as the OCA standard does
since it left black. The repositories checked out under script/ are excluded, a
named path included. The target stays py310 there: from 3.14 on, ruff writes
"except A, B:" unparenthesised, which the python3 of the hooks cannot read.
Checked: one file gets two standards by its path, and no checked-out
repository is touched.
Assisted-by: Claude Opus 5
[FIX] qemu : clé portable du cache, re-clé du magasin, image reprise
10 commits. Le magasin rangeait un objet sous le chemin ENTIER de son URL : un
miroir qui préfixe ce chemin donnait deux clés pour les mêmes octets, et le
cache retéléchargeait ce qu'il détenait — sur un journal de 7099 noms livrés,
1124 vivaient sous plusieurs chemins, 3,18 Gio repris à l'amont pour rien.
Seuls les six derniers segments comptent désormais, quatre pour la famille
pacman dont les chemins sont plus courts. « --recle » rattrape un magasin
déjà rempli sans rien retélécharger, et une image gardée devenue périmée est
reprise une fois au lieu de perdre la campagne entière.
Vérifié : suites Go et Python vertes, et une campagne hors ligne où la seconde
VM n'a repris aucun octet de paquet à l'amont.
--- EN ---
10 commits. The store filed an object under the WHOLE path of its URL: a mirror
prefixing that path gave two keys for the same bytes, and the cache
re-downloaded what it held — over a log of 7099 delivered names, 1124 lived
under several paths, 3.18 GiB taken upstream for nothing. Only the last six
segments count now, four for the pacman family whose paths are shorter.
« --recle » brings over a store already filled, downloading nothing, and a
kept image gone stale is fetched once more instead of losing a whole campaign.
Checked: Go and Python suites green, and an offline campaign where the second
VM took no package byte from upstream.
Assisted-by: Claude Opus 5