aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/profiles.cc
diff options
context:
space:
mode:
authorThéophane Hufschmitt <theophane.hufschmitt@tweag.io>2022-04-13 10:26:50 +0200
committerThéophane Hufschmitt <theophane.hufschmitt@tweag.io>2023-01-17 14:17:28 +0100
commit0601050755ba39f52fdd2a0fc0478baaf9b1c7b9 (patch)
treee92ab59a99e77eaaedae46e839bc0aac0edc05d6 /src/libstore/profiles.cc
parenta5919f4754be6f4a9fe091e0ee5538ad85af0050 (diff)
Migrate the old profiles to the new location
Make sure that we don’t just create the new profiles directory, but that we also migrate every existing profile to it.
Diffstat (limited to 'src/libstore/profiles.cc')
-rw-r--r--src/libstore/profiles.cc28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/libstore/profiles.cc b/src/libstore/profiles.cc
index 29ce13b8d..d185a898c 100644
--- a/src/libstore/profiles.cc
+++ b/src/libstore/profiles.cc
@@ -293,17 +293,29 @@ Path getDefaultProfile()
Path profileLink = getHome() + "/.nix-profile";
try {
// Migrate from the “old-style” profiles stored under `/nix/var`:
- // If the link exists and points to the old location, rewrite it to the
- // new one (otherwise keep-it as-it-is as it might have been
- // intentionnally changed, in which case we shouldn’t touch it)
+ // If the link exists and points to the old location, then:
+ // - Rewrite it to point to the new location
+ // - For every generation of the old default profile, create a symlink
+ // from the new directory to it (so that all the previous profiles
+ // and generations are still available).
auto legacyProfile = getuid() == 0
? settings.nixStateDir + "/profiles/default"
: fmt("%s/profiles/per-user/%s/profile", settings.nixStateDir, getUserName());
- if (!pathExists(profileLink) ||
- (isLink(profileLink) &&
- readLink(profileLink) == legacyProfile)
- ) {
- replaceSymlink(profilesDir() + "/profile", profileLink);
+ auto newProfile = profilesDir() + "/profile";
+ if (!pathExists(profileLink)
+ || (isLink(profileLink)
+ && readLink(profileLink) == legacyProfile)) {
+ warn("Migrating the default profile");
+ replaceSymlink(newProfile, profileLink);
+ replaceSymlink(legacyProfile, newProfile);
+ if (pathExists(legacyProfile)) {
+ for (auto & oldGen : findGenerations(legacyProfile).first) {
+ replaceSymlink(
+ oldGen.path,
+ dirOf(newProfile) + "/"
+ + std::string(baseNameOf(oldGen.path)));
+ }
+ }
}
return absPath(readLink(profileLink), dirOf(profileLink));
} catch (Error &) {