Merge pull request #7611 from obsidiansystems/structured-command-stabilization
Stuctured command stability
This commit is contained in:
commit
acc3314376
7 changed files with 51 additions and 9 deletions
|
@ -236,8 +236,6 @@ nlohmann::json Args::toJSON()
|
||||||
auto flags = nlohmann::json::object();
|
auto flags = nlohmann::json::object();
|
||||||
|
|
||||||
for (auto & [name, flag] : longFlags) {
|
for (auto & [name, flag] : longFlags) {
|
||||||
/* Skip experimental flags when listing flags. */
|
|
||||||
if (!experimentalFeatureSettings.isEnabled(flag->experimentalFeature)) continue;
|
|
||||||
auto j = nlohmann::json::object();
|
auto j = nlohmann::json::object();
|
||||||
if (flag->aliases.count(name)) continue;
|
if (flag->aliases.count(name)) continue;
|
||||||
if (flag->shortName)
|
if (flag->shortName)
|
||||||
|
@ -249,6 +247,11 @@ nlohmann::json Args::toJSON()
|
||||||
j["arity"] = flag->handler.arity;
|
j["arity"] = flag->handler.arity;
|
||||||
if (!flag->labels.empty())
|
if (!flag->labels.empty())
|
||||||
j["labels"] = flag->labels;
|
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);
|
flags[name] = std::move(j);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -345,6 +348,11 @@ Strings argvToStrings(int argc, char * * argv)
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<ExperimentalFeature> Command::experimentalFeature ()
|
||||||
|
{
|
||||||
|
return { Xp::NixCommand };
|
||||||
|
}
|
||||||
|
|
||||||
MultiCommand::MultiCommand(const Commands & commands_)
|
MultiCommand::MultiCommand(const Commands & commands_)
|
||||||
: commands(commands_)
|
: commands(commands_)
|
||||||
{
|
{
|
||||||
|
@ -408,6 +416,11 @@ nlohmann::json MultiCommand::toJSON()
|
||||||
cat["id"] = command->category();
|
cat["id"] = command->category();
|
||||||
cat["description"] = trim(categories[command->category()]);
|
cat["description"] = trim(categories[command->category()]);
|
||||||
j["category"] = std::move(cat);
|
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);
|
cmds[name] = std::move(j);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -236,6 +236,8 @@ struct Command : virtual public Args
|
||||||
|
|
||||||
static constexpr Category catDefault = 0;
|
static constexpr Category catDefault = 0;
|
||||||
|
|
||||||
|
virtual std::optional<ExperimentalFeature> experimentalFeature ();
|
||||||
|
|
||||||
virtual Category category() { return catDefault; }
|
virtual Category category() { return catDefault; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,14 @@ struct CmdDoctor : StoreCommand
|
||||||
{
|
{
|
||||||
bool success = true;
|
bool success = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This command is stable before the others
|
||||||
|
*/
|
||||||
|
std::optional<ExperimentalFeature> experimentalFeature() override
|
||||||
|
{
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
std::string description() override
|
std::string description() override
|
||||||
{
|
{
|
||||||
return "check your system for potential problems and print a PASS or FAIL for each check";
|
return "check your system for potential problems and print a PASS or FAIL for each check";
|
||||||
|
|
|
@ -423,10 +423,8 @@ void mainWrapped(int argc, char * * argv)
|
||||||
if (!args.command)
|
if (!args.command)
|
||||||
throw UsageError("no subcommand specified");
|
throw UsageError("no subcommand specified");
|
||||||
|
|
||||||
if (args.command->first != "repl"
|
experimentalFeatureSettings.require(
|
||||||
&& args.command->first != "doctor"
|
args.command->second->experimentalFeature());
|
||||||
&& args.command->first != "upgrade-nix")
|
|
||||||
experimentalFeatureSettings.require(Xp::NixCommand);
|
|
||||||
|
|
||||||
if (args.useNet && !haveInternet()) {
|
if (args.useNet && !haveInternet()) {
|
||||||
warn("you don't have Internet access; disabling some network-dependent features");
|
warn("you don't have Internet access; disabling some network-dependent features");
|
||||||
|
|
|
@ -12,6 +12,14 @@ struct CmdRepl : RawInstallablesCommand
|
||||||
evalSettings.pureEval = false;
|
evalSettings.pureEval = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This command is stable before the others
|
||||||
|
*/
|
||||||
|
std::optional<ExperimentalFeature> experimentalFeature() override
|
||||||
|
{
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<std::string> files;
|
std::vector<std::string> files;
|
||||||
|
|
||||||
Strings getDefaultFlakeAttrPaths() override
|
Strings getDefaultFlakeAttrPaths() override
|
||||||
|
|
|
@ -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
|
std::string description() override
|
||||||
{
|
{
|
||||||
return "upgrade Nix to the stable version declared in Nixpkgs";
|
return "upgrade Nix to the stable version declared in Nixpkgs";
|
||||||
|
|
|
@ -15,15 +15,20 @@ function both_ways {
|
||||||
# Simple case, the configuration effects the running command
|
# Simple case, the configuration effects the running command
|
||||||
both_ways show-config
|
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'
|
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'
|
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 '' --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
|
# 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
|
# all care). To deal with fixing later, we simply make them require the
|
||||||
|
|
Loading…
Reference in a new issue