From 93ffb3b7e91ab44208021b22a46cef6416f7fafd Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Wed, 2 Sep 2026 04:01:10 -0400 Subject: [PATCH] [ADD] script todo : poser merge.conflictStyle=zdiff3 depuis le menu Git MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit zdiff3 fait figurer la base commune dans les marqueurs de conflit et sort de la zone contestée les lignes que les deux côtés ont en commun : il reste moins à arbitrer à la main. Le style demande git 2.35, que toutes les plateformes supportées dépassent. La valeur est relue après écriture, « git config » ne rendant rien à l'écriture. L'entrée est déclarée dans TestGitMenuNumbering : le menu Git mêle entrées codées en dur et entrées de todo.json, qu'un rang de plus décale. Vérifié : 117 tests au vert. --- EN --- zdiff3 puts the merge base into the conflict markers and lifts out of the contested area the lines both sides share: less is left to arbitrate by hand. The style needs git 2.35, which every supported platform exceeds. The value is read back after writing, as « git config » returns nothing on write. The entry is declared in TestGitMenuNumbering: the Git menu mixes hard-coded entries with todo.json ones, which one more rank shifts. Checked: 117 tests green. Assisted-by: Claude Opus 5 --- script/todo/todo.py | 39 +++++++++++++++++++++++++++++++++++++++ script/todo/todo_i18n.py | 11 +++++++++++ test/test_todo_menu.py | 12 ++++++------ 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/script/todo/todo.py b/script/todo/todo.py index 1bcdc7b..c5e08d3 100755 --- a/script/todo/todo.py +++ b/script/todo/todo.py @@ -2539,6 +2539,11 @@ class TODO( "Install git hooks (commit-msg, pre-commit)" ) }, + { + "prompt_description": t( + "Set merge.conflictStyle to zdiff3 (global)" + ) + }, ] # Append config-driven entries @@ -2559,6 +2564,8 @@ class TODO( self._git_add_remote() elif status == "3": self._git_install_hooks() + elif status == "4": + self._git_set_conflict_style() else: cmd_no_found = True try: @@ -2636,6 +2643,38 @@ class TODO( marque = t("hook installed") if pose else t("hook not installed") print(f" {hook:<26} {marque}") + def _git_set_conflict_style(self): + """Poser merge.conflictStyle=zdiff3 dans la configuration globale. + + zdiff3 ajoute la base commune aux marqueurs de conflit et sort de la + zone contestée les lignes que les deux côtés ont en commun : il reste + moins à arbitrer à la main. Le style demande git 2.35, que toutes les + plateformes supportées dépassent. + + La valeur est relue après écriture : « git config » ne rend rien à + l'écriture, et une configuration globale en lecture seule échouerait + sans que le menu le sache. + """ + status = self.execute.exec_command_live( + "git config --global merge.conflictStyle zdiff3", + source_erplibre=False, + ) + if status: + print( + f"❌ {t('Failed to set merge.conflictStyle, see the output above.')}" + ) + return + result = self.execute.exec_command_live( + "git config --global --get merge.conflictStyle", + source_erplibre=False, + quiet=True, + return_status_and_output=True, + ) + value = ( + " ".join(result[1]).strip() if isinstance(result, tuple) else "" + ) + print(f"✅ merge.conflictStyle = {value}") + def prompt_execute_git_local_server(self): print(f"🤖 {t('Manage local git repository server!')}") choices = [ diff --git a/script/todo/todo_i18n.py b/script/todo/todo_i18n.py index 4a21a71..88a3f96 100644 --- a/script/todo/todo_i18n.py +++ b/script/todo/todo_i18n.py @@ -903,6 +903,17 @@ TRANSLATIONS = { "en": "Error adding remote: ", }, # Git hooks + "Set merge.conflictStyle to zdiff3 (global)": { + "fr": "Configurer merge.conflictStyle en zdiff3 (global)", + "en": "Set merge.conflictStyle to zdiff3 (global)", + }, + "Failed to set merge.conflictStyle, see the output above.": { + "fr": ( + "Échec du réglage de merge.conflictStyle, voir la sortie" + " ci-dessus." + ), + "en": "Failed to set merge.conflictStyle, see the output above.", + }, "Install git hooks (commit-msg, pre-commit)": { "fr": "Installer les hooks git (commit-msg, pre-commit)", "en": "Install git hooks (commit-msg, pre-commit)", diff --git a/test/test_todo_menu.py b/test/test_todo_menu.py index f6a5aa5..b31912c 100644 --- a/test/test_todo_menu.py +++ b/test/test_todo_menu.py @@ -451,12 +451,11 @@ class TestProxmoxMenuNumbering(MenuCoherence, unittest.TestCase): class TestGitMenuNumbering(MenuCoherence, unittest.TestCase): """Le menu Git, le seul dont todo.json suit des entrées codées en dur. - Ses trois premières entrées sont écrites à la main, les suivantes viennent - de `git_from_makefile` et le repli générique les renumérote tout seul : - ajouter « Installer les hooks git » en [3] a poussé les deux entrées de - todo.json en [4] et [5] sans que rien ne le dise. Une quatrième entrée - codée en dur, oubliée dans le dispatch, ferait lancer à [4] la commande - du voisin sous le libellé attendu. + Ses premières entrées sont écrites à la main, les suivantes viennent de + `git_from_makefile` et le repli générique les renumérote tout seul : + ajouter une entrée codée en dur pousse celles de todo.json d'un rang sans + que rien ne le dise. Une entrée codée en dur oubliée dans le dispatch + ferait lancer la commande du voisin sous le libellé attendu. """ SOURCE = TODO_DIR / "todo.py" @@ -468,6 +467,7 @@ class TestGitMenuNumbering(MenuCoherence, unittest.TestCase): "Local git server": "prompt_execute_git_local_server", "Add a remote to a local repository": "_git_add_remote", "Install git hooks": "_git_install_hooks", + "Set merge.conflictStyle": "_git_set_conflict_style", }