diff options
author | Qyriad <qyriad@qyriad.me> | 2024-04-27 13:24:39 -0600 |
---|---|---|
committer | Qyriad <qyriad@qyriad.me> | 2024-04-29 01:19:21 +0000 |
commit | 2bd57d4d36f66de00fa4f791569056e58598e782 (patch) | |
tree | cf8e49b9f2a3c03068c13baa0ef7c43cfae344f6 /src/libcmd/cmd-profiles.hh | |
parent | da677fce395fa86dbd5e8b5e3c0bef1712f9c3f1 (diff) |
refactor some nix-env and profile code to libcmd
Notably, ProfileManifest and ProfileElement are useful generic
profile management code, and nix profile is not the only place in the
codebase where profiles are relevant.
This commit is in preparation for fixing upgrade-nix's interaction with
new-style profiles.
Change-Id: Iefc8bbd34b4bc6012175cb3d6e6a8207973bc792
Diffstat (limited to 'src/libcmd/cmd-profiles.hh')
-rw-r--r-- | src/libcmd/cmd-profiles.hh | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/libcmd/cmd-profiles.hh b/src/libcmd/cmd-profiles.hh new file mode 100644 index 000000000..d03f9b1c2 --- /dev/null +++ b/src/libcmd/cmd-profiles.hh @@ -0,0 +1,73 @@ +#pragma once +///@file + +#include "built-path.hh" +#include "eval.hh" +#include "flake/flakeref.hh" +#include "get-drvs.hh" +#include "types.hh" + +#include <string> +#include <set> + +#include <nlohmann/json.hpp> + +namespace nix +{ + +struct ProfileElementSource +{ + FlakeRef originalRef; + // FIXME: record original attrpath. + FlakeRef lockedRef; + std::string attrPath; + ExtendedOutputsSpec outputs; + + bool operator<(const ProfileElementSource & other) const; + + std::string to_string() const; +}; + +constexpr int DEFAULT_PRIORITY = 5; + +struct ProfileElement +{ + StorePathSet storePaths; + std::optional<ProfileElementSource> source; + bool active = true; + int priority = DEFAULT_PRIORITY; + + std::string identifier() const; + + /** + * Return a string representing an installable corresponding to the current + * element, either a flakeref or a plain store path + */ + std::set<std::string> toInstallables(Store & store); + + std::string versions() const; + + bool operator<(const ProfileElement & other) const; + + void updateStorePaths(ref<Store> evalStore, ref<Store> store, const BuiltPaths & builtPaths); +}; + +struct ProfileManifest +{ + std::vector<ProfileElement> elements; + + ProfileManifest() { } + + ProfileManifest(EvalState & state, const Path & profile); + + nlohmann::json toJSON(Store & store) const; + + StorePath build(ref<Store> store); + + static void printDiff(const ProfileManifest & prev, const ProfileManifest & cur, std::string_view indent); +}; + +DrvInfos queryInstalled(EvalState & state, const Path & userEnv); +std::string showVersions(const std::set<std::string> & versions); + +} |