mirror of
https://github.com/NixOS/nix.git
synced 2025-04-15 13:47:34 +00:00
Merge pull request #13008 from Mic92/aliases
Move alias support from NixArgs to MultiCommand + test
This commit is contained in:
commit
71567373b6
@ -281,7 +281,6 @@ nix3_manpages = [
|
||||
'nix3-store',
|
||||
'nix3-store-optimise',
|
||||
'nix3-store-path-from-hash-part',
|
||||
'nix3-store-ping',
|
||||
'nix3-store-prefetch-file',
|
||||
'nix3-store-repair',
|
||||
'nix3-store-sign',
|
||||
|
@ -647,4 +647,25 @@ nlohmann::json MultiCommand::toJSON()
|
||||
return res;
|
||||
}
|
||||
|
||||
Strings::iterator MultiCommand::rewriteArgs(Strings & args, Strings::iterator pos)
|
||||
{
|
||||
if (command)
|
||||
return command->second->rewriteArgs(args, pos);
|
||||
|
||||
if (aliasUsed || pos == args.end()) return pos;
|
||||
auto arg = *pos;
|
||||
auto i = aliases.find(arg);
|
||||
if (i == aliases.end()) return pos;
|
||||
auto & info = i->second;
|
||||
if (info.status == AliasStatus::Deprecated) {
|
||||
warn("'%s' is a deprecated alias for '%s'",
|
||||
arg, concatStringsSep(" ", info.replacement));
|
||||
}
|
||||
pos = args.erase(pos);
|
||||
for (auto j = info.replacement.rbegin(); j != info.replacement.rend(); ++j)
|
||||
pos = args.insert(pos, *j);
|
||||
aliasUsed = true;
|
||||
return pos;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -393,8 +393,30 @@ public:
|
||||
|
||||
nlohmann::json toJSON() override;
|
||||
|
||||
enum struct AliasStatus {
|
||||
/** Aliases that don't go away */
|
||||
AcceptedShorthand,
|
||||
/** Aliases that will go away */
|
||||
Deprecated,
|
||||
};
|
||||
|
||||
/** An alias, except for the original syntax, which is in the map key. */
|
||||
struct AliasInfo {
|
||||
AliasStatus status;
|
||||
std::vector<std::string> replacement;
|
||||
};
|
||||
|
||||
/**
|
||||
* A list of aliases (remapping a deprecated/shorthand subcommand
|
||||
* to something else).
|
||||
*/
|
||||
std::map<std::string, AliasInfo> aliases;
|
||||
|
||||
Strings::iterator rewriteArgs(Strings & args, Strings::iterator pos) override;
|
||||
|
||||
protected:
|
||||
std::string commandName = "";
|
||||
bool aliasUsed = false;
|
||||
};
|
||||
|
||||
Strings argvToStrings(int argc, char * * argv);
|
||||
|
@ -50,19 +50,6 @@ void chrootHelper(int argc, char * * argv);
|
||||
|
||||
namespace nix {
|
||||
|
||||
enum struct AliasStatus {
|
||||
/** Aliases that don't go away */
|
||||
AcceptedShorthand,
|
||||
/** Aliases that will go away */
|
||||
Deprecated,
|
||||
};
|
||||
|
||||
/** An alias, except for the original syntax, which is in the map key. */
|
||||
struct AliasInfo {
|
||||
AliasStatus status;
|
||||
std::vector<std::string> replacement;
|
||||
};
|
||||
|
||||
/* Check if we have a non-loopback/link-local network interface. */
|
||||
static bool haveInternet()
|
||||
{
|
||||
@ -153,54 +140,34 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs, virtual RootArgs
|
||||
.handler = {[&]() { refresh = true; }},
|
||||
.experimentalFeature = Xp::NixCommand,
|
||||
});
|
||||
}
|
||||
|
||||
std::map<std::string, AliasInfo> aliases = {
|
||||
{"add-to-store", { AliasStatus::Deprecated, {"store", "add-path"}}},
|
||||
{"cat-nar", { AliasStatus::Deprecated, {"nar", "cat"}}},
|
||||
{"cat-store", { AliasStatus::Deprecated, {"store", "cat"}}},
|
||||
{"copy-sigs", { AliasStatus::Deprecated, {"store", "copy-sigs"}}},
|
||||
{"dev-shell", { AliasStatus::Deprecated, {"develop"}}},
|
||||
{"diff-closures", { AliasStatus::Deprecated, {"store", "diff-closures"}}},
|
||||
{"dump-path", { AliasStatus::Deprecated, {"store", "dump-path"}}},
|
||||
{"hash-file", { AliasStatus::Deprecated, {"hash", "file"}}},
|
||||
{"hash-path", { AliasStatus::Deprecated, {"hash", "path"}}},
|
||||
{"ls-nar", { AliasStatus::Deprecated, {"nar", "ls"}}},
|
||||
{"ls-store", { AliasStatus::Deprecated, {"store", "ls"}}},
|
||||
{"make-content-addressable", { AliasStatus::Deprecated, {"store", "make-content-addressed"}}},
|
||||
{"optimise-store", { AliasStatus::Deprecated, {"store", "optimise"}}},
|
||||
{"ping-store", { AliasStatus::Deprecated, {"store", "info"}}},
|
||||
{"sign-paths", { AliasStatus::Deprecated, {"store", "sign"}}},
|
||||
{"shell", { AliasStatus::AcceptedShorthand, {"env", "shell"}}},
|
||||
{"show-derivation", { AliasStatus::Deprecated, {"derivation", "show"}}},
|
||||
{"show-config", { AliasStatus::Deprecated, {"config", "show"}}},
|
||||
{"to-base16", { AliasStatus::Deprecated, {"hash", "to-base16"}}},
|
||||
{"to-base32", { AliasStatus::Deprecated, {"hash", "to-base32"}}},
|
||||
{"to-base64", { AliasStatus::Deprecated, {"hash", "to-base64"}}},
|
||||
{"verify", { AliasStatus::Deprecated, {"store", "verify"}}},
|
||||
{"doctor", { AliasStatus::Deprecated, {"config", "check"}}},
|
||||
aliases = {
|
||||
{"add-to-store", { AliasStatus::Deprecated, {"store", "add-path"}}},
|
||||
{"cat-nar", { AliasStatus::Deprecated, {"nar", "cat"}}},
|
||||
{"cat-store", { AliasStatus::Deprecated, {"store", "cat"}}},
|
||||
{"copy-sigs", { AliasStatus::Deprecated, {"store", "copy-sigs"}}},
|
||||
{"dev-shell", { AliasStatus::Deprecated, {"develop"}}},
|
||||
{"diff-closures", { AliasStatus::Deprecated, {"store", "diff-closures"}}},
|
||||
{"dump-path", { AliasStatus::Deprecated, {"store", "dump-path"}}},
|
||||
{"hash-file", { AliasStatus::Deprecated, {"hash", "file"}}},
|
||||
{"hash-path", { AliasStatus::Deprecated, {"hash", "path"}}},
|
||||
{"ls-nar", { AliasStatus::Deprecated, {"nar", "ls"}}},
|
||||
{"ls-store", { AliasStatus::Deprecated, {"store", "ls"}}},
|
||||
{"make-content-addressable", { AliasStatus::Deprecated, {"store", "make-content-addressed"}}},
|
||||
{"optimise-store", { AliasStatus::Deprecated, {"store", "optimise"}}},
|
||||
{"ping-store", { AliasStatus::Deprecated, {"store", "info"}}},
|
||||
{"sign-paths", { AliasStatus::Deprecated, {"store", "sign"}}},
|
||||
{"shell", { AliasStatus::AcceptedShorthand, {"env", "shell"}}},
|
||||
{"show-derivation", { AliasStatus::Deprecated, {"derivation", "show"}}},
|
||||
{"show-config", { AliasStatus::Deprecated, {"config", "show"}}},
|
||||
{"to-base16", { AliasStatus::Deprecated, {"hash", "to-base16"}}},
|
||||
{"to-base32", { AliasStatus::Deprecated, {"hash", "to-base32"}}},
|
||||
{"to-base64", { AliasStatus::Deprecated, {"hash", "to-base64"}}},
|
||||
{"verify", { AliasStatus::Deprecated, {"store", "verify"}}},
|
||||
{"doctor", { AliasStatus::Deprecated, {"config", "check"}}},
|
||||
};
|
||||
};
|
||||
|
||||
bool aliasUsed = false;
|
||||
|
||||
Strings::iterator rewriteArgs(Strings & args, Strings::iterator pos) override
|
||||
{
|
||||
if (aliasUsed || command || pos == args.end()) return pos;
|
||||
auto arg = *pos;
|
||||
auto i = aliases.find(arg);
|
||||
if (i == aliases.end()) return pos;
|
||||
auto & info = i->second;
|
||||
if (info.status == AliasStatus::Deprecated) {
|
||||
warn("'%s' is a deprecated alias for '%s'",
|
||||
arg, concatStringsSep(" ", info.replacement));
|
||||
}
|
||||
pos = args.erase(pos);
|
||||
for (auto j = info.replacement.rbegin(); j != info.replacement.rend(); ++j)
|
||||
pos = args.insert(pos, *j);
|
||||
aliasUsed = true;
|
||||
return pos;
|
||||
}
|
||||
|
||||
std::string description() override
|
||||
{
|
||||
return "a tool for reproducible and declarative configuration management";
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
using namespace nix;
|
||||
|
||||
struct CmdPingStore : StoreCommand, MixJSON
|
||||
struct CmdInfoStore : StoreCommand, MixJSON
|
||||
{
|
||||
std::string description() override
|
||||
{
|
||||
@ -46,15 +46,4 @@ struct CmdPingStore : StoreCommand, MixJSON
|
||||
}
|
||||
};
|
||||
|
||||
struct CmdInfoStore : CmdPingStore
|
||||
{
|
||||
void run(nix::ref<nix::Store> store) override
|
||||
{
|
||||
warn("'nix store ping' is a deprecated alias for 'nix store info'");
|
||||
CmdPingStore::run(store);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
static auto rCmdPingStore = registerCommand2<CmdPingStore>({"store", "info"});
|
||||
static auto rCmdInfoStore = registerCommand2<CmdInfoStore>({"store", "ping"});
|
||||
static auto rCmdInfoStore = registerCommand2<CmdInfoStore>({"store", "info"});
|
||||
|
@ -5,7 +5,11 @@ using namespace nix;
|
||||
struct CmdStore : NixMultiCommand
|
||||
{
|
||||
CmdStore() : NixMultiCommand("store", RegisterCommand::getCommandsFor({"store"}))
|
||||
{ }
|
||||
{
|
||||
aliases = {
|
||||
{"ping", { AliasStatus::Deprecated, {"info"}}},
|
||||
};
|
||||
}
|
||||
|
||||
std::string description() override
|
||||
{
|
||||
|
@ -3,9 +3,11 @@
|
||||
source common.sh
|
||||
|
||||
STORE_INFO=$(nix store info 2>&1)
|
||||
LEGACY_STORE_INFO=$(nix store ping 2>&1) # alias to nix store info
|
||||
STORE_INFO_JSON=$(nix store info --json)
|
||||
|
||||
echo "$STORE_INFO" | grep "Store URL: ${NIX_REMOTE}"
|
||||
echo "$LEGACY_STORE_INFO" | grep "Store URL: ${NIX_REMOTE}"
|
||||
|
||||
if [[ -v NIX_DAEMON_PACKAGE ]] && isDaemonNewer "2.7.0pre20220126"; then
|
||||
DAEMON_VERSION=$("$NIX_DAEMON_PACKAGE"/bin/nix daemon --version | cut -d' ' -f3)
|
||||
@ -13,6 +15,7 @@ if [[ -v NIX_DAEMON_PACKAGE ]] && isDaemonNewer "2.7.0pre20220126"; then
|
||||
[[ "$(echo "$STORE_INFO_JSON" | jq -r ".version")" == "$DAEMON_VERSION" ]]
|
||||
fi
|
||||
|
||||
|
||||
expect 127 NIX_REMOTE=unix:"$PWD"/store nix store info || \
|
||||
fail "nix store info on a non-existent store should fail"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user