[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:
parent
c4d8536509
commit
69431e17c9
4 changed files with 76 additions and 10 deletions
7
Makefile
7
Makefile
|
|
@ -384,4 +384,9 @@ pycharm_open:
|
||||||
|
|
||||||
.PHONY: pycharm_configure
|
.PHONY: pycharm_configure
|
||||||
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
|
||||||
|
|
|
||||||
|
|
@ -5779,9 +5779,17 @@ class TODO:
|
||||||
"sudo sysctl -q -p /etc/sysctl.d/60-erplibre-inotify.conf "
|
"sudo sysctl -q -p /etc/sysctl.d/60-erplibre-inotify.conf "
|
||||||
f'2>/dev/null; echo " {t("inotify watches raised for the IDE")}"; '
|
f'2>/dev/null; echo " {t("inotify watches raised for the IDE")}"; '
|
||||||
"fi; "
|
"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" '
|
'PYCHARM_VM_OPTIONS="$HOME/.pycharm-headless.vmoptions" '
|
||||||
f"setsid xvfb-run -a pycharm {el_dir} "
|
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; "
|
"pid=$!; ok=0; "
|
||||||
f"for i in $(seq 1 {self._QEMU_PYCHARM_OPEN_TRIES}); do "
|
f"for i in $(seq 1 {self._QEMU_PYCHARM_OPEN_TRIES}); do "
|
||||||
f"if ls {el_dir}/.idea/*.iml >/dev/null 2>&1 && "
|
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"; '
|
f'echo " {t("closing what survived the first open:")} $left"; '
|
||||||
'pkill -u "$(id -u)" -x '
|
'pkill -u "$(id -u)" -x '
|
||||||
'"pycharm|cef_server|fsnotifier|Xvfb" 2>/dev/null; sleep 2; }; '
|
'"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; } && '
|
'[ "$ok" = 1 ]; fi; fi; } && '
|
||||||
f'echo " {t("project created, the install will configure it")}" '
|
f'echo " {t("project created, the install will configure it")}" '
|
||||||
f'|| echo " ⚠ {t("no .idea: open PyCharm once, then")} '
|
f'|| echo " ⚠ {t("no .idea: open PyCharm once, then")} '
|
||||||
|
|
@ -6669,7 +6680,12 @@ class TODO:
|
||||||
# pycharm_update() n'avait alors rien à configurer.
|
# pycharm_update() n'avait alors rien à configurer.
|
||||||
open_step = (
|
open_step = (
|
||||||
self._qemu_pycharm_project_cmd(prod)
|
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 ())
|
if "pycharm" in (tools or ())
|
||||||
else ""
|
else ""
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -2260,6 +2260,10 @@ TRANSLATIONS = {
|
||||||
"line": {"fr": "ligne", "en": "line"},
|
"line": {"fr": "ligne", "en": "line"},
|
||||||
"free space": {"fr": "libre", "en": "free"},
|
"free space": {"fr": "libre", "en": "free"},
|
||||||
"silent": {"fr": "silence", "en": "silent"},
|
"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": {
|
"already there, download skipped": {
|
||||||
"fr": "déjà présent, téléchargement évité",
|
"fr": "déjà présent, téléchargement évité",
|
||||||
"en": "already there, download skipped",
|
"en": "already there, download skipped",
|
||||||
|
|
|
||||||
|
|
@ -180,14 +180,24 @@ class TestToolRemoteCommand(unittest.TestCase):
|
||||||
script.index("PyCharm"), script.index("make install_os")
|
script.index("PyCharm"), script.index("make install_os")
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_the_install_owns_the_project_configuration(self):
|
def test_the_configuration_is_asked_for_because_the_install_was_too_early(
|
||||||
"""update_env_version.pycharm_update() lance déjà le script, et sait se
|
self,
|
||||||
taire sans .idea. Doubler l'appel n'écrivait qu'une erreur dans le
|
):
|
||||||
journal d'une VM neuve."""
|
"""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(
|
script = self.todo._qemu_erplibre_remote_cmd(
|
||||||
"develop", None, False, "gnome", "", "deb", ("pycharm",)
|
"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):
|
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
|
"""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")
|
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):
|
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()
|
"""L'installation est déjà passée quand le .idea naît : pycharm_update()
|
||||||
n'avait rien à configurer, donc on le demande explicitement."""
|
n'avait rien à configurer, donc on le demande explicitement."""
|
||||||
|
|
@ -658,9 +699,9 @@ class TestPycharmFirstOpen(unittest.TestCase):
|
||||||
script = self.todo._qemu_erplibre_remote_cmd(
|
script = self.todo._qemu_erplibre_remote_cmd(
|
||||||
"develop", None, False, "gnome", "", "deb", ("pycharm", "mobile")
|
"develop", None, False, "gnome", "", "deb", ("pycharm", "mobile")
|
||||||
)
|
)
|
||||||
self.assertIn("make pycharm_configure || true", script)
|
self.assertIn("pycharm_configuration.py --init || true", script)
|
||||||
self.assertLess(
|
self.assertLess(
|
||||||
script.index("make pycharm_configure"),
|
script.index("pycharm_configuration.py"),
|
||||||
script.index("ERPLibre mobile"),
|
script.index("ERPLibre mobile"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue