forked from lix-project/lix
Add priority for nix profile install
This commit is contained in:
parent
54457382f9
commit
aefc6c4f41
|
@ -93,8 +93,9 @@ static void createLinks(State & state, const Path & srcDir, const Path & dstDir,
|
||||||
auto prevPriority = state.priorities[dstFile];
|
auto prevPriority = state.priorities[dstFile];
|
||||||
if (prevPriority == priority)
|
if (prevPriority == priority)
|
||||||
throw Error(
|
throw Error(
|
||||||
"packages '%1%' and '%2%' have the same priority %3%; "
|
"files '%1%' and '%2%' have the same priority %3%; "
|
||||||
"use 'nix-env --set-flag priority NUMBER INSTALLED_PKGNAME' "
|
"use 'nix-env --set-flag priority NUMBER INSTALLED_PKGNAME' "
|
||||||
|
"or 'nix profile --priority NUMBER INSTALLED_PKGNAME' "
|
||||||
"to change the priority of one of the conflicting packages"
|
"to change the priority of one of the conflicting packages"
|
||||||
" (0 being the highest priority)",
|
" (0 being the highest priority)",
|
||||||
srcFile, readLink(dstFile), priority);
|
srcFile, readLink(dstFile), priority);
|
||||||
|
|
|
@ -37,7 +37,7 @@ struct ProfileElement
|
||||||
StorePathSet storePaths;
|
StorePathSet storePaths;
|
||||||
std::optional<ProfileElementSource> source;
|
std::optional<ProfileElementSource> source;
|
||||||
bool active = true;
|
bool active = true;
|
||||||
// FIXME: priority
|
int priority = 5;
|
||||||
|
|
||||||
std::string describe() const
|
std::string describe() const
|
||||||
{
|
{
|
||||||
|
@ -116,6 +116,9 @@ struct ProfileManifest
|
||||||
for (auto & p : e["storePaths"])
|
for (auto & p : e["storePaths"])
|
||||||
element.storePaths.insert(state.store->parseStorePath((std::string) p));
|
element.storePaths.insert(state.store->parseStorePath((std::string) p));
|
||||||
element.active = e["active"];
|
element.active = e["active"];
|
||||||
|
if(e.contains("priority")) {
|
||||||
|
element.priority = e["priority"];
|
||||||
|
}
|
||||||
if (e.value(sUrl, "") != "") {
|
if (e.value(sUrl, "") != "") {
|
||||||
element.source = ProfileElementSource {
|
element.source = ProfileElementSource {
|
||||||
parseFlakeRef(e[sOriginalUrl]),
|
parseFlakeRef(e[sOriginalUrl]),
|
||||||
|
@ -153,6 +156,7 @@ struct ProfileManifest
|
||||||
nlohmann::json obj;
|
nlohmann::json obj;
|
||||||
obj["storePaths"] = paths;
|
obj["storePaths"] = paths;
|
||||||
obj["active"] = element.active;
|
obj["active"] = element.active;
|
||||||
|
obj["priority"] = element.priority;
|
||||||
if (element.source) {
|
if (element.source) {
|
||||||
obj["originalUrl"] = element.source->originalRef.to_string();
|
obj["originalUrl"] = element.source->originalRef.to_string();
|
||||||
obj["url"] = element.source->resolvedRef.to_string();
|
obj["url"] = element.source->resolvedRef.to_string();
|
||||||
|
@ -177,7 +181,7 @@ struct ProfileManifest
|
||||||
for (auto & element : elements) {
|
for (auto & element : elements) {
|
||||||
for (auto & path : element.storePaths) {
|
for (auto & path : element.storePaths) {
|
||||||
if (element.active)
|
if (element.active)
|
||||||
pkgs.emplace_back(store->printStorePath(path), true, 5);
|
pkgs.emplace_back(store->printStorePath(path), true, element.priority);
|
||||||
references.insert(path);
|
references.insert(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -259,6 +263,23 @@ builtPathsPerInstallable(
|
||||||
|
|
||||||
struct CmdProfileInstall : InstallablesCommand, MixDefaultProfile
|
struct CmdProfileInstall : InstallablesCommand, MixDefaultProfile
|
||||||
{
|
{
|
||||||
|
std::optional<int> priority;
|
||||||
|
CmdProfileInstall() {
|
||||||
|
addFlag({
|
||||||
|
.longName = "priority",
|
||||||
|
.description = "The priority of the package to install.",
|
||||||
|
.labels = {"priority"},
|
||||||
|
.handler = {[&](std::string s) {
|
||||||
|
try{
|
||||||
|
priority = std::stoi(s);
|
||||||
|
} catch (std::invalid_argument & e) {
|
||||||
|
throw ParseError("invalid priority '%s'", s);
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
// .completer = // no completer since number
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
std::string description() override
|
std::string description() override
|
||||||
{
|
{
|
||||||
return "install a package into a profile";
|
return "install a package into a profile";
|
||||||
|
@ -282,6 +303,10 @@ struct CmdProfileInstall : InstallablesCommand, MixDefaultProfile
|
||||||
for (auto & installable : installables) {
|
for (auto & installable : installables) {
|
||||||
ProfileElement element;
|
ProfileElement element;
|
||||||
|
|
||||||
|
if(priority) {
|
||||||
|
element.priority = *priority;
|
||||||
|
};
|
||||||
|
|
||||||
if (auto installable2 = std::dynamic_pointer_cast<InstallableFlake>(installable)) {
|
if (auto installable2 = std::dynamic_pointer_cast<InstallableFlake>(installable)) {
|
||||||
// FIXME: make build() return this?
|
// FIXME: make build() return this?
|
||||||
auto [attrPath, resolvedRef, drv] = installable2->toDerivation();
|
auto [attrPath, resolvedRef, drv] = installable2->toDerivation();
|
||||||
|
|
|
@ -120,3 +120,19 @@ nix profile install "$flake1Dir^man"
|
||||||
(! [ -e $TEST_HOME/.nix-profile/bin/hello ])
|
(! [ -e $TEST_HOME/.nix-profile/bin/hello ])
|
||||||
[ -e $TEST_HOME/.nix-profile/share/man ]
|
[ -e $TEST_HOME/.nix-profile/share/man ]
|
||||||
(! [ -e $TEST_HOME/.nix-profile/include ])
|
(! [ -e $TEST_HOME/.nix-profile/include ])
|
||||||
|
|
||||||
|
# test priority
|
||||||
|
nix profile remove 0
|
||||||
|
|
||||||
|
# Make another flake.
|
||||||
|
flake2Dir=$TEST_ROOT/flake2
|
||||||
|
printf World > $flake1Dir/who
|
||||||
|
cp -r $flake1Dir $flake2Dir
|
||||||
|
printf World2 > $flake2Dir/who
|
||||||
|
|
||||||
|
nix profile install $flake1Dir
|
||||||
|
[[ $($TEST_HOME/.nix-profile/bin/hello) = "Hello World" ]]
|
||||||
|
nix profile install $flake2Dir --priority 100
|
||||||
|
[[ $($TEST_HOME/.nix-profile/bin/hello) = "Hello World" ]]
|
||||||
|
nix profile install $flake2Dir --priority 0
|
||||||
|
[[ $($TEST_HOME/.nix-profile/bin/hello) = "Hello World2" ]]
|
||||||
|
|
Loading…
Reference in a new issue