aboutsummaryrefslogtreecommitdiff
path: root/src/nix
diff options
context:
space:
mode:
authorQyriad <qyriad@qyriad.me>2024-05-01 19:55:26 -0600
committerQyriad <qyriad@qyriad.me>2024-05-02 12:59:15 -0600
commite0911eef73e36d5b42ebd2e9fa114d535ab287f7 (patch)
tree23d258d39e0b08590d162c142aead5d204718587 /src/nix
parentce70f02aff058c6438119e9946122f86431151f1 (diff)
nix3-profile: make element names stable
Based off of commit 6268a45b650f563bae2360e0540920a2959bdd40 Upstream-PR: https://github.com/NixOS/nix/pull/9656 Co-authored-by: Eelco Dolstra <edolstra@gmail.com> Change-Id: I0fcf069a8537c61ad6fc4eee1f3c193a708ea1c4
Diffstat (limited to 'src/nix')
-rw-r--r--src/nix/profile.cc38
-rw-r--r--src/nix/upgrade-nix.cc8
2 files changed, 26 insertions, 20 deletions
diff --git a/src/nix/profile.cc b/src/nix/profile.cc
index 131abb258..401d5bd77 100644
--- a/src/nix/profile.cc
+++ b/src/nix/profile.cc
@@ -105,7 +105,7 @@ struct CmdProfileInstall : InstallablesCommand, MixDefaultProfile
element.updateStorePaths(getEvalStore(), store, res);
- manifest.elements.push_back(std::move(element));
+ manifest.addElement(std::move(element));
}
try {
@@ -115,7 +115,7 @@ struct CmdProfileInstall : InstallablesCommand, MixDefaultProfile
// See https://github.com/NixOS/nix/compare/3efa476c5439f8f6c1968a6ba20a31d1239c2f04..1fe5d172ece51a619e879c4b86f603d9495cc102
auto findRefByFilePath = [&]<typename Iterator>(Iterator begin, Iterator end) {
for (auto it = begin; it != end; it++) {
- auto profileElement = *it;
+ auto & profileElement = it->second;
for (auto & storePath : profileElement.storePaths) {
if (conflictError.fileA.starts_with(store->printStorePath(storePath))) {
return std::pair(conflictError.fileA, profileElement.toInstallables(*store));
@@ -202,13 +202,19 @@ public:
return res;
}
- bool matches(const Store & store, const ProfileElement & element, const std::vector<Matcher> & matchers)
+ bool matches(
+ Store const & store,
+ // regex_match doesn't take a string_view lol
+ std::string const & name,
+ ProfileElement const & element,
+ std::vector<Matcher> const & matchers
+ )
{
for (auto & matcher : matchers) {
if (auto path = std::get_if<Path>(&matcher)) {
if (element.storePaths.count(store.parseStorePath(*path))) return true;
} else if (auto regex = std::get_if<RegexPattern>(&matcher)) {
- if (std::regex_match(element.name, regex->reg)) {
+ if (std::regex_match(name, regex->reg)) {
return true;
}
}
@@ -240,10 +246,9 @@ struct CmdProfileRemove : virtual EvalCommand, MixDefaultProfile, MixProfileElem
ProfileManifest newManifest;
- for (size_t i = 0; i < oldManifest.elements.size(); ++i) {
- auto & element(oldManifest.elements[i]);
- if (!matches(*store, element, matchers)) {
- newManifest.elements.push_back(std::move(element));
+ for (auto & [name, element] : oldManifest.elements) {
+ if (!matches(*store, name, element, matchers)) {
+ newManifest.elements.insert_or_assign(name, std::move(element));
} else {
notice("removing '%s'", element.identifier());
}
@@ -289,14 +294,13 @@ struct CmdProfileUpgrade : virtual SourceExprCommand, MixDefaultProfile, MixProf
auto matchers = getMatchers(store);
Installables installables;
- std::vector<size_t> indices;
+ std::vector<ProfileElement *> elems;
auto matchedCount = 0;
auto upgradedCount = 0;
- for (size_t i = 0; i < manifest.elements.size(); ++i) {
- auto & element(manifest.elements[i]);
- if (!matches(*store, element, matchers)) {
+ for (auto & [name, element] : manifest.elements) {
+ if (!matches(*store, name, element, matchers)) {
continue;
}
@@ -368,7 +372,7 @@ struct CmdProfileUpgrade : virtual SourceExprCommand, MixDefaultProfile, MixProf
};
installables.push_back(installable);
- indices.push_back(i);
+ elems.push_back(&element);
}
@@ -393,7 +397,7 @@ struct CmdProfileUpgrade : virtual SourceExprCommand, MixDefaultProfile, MixProf
for (size_t i = 0; i < installables.size(); ++i) {
auto & installable = installables.at(i);
- auto & element = manifest.elements[indices.at(i)];
+ auto & element = *elems.at(i);
element.updateStorePaths(
getEvalStore(),
store,
@@ -425,14 +429,14 @@ struct CmdProfileList : virtual EvalCommand, virtual StoreCommand, MixDefaultPro
if (json) {
std::cout << manifest.toJSON(*store).dump() << "\n";
} else {
- for (size_t i = 0; i < manifest.elements.size(); ++i) {
- auto & element(manifest.elements[i]);
+ for (auto const & [i, nameElemPair] : enumerate(manifest.elements)) {
+ auto & [name, element] = nameElemPair;
if (i) {
logger->cout("");
}
logger->cout(
"Name: " ANSI_BOLD "%s" ANSI_NORMAL "%s",
- element.name,
+ name,
element.active ? "" : " " ANSI_RED "(inactive)" ANSI_NORMAL
);
if (element.source) {
diff --git a/src/nix/upgrade-nix.cc b/src/nix/upgrade-nix.cc
index 31a051246..ca8080f88 100644
--- a/src/nix/upgrade-nix.cc
+++ b/src/nix/upgrade-nix.cc
@@ -208,7 +208,8 @@ struct CmdUpgradeNix : MixDryRun, EvalCommand
// Find which profile element has Nix in it.
// It should be impossible to *not* have Nix, since we grabbed this
// store path by looking for things with bin/nix-env in them anyway.
- auto findNix = [&](ProfileElement const & elem) -> bool {
+ auto findNix = [&](std::pair<std::string, ProfileElement> const & nameElemPair) -> bool {
+ auto const & [name, elem] = nameElemPair;
for (auto const & ePath : elem.storePaths) {
auto const nixEnv = store->printStorePath(ePath) + "/bin/nix-env";
if (pathExists(nixEnv)) {
@@ -226,14 +227,15 @@ struct CmdUpgradeNix : MixDryRun, EvalCommand
// *Should* be impossible...
assert(elemWithNix != std::end(manifest.elements));
+ auto const nixElemName = elemWithNix->first;
+
// Now create a new profile element for the new Nix version...
ProfileElement elemForNewNix = {
.storePaths = {newNix},
};
// ...and splork it into the manifest where the old profile element was.
- // (Remember, elemWithNix is an iterator)
- *elemWithNix = elemForNewNix;
+ manifest.elements.at(nixElemName) = elemForNewNix;
// Build the new profile, and switch to it.
StorePath const newProfile = manifest.build(store);