aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 &) {