Add feature to disable URL literals

E.g.

  $ nix-build '<nixpkgs>' -A hello --experimental-features no-url-literals
  error: URL literals are disabled, at /nix/store/vsjamkzh15r3c779q2711az826hqgvzr-nixpkgs-20.03pre194957.bef773ed53f/nixpkgs/pkgs/top-level/all-packages.nix:1236:11

Helps with implementing https://github.com/NixOS/rfcs/pull/45.
This commit is contained in:
Eelco Dolstra 2019-11-26 19:48:34 +01:00
parent fc62caa4a5
commit 1ec6e6e11e
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
3 changed files with 16 additions and 3 deletions

View file

@ -20,6 +20,7 @@
#include "nixexpr.hh"
#include "eval.hh"
#include "globals.hh"
namespace nix {
@ -401,7 +402,12 @@ expr_simple
new ExprVar(data->symbols.create("__nixPath"))),
new ExprString(data->symbols.create(path)));
}
| URI { $$ = new ExprString(data->symbols.create($1)); }
| URI {
static bool noURLLiterals = settings.isExperimentalFeatureEnabled("no-url-literals");
if (noURLLiterals)
throw ParseError("URL literals are disabled, at %s", CUR_POS);
$$ = new ExprString(data->symbols.create($1));
}
| '(' expr ')' { $$ = $2; }
/* Let expressions `let {..., body = ...}' are just desugared
into `(rec {..., body = ...}).body'. */

View file

@ -105,10 +105,15 @@ StringSet Settings::getDefaultSystemFeatures()
return features;
}
void Settings::requireExperimentalFeature(const std::string & name)
bool Settings::isExperimentalFeatureEnabled(const std::string & name)
{
auto & f = experimentalFeatures.get();
if (std::find(f.begin(), f.end(), name) == f.end())
return std::find(f.begin(), f.end(), name) != f.end();
}
void Settings::requireExperimentalFeature(const std::string & name)
{
if (!isExperimentalFeatureEnabled(name))
throw Error("experimental Nix feature '%s' is disabled", name);
}

View file

@ -357,6 +357,8 @@ public:
Setting<Strings> experimentalFeatures{this, {}, "experimental-features",
"Experimental Nix features to enable."};
bool isExperimentalFeatureEnabled(const std::string & name);
void requireExperimentalFeature(const std::string & name);
};