nixos/grub: Add submenu for each generation with specialisation

Before this commit there was no way to access (boot into) specialisation of previous generations from grub,even tho they are there.

This commit will add grub submenu for each generation if the generation has any specialisation.
Which will allow you to boot into them.

Co-authored-by: Samuel Dionne-Riel <samuel@dionne-riel.com>

Changed files
+37 -22
nixos
modules
system
boot
loader
+37 -22
nixos/modules/system/boot/loader/grub/install-grub.pl
···
$conf .= "}\n\n";
}
+
sub addGeneration {
+
my ($name, $nameSuffix, $path, $options, $current) = @_;
-
# Add default entries.
-
$conf .= "$extraEntries\n" if $extraEntriesBeforeNixOS;
+
# Do not search for grand children
+
my @links = sort (glob "$path/specialisation/*");
-
addEntry("@distroName@ - Default", $defaultConfig, $entryOptions, 1);
+
if ($current != 1 && scalar(@links) != 0) {
+
$conf .= "submenu \"> $name$nameSuffix\" --class submenu {\n";
+
}
-
$conf .= "$extraEntries\n" unless $extraEntriesBeforeNixOS;
+
addEntry("$name" . (scalar(@links) == 0 ? "" : " - Default") . $nameSuffix, $path, $options, $current);
-
# Find all the children of the current default configuration
-
# Do not search for grand children
-
my @links = sort (glob "$defaultConfig/specialisation/*");
-
foreach my $link (@links) {
+
# Find all the children of the current default configuration
+
# Do not search for grand children
+
foreach my $link (@links) {
-
my $entryName = "";
+
my $entryName = "";
+
+
my $cfgName = readFile("$link/configuration-name");
-
my $cfgName = readFile("$link/configuration-name");
+
my $date = strftime("%F", localtime(lstat($link)->mtime));
+
my $version =
+
-e "$link/nixos-version"
+
? readFile("$link/nixos-version")
+
: basename((glob(dirname(Cwd::abs_path("$link/kernel")) . "/lib/modules/*"))[0]);
-
my $date = strftime("%F", localtime(lstat($link)->mtime));
-
my $version =
-
-e "$link/nixos-version"
-
? readFile("$link/nixos-version")
-
: basename((glob(dirname(Cwd::abs_path("$link/kernel")) . "/lib/modules/*"))[0]);
+
if ($cfgName) {
+
$entryName = $cfgName;
+
} else {
+
my $linkname = basename($link);
+
$entryName = "($linkname - $date - $version)";
+
}
+
addEntry("$name - $entryName", $link, "", 1);
+
}
-
if ($cfgName) {
-
$entryName = $cfgName;
-
} else {
-
my $linkname = basename($link);
-
$entryName = "($linkname - $date - $version)";
+
if ($current != 1 && scalar(@links) != 0) {
+
$conf .= "}\n";
}
-
addEntry("@distroName@ - $entryName", $link, "", 1);
}
+
+
# Add default entries.
+
$conf .= "$extraEntries\n" if $extraEntriesBeforeNixOS;
+
+
addGeneration("@distroName@", "", $defaultConfig, $entryOptions, 1);
+
+
$conf .= "$extraEntries\n" unless $extraEntriesBeforeNixOS;
my $grubBootPath = $grubBoot->path;
# extraEntries could refer to @bootRoot@, which we have to substitute
···
-e "$link/nixos-version"
? readFile("$link/nixos-version")
: basename((glob(dirname(Cwd::abs_path("$link/kernel")) . "/lib/modules/*"))[0]);
-
addEntry("@distroName@ - Configuration " . nrFromGen($link) . " ($date - $version)", $link, $subEntryOptions, 0);
+
addGeneration("@distroName@ - Configuration " . nrFromGen($link), " ($date - $version)", $link, $subEntryOptions, 0);
}
$conf .= "}\n";