feat(mise): Generate toolbox conf.d files dynamically from tools.yaml #1

Merged
xavier merged 3 commits from feat/mise-dynamic-toolboxes into dev 2026-08-31 00:52:24 +02:00
6 changed files with 79 additions and 33 deletions
+17
View File
@@ -0,0 +1,17 @@
{{/* .chezmoitemplates/mise-toolbox-conf */}}
{{/* Expects data: (merge (dict "toolboxName" "<name>") .) */}}
{{- $toolboxName := .toolboxName -}}
{{ includeTemplate "chezmoi-managed-header" . }}
# Toolbox: {{ $toolboxName }}
[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 }}
+6 -24
View File
@@ -10,14 +10,12 @@
{{- end }} {{- end }}
{{- end }} {{- end }}
{{- if $currentUser }} {{- if $currentUser }}
{{- /* 1. Parcourir les toolboxes associées à cet hôte */}} {{- /* Les outils individuels (la liste 'tools:' de l'utilisateur) */}}
{{- range $toolboxName := $currentUser.toolboxes }} {{- if hasKey $currentUser "tools" }}
{{- /* Récupérer la liste des outils pour cette toolbox dans tools.yaml */}} {{- if $currentUser.tools }}
{{- $toolsList := index $.tools.toolboxes $toolboxName }}
{{- if $toolsList }}
# Toolbox: {{ $toolboxName }} # Outils individuels
{{- range $tool := $toolsList }} {{- range $tool := $currentUser.tools }}
{{- /* Un outil est soit une chaîne ("nom"), soit un objet { nom: {version, ...params mise} } */}} {{- /* Un outil est soit une chaîne ("nom"), soit un objet { nom: {version, ...params mise} } */}}
{{- if kindIs "map" $tool }} {{- if kindIs "map" $tool }}
{{- range $toolName, $params := $tool }} {{- range $toolName, $params := $tool }}
@@ -29,23 +27,7 @@
{{- end }} {{- end }}
{{- end }} {{- end }}
{{- end }} {{- end }}
{{- /* Les toolboxes de cet utilisateur sont générées séparément dans ~/.config/mise/conf.d/<toolbox>.toml */}}
{{- /* 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 }}
{{- else if $currentHost }} {{- else if $currentHost }}
# Aucun profil trouvé dans hosts.yaml pour l'utilisateur {{ $username }} sur la machine : {{ $hostname }} # Aucun profil trouvé dans hosts.yaml pour l'utilisateur {{ $username }} sur la machine : {{ $hostname }}
{{- else }} {{- else }}
+2 -2
View File
@@ -11,7 +11,7 @@ gui:
- bold - bold
nerdFontsVersion: "3" nerdFontsVersion: "3"
git: git:
pagers: diffRenderers:
- colorArg: always - colorArg: always
pager: delta --paging=never command: delta --paging=never
parseEmoji: true parseEmoji: true
+2 -1
View File
@@ -35,7 +35,8 @@ chezmoi = "latest"
neovim = "latest" neovim = "latest"
tree-sitter = "latest" tree-sitter = "latest"
# Tools automated with chezmoi # Individual tools automated with chezmoi
# (toolboxes from .chezmoidata/tools.yaml live in ~/.config/mise/conf.d/<toolbox>.toml)
{{ includeTemplate "mise-tools" . }} {{ includeTemplate "mise-tools" . }}
# Password managers # Password managers
+1 -1
View File
@@ -15,7 +15,7 @@ if command -v mise &>/dev/null; then
mise bootstrap --yes mise bootstrap --yes
fi 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 if command -v mise &>/dev/null; then
echo "⚡ Installation des outils via Mise (dont chezmoi si désiré)..." echo "⚡ Installation des outils via Mise (dont chezmoi si désiré)..."
mise install --yes mise install --yes
+51 -5
View File
@@ -1,13 +1,59 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Déclencheur automatique : ce script se réexécutera si le config.toml de mise change, # Déclencheur automatique : ce script régénère les toolboxes mise
# y compris quand seules les données (.chezmoidata) utilisées par ses templates changent. # (~/.config/mise/conf.d/<toolbox>.toml) à partir de .chezmoidata/tools.yaml
# hash: {{ includeTemplate "private_dot_config/mise/config.toml.tmpl" . | sha256sum }} # 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" 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 if command -v mise &>/dev/null; then
echo "✏️ Modification de la configuration mise détectée."
echo echo
echo "🚀 Mise bootstrap..." echo "🚀 Mise bootstrap..."
mise bootstrap --yes mise bootstrap --yes