#!/usr/bin/env bash set -euo pipefail ROOT="${1:-../Modules}" # pass root dir, defaults to Modules # Generate module boilerplate for each .nix (excluding default.nix) gen_module_boilerplate() { local file="$1" local module module="$(basename "$file" .nix)" # skip if non-empty if [[ -s "$file" ]]; then echo "Skipping non-empty $file" return fi local ns target if [[ "$file" == *"/Home/"* ]]; then ns="home" target="home.packages" else ns="system" target="environment.systemPackages" fi cat > "$file" < 0 )); then new_imports=("${local_modules[@]}") else local subdirs=() for sub in "$dir"/*/; do [[ -d "$sub" && -f "$sub/default.nix" ]] && subdirs+=("./$(basename "$sub")") done new_imports=("${subdirs[@]}") fi mkdir -p "$dir" if [[ -f "$file" ]]; then # Replace imports block in place awk -v n="${#new_imports[@]}" -v imports="$(printf '%s\n' "${new_imports[@]}")" ' BEGIN { split(imports, arr, "\n") printing=1 } /imports = \[/ { print " imports = [" for (i=1; i<=n; i++) { print " " arr[i] } print " ];" # skip until closing bracket while (getline > 0) { if ($0 ~ /\];/) break } next } { print } ' "$file" > "$file.tmp" && mv "$file.tmp" "$file" echo "Updated imports in $file" else # brand new default.nix { echo "{ config, lib, pkgs, ... }:" echo echo "{" echo " imports = [" for imp in "${new_imports[@]}"; do echo " $imp" done echo " ];" echo "}" } > "$file" echo "Created $file" fi } # Walk the tree echo "Generating nix module boilerplates under $ROOT ..." # 1. Generate boilerplate for all non-default modules find "$ROOT" -type f -name "*.nix" ! -name "default.nix" | while read -r f; do gen_module_boilerplate "$f" done # 2. Generate default.nix in every directory find "$ROOT" -type d | while read -r d; do gen_default_for_dir "$d" done echo "Done! All modules + defaults generated."