forked from lix-project/lix
Add "nix profile upgrade" command
This commit is contained in:
parent
e30a0155d4
commit
af786432c5
|
@ -239,7 +239,7 @@ struct CmdProfileRemove : virtual StoreCommand, MixDefaultProfile, MixProfileEle
|
||||||
"nix profile remove packages.x86_64-linux.hello"
|
"nix profile remove packages.x86_64-linux.hello"
|
||||||
},
|
},
|
||||||
Example{
|
Example{
|
||||||
"To remove all package:",
|
"To remove all packages:",
|
||||||
"nix profile remove '.*'"
|
"nix profile remove '.*'"
|
||||||
},
|
},
|
||||||
Example{
|
Example{
|
||||||
|
@ -277,6 +277,71 @@ struct CmdProfileRemove : virtual StoreCommand, MixDefaultProfile, MixProfileEle
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct CmdProfileUpgrade : virtual SourceExprCommand, MixDefaultProfile, MixProfileElementMatchers
|
||||||
|
{
|
||||||
|
std::string description() override
|
||||||
|
{
|
||||||
|
return "upgrade packages using their most recent flake";
|
||||||
|
}
|
||||||
|
|
||||||
|
Examples examples() override
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
Example{
|
||||||
|
"To upgrade all packages that were installed using a mutable flake reference:",
|
||||||
|
"nix profile upgrade '.*'"
|
||||||
|
},
|
||||||
|
Example{
|
||||||
|
"To upgrade a specific package:",
|
||||||
|
"nix profile upgrade packages.x86_64-linux.hello"
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void run(ref<Store> store) override
|
||||||
|
{
|
||||||
|
ProfileManifest manifest(*profile);
|
||||||
|
|
||||||
|
auto matchers = getMatchers(store);
|
||||||
|
|
||||||
|
// FIXME: code duplication
|
||||||
|
PathSet pathsToBuild;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < manifest.elements.size(); ++i) {
|
||||||
|
auto & element(manifest.elements[i]);
|
||||||
|
if (element.source
|
||||||
|
&& !element.source->originalRef.isImmutable()
|
||||||
|
&& matches(element, i, matchers))
|
||||||
|
{
|
||||||
|
Activity act(*logger, lvlChatty, actUnknown,
|
||||||
|
fmt("checking '%s' for updates", element.source->attrPath));
|
||||||
|
|
||||||
|
InstallableFlake installable(*this, FlakeRef(element.source->originalRef), {element.source->attrPath});
|
||||||
|
|
||||||
|
auto [attrPath, resolvedRef, drv] = installable.toDerivation();
|
||||||
|
|
||||||
|
if (element.source->resolvedRef == resolvedRef) continue;
|
||||||
|
|
||||||
|
printInfo("upgrading '%s' from flake '%s' to '%s'",
|
||||||
|
element.source->attrPath, element.source->resolvedRef, resolvedRef);
|
||||||
|
|
||||||
|
element.storePaths = {drv.outPath}; // FIXME
|
||||||
|
element.source = ProfileElementSource{
|
||||||
|
installable.flakeRef,
|
||||||
|
resolvedRef,
|
||||||
|
attrPath,
|
||||||
|
};
|
||||||
|
|
||||||
|
pathsToBuild.insert(makeDrvPathWithOutputs(drv.drvPath, {"out"})); // FIXME
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
store->buildPaths(pathsToBuild);
|
||||||
|
|
||||||
|
updateProfile(manifest.build(store));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct CmdProfileInfo : virtual StoreCommand, MixDefaultProfile
|
struct CmdProfileInfo : virtual StoreCommand, MixDefaultProfile
|
||||||
{
|
{
|
||||||
std::string description() override
|
std::string description() override
|
||||||
|
@ -314,6 +379,7 @@ struct CmdProfile : virtual MultiCommand, virtual Command
|
||||||
: MultiCommand({
|
: MultiCommand({
|
||||||
{"install", []() { return make_ref<CmdProfileInstall>(); }},
|
{"install", []() { return make_ref<CmdProfileInstall>(); }},
|
||||||
{"remove", []() { return make_ref<CmdProfileRemove>(); }},
|
{"remove", []() { return make_ref<CmdProfileRemove>(); }},
|
||||||
|
{"upgrade", []() { return make_ref<CmdProfileUpgrade>(); }},
|
||||||
{"info", []() { return make_ref<CmdProfileInfo>(); }},
|
{"info", []() { return make_ref<CmdProfileInfo>(); }},
|
||||||
})
|
})
|
||||||
{ }
|
{ }
|
||||||
|
|
Loading…
Reference in a new issue