Fix nixos-option

In particular, it no longer produces an "infinite recursion" error
when run with no arguments.
This commit is contained in:
Eelco Dolstra 2013-10-28 22:43:29 +01:00
parent c9dad37f01
commit 3115addf4c
4 changed files with 22 additions and 21 deletions

View file

@ -160,6 +160,7 @@ rec {
value = (opt.apply or id) merged; value = (opt.apply or id) merged;
in opt // in opt //
{ value = addErrorContext "while evaluating the option `${showOption loc}':" value; { value = addErrorContext "while evaluating the option `${showOption loc}':" value;
files = map (def: def.file) defs;
definitions = map (def: def.value) defsFinal; definitions = map (def: def.value) defsFinal;
isDefined = defsFinal != []; isDefined = defsFinal != [];
}; };

View file

@ -9,7 +9,7 @@ let
modules = [ configuration ]; modules = [ configuration ];
}; };
inherit (eval) config pkgs; inherit (eval) pkgs;
# This is for `nixos-rebuild build-vm'. # This is for `nixos-rebuild build-vm'.
vmConfig = (import ./lib/eval-config.nix { vmConfig = (import ./lib/eval-config.nix {
@ -30,9 +30,9 @@ let
in in
{ {
inherit eval config; inherit (eval) config options;
system = config.system.build.toplevel; system = eval.config.system.build.toplevel;
vm = vmConfig.system.build.vm; vm = vmConfig.system.build.vm;

View file

@ -16,14 +16,11 @@ rec {
# Merge the option definitions in all modules, forming the full # Merge the option definitions in all modules, forming the full
# system configuration. # system configuration.
systemModule = inherit (pkgs.lib.evalModules {
pkgs.lib.evalModules {
modules = modules ++ baseModules; modules = modules ++ baseModules;
args = extraArgs; args = extraArgs;
inherit check; inherit check;
}; }) config options;
config = systemModule.config;
# These are the extra arguments passed to every module. In # These are the extra arguments passed to every module. In
# particular, Nixpkgs is passed through the "pkgs" argument. # particular, Nixpkgs is passed through the "pkgs" argument.

View file

@ -1,5 +1,7 @@
#! @shell@ -e #! @shell@ -e
# FIXME: rewrite this in a more suitable language.
usage () { usage () {
exec man nixos-option exec man nixos-option
exit 1 exit 1
@ -90,24 +92,25 @@ evalNix(){
} }
evalAttr(){ evalAttr(){
local prefix=$1 local prefix="$1"
local suffix=$2 local strict="$2"
local strict=$3 local suffix="$3"
echo "(import <nixos> {}).$prefix${option:+.$option}${suffix:+.$suffix}" | echo "(import <nixos> {}).$prefix${option:+.$option}${suffix:+.$suffix}" |
evalNix ${strict:+--strict} evalNix ${strict:+--strict}
} }
evalOpt(){ evalOpt(){
evalAttr "eval.options" "$@" evalAttr "options" "" "$@"
} }
evalCfg(){ evalCfg(){
evalAttr "config" "$@" local strict="$1"
evalAttr "config" "$strict"
} }
findSources(){ findSources(){
local suffix=$1 local suffix=$1
echo "builtins.map (f: f.source) (import <nixos> {}).eval.options${option:+.$option}.$suffix" | echo "(import <nixos> {}).options${option:+.$option}.$suffix" |
evalNix --strict evalNix --strict
} }
@ -143,7 +146,7 @@ let
nixos = import <nixos> {}; nixos = import <nixos> {};
nixpkgs = import <nixpkgs> {}; nixpkgs = import <nixpkgs> {};
sources = builtins.map (f: f.source); sources = builtins.map (f: f.source);
opt = reach nixos.eval.options; opt = reach nixos.options;
cfg = reach nixos.config; cfg = reach nixos.config;
in in
@ -186,7 +189,7 @@ EOF
fi fi
if test "$(evalOpt "_type" 2> /dev/null)" = '"option"'; then if test "$(evalOpt "_type" 2> /dev/null)" = '"option"'; then
$value && evalCfg; $value && evalCfg 1
if $desc; then if $desc; then
$value && echo; $value && echo;
@ -212,14 +215,14 @@ if test "$(evalOpt "_type" 2> /dev/null)" = '"option"'; then
nixMap printPath "$(findSources "declarations")" nixMap printPath "$(findSources "declarations")"
echo "" echo ""
echo "Defined by:" echo "Defined by:"
nixMap printPath "$(findSources "definitions")" nixMap printPath "$(findSources "files")"
echo "" echo ""
fi fi
else else
# echo 1>&2 "Warning: This value is not an option." # echo 1>&2 "Warning: This value is not an option."
result=$(evalCfg) result=$(evalCfg "")
if names=$(attrNames "$result" 2> /dev/null); then if names=$(attrNames "$result" 2> /dev/null); then
echo 1>&2 "This attribute set contains:" echo 1>&2 "This attribute set contains:"
escapeQuotes () { eval echo "$1"; } escapeQuotes () { eval echo "$1"; }