From 37b65c093949ede515cec14e7b09aa1c83206d8c Mon Sep 17 00:00:00 2001 From: "David J. Allen" Date: Sun, 2 Jul 2023 08:39:10 -0600 Subject: [PATCH] Added section to `README.md` and minor fixes --- README.md | 13 ++++++++++ include/config.hpp | 2 +- include/types.hpp | 2 +- include/utils.hpp | 1 + src/config.cpp | 57 +++++++++++++++++++++-------------------- src/package_manager.cpp | 44 +++++++++++++++++++++++-------- src/utils.cpp | 4 +++ 7 files changed, 83 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 0851fee..a499aa4 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ GDPM is an attempt to make a simple, front-end, command-line, package manager de - [Linking and Cloning](#linking-and-cloning) - [Cleaning Temporary Files](#cleaning-temporary-files) - [Managing Remote Sources](#managing-remote-sources) + - [Managing Configuration Properties](#managing-configuration-properties) - [Planned Features](#planned-features) - [Known Issues](#known-issues) - [License](#license) @@ -308,6 +309,18 @@ ln -s path/to/build/gdpm path/to/bin/gdpm export PATH=$PATH:path/to/bin/gdpm ``` +### Managing Configuration Properties + +Configuration properties can be viewed and set using the `gdpm config` command. + +```bash +gdpm config get # shows all config properties +gdpm config get --style=table # shows all config properties in table +gdpm config get skip-prompt jobs # shows config properties listed +gdpm config set timeout 30 # set config property value +gdpm config set username towk +``` + ## Planned Features * [ ] Godot 4 Asset Library compatibility. diff --git a/include/config.hpp b/include/config.hpp index d0fee1e..b4df76b 100644 --- a/include/config.hpp +++ b/include/config.hpp @@ -48,7 +48,7 @@ namespace gdpm::config{ error load(std::filesystem::path path, context& config); error save(std::filesystem::path path, const context& config); error handle_config(config::context& config, const args_t& args, const var_opts& opts); - error set_property(config::context& config, const string& property, const any& value); + error set_property(config::context& config, const string& property, const string& value); template T& get_property(const config::context& config, const string& property); context make_context(const string& username = GDPM_CONFIG_USERNAME, const string& password = GDPM_CONFIG_PASSWORD, const string& path = GDPM_CONFIG_PATH, const string& token = GDPM_CONFIG_TOKEN, const string& godot_version = GDPM_CONFIG_GODOT_VERSION, const string& packages_dir = GDPM_CONFIG_LOCAL_PACKAGES_DIR, const string& tmp_dir = GDPM_CONFIG_LOCAL_TMP_DIR, const string_map& remote_sources = {GDPM_CONFIG_REMOTE_SOURCES}, int jobs = GDPM_CONFIG_THREADS, int timeout = 0, bool enable_sync = GDPM_CONFIG_ENABLE_SYNC, bool enable_file_logging = GDPM_CONFIG_ENABLE_FILE_LOGGING, int verbose = GDPM_CONFIG_VERBOSE); diff --git a/include/types.hpp b/include/types.hpp index 9a5014e..7345a57 100644 --- a/include/types.hpp +++ b/include/types.hpp @@ -1,6 +1,5 @@ #pragma once -#include "clipp.h" #include #include #include @@ -77,6 +76,7 @@ namespace gdpm{ return sl; } + inline opts_t unwrap(const var_opts& opts){ opts_t o; std::for_each(opts.begin(), opts.end(), [&o](const var_opt& opt){ diff --git a/include/utils.hpp b/include/utils.hpp index 417a47f..aa46221 100644 --- a/include/utils.hpp +++ b/include/utils.hpp @@ -72,6 +72,7 @@ namespace gdpm::utils { from.erase(part); } + bool to_bool(const std::string& s); std::vector split_lines(const std::string& contents); std::string readfile(const std::string& path); std::string to_lower(const std::string& s); diff --git a/src/config.cpp b/src/config.cpp index 3854b53..8672905 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -232,32 +232,33 @@ namespace gdpm::config{ return error(); } + error set_property( config::context& config, const string& property, - const any& value + const string& value ){ - log::println("config::set_property() called"); - if(property == "username") config.username = std::any_cast(value); - else if(property == "password") config.password = std::any_cast(value); - else if(property == "path") config.path = std::any_cast(value); - else if(property == "token") config.token = std::any_cast(value); - else if(property == "packages_dir") config.packages_dir = std::any_cast(value); - else if(property == "tmp_dir") config.tmp_dir = std::any_cast(value); - else if(property == "remote_sources") config.remote_sources = std::any_cast(value); - else if(property == "jobs") config.jobs = std::any_cast(value); - else if(property == "timeout") config.timeout = std::any_cast(value); - else if(property == "enable_sync") config.enable_sync = std::any_cast(value); - else if(property == "enable_cache") config.enable_cache = std::any_cast(value); - else if(property == "skip_prompt") config.skip_prompt = std::any_cast(value); - else if(property == "enable_file_logging") config.enable_file_logging = std::any_cast(value); - else if(property == "clean_temporary") config.clean_temporary = std::any_cast(value); + if(property == "username") config.username = value; + else if(property == "password") config.password = value; + else if(property == "path") config.path = value; + else if(property == "token") config.token = value; + else if(property == "packages-dir") config.packages_dir = value; + else if(property == "tmp-dir") config.tmp_dir = value; + else if(property == "remote-sources") log::println("use 'gpdm remote' to manage remotes"); + else if(property == "jobs") config.jobs = std::stoi(value); + else if(property == "timeout") config.timeout = std::stoi(value); + else if(property == "enable-sync") config.enable_sync = utils::to_bool(value); + else if(property == "enable-cache") config.enable_cache = utils::to_bool(value); + else if(property == "skip-prompt") config.skip_prompt = utils::to_bool(value); + else if(property == "enable-file-logging") config.enable_file_logging = utils::to_bool(value); + else if(property == "clean-temporary") config.clean_temporary = utils::to_bool(value); else{ return log::error_rc(error( constants::error::INVALID_CONFIG, "Could not find property" )); } + return error(); } template @@ -342,14 +343,14 @@ namespace gdpm::config{ else if(property == "password") log::println("password: {}", config.password); else if(property == "path") log::println("path: {}", config.path); else if(property == "token") log::println("token: {}", config.token); - else if(property == "packages_dir") log::println("package directory: {}", config.packages_dir); - else if(property == "tmp_dir") log::println("temporary directory: {}", config.tmp_dir); - else if(property == "remote_sources") log::println("remote sources: \n{}", utils::join(config.remote_sources, "\t", "\n")); + else if(property == "packages-dir") log::println("package directory: {}", config.packages_dir); + else if(property == "tmp-dir") log::println("temporary directory: {}", config.tmp_dir); + else if(property == "remote-sources") log::println("remote sources: \n{}", utils::join(config.remote_sources, "\t", "\n")); else if(property == "jobs") log::println("parallel jobs: {}", config.jobs); else if(property == "timeout") log::println("timeout: {}", config.timeout); else if(property == "sync") log::println("enable sync: {}", config.enable_sync); else if(property == "cache") log::println("enable cache: {}", config.enable_cache); - else if(property == "prompt") log::println("skip prompt: {}", config.skip_prompt); + else if(property == "skip-prompt") log::println("skip prompt: {}", config.skip_prompt); else if(property == "logging") log::println("enable file logging: {}", config.enable_file_logging); else if(property == "clean") log::println("clean temporary files: {}", config.clean_temporary); else if(property == "verbose") log::println("verbose: {}", config.verbose); @@ -366,14 +367,14 @@ namespace gdpm::config{ else if(property == "password") table.add_row({"Password", config.password}); else if(property == "path") table.add_row({"Path", config.path}); else if(property == "token") table.add_row({"Token", config.token}); - else if(property == "packages_dir") table.add_row({"Package Directory", config.packages_dir}); - else if(property == "tmp_dir") table.add_row({"Temp Directory", config.tmp_dir}); - else if(property == "remote_sources") table.add_row({"Remotes", utils::join(config.remote_sources, "\t", "\n")}); + else if(property == "packages-dir") table.add_row({"Package Directory", config.packages_dir}); + else if(property == "tmp-dir") table.add_row({"Temp Directory", config.tmp_dir}); + else if(property == "remote-sources") table.add_row({"Remotes", utils::join(config.remote_sources, "\t", "\n")}); else if(property == "jobs") table.add_row({"Threads", std::to_string(config.jobs)}); else if(property == "timeout") table.add_row({"Timeout", std::to_string(config.timeout)}); else if(property == "sync") table.add_row({"Fetch Assets", std::to_string(config.enable_sync)}); else if(property == "cache") table.add_row({"Cache", std::to_string(config.enable_cache)}); - else if(property == "prompt") table.add_row({"Skip Prompt", std::to_string(config.skip_prompt)}); + else if(property == "skip-prompt") table.add_row({"Skip Prompt", std::to_string(config.skip_prompt)}); else if(property == "logging") table.add_row({"File Logging", std::to_string(config.enable_file_logging)}); else if(property == "clean") table.add_row({"Clean Temporary", std::to_string(config.clean_temporary)}); else if(property == "verbose") table.add_row({"Verbosity", std::to_string(config.verbose)}); @@ -391,9 +392,9 @@ namespace gdpm::config{ _print_property(config, "password"); _print_property(config, "path"); _print_property(config, "token"); - _print_property(config, "packages_dir"); - _print_property(config, "tmp_dir"); - _print_property(config, "remote_sources"); + _print_property(config, "packages-dir"); + _print_property(config, "tmp-dir"); + _print_property(config, "remote-sources"); _print_property(config, "jobs"); _print_property(config, "timeout"); _print_property(config, "sync"); @@ -415,8 +416,8 @@ namespace gdpm::config{ } else if(config.style == config::print_style::table){ Table table; + table.add_row({"Property", "Value"}); if(properties.empty()){ - table.add_row({"Property", "Value"}); table.add_row({"Username", config.username}); table.add_row({"Password", config.password}); table.add_row({"Path", config.path}); diff --git a/src/package_manager.cpp b/src/package_manager.cpp index 020d3aa..0acd35c 100644 --- a/src/package_manager.cpp +++ b/src/package_manager.cpp @@ -93,7 +93,7 @@ namespace gdpm::package_manager{ } }; - string_list get_packages_from_parser( + string_list get_values_from_parser( const argparse::ArgumentParser& cmd, const std::string& arg = "packages" ){ @@ -313,10 +313,17 @@ namespace gdpm::package_manager{ .help("remote to fetch") .nargs(nargs_pattern::any); + config_get.add_description("get config properties"); config_get.add_argument("properties") .help("get config properties") .nargs(nargs_pattern::any); - config_get.add_description("get config properties"); + config_get.add_argument("--style") + .help("set how to print output") + .nargs(1) + .default_value("list"); + + + config_set.add_description("set config property"); config_set.add_argument("property") .help("property name") .required() @@ -325,11 +332,14 @@ namespace gdpm::package_manager{ .help("property value") .required() .nargs(1); - config_set.add_description("set config property"); config_command.add_description("manage config properties"); config_command.add_subparser(config_get); config_command.add_subparser(config_set); + config_command.add_argument("--style") + .help("set how to print output") + .nargs(1) + .default_value("list"); remote_add.add_argument("name") .help("remote name") @@ -394,7 +404,7 @@ namespace gdpm::package_manager{ } else if(program.is_subcommand_used(add_command)){ action = action_e::add; - package_titles = get_packages_from_parser(add_command); + package_titles = get_values_from_parser(add_command); set_if_used(add_command, params.remote_source, "remote"); set_if_used(add_command, config.jobs, "jobs"); set_if_used(add_command, config.skip_prompt, "skip-prompt"); @@ -402,21 +412,21 @@ namespace gdpm::package_manager{ } else if(program.is_subcommand_used(remove_command)){ action = action_e::remove; - package_titles = get_packages_from_parser(remove_command); + package_titles = get_values_from_parser(remove_command); set_if_used(remove_command, config.clean_temporary, "clean"); set_if_used(remove_command, config.skip_prompt, "skip-prompt"); set_if_used(remove_command, params.input_files, "file"); } else if(program.is_subcommand_used(update_command)){ action = action_e::update; - package_titles = get_packages_from_parser(update_command); + package_titles = get_values_from_parser(update_command); set_if_used(update_command, config.clean_temporary, "clean"); set_if_used(update_command, params.remote_source, "remote"); set_if_used(update_command, params.input_files, "file"); } else if(program.is_subcommand_used(search_command)){ action = action_e::search; - package_titles = get_packages_from_parser(search_command); + package_titles = get_values_from_parser(search_command); set_if_used(search_command, config.rest_api_params.godot_version, "godot-version"); set_if_used(search_command, params.remote_source, "remote"); set_if_used(search_command, params.input_files, "file"); @@ -439,7 +449,7 @@ namespace gdpm::package_manager{ } else if(program.is_subcommand_used(link_command)){ action = action_e::link; - package_titles = get_packages_from_parser(link_command); + package_titles = get_values_from_parser(link_command); set_if_used(link_command, params.paths, "path"); if(link_command.is_used("file")){ params.input_files = link_command.get("file"); @@ -450,7 +460,7 @@ namespace gdpm::package_manager{ } else if(program.is_subcommand_used(clone_command)){ action = action_e::clone; - package_titles = get_packages_from_parser(clone_command); + package_titles = get_values_from_parser(clone_command); set_if_used(clone_command, params.paths, "path"); if(clone_command.is_used("file")){ params.input_files = clone_command.get("file"); @@ -461,13 +471,27 @@ namespace gdpm::package_manager{ } else if(program.is_subcommand_used(clean_command)){ action = action_e::clean; - package_titles = get_packages_from_parser(clean_command); + package_titles = get_values_from_parser(clean_command); } else if(program.is_subcommand_used(config_command)){ + if(config_command.is_used("style")){ + string style = config_command.get("style"); + if(!style.compare("list")) + config.style = config::print_style::list; + else if(!style.compare("table")) + config.style = config::print_style::table; + } if(config_command.is_subcommand_used(config_get)){ action = action_e::config_get; if(config_get.is_used("properties")) params.args = config_get.get("properties"); + if(config_get.is_used("style")){ + string style = config_get.get("style"); + if(!style.compare("list")) + config.style = config::print_style::list; + else if(!style.compare("table")) + config.style = config::print_style::table; + } } else if(config_command.is_subcommand_used(config_set)){ action = action_e::config_set; diff --git a/src/utils.cpp b/src/utils.cpp index 5941056..b1a5759 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -57,6 +57,10 @@ namespace gdpm::utils{ option::FontStyles{std::vector{FontStyle::bold}}, }; + bool to_bool(const std::string& s){ + return to_lower(s) == "true"; + } + std::vector split_lines(const std::string& contents){ using namespace csv2; csv2::Reader<