The reverse proxy entry now asks HTTP or HTTPS; in HTTPS it issues the
local certificate on first use, passes it to the proxy and names the
authority to import in the browser. A fifth Network entry issues it
again with extra names or addresses typed by the user, keeping the
authority already imported.
Checked: 10 menu tests, among them a real openssl issue whose SAN holds
the typed names; test_todo_i18n passes.
--- FR ---
[IMP] todo network : HTTPS pour le mandataire, certificats locaux
L'entrée du mandataire demande désormais HTTP ou HTTPS ; en HTTPS, elle
émet le certificat local au premier usage, le passe au mandataire et
nomme l'autorité à importer dans le navigateur. Une cinquième entrée de
Network le réémet avec des noms ou adresses saisis, en gardant l'autorité
déjà importée.
Vérifié : 10 tests du menu, dont une vraie émission openssl dont le SAN
porte les noms saisis ; test_todo_i18n passe.
Assisted-by: Claude Opus 5.5
A client that opened a connection and sent nothing held its task forever,
and the proxy stayed silent until a 502 that named no port. The request
head now waits 30 s (408) and the connection to Odoo 10 s (504), never
the relay, so a WebSocket stays open; a line per request gives route,
status and duration; the start probes both ports and a 502 names the one
missing, with workers for the bus. --tls-cert/--tls-key serve HTTPS and
default X-Forwarded-Proto to https; --trust-forwarded extends a chain.
Checked: 32 tests; live Odoo 18 over HTTPS, wss ping returns its pong.
--- FR ---
[IMP] reverse proxy : délais, journal, sonde au démarrage, TLS, chaîne
Un client qui ouvrait une connexion sans rien envoyer gardait sa tâche
pour toujours, et le mandataire restait muet jusqu'à un 502 sans port. La
tête attend désormais 30 s (408) et la connexion à Odoo 10 s (504), jamais
le relais : une WebSocket reste ouverte ; une ligne par requête donne
route, statut et durée ; le démarrage sonde les deux ports et un 502 nomme
celui qui manque, workers pour le bus. --tls-cert/--tls-key servent en
HTTPS, X-Forwarded-Proto à https ; --trust-forwarded prolonge une chaîne.
Vérifié : 32 tests ; Odoo 18 réel en HTTPS, un ping wss rend son pong.
Assisted-by: Claude Opus 5.5
Testing Odoo behind HTTPS needs a certificate the browser accepts,
WebSocket over wss included. local_cert.py issues, through the openssl
command, a local authority to import once and a server certificate it
signs for localhost, the loopbacks, the host name and its addresses.
The authority is kept across issues, so a new name needs no new import;
the directory is 0700 and the keys 0600, the authority being able to
sign for any name. Server certificates last 397 days, under the 398
that browsers accept.
Checked: 6 tests, openssl verify passes, SAN and key modes asserted.
--- FR ---
[ADD] reverse proxy : autorité locale et certificat pour tests HTTPS
Tester Odoo derrière HTTPS exige un certificat que le navigateur accepte,
WebSocket en wss comprise. local_cert.py émet, par la commande openssl,
une autorité locale à importer une fois et un certificat serveur qu'elle
signe pour localhost, les boucles locales, le nom d'hôte et ses adresses.
L'autorité est gardée d'une émission à l'autre : un nouveau nom n'exige
aucun nouvel import. Répertoire en 0700 et clés en 0600, l'autorité
pouvant signer pour tout nom. Certificats serveur de 397 jours, sous les
398 qu'acceptent les navigateurs.
Vérifié : 6 tests, openssl verify passe, SAN et droits des clés vérifiés.
Assisted-by: Claude Opus 5.5
Network gains a fourth entry that starts script/reverse_proxy/main.py
with the web and bus ports read from config.conf, falling back to the
older xmlrpc_port and longpolling_port names. It asks for this machine
only or the whole network, local by default, and warns when proxy_mode
is off or workers is 0: the first makes Odoo ignore X-Forwarded-*, the
second leaves no bus port, so /websocket fails behind the proxy too.
Checked: 48 tests pass (proxy, config reading, menu wiring, i18n); the
French screen renders with the real config.conf.
--- FR ---
[ADD] todo network : lancer le mandataire inverse Odoo, local ou réseau
Network gagne une quatrième entrée qui lance script/reverse_proxy/main.py
avec les ports web et bus lus dans config.conf, repli sur les anciens noms
xmlrpc_port et longpolling_port. Elle demande cette machine seule ou tout
le réseau, local par défaut, et prévient quand proxy_mode est éteint ou
workers vaut 0 : le premier fait ignorer X-Forwarded-* à Odoo, le second
ne laisse aucun port de bus, et /websocket échoue aussi derrière le proxy.
Vérifié : 48 tests passent (mandataire, lecture du config, câblage du
menu, i18n) ; l'écran français s'affiche avec le vrai config.conf.
Assisted-by: Claude Opus 5.5
A single local address routes pages to the Odoo web port and /websocket
to the bus port, with X-Forwarded-* set for proxy_mode; a client value
for these headers is replaced. Only the request head is read: bytes then
pass through unchanged in both directions, so an upgraded WebSocket stays
open and a gzip or chunked response reaches the browser intact. Each
connection carries one request; production keeps nginx (script/nginx).
Checked: 15 tests on real sockets (routing, headers, 5 MB body, gzip,
WebSocket echo, 502, 400, 431); byte-identical to direct against Odoo 18.
--- FR ---
[ADD] reverse proxy : façade de dev pour Odoo 18, websocket dans 2 sens
Une seule adresse locale envoie les pages au port web d'Odoo et
/websocket au port du bus, avec les X-Forwarded-* de proxy_mode ; la
valeur qu'un client donne à ces en-têtes est remplacée. Seule la tête est
lue : les octets passent ensuite tels quels dans les deux sens, une
WebSocket montée reste ouverte et une réponse gzip ou en morceaux arrive
intacte. Une requête par connexion ; la production garde nginx.
Vérifié : 15 tests sur vrais sockets (routage, en-têtes, corps de 5 Mo,
gzip, écho WebSocket, 502, 400, 431) ; identique octet pour octet au
direct face à Odoo 18.
Assisted-by: Claude Opus 5.5
[FIX] qemu cache: git mirror limited to http(s), icons on UI chooser
3 commits. The git mirror of the QEMU cache took the scheme of a git
negotiation from the request line the client writes, so an ssh:// or
git:// repository made the cache connect, with its service account keys,
to a host the client chose. It now clones only over http and https, and
the binary reports 0.2.17. The interface chooser of the TODO CLI gains
icons on its two choices.
Checked: full qemu_cache Go suite passes, a real clone through the
mirror still works; test_todo_i18n passes.
--- FR ---
[FIX] qemu cache : miroir git limité à http(s), icônes du choix d'IU
3 commits. Le miroir git du cache QEMU prenait le schéma d'une
négociation git dans la ligne de requête écrite par le client : un dépôt
ssh:// ou git:// faisait se connecter le cache, avec les clés de son
compte de service, à un hôte choisi par le client. Il ne clone plus qu'en
http et https, et le binaire annonce 0.2.17. Le choix d'interface du CLI
TODO gagne des icônes sur ses deux options.
Vérifié : suite Go de qemu_cache au vert, un vrai clone à travers le
miroir fonctionne toujours ; test_todo_i18n passe.
Assisted-by: Claude Opus 5.5
Records the branch for the next release: under Security, the git mirror
of the QEMU cache that no longer follows an ssh:// or git:// repository
named by a client, with the binary version 0.2.17 that tells a fixed
cache apart; under Changed, the icons on the interface chooser.
Checked: make doc_markdown regenerates both files, each language only
in its own.
--- FR ---
[UPD] changelog : miroir git du cache qemu limité à http(s), icônes
Consigne la branche pour la prochaine version : sous Sécurité, le miroir
git du cache QEMU qui ne suit plus un dépôt ssh:// ou git:// nommé par un
client, avec la version 0.2.17 du binaire qui distingue un cache corrigé ;
sous Modifié, les icônes du choix d'interface.
Vérifié : make doc_markdown régénère les deux fichiers, chaque langue
dans le sien seulement.
Assisted-by: Claude Opus 5.5
The interface chooser of the QEMU deployment and of the Odoo migration,
and the matching preferences in Configuration, read as two plain lines.
The TUI form now carries a clipboard icon and the line by line questions
a speech balloon, in both languages. Both are single code point emoji,
without the variation selector that shifts alignment on some terminals.
Checked: both labels render with their icon in French and English, and
test_todo_i18n passes.
--- FR ---
[IMP] todo : icônes sur les choix formulaire TUI et questions classiques
Le choix d'interface du déploiement QEMU et de la migration Odoo, et les
préférences correspondantes de Configuration, se lisaient comme deux
lignes nues. Le formulaire TUI porte désormais un presse-papiers et les
questions ligne par ligne une bulle, dans les deux langues. Ce sont des
emoji d'un seul point de code, sans le sélecteur de variante qui décale
l'alignement sur certains terminaux.
Vérifié : les deux libellés s'affichent avec leur icône en français et
en anglais, et test_todo_i18n passe.
Assisted-by: Claude Opus 5.5
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