diff --git a/.chezmoitemplates/mise-toolbox-conf b/.chezmoitemplates/mise-toolbox-conf new file mode 100644 index 0000000..4c2f357 --- /dev/null +++ b/.chezmoitemplates/mise-toolbox-conf @@ -0,0 +1,15 @@ +{{/* .chezmoitemplates/mise-toolbox-conf */}} +{{/* Expects data: (merge (dict "toolboxName" "") .) */}} +{{- $toolboxName := .toolboxName -}} +{{ includeTemplate "chezmoi-managed-header" . }} +[tools] +{{- $toolsList := index .tools.toolboxes $toolboxName }} +{{- range $tool := $toolsList }} + {{- if kindIs "map" $tool }} + {{- range $toolName, $params := $tool }} +{{ $toolName }} = { version = "{{ $params.version | default "latest" }}"{{ range $key, $value := omit $params "version" }}, {{ $key }} = "{{ $value }}"{{ end }} } + {{- end }} + {{- else }} +"{{ $tool }}" = "latest" + {{- end }} +{{- end }} diff --git a/.chezmoitemplates/mise-tools b/.chezmoitemplates/mise-tools index 08ec7a7..36f61ec 100644 --- a/.chezmoitemplates/mise-tools +++ b/.chezmoitemplates/mise-tools @@ -10,14 +10,12 @@ {{- end }} {{- end }} {{- if $currentUser }} - {{- /* 1. Parcourir les toolboxes associées à cet hôte */}} - {{- range $toolboxName := $currentUser.toolboxes }} - {{- /* Récupérer la liste des outils pour cette toolbox dans tools.yaml */}} - {{- $toolsList := index $.tools.toolboxes $toolboxName }} - {{- if $toolsList }} + {{- /* Les outils individuels (la liste 'tools:' de l'utilisateur) */}} + {{- if hasKey $currentUser "tools" }} + {{- if $currentUser.tools }} -# Toolbox: {{ $toolboxName }} - {{- range $tool := $toolsList }} +# Outils individuels + {{- range $tool := $currentUser.tools }} {{- /* Un outil est soit une chaîne ("nom"), soit un objet { nom: {version, ...params mise} } */}} {{- if kindIs "map" $tool }} {{- range $toolName, $params := $tool }} @@ -29,23 +27,7 @@ {{- end }} {{- end }} {{- end }} - - {{- /* 2. Parcourir les outils individuels (la liste 'tools:' de l'utilisateur) */}} - {{- if hasKey $currentUser "tools" }} - {{- if $currentUser.tools }} - -# Outils individuels - {{- range $tool := $currentUser.tools }} - {{- if kindIs "map" $tool }} - {{- range $toolName, $params := $tool }} -{{ $toolName }} = { version = "{{ $params.version | default "latest" }}"{{ range $key, $value := omit $params "version" }}, {{ $key }} = "{{ $value }}"{{ end }} } - {{- end }} - {{- else }} -"{{ $tool }}" = "latest" - {{- end }} - {{- end }} - {{- end }} - {{- end }} + {{- /* Les toolboxes de cet utilisateur sont générées séparément dans ~/.config/mise/conf.d/.toml */}} {{- else if $currentHost }} # Aucun profil trouvé dans hosts.yaml pour l'utilisateur {{ $username }} sur la machine : {{ $hostname }} {{- else }} diff --git a/private_dot_config/mise/config.toml.tmpl b/private_dot_config/mise/config.toml.tmpl index 1bf2f02..f97837e 100644 --- a/private_dot_config/mise/config.toml.tmpl +++ b/private_dot_config/mise/config.toml.tmpl @@ -35,7 +35,8 @@ chezmoi = "latest" neovim = "latest" tree-sitter = "latest" -# Tools automated with chezmoi +# Individual tools automated with chezmoi +# (toolboxes from .chezmoidata/tools.yaml live in ~/.config/mise/conf.d/.toml) {{ includeTemplate "mise-tools" . }} # Password managers diff --git a/run_once_after_00-install-mise.sh.tmpl b/run_once_after_00-install-mise.sh.tmpl index 0ddfb3d..ccc8ead 100644 --- a/run_once_after_00-install-mise.sh.tmpl +++ b/run_once_after_00-install-mise.sh.tmpl @@ -15,7 +15,7 @@ if command -v mise &>/dev/null; then mise bootstrap --yes fi -# 3. Installer tous les outils déclarés dans ~/.config/mise/config.toml +# 3. Installer tous les outils déclarés dans ~/.config/mise/config.toml et ~/.config/mise/conf.d/*.toml if command -v mise &>/dev/null; then echo "⚡ Installation des outils via Mise (dont chezmoi si désiré)..." mise install --yes diff --git a/run_onchange_after_mise-install.sh.tmpl b/run_onchange_after_mise-install.sh.tmpl index c121231..93a0899 100644 --- a/run_onchange_after_mise-install.sh.tmpl +++ b/run_onchange_after_mise-install.sh.tmpl @@ -1,13 +1,59 @@ #!/usr/bin/env bash -# Déclencheur automatique : ce script se réexécutera si le config.toml de mise change, -# y compris quand seules les données (.chezmoidata) utilisées par ses templates changent. -# hash: {{ includeTemplate "private_dot_config/mise/config.toml.tmpl" . | sha256sum }} +# Déclencheur automatique : ce script régénère les toolboxes mise +# (~/.config/mise/conf.d/.toml) à partir de .chezmoidata/tools.yaml +# et .chezmoidata/hosts.yaml, puis (ré)installe les outils. +# Il se réexécute automatiquement dès que ces données changent, car la boucle +# ci-dessous fait partie du contenu templaté (donc du hash) de ce script. +# hash config.toml: {{ includeTemplate "private_dot_config/mise/config.toml.tmpl" . | sha256sum }} + +set -euo pipefail export PATH="${HOME}/.local/bin:$PATH" +MISE_CONF_D="${HOME}/.config/mise/conf.d" +mkdir -p "$MISE_CONF_D" + +{{- $hostname := output "hostname" | trim -}} +{{- $username := .chezmoi.username -}} +{{- $currentHost := index .hosts $hostname -}} +{{- $currentUser := "" -}} +{{- if $currentHost -}} + {{- if hasKey $currentHost.users $username -}} + {{- $currentUser = index $currentHost.users $username -}} + {{- end -}} +{{- end }} + +echo "✏️ Génération des toolboxes mise pour {{ $username }}@{{ $hostname }}..." + +declare -A active_toolboxes=( +{{- if $currentUser }} + {{- range $toolboxName := $currentUser.toolboxes }} + ["{{ $toolboxName }}"]=1 + {{- end }} +{{- end }} +) + +# Suppression des toolboxes qui ne sont plus assignées à cet hôte/utilisateur +for f in "$MISE_CONF_D"/*.toml; do + [ -e "$f" ] || continue + name="$(basename "$f" .toml)" + if [ -z "${active_toolboxes[$name]:-}" ]; then + echo "🗑️ Toolbox obsolète supprimée : $name" + rm -f "$f" + fi +done +{{ if $currentUser }} + {{- range $toolboxName := $currentUser.toolboxes }} + {{- $toolsList := index $.tools.toolboxes $toolboxName }} + {{- if $toolsList }} +echo " → {{ $toolboxName }}.toml" +cat > "$MISE_CONF_D/{{ $toolboxName }}.toml" <<'MISE_TOOLBOX_EOF' +{{ includeTemplate "mise-toolbox-conf" (merge (dict "toolboxName" $toolboxName) $) }} +MISE_TOOLBOX_EOF + {{- end }} + {{- end }} +{{- end }} if command -v mise &>/dev/null; then - echo "✏️ Modification de la configuration mise détectée." - echo echo "🚀 Mise bootstrap..." mise bootstrap --yes