[FIX] script todo: configurer le projet PyCharm avec le venv, et réessayer

Deux défauts empêchaient le .idea d'exister. La configuration d'abord :
« make pycharm_configure » lance le script avec le python SYSTÈME, qui n'a pas
xmltodict — « ModuleNotFoundError », mesuré. update_env_version.pycharm_update()
l'appelle depuis .venv.erplibre ; la cible make et l'étape font désormais pareil.

L'ouverture ensuite : la première tentative sur un dépôt neuf peut n'écrire
aucun .idea, son configurateur d'interpréteur plantant sur « homeDir is null »,
là où la suivante l'écrit en 25 s — constaté sur deux VM. L'étape retente donc
une fois, en gardant les deux journaux. Vérifié sur erplibre-ubuntu-2604-gnome,
caches effacés : erplibre.iml, misc.xml, modules.xml, vcs.xml, et 0 processus
survivant.

--- EN ---

Two defects kept .idea from existing. The configuration first: "make
pycharm_configure" runs the script with the SYSTEM python, which lacks
xmltodict — "ModuleNotFoundError", measured. update_env_version.pycharm_update()
calls it from .venv.erplibre; the make target and the step now do the same.

The open next: the first attempt on a fresh repo can write no .idea at all, its
interpreter configurator dying on "homeDir is null", where the next one writes
it in 25 s — seen on two VMs. The step therefore retries once, keeping both
logs. Verified on erplibre-ubuntu-2604-gnome with caches wiped: erplibre.iml,
misc.xml, modules.xml, vcs.xml, and 0 surviving processes.

Assisted-by: Claude Opus 5
This commit is contained in:
Mathieu Benoit 2026-08-19 08:11:12 -04:00
parent c4d8536509
commit 69431e17c9
4 changed files with 76 additions and 10 deletions

View file

@ -384,4 +384,9 @@ pycharm_open:
.PHONY: pycharm_configure
pycharm_configure:
./script/ide/pycharm_configuration.py --init
# Le venv du dépôt, et non le python système : le script importe xmltodict, qui
# vit dans .venv.erplibre. Appelé directement, il s'arrête sur
# « ModuleNotFoundError: No module named 'xmltodict' » — et c'est cette cible
# que le message d'échec de l'installation recommande. update_env_version.
# pycharm_update() l'appelle déjà ainsi : une seule autorité.
./.venv.erplibre/bin/python ./script/ide/pycharm_configuration.py --init

View file

@ -5779,9 +5779,17 @@ class TODO:
"sudo sysctl -q -p /etc/sysctl.d/60-erplibre-inotify.conf "
f'2>/dev/null; echo " {t("inotify watches raised for the IDE")}"; '
"fi; "
# DEUX tentatives, et c'est mesuré : la première ouverture d'un
# dépôt neuf indexe 212 000 fichiers, plante son configurateur
# d'interpréteur (« PythonSdkConfigurator - homeDir is null ») et
# n'écrit AUCUN .idea, même au bout de cinq minutes. La seconde, sur
# les caches que la première a laissés, l'écrit en 25 secondes —
# constaté sur deux VM différentes.
": > /tmp/pycharm-first-run.log; "
"for attempt in 1 2; do "
'PYCHARM_VM_OPTIONS="$HOME/.pycharm-headless.vmoptions" '
f"setsid xvfb-run -a pycharm {el_dir} "
"> /tmp/pycharm-first-run.log 2>&1 & "
">> /tmp/pycharm-first-run.log 2>&1 & "
"pid=$!; ok=0; "
f"for i in $(seq 1 {self._QEMU_PYCHARM_OPEN_TRIES}); do "
f"if ls {el_dir}/.idea/*.iml >/dev/null 2>&1 && "
@ -5814,6 +5822,9 @@ class TODO:
f'echo " {t("closing what survived the first open:")} $left"; '
'pkill -u "$(id -u)" -x '
'"pycharm|cef_server|fsnotifier|Xvfb" 2>/dev/null; sleep 2; }; '
'[ "$ok" = 1 ] && break; '
f'echo " {t("no project yet, second try on the warm caches")}"; '
"done; "
'[ "$ok" = 1 ]; fi; fi; } && '
f'echo " {t("project created, the install will configure it")}" '
f'|| echo " ⚠ {t("no .idea: open PyCharm once, then")} '
@ -6669,7 +6680,12 @@ class TODO:
# pycharm_update() n'avait alors rien à configurer.
open_step = (
self._qemu_pycharm_project_cmd(prod)
+ "make pycharm_configure || true; "
# Le venv du dépôt, comme le fait update_env_version.
# pycharm_update() : le script importe xmltodict, absent du python
# système. Mesuré : « make pycharm_configure » s'arrêtait sur
# « No module named 'xmltodict' ».
+ "./.venv.erplibre/bin/python "
"./script/ide/pycharm_configuration.py --init || true; "
if "pycharm" in (tools or ())
else ""
)

View file

@ -2260,6 +2260,10 @@ TRANSLATIONS = {
"line": {"fr": "ligne", "en": "line"},
"free space": {"fr": "libre", "en": "free"},
"silent": {"fr": "silence", "en": "silent"},
"no project yet, second try on the warm caches": {
"fr": "pas de projet encore ; seconde tentative sur les caches chauds",
"en": "no project yet, second try on the warm caches",
},
"already there, download skipped": {
"fr": "déjà présent, téléchargement évité",
"en": "already there, download skipped",

View file

@ -180,14 +180,24 @@ class TestToolRemoteCommand(unittest.TestCase):
script.index("PyCharm"), script.index("make install_os")
)
def test_the_install_owns_the_project_configuration(self):
"""update_env_version.pycharm_update() lance déjà le script, et sait se
taire sans .idea. Doubler l'appel n'écrivait qu'une erreur dans le
journal d'une VM neuve."""
def test_the_configuration_is_asked_for_because_the_install_was_too_early(
self,
):
"""Le contraire de ce que ce test exigeait avant, et pour une raison
mesurée : pycharm_update() teste « os.path.exists('.idea') » et se tait
quand le projet n'existe pas encore. Or il s'exécute PENDANT
l'installation, alors que PyCharm ne s'ouvrira qu'après. Personne ne
configurait donc le projet — « Missing ./.idea path » dans le journal
d'une VM neuve. On le demande maintenant explicitement, après
l'ouverture."""
script = self.todo._qemu_erplibre_remote_cmd(
"develop", None, False, "gnome", "", "deb", ("pycharm",)
)
self.assertNotIn("pycharm_configuration", script)
self.assertIn("pycharm_configuration.py --init", script)
self.assertLess(
script.index("xvfb-run"),
script.index("pycharm_configuration.py"),
)
def test_a_failing_tool_never_masks_a_failing_install(self):
"""Le code de sortie doit rester celui de l'installation : c'est lui que
@ -640,6 +650,37 @@ class TestPycharmFirstOpen(unittest.TestCase):
script.index("make install_os"), script.index("xvfb-run")
)
def test_the_configuration_uses_the_repo_venv(self):
"""Le script importe xmltodict, qui vit dans .venv.erplibre. Appelé par
le python système — ce que faisait « make pycharm_configure » — il
s'arrête sur « No module named 'xmltodict' », mesuré sur la VM.
update_env_version.pycharm_update() l'appelle déjà avec le venv."""
script = self.todo._qemu_erplibre_remote_cmd(
"develop", None, False, "gnome", "", "deb", ("pycharm",)
)
self.assertIn(
"./.venv.erplibre/bin/python"
" ./script/ide/pycharm_configuration.py --init",
script,
)
# « make pycharm_configure » reste cité dans le message d'aide — la
# cible est réparée, elle aussi — mais n'est plus ce qu'on EXÉCUTE.
self.assertNotIn("&& make pycharm_configure", script)
self.assertNotIn("; make pycharm_configure", script)
def test_the_open_gets_a_second_chance(self):
"""Mesuré sur deux VM : la première ouverture d'un dépôt neuf peut
n'écrire AUCUN .idea — son configurateur d'interpréteur plante
(« homeDir is null ») — là où la suivante l'écrit en 25 s."""
self.assertIn("for attempt in 1 2", self.cmd)
self.assertIn('[ "$ok" = 1 ] && break', self.cmd)
def test_both_attempts_keep_their_log(self):
"""Tronquer à chaque tentative effacerait la trace de la première, la
seule qui porte la cause."""
self.assertIn(": > /tmp/pycharm-first-run.log", self.cmd)
self.assertIn(">> /tmp/pycharm-first-run.log", self.cmd)
def test_the_configuration_is_asked_for_after_the_open(self):
"""L'installation est déjà passée quand le .idea naît : pycharm_update()
n'avait rien à configurer, donc on le demande explicitement."""
@ -658,9 +699,9 @@ class TestPycharmFirstOpen(unittest.TestCase):
script = self.todo._qemu_erplibre_remote_cmd(
"develop", None, False, "gnome", "", "deb", ("pycharm", "mobile")
)
self.assertIn("make pycharm_configure || true", script)
self.assertIn("pycharm_configuration.py --init || true", script)
self.assertLess(
script.index("make pycharm_configure"),
script.index("pycharm_configuration.py"),
script.index("ERPLibre mobile"),
)