mirror of
https://github.com/NixOS/nix
synced 2025-06-25 06:31:14 +02:00
Merge 10a6dff3b8
into 918ac6b2fc
This commit is contained in:
commit
cf1517b7fe
3 changed files with 72 additions and 1 deletions
12
doc/manual/rl-next/profile-flake-url.md
Normal file
12
doc/manual/rl-next/profile-flake-url.md
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
---
|
||||||
|
synopsis: Removing and upgrading packages using flake URLs
|
||||||
|
prs: 10198
|
||||||
|
---
|
||||||
|
|
||||||
|
It is now possible to remove and upgrade packages in `nix profile` using flake URLs.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ nix profile install nixpkgs#firefox
|
||||||
|
$ nix profile upgrade nixpkgs#firefox
|
||||||
|
$ nix profile remove nixpkgs#firefox
|
||||||
|
```
|
|
@ -545,6 +545,43 @@ struct NameMatcher final : public Matcher
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
std::regex defaultPackageFragmentPattern("(?:legacyPackages|packages)\\.(?:[^\\.]+)\\.default");
|
||||||
|
std::regex packageFragmentPattern("(?:legacyPackages|packages)\\.(?:[^\\.]+)\\.(.+)");
|
||||||
|
struct InstallableMatcher : public Matcher
|
||||||
|
{
|
||||||
|
const FlakeRef flakeRef;
|
||||||
|
const std::string fragment;
|
||||||
|
|
||||||
|
InstallableMatcher(const FlakeRef flakeRef, const std::string fragment) : flakeRef(flakeRef), fragment(fragment)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
std::string getTitle() override
|
||||||
|
{
|
||||||
|
return fmt("Installable '%s#%s'", flakeRef.to_string(), fragment);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool matches(const std::string & name, const ProfileElement & element) override
|
||||||
|
{
|
||||||
|
if (element.source->originalRef != flakeRef) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Match "#packages.{system}.default"
|
||||||
|
if (fragment == "") {
|
||||||
|
return std::regex_match(element.source->attrPath, defaultPackageFragmentPattern);
|
||||||
|
}
|
||||||
|
// Match "#{name}"
|
||||||
|
if (element.source->attrPath == fragment) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// Match "#packages.{system}.{name}"
|
||||||
|
std::smatch match;
|
||||||
|
if (std::regex_match(element.source->attrPath, match, packageFragmentPattern)) {
|
||||||
|
return match.str(1) == fragment;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct AllMatcher final : public Matcher
|
struct AllMatcher final : public Matcher
|
||||||
{
|
{
|
||||||
std::string getTitle() override
|
std::string getTitle() override
|
||||||
|
@ -592,6 +629,9 @@ public:
|
||||||
throw Error("'nix profile' no longer supports indices ('%d')", *n);
|
throw Error("'nix profile' no longer supports indices ('%d')", *n);
|
||||||
} else if (getStore()->isStorePath(arg)) {
|
} else if (getStore()->isStorePath(arg)) {
|
||||||
_matchers.push_back(make_ref<StorePathMatcher>(getStore()->parseStorePath(arg)));
|
_matchers.push_back(make_ref<StorePathMatcher>(getStore()->parseStorePath(arg)));
|
||||||
|
} else if (std::regex_match(arg, std::regex(".*[#:].*"))) {
|
||||||
|
auto pair = parseFlakeRefWithFragment(arg);
|
||||||
|
_matchers.push_back(make_ref<InstallableMatcher>(pair.first, pair.second));
|
||||||
} else {
|
} else {
|
||||||
_matchers.push_back(make_ref<NameMatcher>(arg));
|
_matchers.push_back(make_ref<NameMatcher>(arg));
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,9 +110,28 @@ warning: No packages to upgrade. Use 'nix profile list' to see the current profi
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Test removing all packages using regular expression.
|
# Test removing all packages using regular expression.
|
||||||
nix profile remove --regex '.*' 2>&1 | grep "removed 2 packages, kept 0 packages"
|
assertStderr nix --offline profile remove --regex '.*' << EOF
|
||||||
|
removing 'path:$flake1Dir#packages.$system.default'
|
||||||
|
removing 'foo'
|
||||||
|
removed 2 packages, kept 0 packages
|
||||||
|
EOF
|
||||||
nix profile rollback
|
nix profile rollback
|
||||||
|
|
||||||
|
# Test removing package using full url.
|
||||||
|
nix profile remove "path:$flake1Dir#packages.$system.default"
|
||||||
|
[[ ! -f $TEST_HOME/.nix-profile/bin/hello ]]
|
||||||
|
nix profile install $flake1Dir
|
||||||
|
|
||||||
|
# Test removing package using shorthand flake url.
|
||||||
|
nix profile remove path:$flake1Dir
|
||||||
|
[[ ! -f $TEST_HOME/.nix-profile/bin/hello ]]
|
||||||
|
nix profile install $flake1Dir
|
||||||
|
|
||||||
|
# Test removing package using shorthand package name.
|
||||||
|
nix profile remove path:$flake1Dir#default
|
||||||
|
[[ ! -f $TEST_HOME/.nix-profile/bin/hello ]]
|
||||||
|
nix profile install $flake1Dir
|
||||||
|
|
||||||
# Test 'history', 'diff-closures'.
|
# Test 'history', 'diff-closures'.
|
||||||
nix profile diff-closures
|
nix profile diff-closures
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue