[ADD] script todo : poser merge.conflictStyle=zdiff3 depuis le menu Git

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
This commit is contained in:
Mathieu Benoit 2026-09-02 04:01:10 -04:00
parent 3dcccf40d9
commit 93ffb3b7e9
3 changed files with 56 additions and 6 deletions

View file

@ -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 = [

View file

@ -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)",

View file

@ -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",
}