mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-10 08:16:15 +02:00
Add --exclude
flag to nix search
If a package's attribute path, description or name contains matches for any of the regexes specified via `-e` or `--exclude` that package is excluded from the final output.
This commit is contained in:
parent
d137ceccef
commit
b42358b9be
2 changed files with 34 additions and 2 deletions
|
@ -18,16 +18,24 @@ using namespace nix;
|
||||||
|
|
||||||
std::string wrap(std::string prefix, std::string s)
|
std::string wrap(std::string prefix, std::string s)
|
||||||
{
|
{
|
||||||
return prefix + s + ANSI_NORMAL;
|
return concatStrings(prefix, s, ANSI_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CmdSearch : InstallableCommand, MixJSON
|
struct CmdSearch : InstallableCommand, MixJSON
|
||||||
{
|
{
|
||||||
std::vector<std::string> res;
|
std::vector<std::string> res;
|
||||||
|
std::vector<std::string> excludeRes;
|
||||||
|
|
||||||
CmdSearch()
|
CmdSearch()
|
||||||
{
|
{
|
||||||
expectArgs("regex", &res);
|
expectArgs("regex", &res);
|
||||||
|
addFlag(Flag {
|
||||||
|
.longName = "exclude",
|
||||||
|
.shortName = 'e',
|
||||||
|
.description = "Hide packages whose attribute path, name or description contain *regex*.",
|
||||||
|
.labels = {"regex"},
|
||||||
|
.handler = Handler(&excludeRes),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string description() override
|
std::string description() override
|
||||||
|
@ -62,11 +70,16 @@ struct CmdSearch : InstallableCommand, MixJSON
|
||||||
res.push_back("^");
|
res.push_back("^");
|
||||||
|
|
||||||
std::vector<std::regex> regexes;
|
std::vector<std::regex> regexes;
|
||||||
|
std::vector<std::regex> excludeRegexes;
|
||||||
regexes.reserve(res.size());
|
regexes.reserve(res.size());
|
||||||
|
excludeRegexes.reserve(excludeRes.size());
|
||||||
|
|
||||||
for (auto & re : res)
|
for (auto & re : res)
|
||||||
regexes.push_back(std::regex(re, std::regex::extended | std::regex::icase));
|
regexes.push_back(std::regex(re, std::regex::extended | std::regex::icase));
|
||||||
|
|
||||||
|
for (auto & re : excludeRes)
|
||||||
|
excludeRegexes.emplace_back(re, std::regex::extended | std::regex::icase);
|
||||||
|
|
||||||
auto state = getEvalState();
|
auto state = getEvalState();
|
||||||
|
|
||||||
auto jsonOut = json ? std::make_unique<JSONObject>(std::cout) : nullptr;
|
auto jsonOut = json ? std::make_unique<JSONObject>(std::cout) : nullptr;
|
||||||
|
@ -106,6 +119,14 @@ struct CmdSearch : InstallableCommand, MixJSON
|
||||||
std::vector<std::smatch> nameMatches;
|
std::vector<std::smatch> nameMatches;
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
|
for (auto & regex : excludeRegexes) {
|
||||||
|
if (
|
||||||
|
std::regex_search(attrPath2, regex)
|
||||||
|
|| std::regex_search(name.name, regex)
|
||||||
|
|| std::regex_search(description, regex))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (auto & regex : regexes) {
|
for (auto & regex : regexes) {
|
||||||
found = false;
|
found = false;
|
||||||
auto addAll = [&found](std::sregex_iterator it, std::vector<std::smatch> & vec) {
|
auto addAll = [&found](std::sregex_iterator it, std::vector<std::smatch> & vec) {
|
||||||
|
|
|
@ -43,12 +43,23 @@ R""(
|
||||||
# nix search nixpkgs 'firefox|chromium'
|
# nix search nixpkgs 'firefox|chromium'
|
||||||
```
|
```
|
||||||
|
|
||||||
* Search for packages containing `git'`and either `frontend` or `gui`:
|
* Search for packages containing `git` and either `frontend` or `gui`:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
# nix search nixpkgs git 'frontend|gui'
|
# nix search nixpkgs git 'frontend|gui'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
* Search for packages containing `neovim` but hide ones containing either `gui` or `python`:
|
||||||
|
|
||||||
|
```console
|
||||||
|
# nix search nixpkgs neovim -e 'python|gui'
|
||||||
|
```
|
||||||
|
or
|
||||||
|
|
||||||
|
```console
|
||||||
|
# nix search nixpkgs neovim -e 'python' -e 'gui'
|
||||||
|
```
|
||||||
|
|
||||||
# Description
|
# Description
|
||||||
|
|
||||||
`nix search` searches *installable* (which must be evaluatable, e.g. a
|
`nix search` searches *installable* (which must be evaluatable, e.g. a
|
||||||
|
|
Loading…
Reference in a new issue