From dfa5a732bab2bf4c50c6b193cb49cd3a67aef720 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Mon, 10 Mar 2025 12:16:31 +0100 Subject: Display packages installed from a repository --- cli/main.cpp | 166 +++++------------------------------------------------------ 1 file changed, 12 insertions(+), 154 deletions(-) (limited to 'cli/main.cpp') diff --git a/cli/main.cpp b/cli/main.cpp index 614a274..c417b83 100644 --- a/cli/main.cpp +++ b/cli/main.cpp @@ -1,171 +1,29 @@ #include #include -#include -#include -#include -#include -#include "katja/database.hpp" - -bool trim_info_line(std::string& info_value) -{ - if (boost::algorithm::ends_with(info_value, "\"")) - { - info_value.pop_back(); - return false; - } - else if (boost::algorithm::ends_with(info_value, "\\")) - { - info_value.pop_back(); - return true; - } - return false; -} - -struct info_file -{ - const std::string program_name; - const std::string version; - const std::string homepage; - const std::string email; - const std::string maintainer; - - info_file(const std::string& program_name, const std::string& version, - const std::string homepage, const std::string& email, const std::string& maintainer) - : program_name(program_name), version(version), homepage(homepage), email(email), maintainer(maintainer) - { - } -}; - -std::optional read_slackbuild_info(const std::filesystem::path& info_filepath) -{ - std::ifstream info_stream{ info_filepath }; - std::string info_line, info_variable, info_value; - std::string program_name, version, homepage, email, maintainer; - std::vector download, md5sum, download_x86_64, md5sum_x86_64, requires; - bool continuation{ false }; - - while (std::getline(info_stream, info_line)) - { - if (info_line.empty()) - { - continue; - } - else if (!continuation) - { - auto equals_position = std::find(info_line.cbegin(), info_line.cend(), '='); - info_variable = std::string(info_line.cbegin(), equals_position); - - if (equals_position == info_line.cend() - || ++equals_position == info_line.cend() || *equals_position != '"') - { - return std::nullopt; - } - info_value = std::string(std::next(equals_position), info_line.cend()); - } - else - { - info_value += info_line; - } - continuation = trim_info_line(info_value); - - if (!continuation) - { - if (info_variable == "PRGNAM") - { - std::swap(program_name, info_value); - } - else if (info_variable == "VERSION") - { - std::swap(version, info_value); - } - else if (info_variable == "HOMEPAGE") - { - std::swap(homepage, info_value); - } - else if (info_variable == "EMAIL") - { - std::swap(email, info_value); - } - else if (info_variable == "MAINTAINER") - { - std::swap(maintainer, info_value); - } - else if (info_variable == "DOWNLOAD") - { - boost::split(download, info_value, boost::is_any_of(" "), boost::token_compress_on); - } - else if (info_variable == "MD5SUM") - { - boost::split(md5sum, info_value, boost::is_any_of(" "), boost::token_compress_on); - } - else if (info_variable == "DOWNLOAD_x86_64") - { - boost::split(download_x86_64, info_value, boost::is_any_of(" "), boost::token_compress_on); - } - else if (info_variable == "MD5SUM_x86_64") - { - boost::split(md5sum_x86_64, info_value, boost::is_any_of(" "), boost::token_compress_on); - } - else if (info_variable == "REQUIRES") - { - boost::split(requires, info_value, boost::is_any_of(" "), boost::token_compress_on); - } - } - } - return std::make_optional(program_name, version, homepage, email, maintainer); -} - -void search_for_slackbuilds(std::vector& info_files, const std::filesystem::path& directory) -{ - for (const auto& entry : std::filesystem::directory_iterator(directory)) - { - std::filesystem::path entry_path = entry; - std::filesystem::path info_filename = entry_path; - info_filename.replace_extension(".info"); - - std::filesystem::path info_filepath = entry_path / info_filename; - if (std::filesystem::exists(info_filepath)) - { - auto slackbuild_info = read_slackbuild_info(info_filepath); - - if (slackbuild_info.has_value()) - { - info_files.emplace_back(std::move(slackbuild_info.value())); - } - else - { - std::cout << info_filepath << std::endl; - } - } - else if (std::filesystem::is_directory(entry_path)) - { - search_for_slackbuilds(info_files, entry_path); - } - } -} +#include "katja/sbo.hpp" +#include "katja/database.hpp" int main(int argc, const char **argv) { - std::vector info_files; + std::vector info_files; + std::multimap installed_database = katja::read_installed_database(); if (argc > 1) { std::filesystem::path slackbuild_repository{ argv[1] }; - search_for_slackbuilds(info_files, slackbuild_repository); + katja::search_for_slackbuilds(info_files, slackbuild_repository); for (const auto& slackbuild_info : info_files) { - std::cout << slackbuild_info.program_name << " " << slackbuild_info.version << " " << std::endl; - } - } - else - { - for (const auto& entry : std::filesystem::directory_iterator(katja::database)) - { - katja::database_package database_entry{ entry.path().filename() }; + std::multimap::const_iterator installed_package = + installed_database.find(slackbuild_info.program_name); - std::cout << database_entry.to_string() << std::endl; + if (installed_package != installed_database.cend()) + { + std::cout << slackbuild_info.program_name << " " << slackbuild_info.version + << " (installed " << installed_package->second.version << ")" << std::endl; + } } } return 0; -- cgit v1.2.3