Commit graph

45 commits

Author SHA1 Message Date
Eelco Dolstra
f3d94cfc23 Revert "Add the tool "nixos-typecheck" that can check an option declaration to:"
This reverts commit cad8957eab. It
breaks NixOps, but more importantly, such major changes to the module
system really need to be reviewed.
2016-03-01 20:52:06 +01:00
Thomas Strobel
cad8957eab Add the tool "nixos-typecheck" that can check an option declaration to:
- Enforce that an option declaration has a "defaultText" if and only if the
   type of the option derives from "package", "packageSet" or "nixpkgsConfig"
   and if a "default" attribute is defined.

 - Enforce that the value of the "example" attribute is wrapped with "literalExample"
   if the type of the option derives from "package", "packageSet" or "nixpkgsConfig".

 - Warn if a "defaultText" is defined in an option declaration if the type of
   the option does not derive from "package", "packageSet" or "nixpkgsConfig".

 - Warn if no "type" is defined in an option declaration.
2016-02-29 01:09:00 +01:00
aszlig
98faa0c8f3
lib/types: Set name of types.package to "package"
Nobody seems to have noticed this (except @Profpatsch) that options with
a "package" type do not get included in the manual.

So debugging this was a bit more involving because while generating the
manual there is an optionList' attribute built from the collected
attributes of all the option declarations.

Up to that point everything is fine except if it comes to
builtins.toXML, where attributes with { type = "derivation" } won't get
included, for example see here:

nix-repl> builtins.toXML { type = "derivation"; foo = "bar"; }
"<?xml version='1.0' encoding='utf-8'?>\n<expr>\n  <derivation>
 <repeated />\n  </derivation>\n</expr>\n"

nix-repl> builtins.toXML { type = "somethingelse"; foo = "bar"; }
"<?xml version='1.0' encoding='utf-8'?>\n<expr>\n  <attrs>
     <attr name=\"foo\">\n      <string value=\"bar\" />\n    </attr>
     <attr name=\"type\">\n      <string value=\"somethingelse\" />
     </attr>\n </attrs>\n</expr>\n"

The following function in libexpr/eval.cc (Nix) is responsible for toXML
dropping the attributes:

bool EvalState::isDerivation(Value & v)
{
    if (v.type != tAttrs) return false;
    Bindings::iterator i = v.attrs->find(sType);
    if (i == v.attrs->end()) return false;
    forceValue(*i->value);
    if (i->value->type != tString) return false;
    return strcmp(i->value->string.s, "derivation") == 0;
}

So I've renamed this now to "package" which is not only more consistent
with the option type but also shouldn't cause similar issues anymore.

Tested this on base of b60ceea, because building the dependencies on
recent libc/staging changes on master took too long.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Reported-by: Profpatsch <mail@profpatsch.de>
2016-02-17 21:12:24 +01:00
Igor Pashev
b078ae9c16 Use x == null instead of builtins.isNull x 2015-12-04 07:22:57 +03:00
Igor Pashev
363e6978ce Allow enum of integers (and any other type)
Closes #9826.
2015-12-04 07:15:14 +03:00
Jan Malakhovski
33ae3f2fe4 nixos,lib: move environment generation related copy-paste to lib 2015-09-18 18:48:49 +00:00
Benno Fünfstück
7cd6b3cf76 Revert change of path type
The change caused lots of evaluation errors, since it caused derivations to no longer be valid paths as well.
2015-08-15 15:38:12 +02:00
Benno Fünfstück
691f683c8c types.nix: better error message for non-paths
This improves error messages when a set or a list is used where a path
was expected. For an example, if you used a package set (as opposed to a
single package) in systemPackages before this commit, the error was:

```
cannot coerce a list to a string, at "/home/nixpkgs/lib/types.nix":103:37
```

Now, the error message reads:

```
The option value `environment.systemPackages' in `/etc/nixos/configuration.nix' is not a list of paths.
```
2015-08-15 13:05:57 +02:00
Eelco Dolstra
214d4fb73c Allow options with type "package" to be store paths
For example, this allows writing

  nix.package = /nix/store/786mlvhd17xvcp2r4jmmay6jj4wj6b7f-nix-1.10pre4206_896428c;

Also, document types.package in the manual.
2015-08-07 03:09:57 +02:00
Eelco Dolstra
637e35deb9 Use foldl' instead of fold in some places 2015-07-23 18:31:54 +02:00
Eelco Dolstra
e212e07cf6 Make types.bool complain on conflicting definitions
Previously, conflicting definitions would merge to "true". Now they
give an error, e.g.

  error: The option `hardware.enableAllFirmware' has conflicting definitions, in `/etc/nixos/configurations/misc/eelco/stuff.nix' and `/etc/nixos/configurations/misc/eelco/mandark.nix'.
2015-06-15 18:07:48 +02:00
Nicolas B. Pierron
05e8a48fb4 Document and rename internal option of modules. 2015-03-15 14:45:42 +01:00
Nicolas B. Pierron
ed91474e9b Share common code for merging option definitions.
This move idioms which were used in `evalOptionValue` and in the `merge`
functions of `listOf` and `attrsOf` types, such that we can use a names such
as `isDefined` and `optionalValue` instead or repeating identical
comparisons of `defsFinal == []`.
2015-03-12 23:42:58 +01:00
Shea Levy
0a0a29fd0b Add comments about the module system interface
Ideally the module system could be configured pretty much completely by
the contents of the modules themselves, so add comments about avoiding
complicating it further and possibly removing now-redundant
configurability from the existing interface.
2015-03-12 23:42:57 +01:00
Shea Levy
4f5c6330c9 types.loaOf: Update check function
This symplifies typechecking and allows properties to be used inside the
function body. It also makes possible checking the type of the result.
2015-03-12 23:42:57 +01:00
Shea Levy
8737d1783f types.attrsOf: Use mergeDefinitions to handle each element
This simplifes typechecking and allows properties to be used inside of
the attribute sets.

This fixes the empty synergy-client and synergy-server services
previously generated on systems with synergy disabled.
2015-03-12 23:42:57 +01:00
Shea Levy
e4bc2592f3 types.listOf: Use mergeDefinitions to handle each element
This simplifies typechecking and allows properties to be used inside the lists
2015-03-12 23:42:57 +01:00
Nicolas Pierron
4ff1ab5a56 Remove types.functionTo. 2014-09-07 19:41:45 +02:00
Nicolas Pierron
b5f0cc3cda Merge options having the submodule type.
Now we should be able to have multiple declaration of the same option as
long as all declarations have the same type.  If the type has a sub module,
then it is merged with the submodules of other declarations, as done with
option sets.

In addition, the file of the option declaration is passed into the
submodule, such as the documentation can display it correctly.
2014-09-07 19:03:20 +02:00
Eelco Dolstra
f932910323 types.nix: Add ‘either’ type 2014-08-19 18:24:37 +02:00
Shea Levy
da4adc2a4f Fix description to match convention 2014-05-01 11:46:44 -04:00
Shea Levy
ab2cd34076 Add enum option type 2014-05-01 11:30:20 -04:00
Eelco Dolstra
ebe57b1ac8 Remove lib.typeOf
It clashes with builtins.typeOf.
2014-02-27 21:27:29 +01:00
Shea Levy
83c98e4dd6 loaOf: Allow merging definitions from a list into other definitions IFF there is a name attribute 2014-02-20 10:40:49 -05:00
Shea Levy
c8f1a6ac1e Revert "Add nixosSubmodule option type"
Moving recent types work to a separate branch for now

This reverts commit ca1c5cfa8f.
2014-02-13 12:10:50 -05:00
Shea Levy
4fd825cc94 Revert "Add option type for a submodule with extra arguments"
Moving recent types work to a separate branch for now

This reverts commit 8764758044.
2014-02-13 12:10:50 -05:00
Shea Levy
220654e205 Revert "Add heterogeneousAttrsOf option type"
Moving recent types work to a separate branch for now

This reverts commit 3f70dabad3.
2014-02-13 12:10:50 -05:00
Shea Levy
3f70dabad3 Add heterogeneousAttrsOf option type
It is parameterized by a function that takes a name and evaluates to the
option type for the attribute of that name. Together with
submoduleWithExtraArgs, this subsumes nixosSubmodule.
2014-02-11 14:59:24 -05:00
Shea Levy
8764758044 Add option type for a submodule with extra arguments 2014-02-11 14:39:46 -05:00
Shea Levy
ca1c5cfa8f Add nixosSubmodule option type
Since NixOS modules expect special arguments, use a hack to provide them
2014-02-11 14:21:34 -05:00
Shea Levy
84a7a09bc8 Try to improve naming of list elements in loaOf types
Signed-off-by: Shea Levy <shea@shealevy.com>
2014-02-08 15:20:25 -05:00
Eelco Dolstra
785eaf2cea Add some primops to lib 2013-11-12 13:48:30 +01:00
Eelco Dolstra
a61b800da5 Fix backward compatibility with Nix < 1.6
"with" used to be less lazy, so don't rely on that.  Also don't use
the "<" operator.
2013-10-30 19:12:25 +01:00
Eelco Dolstra
70a2c54527 Strictly check the arguments to mkOption
And fix various instances of bad arguments.
2013-10-30 15:35:09 +01:00
Eelco Dolstra
800f9c2037 Show correct position info for errors in submodules
E.g.

  The unique option `fileSystems./.device' is defined multiple times, in `/etc/nixos/configuration.nix' and `/etc/nixos/foo.nix'.

This requires passing file/value tuples to the merge functions.
2013-10-30 14:57:43 +01:00
Eelco Dolstra
0afdb1e933 Add option type "str" for unique strings
An annoying and dangerous property of "types.string" is that it merges
multiple definitions by concatenating them, which almost never
produces a sensible result.  (Those options for which it does make
sense typically should use "types.lines" instead, and things only work
because the option definitions already end in a newline.)  Of course,
you can use "types.uniq types.string", but that's rather verbose, and
inconsistent with other basic types like "types.int".

Changing the behaviour of "types.string" to be unique by default is
not an option, given the large number of options that use it.  So
instead, we now have "types.str", which is equivalent to "types.uniq
types.string".
2013-10-29 13:45:30 +01:00
Eelco Dolstra
73f32d0375 Show precise error messages in option merge failures
For instance, if time.timeZone is defined multiple times, you now get
the error message:

  error: user-thrown exception: The unique option `time.timeZone' is defined multiple times, in `/etc/nixos/configurations/misc/eelco/x11vnc.nix' and `/etc/nixos/configuration.nix'.

while previously you got:

  error: user-thrown exception: Multiple definitions of string. Only one is allowed for this option.

and only an inspection of the stack trace gave a clue as to what
option caused the problem.
2013-10-28 22:45:57 +01:00
Eelco Dolstra
d5047faede Remove uses of the "merge" option attribute
It's redundant because you can (and should) specify an option type, or
an apply function.
2013-10-28 22:45:56 +01:00
Eelco Dolstra
f4a418761b Check for undeclared options 2013-10-28 22:45:56 +01:00
Eelco Dolstra
c263b5b284 Show error locations in submodules 2013-10-28 22:45:56 +01:00
Eelco Dolstra
89bd18b3af Fix manual generation 2013-10-28 22:45:56 +01:00
Eelco Dolstra
b479dac8df Inline some functions on the critical path 2013-10-28 22:45:55 +01:00
Eelco Dolstra
cfab329437 Use isType instead of typeOf 2013-10-28 22:45:55 +01:00
Eelco Dolstra
0e333688ce Big cleanup of the NixOS module system
The major changes are:

* The evaluation is now driven by the declared options.  In
  particular, this fixes the long-standing problem with lack of
  laziness of disabled option definitions.  Thus, a configuration like

    config = mkIf false {
      environment.systemPackages = throw "bla";
    };

  will now evaluate without throwing an error.  This also improves
  performance since we're not evaluating unused option definitions.

* The implementation of properties is greatly simplified.

* There is a new type constructor "submodule" that replaces
  "optionSet".  Unlike "optionSet", "submodule" gets its option
  declarations as an argument, making it more like "listOf" and other
  type constructors.  A typical use is:

    foo = mkOption {
      type = type.attrsOf (type.submodule (
        { config, ... }:
        { bar = mkOption { ... };
          xyzzy = mkOption { ... };
        }));
    };

  Existing uses of "optionSet" are automatically mapped to
  "submodule".

* Modules are now checked for unsupported attributes: you get an error
  if a module contains an attribute other than "config", "options" or
  "imports".

* The new implementation is faster and uses much less memory.
2013-10-28 22:45:55 +01:00
Eelco Dolstra
5fef92c4a0 Move pkgs/lib/ to lib/ 2013-10-10 13:28:21 +02:00
Renamed from pkgs/lib/types.nix (Browse further)