Add deprecated aliases for renamed commands
This commit is contained in:
parent
0c15ae5d4b
commit
af373c2ece
|
@ -86,6 +86,7 @@ void Args::parseCmdline(const Strings & _cmdline)
|
||||||
throw UsageError("unrecognised flag '%1%'", arg);
|
throw UsageError("unrecognised flag '%1%'", arg);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
pos = rewriteArgs(cmdline, pos);
|
||||||
pendingArgs.push_back(*pos++);
|
pendingArgs.push_back(*pos++);
|
||||||
if (processArgs(pendingArgs, false))
|
if (processArgs(pendingArgs, false))
|
||||||
pendingArgs.clear();
|
pendingArgs.clear();
|
||||||
|
@ -390,10 +391,6 @@ MultiCommand::MultiCommand(const Commands & commands)
|
||||||
.optional = true,
|
.optional = true,
|
||||||
.handler = {[=](std::string s) {
|
.handler = {[=](std::string s) {
|
||||||
assert(!command);
|
assert(!command);
|
||||||
if (auto alias = get(deprecatedAliases, s)) {
|
|
||||||
warn("'%s' is a deprecated alias for '%s'", s, *alias);
|
|
||||||
s = *alias;
|
|
||||||
}
|
|
||||||
if (auto prefix = needsCompletion(s)) {
|
if (auto prefix = needsCompletion(s)) {
|
||||||
for (auto & [name, command] : commands)
|
for (auto & [name, command] : commands)
|
||||||
if (hasPrefix(name, *prefix))
|
if (hasPrefix(name, *prefix))
|
||||||
|
|
|
@ -115,6 +115,9 @@ protected:
|
||||||
|
|
||||||
virtual bool processArgs(const Strings & args, bool finish);
|
virtual bool processArgs(const Strings & args, bool finish);
|
||||||
|
|
||||||
|
virtual Strings::iterator rewriteArgs(Strings & args, Strings::iterator pos)
|
||||||
|
{ return pos; }
|
||||||
|
|
||||||
std::set<std::string> hiddenCategories;
|
std::set<std::string> hiddenCategories;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -257,8 +260,6 @@ public:
|
||||||
|
|
||||||
std::map<Command::Category, std::string> categories;
|
std::map<Command::Category, std::string> categories;
|
||||||
|
|
||||||
std::map<std::string, std::string> deprecatedAliases;
|
|
||||||
|
|
||||||
// Selected command, if any.
|
// Selected command, if any.
|
||||||
std::optional<std::pair<std::string, ref<Command>>> command;
|
std::optional<std::pair<std::string, ref<Command>>> command;
|
||||||
|
|
||||||
|
|
|
@ -112,8 +112,36 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
|
||||||
.description = "consider all previously downloaded files out-of-date",
|
.description = "consider all previously downloaded files out-of-date",
|
||||||
.handler = {[&]() { refresh = true; }},
|
.handler = {[&]() { refresh = true; }},
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
deprecatedAliases.insert({"dev-shell", "develop"});
|
std::map<std::string, std::vector<std::string>> aliases = {
|
||||||
|
{"dev-shell", {"develop"}},
|
||||||
|
{"hash-file", {"hash", "file"}},
|
||||||
|
{"hash-path", {"hash", "path"}},
|
||||||
|
{"to-base16", {"hash", "to-base16"}},
|
||||||
|
{"to-base32", {"hash", "to-base32"}},
|
||||||
|
{"to-base64", {"hash", "to-base64"}},
|
||||||
|
{"ls-nar", {"nar", "ls"}},
|
||||||
|
{"ls-store", {"store", "ls"}},
|
||||||
|
{"cat-nar", {"nar", "cat"}},
|
||||||
|
{"cat-store", {"store", "cat"}},
|
||||||
|
};
|
||||||
|
|
||||||
|
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;
|
||||||
|
warn("'%s' is a deprecated alias for '%s'",
|
||||||
|
arg, concatStringsSep(" ", i->second));
|
||||||
|
pos = args.erase(pos);
|
||||||
|
for (auto j = i->second.rbegin(); j != i->second.rend(); ++j)
|
||||||
|
pos = args.insert(pos, *j);
|
||||||
|
aliasUsed = true;
|
||||||
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
void printFlags(std::ostream & out) override
|
void printFlags(std::ostream & out) override
|
||||||
|
|
Loading…
Reference in a new issue