Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stuctured command stability #7611

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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;
// TODO 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);
// TODO 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
6 changes: 2 additions & 4 deletions src/nix/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -423,10 +423,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