👷 cache information about partition scheme

This commit is contained in:
Vladislav Nepogodin 2024-07-27 03:27:01 +04:00
parent 1ca45defa7
commit c322aba3ff
No known key found for this signature in database
GPG Key ID: B62C3D10C54D5DA9
2 changed files with 29 additions and 19 deletions

View File

@ -28,6 +28,7 @@
#include <fmt/ranges.h>
using namespace ftxui;
using namespace std::string_literals;
using namespace std::string_view_literals;
namespace {
@ -156,6 +157,8 @@ auto make_partitions_prepared(std::string_view bootloader, std::string_view root
if (ready_parts.empty()) { spdlog::error("Invalid use! ready parts empty."); return false; }
/* clang-format on */
const auto& mountpoint_info = std::get<std::string>(config_data["MOUNTPOINT"]);
std::vector<gucc::fs::Partition> partitions{};
std::string root_part{};
@ -178,6 +181,10 @@ auto make_partitions_prepared(std::string_view bootloader, std::string_view root
utils::get_cryptroot();
utils::get_cryptboot();
spdlog::info("boot partition: name={}", part_name);
// TODO(vnepogodin): handle boot partition mount options
auto part_struct = gucc::fs::Partition{.fstype = part_fs, .mountpoint = part_mountpoint, .device = part_name, .mount_opts = "defaults"s};
partitions.emplace_back(std::move(part_struct));
continue;
} else if (part_type == "root"sv) {
config_data["PARTITION"] = part_name;
@ -192,7 +199,8 @@ auto make_partitions_prepared(std::string_view bootloader, std::string_view root
// If the root partition is btrfs, offer to create subvolumes
if (root_fs == "btrfs"sv) {
// Check if there are subvolumes already on the btrfs partition
const auto& subvolumes = fmt::format(FMT_COMPILE("btrfs subvolume list \"{}\" 2>/dev/null"), part_mountpoint);
const auto& mount_dir = fmt::format(FMT_COMPILE("{}{}"), mountpoint_info, part_mountpoint);
const auto& subvolumes = fmt::format(FMT_COMPILE("btrfs subvolume list \"{}\" 2>/dev/null"), mount_dir);
const auto& subvolumes_count = gucc::utils::exec(fmt::format(FMT_COMPILE("{} | wc -l"), subvolumes));
const auto& lines_count = utils::to_int(subvolumes_count);
@ -214,6 +222,9 @@ auto make_partitions_prepared(std::string_view bootloader, std::string_view root
utils::select_filesystem(part_fs);
tui::mount_current_partition(true);
auto part_struct = gucc::fs::Partition{.fstype = part_fs, .mountpoint = part_mountpoint, .device = part_name, .mount_opts = std::string{mount_opts_info}};
partitions.emplace_back(std::move(part_struct));
// Determine if a separate /boot is used.
// 0 = no separate boot,
// 1 = separate non-lvm boot,

View File

@ -86,7 +86,7 @@ bool exit_done() noexcept {
return true;
}
void btrfs_subvolumes() noexcept {
void btrfs_subvolumes(std::vector<gucc::fs::Partition>& partitions) noexcept {
const std::vector<std::string> menu_entries = {
"automatic",
"manual",
@ -105,16 +105,6 @@ void btrfs_subvolumes() noexcept {
if (btrfsvols_mode.empty()) { return; }
/* clang-format on */
auto* config_instance = Config::instance();
auto& config_data = config_instance->data();
const auto& mount_opts_info = std::get<std::string>(config_data["MOUNT_OPTS"]);
const auto& root_part = std::get<std::string>(config_data["ROOT_PART"]);
std::vector<gucc::fs::Partition> partitions{
gucc::fs::Partition{.fstype = "btrfs"s, .mountpoint = "/"s, .device = root_part, .mount_opts = mount_opts_info},
};
utils::btrfs_create_subvols(partitions, btrfsvols_mode);
}
@ -1730,10 +1720,10 @@ void mount_partitions() noexcept {
auto screen = ScreenInteractive::Fullscreen();
std::int32_t selected{};
bool success{};
const auto& partitions = std::get<std::vector<std::string>>(config_data["PARTITIONS"]);
const auto& partitions_lines = std::get<std::vector<std::string>>(config_data["PARTITIONS"]);
auto ok_callback = [&] {
const auto& src = partitions[static_cast<std::size_t>(selected)];
const auto& src = partitions_lines[static_cast<std::size_t>(selected)];
const auto& lines = gucc::utils::make_multiline(src, false, ' ');
config_data["PARTITION"] = lines[0];
config_data["ROOT_PART"] = lines[0];
@ -1742,7 +1732,7 @@ void mount_partitions() noexcept {
};
/* clang-format off */
static constexpr auto sel_root_body = "\nSelect ROOT Partition.\nThis is where CachyOS will be installed.\n"sv;
detail::menu_widget(partitions, ok_callback, &selected, &screen, sel_root_body, {.text_size = size(HEIGHT, GREATER_THAN, 1)});
detail::menu_widget(partitions_lines, ok_callback, &selected, &screen, sel_root_body, {.text_size = size(HEIGHT, GREATER_THAN, 1)});
if (!success) { return; }
/* clang-format on */
}
@ -1791,7 +1781,7 @@ void mount_partitions() noexcept {
const auto& create_subvolumes = detail::yesno_widget("\nWould you like to create subvolumes in it? \n", size(HEIGHT, LESS_THAN, 15) | size(WIDTH, LESS_THAN, 75));
/* clang-format on */
if (create_subvolumes) {
tui::btrfs_subvolumes();
tui::btrfs_subvolumes(partitions);
}
/* clang-format on */
}
@ -1825,10 +1815,10 @@ void mount_partitions() noexcept {
const auto& partition = std::get<std::string>(config_data["PARTITION"]);
while (number_partitions > 0) {
{
const auto& partitions = std::get<std::vector<std::string>>(config_data["PARTITIONS"]);
const auto& partitions_lines = std::get<std::vector<std::string>>(config_data["PARTITIONS"]);
std::vector<std::string> temp{"Done -"};
temp.reserve(partitions.size());
std::copy(partitions.begin(), partitions.end(), std::back_inserter(temp));
temp.reserve(partitions_lines.size());
std::copy(partitions_lines.begin(), partitions_lines.end(), std::back_inserter(temp));
auto screen = ScreenInteractive::Fullscreen();
std::int32_t selected{};
@ -1883,6 +1873,15 @@ void mount_partitions() noexcept {
tui::mount_current_partition();
// utils::delete_partition_in_list(partition);
// TODO(vnepogodin): parse luks information
const auto& mount_opts_info = std::get<std::string>(config_data["MOUNT_OPTS"]);
const auto& part_fs = gucc::fs::utils::get_mountpoint_fs(mountpoint_info);
auto part_struct = gucc::fs::Partition{.fstype = part_fs, .mountpoint = mount_dev, .device = partition, .mount_opts = mount_opts_info};
// insert root partition
partitions.emplace_back(std::move(part_struct));
// Determine if a separate /boot is used.
// 0 = no separate boot,
// 1 = separate non-lvm boot,