1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-12-07 09:31:01 +01:00

Merge remote-tracking branch 'detsys/detsys-main' into lazy-trees-tmp

This commit is contained in:
Eelco Dolstra 2025-04-23 12:25:28 +02:00
commit a6faa69fc8
109 changed files with 1219 additions and 546 deletions

View file

@ -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;
}
}

View file

@ -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);

View file

@ -26,6 +26,11 @@ static inline bool getInterrupted();
*/
void setInterruptThrown();
/**
* @note Does nothing on Windows
*/
static inline bool isInterrupted();
/**
* @note Does nothing on Windows
*/

View file

@ -85,17 +85,22 @@ static inline bool getInterrupted()
return unix::_isInterrupted;
}
static inline bool isInterrupted()
{
using namespace unix;
return _isInterrupted || (interruptCheck && interruptCheck());
}
/**
* Throw `Interrupted` exception if the process has been interrupted.
*
* Call this in long-running loops and between slow operations to terminate
* them as needed.
*/
void inline checkInterrupt()
inline void checkInterrupt()
{
using namespace unix;
if (_isInterrupted || (interruptCheck && interruptCheck()))
_interrupted();
if (isInterrupted())
unix::_interrupted();
}
/**

View file

@ -22,7 +22,12 @@ inline void setInterruptThrown()
/* Do nothing for now */
}
void inline checkInterrupt()
static inline bool isInterrupted()
{
/* Do nothing for now */
}
inline void checkInterrupt()
{
/* Do nothing for now */
}