diff --git a/src/simple_tui.cpp b/src/simple_tui.cpp index a75d47e..0b04cf2 100644 --- a/src/simple_tui.cpp +++ b/src/simple_tui.cpp @@ -28,6 +28,7 @@ #include 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(config_data["MOUNTPOINT"]); + std::vector 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, diff --git a/src/tui.cpp b/src/tui.cpp index acb5f49..a29da08 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -86,7 +86,7 @@ bool exit_done() noexcept { return true; } -void btrfs_subvolumes() noexcept { +void btrfs_subvolumes(std::vector& partitions) noexcept { const std::vector 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(config_data["MOUNT_OPTS"]); - const auto& root_part = std::get(config_data["ROOT_PART"]); - - std::vector 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>(config_data["PARTITIONS"]); + const auto& partitions_lines = std::get>(config_data["PARTITIONS"]); auto ok_callback = [&] { - const auto& src = partitions[static_cast(selected)]; + const auto& src = partitions_lines[static_cast(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(config_data["PARTITION"]); while (number_partitions > 0) { { - const auto& partitions = std::get>(config_data["PARTITIONS"]); + const auto& partitions_lines = std::get>(config_data["PARTITIONS"]); std::vector 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(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,