Skip to content

Commit

Permalink
Stuctured command stability
Browse files Browse the repository at this point in the history
Prior to this, there was an ad-hoc whitelist in `main.cc`. Now, every
command states its stability.

In a future PR, we will adjust the manual to take advantage of this new
information in the JSON.
(It will be easier to do that once we have some experimental feature
docs to link too; see #5930 and #7798.)
  • Loading branch information
Ericson2314 committed Apr 3, 2023
1 parent 70bb7b7 commit e97c91f
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 9 deletions.
17 changes: 15 additions & 2 deletions src/libutil/args.cc
Original file line number Diff line number Diff line change
Expand Up @@ -236,8 +236,6 @@ nlohmann::json Args::toJSON()
auto flags = nlohmann::json::object();

for (auto & [name, flag] : longFlags) {
/* Skip experimental flags when listing flags. */
if (!experimentalFeatureSettings.isEnabled(flag->experimentalFeature)) continue;
auto j = nlohmann::json::object();
if (flag->aliases.count(name)) continue;
if (flag->shortName)
Expand All @@ -249,6 +247,11 @@ nlohmann::json Args::toJSON()
j["arity"] = flag->handler.arity;
if (!flag->labels.empty())
j["labels"] = flag->labels;
// FIXME With C++23 use std::optional::tranform
if (auto & xp = flag->experimentalFeature)
j["experimental-feature"] = showExperimentalFeature(*xp);
else
j["experimental-feature"] = nullptr;
flags[name] = std::move(j);
}

Expand Down Expand Up @@ -345,6 +348,11 @@ Strings argvToStrings(int argc, char * * argv)
return args;
}

std::optional<ExperimentalFeature> Command::experimentalFeature ()
{
return { Xp::NixCommand };
}

MultiCommand::MultiCommand(const Commands & commands_)
: commands(commands_)
{
Expand Down Expand Up @@ -408,6 +416,11 @@ nlohmann::json MultiCommand::toJSON()
cat["id"] = command->category();
cat["description"] = trim(categories[command->category()]);
j["category"] = std::move(cat);
// FIXME With C++23 use std::optional::tranform
if (auto xp = command->experimentalFeature())
cat["experimental-feature"] = showExperimentalFeature(*xp);
else
cat["experimental-feature"] = nullptr;
cmds[name] = std::move(j);
}

Expand Down
2 changes: 2 additions & 0 deletions src/libutil/args.hh
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,8 @@ struct Command : virtual public Args

static constexpr Category catDefault = 0;

virtual std::optional<ExperimentalFeature> experimentalFeature ();

virtual Category category() { return catDefault; }
};

Expand Down
8 changes: 8 additions & 0 deletions src/nix/doctor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,14 @@ struct CmdDoctor : StoreCommand
{
bool success = true;

/**
* This command is stable before the others
*/
std::optional<ExperimentalFeature> experimentalFeature() override
{
return std::nullopt;
}

std::string description() override
{
return "check your system for potential problems and print a PASS or FAIL for each check";
Expand Down
9 changes: 5 additions & 4 deletions src/nix/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,9 @@ void mainWrapped(int argc, char * * argv)
NixArgs args;

if (argc == 2 && std::string(argv[1]) == "__dump-cli") {
experimentalFeatureSettings.experimentalFeatures = {
Xp::NixCommand,
};
logger->cout(args.dumpCli());
return;
}
Expand Down Expand Up @@ -423,10 +426,8 @@ void mainWrapped(int argc, char * * argv)
if (!args.command)
throw UsageError("no subcommand specified");

if (args.command->first != "repl"
&& args.command->first != "doctor"
&& args.command->first != "upgrade-nix")
experimentalFeatureSettings.require(Xp::NixCommand);
experimentalFeatureSettings.require(
args.command->second->experimentalFeature());

if (args.useNet && !haveInternet()) {
warn("you don't have Internet access; disabling some network-dependent features");
Expand Down
8 changes: 8 additions & 0 deletions src/nix/repl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ struct CmdRepl : RawInstallablesCommand
evalSettings.pureEval = false;
}

/**
* This command is stable before the others
*/
std::optional<ExperimentalFeature> experimentalFeature() override
{
return std::nullopt;
}

std::vector<std::string> files;

Strings getDefaultFlakeAttrPaths() override
Expand Down
8 changes: 8 additions & 0 deletions src/nix/upgrade-nix.cc
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ struct CmdUpgradeNix : MixDryRun, StoreCommand
});
}

/**
* This command is stable before the others
*/
std::optional<ExperimentalFeature> experimentalFeature() override
{
return std::nullopt;
}

std::string description() override
{
return "upgrade Nix to the stable version declared in Nixpkgs";
Expand Down
11 changes: 8 additions & 3 deletions tests/experimental-features.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,20 @@ function both_ways {
# Simple case, the configuration effects the running command
both_ways show-config

# Complicated case, earlier args effect later args
# Skipping for now, because we actually *do* want these to show up in
# the manual, just be marked experimental. Will reenable once the manual
# generation takes advantage of the JSON metadata on this.

both_ways store gc --help
# both_ways store gc --help

expect 1 nix --experimental-features 'nix-command' show-config --flake-registry 'https://no'
nix --experimental-features 'nix-command flakes' show-config --flake-registry 'https://no'

# Double check this is stable
# Double check these are stable
nix --experimental-features '' --help
nix --experimental-features '' doctor --help
nix --experimental-features '' repl --help
nix --experimental-features '' upgrade-nix --help

# These 3 arguments are currently given to all commands, which is wrong (as not
# all care). To deal with fixing later, we simply make them require the
Expand Down

0 comments on commit e97c91f

Please sign in to comment.