nixpkgs/maintainers/scripts/gen-module-list.sh

69 lines
1.4 KiB
Bash
Raw Normal View History

#!/bin/sh
prog=$0
usage(){
echo 1>&2 "
$prog module-dir
This script generates the \`module-list.nix' index file inside the
module directory.
"
exit 1
}
: ${NIXPKGS=/etc/nixos/nixpkgs}
is_module(){
local file=$1
echo "
let
appIfFun = f: x: if builtins.isFunction f then f x else f;
in
builtins.isAttrs (
appIfFun (import $file) {
pkgs = (import $NIXPKGS) {};
config = {};
dummy = 42;
}
)
" | nix-instantiate - --eval-only
}
find_mask(){
local maskfile="$1"
if test -r "${maskfile}"; then
cat "${maskfile}"
echo
echo "./module-list.nix"
else
echo "./module-list.nix"
fi | \
sed -ne 's/[ ]*#.*//; /^[ ]*$/ d; s/\(.*\)/-wholename '"'\1'"' -or /p' | tr -d '\n'
}
generate_index(){
local path="$1"
cd "$path"
echo -n "$path: " 1>&2
{ echo "[ # This file has been generated by $(basename $prog)";
for file in : $(eval find ./ $(find_mask ./module-list.mask) -type f -name "'*.nix'" -print | sort); do
[ "$file" = ':' ] && continue;
echo -n . 1>&2
if test "$(is_module "$file" 2> /dev/null)" = "Bool(True)"; then
echo " $file"
else
echo "##### $file"
is_module "$file" 2>&1 | sed "s/^/# /; s,$(pwd),.,"
fi
done
echo ']';
} > ./module-list.nix
echo 1>&2
cd - > /dev/null
}
[ $# -eq 1 ] || usage;
generate_index "$1"