| "version": "0.1.0-alpha.4", | "version": "0.1.0-alpha.4", | ||||
| "namespace": "dds", | "namespace": "dds", | ||||
| "depends": { | "depends": { | ||||
| "spdlog": "1.4.2", | |||||
| "spdlog": "1.7.0", | |||||
| "ms-wil": "2020.3.16", | "ms-wil": "2020.3.16", | ||||
| "range-v3": "0.10.0", | "range-v3": "0.10.0", | ||||
| "nlohmann-json": "3.7.1", | "nlohmann-json": "3.7.1", | ||||
| "vob-json5": "0.1.5", | "vob-json5": "0.1.5", | ||||
| "vob-semester": "0.2.1", | "vob-semester": "0.2.1", | ||||
| "ctre": "2.8.1", | "ctre": "2.8.1", | ||||
| "fmt": "^7.0.0" | |||||
| }, | }, | ||||
| "test_driver": "Catch-Main" | "test_driver": "Catch-Main" | ||||
| } | } |
| #include <dds/source/dist.hpp> | #include <dds/source/dist.hpp> | ||||
| #include <dds/toolchain/from_json.hpp> | #include <dds/toolchain/from_json.hpp> | ||||
| #include <dds/util/fs.hpp> | #include <dds/util/fs.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <dds/util/paths.hpp> | #include <dds/util/paths.hpp> | ||||
| #include <dds/util/signal.hpp> | #include <dds/util/signal.hpp> | ||||
| #include <range/v3/view/concat.hpp> | #include <range/v3/view/concat.hpp> | ||||
| #include <range/v3/view/group_by.hpp> | #include <range/v3/view/group_by.hpp> | ||||
| #include <range/v3/view/transform.hpp> | #include <range/v3/view/transform.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <dds/3rd/args.hxx> | #include <dds/3rd/args.hxx> | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <filesystem> | #include <filesystem> | ||||
| #include <iostream> | #include <iostream> | ||||
| auto tsd = dds::get_package_sdist(*info); | auto tsd = dds::get_package_sdist(*info); | ||||
| auto out_path = out.Get(); | auto out_path = out.Get(); | ||||
| auto dest = out_path / id.to_string(); | auto dest = out_path / id.to_string(); | ||||
| spdlog::info("Create sdist at {}", dest.string()); | |||||
| dds::log::info("Create sdist at {}", dest.string()); | |||||
| dds::fs::remove_all(dest); | dds::fs::remove_all(dest); | ||||
| dds::safe_rename(tsd.sdist.path, dest); | dds::safe_rename(tsd.sdist.path, dest); | ||||
| } | } | ||||
| auto cat = cat_path.open(); | auto cat = cat_path.open(); | ||||
| auto pkg = cat.get(pk_id); | auto pkg = cat.get(pk_id); | ||||
| if (!pkg) { | if (!pkg) { | ||||
| spdlog::error("No package '{}' in the catalog", pk_id.to_string()); | |||||
| dds::log::error("No package '{}' in the catalog", pk_id.to_string()); | |||||
| return 1; | return 1; | ||||
| } | } | ||||
| std::cout << "Name: " << pkg->ident.name << '\n' | std::cout << "Name: " << pkg->ident.name << '\n' | ||||
| }); | }); | ||||
| for (const auto& [name, grp] : grp_by_name) { | for (const auto& [name, grp] : grp_by_name) { | ||||
| spdlog::info("{}:", name); | |||||
| dds::log::info("{}:", name); | |||||
| for (const dds::sdist& sd : grp) { | for (const dds::sdist& sd : grp) { | ||||
| spdlog::info(" - {}", sd.manifest.pkg_id.version.to_string()); | |||||
| dds::log::info(" - {}", sd.manifest.pkg_id.version.to_string()); | |||||
| } | } | ||||
| } | } | ||||
| auto all_file_deps = deps_files.Get() // | auto all_file_deps = deps_files.Get() // | ||||
| | ranges::views::transform([&](auto dep_fpath) { | | ranges::views::transform([&](auto dep_fpath) { | ||||
| spdlog::info("Reading deps from {}", dep_fpath.string()); | |||||
| dds::log::info("Reading deps from {}", dep_fpath.string()); | |||||
| return dds::dependency_manifest::from_file(dep_fpath).dependencies; | return dds::dependency_manifest::from_file(dep_fpath).dependencies; | ||||
| }) | }) | ||||
| | ranges::actions::join; | | ranges::actions::join; | ||||
| dds::repo_flags::write_lock | dds::repo_flags::create_if_absent, | dds::repo_flags::write_lock | dds::repo_flags::create_if_absent, | ||||
| [&](dds::repository repo) { | [&](dds::repository repo) { | ||||
| // Download dependencies | // Download dependencies | ||||
| spdlog::info("Loading {} dependencies", all_deps.size()); | |||||
| dds::log::info("Loading {} dependencies", all_deps.size()); | |||||
| auto deps = repo.solve(all_deps, cat); | auto deps = repo.solve(all_deps, cat); | ||||
| dds::get_all(deps, repo, cat); | dds::get_all(deps, repo, cat); | ||||
| for (const dds::package_id& pk : deps) { | for (const dds::package_id& pk : deps) { | ||||
| assert(sdist_ptr); | assert(sdist_ptr); | ||||
| dds::sdist_build_params deps_params; | dds::sdist_build_params deps_params; | ||||
| deps_params.subdir = sdist_ptr->manifest.pkg_id.to_string(); | deps_params.subdir = sdist_ptr->manifest.pkg_id.to_string(); | ||||
| spdlog::info("Dependency: {}", sdist_ptr->manifest.pkg_id.to_string()); | |||||
| dds::log::info("Dependency: {}", sdist_ptr->manifest.pkg_id.to_string()); | |||||
| bd.add(*sdist_ptr, deps_params); | bd.add(*sdist_ptr, deps_params); | ||||
| } | } | ||||
| }); | }); | ||||
| int main(int argc, char** argv) { | int main(int argc, char** argv) { | ||||
| #if DDS_DEBUG | #if DDS_DEBUG | ||||
| spdlog::set_level(spdlog::level::debug); | |||||
| dds::log::current_log_level = dds::log::level::debug; | |||||
| #endif | #endif | ||||
| spdlog::set_pattern("[%H:%M:%S] [%^%-5l%$] %v"); | spdlog::set_pattern("[%H:%M:%S] [%^%-5l%$] %v"); | ||||
| args::ArgumentParser parser("DDS - The drop-dead-simple library manager"); | args::ArgumentParser parser("DDS - The drop-dead-simple library manager"); | ||||
| std::terminate(); | std::terminate(); | ||||
| } | } | ||||
| } catch (const dds::user_cancelled&) { | } catch (const dds::user_cancelled&) { | ||||
| spdlog::critical("Operation cancelled by user"); | |||||
| dds::log::critical("Operation cancelled by user"); | |||||
| return 2; | return 2; | ||||
| } catch (const dds::error_base& e) { | } catch (const dds::error_base& e) { | ||||
| spdlog::error("{}", e.what()); | |||||
| spdlog::error("{}", e.explanation()); | |||||
| spdlog::error("Refer: {}", e.error_reference()); | |||||
| dds::log::error("{}", e.what()); | |||||
| dds::log::error("{}", e.explanation()); | |||||
| dds::log::error("Refer: {}", e.error_reference()); | |||||
| return 1; | return 1; | ||||
| } catch (const std::exception& e) { | } catch (const std::exception& e) { | ||||
| spdlog::critical(e.what()); | |||||
| dds::log::critical(e.what()); | |||||
| return 2; | return 2; | ||||
| } | } | ||||
| } | } |
| #include <dds/compdb.hpp> | #include <dds/compdb.hpp> | ||||
| #include <dds/error/errors.hpp> | #include <dds/error/errors.hpp> | ||||
| #include <dds/usage_reqs.hpp> | #include <dds/usage_reqs.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <dds/util/output.hpp> | #include <dds/util/output.hpp> | ||||
| #include <dds/util/time.hpp> | #include <dds/util/time.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <array> | #include <array> | ||||
| #include <set> | #include <set> | ||||
| }; | }; | ||||
| void log_failure(const test_failure& fail) { | void log_failure(const test_failure& fail) { | ||||
| spdlog::error("Test '{}' failed! [exited {}]", fail.executable_path.string(), fail.retc); | |||||
| log::error("Test '{}' failed! [exited {}]", fail.executable_path.string(), fail.retc); | |||||
| if (fail.signal) { | if (fail.signal) { | ||||
| spdlog::error("Test execution received signal {}", fail.signal); | |||||
| log::error("Test execution received signal {}", fail.signal); | |||||
| } | } | ||||
| if (trim_view(fail.output).empty()) { | if (trim_view(fail.output).empty()) { | ||||
| spdlog::error("(Test executable produced no output"); | |||||
| log::error("(Test executable produced no output"); | |||||
| } else { | } else { | ||||
| spdlog::error("Test output:\n{}[dds - test output end]", fail.output); | |||||
| log::error("Test output:\n{}[dds - test output end]", fail.output); | |||||
| } | } | ||||
| } | } | ||||
| auto obj_file = plan.calc_object_file_path(env2); | auto obj_file = plan.calc_object_file_path(env2); | ||||
| if (!fs::exists(obj_file)) { | if (!fs::exists(obj_file)) { | ||||
| spdlog::info("Compiling Catch2 test driver (This will only happen once)..."); | |||||
| log::info("Compiling Catch2 test driver (This will only happen once)..."); | |||||
| compile_all(std::array{plan}, env2, 1); | compile_all(std::array{plan}, env2, 1); | ||||
| } | } | ||||
| dds::stopwatch sw; | dds::stopwatch sw; | ||||
| plan.compile_all(env, params.parallel_jobs); | plan.compile_all(env, params.parallel_jobs); | ||||
| spdlog::info("Compilation completed in {:n}ms", sw.elapsed_ms().count()); | |||||
| log::info("Compilation completed in {:n}ms", sw.elapsed_ms().count()); | |||||
| sw.reset(); | sw.reset(); | ||||
| plan.archive_all(env, params.parallel_jobs); | plan.archive_all(env, params.parallel_jobs); | ||||
| spdlog::info("Archiving completed in {:n}ms", sw.elapsed_ms().count()); | |||||
| log::info("Archiving completed in {:n}ms", sw.elapsed_ms().count()); | |||||
| sw.reset(); | sw.reset(); | ||||
| plan.link_all(env, params.parallel_jobs); | plan.link_all(env, params.parallel_jobs); | ||||
| spdlog::info("Runtime binary linking completed in {:n}ms", sw.elapsed_ms().count()); | |||||
| log::info("Runtime binary linking completed in {:n}ms", sw.elapsed_ms().count()); | |||||
| sw.reset(); | sw.reset(); | ||||
| auto test_failures = plan.run_all_tests(env, params.parallel_jobs); | auto test_failures = plan.run_all_tests(env, params.parallel_jobs); | ||||
| spdlog::info("Test execution finished in {:n}ms", sw.elapsed_ms().count()); | |||||
| log::info("Test execution finished in {:n}ms", sw.elapsed_ms().count()); | |||||
| for (auto& fail : test_failures) { | for (auto& fail : test_failures) { | ||||
| log_failure(fail); | log_failure(fail); |
| #include <dds/db/database.hpp> | #include <dds/db/database.hpp> | ||||
| #include <dds/proc.hpp> | #include <dds/proc.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <dds/util/shlex.hpp> | #include <dds/util/shlex.hpp> | ||||
| #include <dds/util/string.hpp> | #include <dds/util/string.hpp> | ||||
| #include <range/v3/view/filter.hpp> | #include <range/v3/view/filter.hpp> | ||||
| #include <range/v3/view/transform.hpp> | #include <range/v3/view/transform.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| using namespace dds; | using namespace dds; | ||||
| auto iter = split.begin(); | auto iter = split.begin(); | ||||
| auto stop = split.end(); | auto stop = split.end(); | ||||
| if (iter == stop) { | if (iter == stop) { | ||||
| spdlog::critical( | |||||
| log::critical( | |||||
| "Invalid deps listing. Shell split was empty. This is almost certainly a bug."); | "Invalid deps listing. Shell split was empty. This is almost certainly a bug."); | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| auto& head = *iter; | auto& head = *iter; | ||||
| ++iter; | ++iter; | ||||
| if (!ends_with(head, ":")) { | if (!ends_with(head, ":")) { | ||||
| spdlog::critical( | |||||
| log::critical( | |||||
| "Invalid deps listing. Leader item is not colon-terminated. This is probably a bug. " | "Invalid deps listing. Leader item is not colon-terminated. This is probably a bug. " | ||||
| "(Are you trying to use C++ Modules? That's not ready yet, sorry. Set `Deps-Mode` to " | "(Are you trying to use C++ Modules? That's not ready yet, sorry. Set `Deps-Mode` to " | ||||
| "`None` in your toolchain file.)"); | "`None` in your toolchain file.)"); |
| #include <dds/error/errors.hpp> | #include <dds/error/errors.hpp> | ||||
| #include <dds/proc.hpp> | #include <dds/proc.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <dds/util/time.hpp> | #include <dds/util/time.hpp> | ||||
| #include <range/v3/view/transform.hpp> | #include <range/v3/view/transform.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| using namespace dds; | using namespace dds; | ||||
| fs::create_directories(ar.out_path.parent_path()); | fs::create_directories(ar.out_path.parent_path()); | ||||
| // Do it! | // Do it! | ||||
| spdlog::info("[{}] Archive: {}", _qual_name, out_relpath); | |||||
| log::info("[{}] Archive: {}", _qual_name, out_relpath); | |||||
| auto&& [dur_ms, ar_res] = timed<std::chrono::milliseconds>([&] { return run_proc(ar_cmd); }); | auto&& [dur_ms, ar_res] = timed<std::chrono::milliseconds>([&] { return run_proc(ar_cmd); }); | ||||
| spdlog::info("[{}] Archive: {} - {:n}ms", _qual_name, out_relpath, dur_ms.count()); | |||||
| log::info("[{}] Archive: {} - {:n}ms", _qual_name, out_relpath, dur_ms.count()); | |||||
| // Check, log, and throw | // Check, log, and throw | ||||
| if (!ar_res.okay()) { | if (!ar_res.okay()) { | ||||
| spdlog::error("Creating static library archive [{}] failed for '{}'", | |||||
| out_relpath, | |||||
| _qual_name); | |||||
| spdlog::error("Subcommand FAILED: {}\n{}", quote_command(ar_cmd), ar_res.output); | |||||
| log::error("Creating static library archive [{}] failed for '{}'", out_relpath, _qual_name); | |||||
| log::error("Subcommand FAILED: {}\n{}", quote_command(ar_cmd), ar_res.output); | |||||
| throw_external_error< | throw_external_error< | ||||
| errc::archive_failure>("Creating static library archive [{}] failed for '{}'", | errc::archive_failure>("Creating static library archive [{}] failed for '{}'", | ||||
| out_relpath, | out_relpath, |
| #include <dds/build/file_deps.hpp> | #include <dds/build/file_deps.hpp> | ||||
| #include <dds/error/errors.hpp> | #include <dds/error/errors.hpp> | ||||
| #include <dds/proc.hpp> | #include <dds/proc.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <dds/util/parallel.hpp> | #include <dds/util/parallel.hpp> | ||||
| #include <dds/util/string.hpp> | #include <dds/util/string.hpp> | ||||
| #include <dds/util/time.hpp> | #include <dds/util/time.hpp> | ||||
| #include <range/v3/view/filter.hpp> | #include <range/v3/view/filter.hpp> | ||||
| #include <range/v3/view/transform.hpp> | #include <range/v3/view/transform.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <algorithm> | #include <algorithm> | ||||
| #include <atomic> | #include <atomic> | ||||
| fs::relative(source_path, cf.plan.source().basis_path).string()); | fs::relative(source_path, cf.plan.source().basis_path).string()); | ||||
| // Do it! | // Do it! | ||||
| spdlog::info(msg); | |||||
| log::info(msg); | |||||
| auto&& [dur_ms, proc_res] | auto&& [dur_ms, proc_res] | ||||
| = timed<std::chrono::milliseconds>([&] { return run_proc(cf.cmd_info.command); }); | = timed<std::chrono::milliseconds>([&] { return run_proc(cf.cmd_info.command); }); | ||||
| auto nth = counter.n.fetch_add(1); | auto nth = counter.n.fetch_add(1); | ||||
| spdlog::info("{:60} - {:>7n}ms [{:{}}/{}]", | |||||
| msg, | |||||
| dur_ms.count(), | |||||
| nth, | |||||
| counter.max_digits, | |||||
| counter.max); | |||||
| log::info("{:60} - {:>7n}ms [{:{}}/{}]", | |||||
| msg, | |||||
| dur_ms.count(), | |||||
| nth, | |||||
| counter.max_digits, | |||||
| counter.max); | |||||
| const bool compiled_okay = proc_res.okay(); | const bool compiled_okay = proc_res.okay(); | ||||
| const auto compile_retc = proc_res.retc; | const auto compile_retc = proc_res.retc; | ||||
| assert(cf.cmd_info.gnu_depfile_path.has_value()); | assert(cf.cmd_info.gnu_depfile_path.has_value()); | ||||
| auto& df_path = *cf.cmd_info.gnu_depfile_path; | auto& df_path = *cf.cmd_info.gnu_depfile_path; | ||||
| if (!fs::is_regular_file(df_path)) { | if (!fs::is_regular_file(df_path)) { | ||||
| spdlog::critical( | |||||
| log::critical( | |||||
| "The expected Makefile deps were not generated on disk. This is a bug! " | "The expected Makefile deps were not generated on disk. This is a bug! " | ||||
| "(Expected file to exist: [{}])", | "(Expected file to exist: [{}])", | ||||
| df_path.string()); | df_path.string()); | ||||
| // Log a compiler failure | // Log a compiler failure | ||||
| if (!compiled_okay) { | if (!compiled_okay) { | ||||
| spdlog::error("Compilation failed: {}", source_path.string()); | |||||
| spdlog::error("Subcommand FAILED [Exitted {}]: {}\n{}", | |||||
| compile_retc, | |||||
| quote_command(cf.cmd_info.command), | |||||
| compiler_output); | |||||
| log::error("Compilation failed: {}", source_path.string()); | |||||
| log::error("Subcommand FAILED [Exitted {}]: {}\n{}", | |||||
| compile_retc, | |||||
| quote_command(cf.cmd_info.command), | |||||
| compiler_output); | |||||
| if (compile_signal) { | if (compile_signal) { | ||||
| spdlog::error("Process exited via signal {}", compile_signal); | |||||
| log::error("Process exited via signal {}", compile_signal); | |||||
| } | } | ||||
| throw_user_error<errc::compile_failure>("Compilation failed [{}]", source_path.string()); | throw_user_error<errc::compile_failure>("Compilation failed [{}]", source_path.string()); | ||||
| } | } | ||||
| // Print any compiler output, sans whitespace | // Print any compiler output, sans whitespace | ||||
| if (!dds::trim_view(compiler_output).empty()) { | if (!dds::trim_view(compiler_output).empty()) { | ||||
| spdlog::warn("While compiling file {} [{}]:\n{}", | |||||
| source_path.string(), | |||||
| quote_command(cf.cmd_info.command), | |||||
| compiler_output); | |||||
| log::warn("While compiling file {} [{}]:\n{}", | |||||
| source_path.string(), | |||||
| quote_command(cf.cmd_info.command), | |||||
| compiler_output); | |||||
| } | } | ||||
| // We'll only get here if the compilation was successful, otherwise we throw | // We'll only get here if the compilation was successful, otherwise we throw |
| #include <dds/util/signal.hpp> | #include <dds/util/signal.hpp> | ||||
| #include <dds/util/time.hpp> | #include <dds/util/time.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <string> | #include <string> | ||||
| #include <vector> | #include <vector> | ||||
| #include <dds/error/errors.hpp> | #include <dds/error/errors.hpp> | ||||
| #include <dds/proc.hpp> | #include <dds/proc.hpp> | ||||
| #include <dds/util/algo.hpp> | #include <dds/util/algo.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <dds/util/time.hpp> | #include <dds/util/time.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <algorithm> | #include <algorithm> | ||||
| #include <chrono> | #include <chrono> | ||||
| auto msg = fmt::format("[{}] Link: {:30}", | auto msg = fmt::format("[{}] Link: {:30}", | ||||
| lib.qualified_name(), | lib.qualified_name(), | ||||
| fs::relative(spec.output, env.output_root).string()); | fs::relative(spec.output, env.output_root).string()); | ||||
| spdlog::info(msg); | |||||
| log::info(msg); | |||||
| auto [dur_ms, proc_res] | auto [dur_ms, proc_res] | ||||
| = timed<std::chrono::milliseconds>([&] { return run_proc(link_command); }); | = timed<std::chrono::milliseconds>([&] { return run_proc(link_command); }); | ||||
| spdlog::info("{} - {:>6n}ms", msg, dur_ms.count()); | |||||
| log::info("{} - {:>6n}ms", msg, dur_ms.count()); | |||||
| // Check and throw if errant | // Check and throw if errant | ||||
| if (!proc_res.okay()) { | if (!proc_res.okay()) { | ||||
| std::optional<test_failure> link_executable_plan::run_test(build_env_ref env) const { | std::optional<test_failure> link_executable_plan::run_test(build_env_ref env) const { | ||||
| auto exe_path = calc_executable_path(env); | auto exe_path = calc_executable_path(env); | ||||
| auto msg = fmt::format("Run test: {:30}", fs::relative(exe_path, env.output_root).string()); | auto msg = fmt::format("Run test: {:30}", fs::relative(exe_path, env.output_root).string()); | ||||
| spdlog::info(msg); | |||||
| log::info(msg); | |||||
| using namespace std::chrono_literals; | using namespace std::chrono_literals; | ||||
| auto&& [dur, res] = timed<std::chrono::microseconds>( | auto&& [dur, res] = timed<std::chrono::microseconds>( | ||||
| [&] { return run_proc({.command = {exe_path.string()}, .timeout = 10s}); }); | [&] { return run_proc({.command = {exe_path.string()}, .timeout = 10s}); }); | ||||
| if (res.okay()) { | if (res.okay()) { | ||||
| spdlog::info("{} - PASSED - {:>9n}μs", msg, dur.count()); | |||||
| log::info("{} - PASSED - {:>9n}μs", msg, dur.count()); | |||||
| return std::nullopt; | return std::nullopt; | ||||
| } else { | } else { | ||||
| auto exit_msg = fmt::format(res.signal ? "signalled {}" : "exited {}", | auto exit_msg = fmt::format(res.signal ? "signalled {}" : "exited {}", | ||||
| res.signal ? res.signal : res.retc); | res.signal ? res.signal : res.retc); | ||||
| auto fail_str = res.timed_out ? "TIMEOUT" : "FAILED "; | auto fail_str = res.timed_out ? "TIMEOUT" : "FAILED "; | ||||
| spdlog::error("{} - {} - {:>9n}μs [{}]", msg, fail_str, dur.count(), exit_msg); | |||||
| log::error("{} - {} - {:>9n}μs [{}]", msg, fail_str, dur.count(), exit_msg); | |||||
| test_failure f; | test_failure f; | ||||
| f.executable_path = exe_path; | f.executable_path = exe_path; | ||||
| f.output = res.output; | f.output = res.output; |
| #include <range/v3/view/transform.hpp> | #include <range/v3/view/transform.hpp> | ||||
| #include <range/v3/view/zip.hpp> | #include <range/v3/view/zip.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <mutex> | #include <mutex> | ||||
| #include <thread> | #include <thread> | ||||
| #include <dds/dym.hpp> | #include <dds/dym.hpp> | ||||
| #include <dds/error/errors.hpp> | #include <dds/error/errors.hpp> | ||||
| #include <dds/solve/solve.hpp> | #include <dds/solve/solve.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <json5/parse_data.hpp> | #include <json5/parse_data.hpp> | ||||
| #include <neo/assert.hpp> | #include <neo/assert.hpp> | ||||
| #include <range/v3/view/join.hpp> | #include <range/v3/view/join.hpp> | ||||
| #include <range/v3/view/transform.hpp> | #include <range/v3/view/transform.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| using namespace dds; | using namespace dds; | ||||
| namespace sqlite3 = neo::sqlite3; | namespace sqlite3 = neo::sqlite3; | ||||
| exec(db, "UPDATE dds_cat_meta SET meta=?", std::forward_as_tuple(meta.dump())); | exec(db, "UPDATE dds_cat_meta SET meta=?", std::forward_as_tuple(meta.dump())); | ||||
| if (import_init_packages) { | if (import_init_packages) { | ||||
| spdlog::info( | |||||
| log::info( | |||||
| "A new catalog database case been created, and has been populated with some initial " | "A new catalog database case been created, and has been populated with some initial " | ||||
| "contents."); | "contents."); | ||||
| neo::sqlite3::statement_cache stmts{db}; | neo::sqlite3::statement_cache stmts{db}; | ||||
| try { | try { | ||||
| ensure_migrated(db); | ensure_migrated(db); | ||||
| } catch (const sqlite3::sqlite3_error& e) { | } catch (const sqlite3::sqlite3_error& e) { | ||||
| spdlog::critical( | |||||
| log::critical( | |||||
| "Failed to load the repository database. It appears to be invalid/corrupted. The " | "Failed to load the repository database. It appears to be invalid/corrupted. The " | ||||
| "exception message is: {}", | "exception message is: {}", | ||||
| e.what()); | e.what()); | ||||
| void catalog::import_initial() { | void catalog::import_initial() { | ||||
| sqlite3::transaction_guard tr{_db}; | sqlite3::transaction_guard tr{_db}; | ||||
| spdlog::info("Restoring built-in initial catalog contents"); | |||||
| log::info("Restoring built-in initial catalog contents"); | |||||
| store_init_packages(_db, _stmt_cache); | store_init_packages(_db, _stmt_cache); | ||||
| } | } |
| #include <dds/catalog/catalog.hpp> | #include <dds/catalog/catalog.hpp> | ||||
| #include <dds/error/errors.hpp> | #include <dds/error/errors.hpp> | ||||
| #include <dds/repo/repo.hpp> | #include <dds/repo/repo.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <dds/util/parallel.hpp> | #include <dds/util/parallel.hpp> | ||||
| #include <neo/assert.hpp> | #include <neo/assert.hpp> | ||||
| #include <range/v3/numeric/accumulate.hpp> | #include <range/v3/numeric/accumulate.hpp> | ||||
| #include <range/v3/view/filter.hpp> | #include <range/v3/view/filter.hpp> | ||||
| #include <range/v3/view/transform.hpp> | #include <range/v3/view/transform.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| using namespace dds; | using namespace dds; | ||||
| temporary_sdist do_pull_sdist(const package_info& listing, const git_remote_listing& git) { | temporary_sdist do_pull_sdist(const package_info& listing, const git_remote_listing& git) { | ||||
| auto tmpdir = dds::temporary_dir::create(); | auto tmpdir = dds::temporary_dir::create(); | ||||
| spdlog::info("Cloning Git repository: {} [{}] ...", git.url, git.ref); | |||||
| log::info("Cloning Git repository: {} [{}] ...", git.url, git.ref); | |||||
| git.clone(tmpdir.path()); | git.clone(tmpdir.path()); | ||||
| for (const auto& tr : git.transforms) { | for (const auto& tr : git.transforms) { | ||||
| tr.apply_to(tmpdir.path()); | tr.apply_to(tmpdir.path()); | ||||
| } | } | ||||
| spdlog::info("Create sdist from clone ..."); | |||||
| log::info("Create sdist from clone ..."); | |||||
| if (git.auto_lib.has_value()) { | if (git.auto_lib.has_value()) { | ||||
| spdlog::info("Generating library data automatically"); | |||||
| log::info("Generating library data automatically"); | |||||
| auto pkg_strm | auto pkg_strm | ||||
| = dds::open(tmpdir.path() / "package.json5", std::ios::binary | std::ios::out); | = dds::open(tmpdir.path() / "package.json5", std::ios::binary | std::ios::out); | ||||
| }); | }); | ||||
| auto okay = parallel_run(absent_pkg_infos, 8, [&](package_info inf) { | auto okay = parallel_run(absent_pkg_infos, 8, [&](package_info inf) { | ||||
| spdlog::info("Download package: {}", inf.ident.to_string()); | |||||
| log::info("Download package: {}", inf.ident.to_string()); | |||||
| auto tsd = get_package_sdist(inf); | auto tsd = get_package_sdist(inf); | ||||
| std::scoped_lock lk{repo_mut}; | std::scoped_lock lk{repo_mut}; | ||||
| repo.add_sdist(tsd.sdist, if_exists::throw_exc); | repo.add_sdist(tsd.sdist, if_exists::throw_exc); |
| #include "./database.hpp" | #include "./database.hpp" | ||||
| #include <dds/error/errors.hpp> | #include <dds/error/errors.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <neo/sqlite3/exec.hpp> | #include <neo/sqlite3/exec.hpp> | ||||
| #include <neo/sqlite3/iter_tuples.hpp> | #include <neo/sqlite3/iter_tuples.hpp> | ||||
| #include <nlohmann/json.hpp> | #include <nlohmann/json.hpp> | ||||
| #include <range/v3/range/conversion.hpp> | #include <range/v3/range/conversion.hpp> | ||||
| #include <range/v3/view/transform.hpp> | #include <range/v3/view/transform.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| using namespace dds; | using namespace dds; | ||||
| try { | try { | ||||
| ensure_migrated(db); | ensure_migrated(db); | ||||
| } catch (const sqlite3::sqlite3_error& e) { | } catch (const sqlite3::sqlite3_error& e) { | ||||
| spdlog::error( | |||||
| log::error( | |||||
| "Failed to load the databsae. It appears to be invalid/corrupted. We'll delete it and " | "Failed to load the databsae. It appears to be invalid/corrupted. We'll delete it and " | ||||
| "create a new one. The exception message is: {}", | "create a new one. The exception message is: {}", | ||||
| e.what()); | e.what()); | ||||
| try { | try { | ||||
| ensure_migrated(db); | ensure_migrated(db); | ||||
| } catch (const sqlite3::sqlite3_error& e) { | } catch (const sqlite3::sqlite3_error& e) { | ||||
| spdlog::critical( | |||||
| log::critical( | |||||
| "Failed to apply database migrations to recovery database. This is a critical " | "Failed to apply database migrations to recovery database. This is a critical " | ||||
| "error. The exception message is: {}", | "error. The exception message is: {}", | ||||
| e.what()); | e.what()); |
| #include <json5/parse_data.hpp> | #include <json5/parse_data.hpp> | ||||
| #include <range/v3/view/transform.hpp> | #include <range/v3/view/transform.hpp> | ||||
| #include <semester/decomp.hpp> | #include <semester/decomp.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| using namespace dds; | using namespace dds; | ||||
| #include <dds/error/errors.hpp> | #include <dds/error/errors.hpp> | ||||
| #include <dds/source/root.hpp> | #include <dds/source/root.hpp> | ||||
| #include <dds/util/algo.hpp> | #include <dds/util/algo.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <range/v3/view/filter.hpp> | #include <range/v3/view/filter.hpp> | ||||
| #include <range/v3/view/transform.hpp> | #include <range/v3/view/transform.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| using namespace dds; | using namespace dds; | ||||
| // Drop any source files we found within `include/` | // Drop any source files we found within `include/` | ||||
| erase_if(sources, [&](auto& info) { | erase_if(sources, [&](auto& info) { | ||||
| if (info.kind != source_kind::header) { | if (info.kind != source_kind::header) { | ||||
| spdlog::warn("Source file in `include` will not be compiled: {}", | |||||
| info.path.string()); | |||||
| log::warn("Source file in `include` will not be compiled: {}", info.path.string()); | |||||
| return true; | return true; | ||||
| } | } | ||||
| return false; | return false; |
| #include <dds/dym.hpp> | #include <dds/dym.hpp> | ||||
| #include <dds/error/errors.hpp> | #include <dds/error/errors.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <dds/util/string.hpp> | #include <dds/util/string.hpp> | ||||
| #include <range/v3/view/split.hpp> | #include <range/v3/view/split.hpp> | ||||
| #include <range/v3/view/split_when.hpp> | #include <range/v3/view/split_when.hpp> | ||||
| #include <range/v3/view/transform.hpp> | #include <range/v3/view/transform.hpp> | ||||
| #include <semester/walk.hpp> | #include <semester/walk.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <json5/parse_data.hpp> | #include <json5/parse_data.hpp> | ||||
| if_key{"depends", | if_key{"depends", | ||||
| [&](auto&& dat) { | [&](auto&& dat) { | ||||
| if (dat.is_object()) { | if (dat.is_object()) { | ||||
| spdlog::warn( | |||||
| log::warn( | |||||
| "{}: Using a JSON object for 'depends' is deprecated. Use an " | "{}: Using a JSON object for 'depends' is deprecated. Use an " | ||||
| "array of strings instead.", | "array of strings instead.", | ||||
| fpath); | fpath); |
| #ifndef _WIN32 | #ifndef _WIN32 | ||||
| #include "./proc.hpp" | #include "./proc.hpp" | ||||
| #include <dds/util/log.hpp> | |||||
| #include <dds/util/signal.hpp> | #include <dds/util/signal.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <poll.h> | #include <poll.h> | ||||
| #include <signal.h> | #include <signal.h> | ||||
| #include <sys/wait.h> | #include <sys/wait.h> | ||||
| } // namespace | } // namespace | ||||
| proc_result dds::run_proc(const proc_options& opts) { | proc_result dds::run_proc(const proc_options& opts) { | ||||
| spdlog::debug("Spawning subprocess: {}", quote_command(opts.command)); | |||||
| log::debug("Spawning subprocess: {}", quote_command(opts.command)); | |||||
| int stdio_pipe[2] = {}; | int stdio_pipe[2] = {}; | ||||
| auto rc = ::pipe(stdio_pipe); | auto rc = ::pipe(stdio_pipe); | ||||
| check_rc(rc == 0, "Create stdio pipe for subprocess"); | check_rc(rc == 0, "Create stdio pipe for subprocess"); | ||||
| ::kill(child, SIGINT); | ::kill(child, SIGINT); | ||||
| timeout = -1ms; | timeout = -1ms; | ||||
| res.timed_out = true; | res.timed_out = true; | ||||
| spdlog::debug("Subprocess [{}] timed out", quote_command(opts.command)); | |||||
| log::debug("Subprocess [{}] timed out", quote_command(opts.command)); | |||||
| continue; | continue; | ||||
| } | } | ||||
| std::string buffer; | std::string buffer; |
| #include "./proc.hpp" | #include "./proc.hpp" | ||||
| #include <neo/assert.hpp> | #include <neo/assert.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <wil/resource.h> | #include <wil/resource.h> | ||||
| #include <windows.h> | #include <windows.h> |
| #include <dds/error/errors.hpp> | #include <dds/error/errors.hpp> | ||||
| #include <dds/solve/solve.hpp> | #include <dds/solve/solve.hpp> | ||||
| #include <dds/source/dist.hpp> | #include <dds/source/dist.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <dds/util/paths.hpp> | #include <dds/util/paths.hpp> | ||||
| #include <dds/util/string.hpp> | #include <dds/util/string.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <range/v3/action/sort.hpp> | #include <range/v3/action/sort.hpp> | ||||
| #include <range/v3/action/unique.hpp> | #include <range/v3/action/unique.hpp> | ||||
| #include <range/v3/range/conversion.hpp> | #include <range/v3/range/conversion.hpp> | ||||
| try { | try { | ||||
| return sdist::from_directory(p); | return sdist::from_directory(p); | ||||
| } catch (const std::runtime_error& e) { | } catch (const std::runtime_error& e) { | ||||
| spdlog::error("Failed to load source distribution from directory '{}': {}", | |||||
| p.string(), | |||||
| e.what()); | |||||
| log::error("Failed to load source distribution from directory '{}': {}", | |||||
| p.string(), | |||||
| e.what()); | |||||
| return std::nullopt; | return std::nullopt; | ||||
| } | } | ||||
| }; | }; | ||||
| } // namespace | } // namespace | ||||
| void repository::_log_blocking(path_ref dirpath) noexcept { | void repository::_log_blocking(path_ref dirpath) noexcept { | ||||
| spdlog::warn("Another process has the repository directory locked [{}]", dirpath.string()); | |||||
| spdlog::warn("Waiting for repository to be released..."); | |||||
| log::warn("Another process has the repository directory locked [{}]", dirpath.string()); | |||||
| log::warn("Waiting for repository to be released..."); | |||||
| } | } | ||||
| void repository::_init_repo_dir(path_ref dirpath) noexcept { fs::create_directories(dirpath); } | void repository::_init_repo_dir(path_ref dirpath) noexcept { fs::create_directories(dirpath); } | ||||
| void repository::add_sdist(const sdist& sd, if_exists ife_action) { | void repository::add_sdist(const sdist& sd, if_exists ife_action) { | ||||
| if (!_write_enabled) { | if (!_write_enabled) { | ||||
| spdlog::critical( | |||||
| log::critical( | |||||
| "DDS attempted to write into a repository that wasn't opened with a write-lock. This " | "DDS attempted to write into a repository that wasn't opened with a write-lock. This " | ||||
| "is a hard bug and should be reported. For the safety and integrity of the local " | "is a hard bug and should be reported. For the safety and integrity of the local " | ||||
| "repository, we'll hard-exit immediately."); | "repository, we'll hard-exit immediately."); | ||||
| if (ife_action == if_exists::throw_exc) { | if (ife_action == if_exists::throw_exc) { | ||||
| throw_user_error<errc::sdist_exists>(msg); | throw_user_error<errc::sdist_exists>(msg); | ||||
| } else if (ife_action == if_exists::ignore) { | } else if (ife_action == if_exists::ignore) { | ||||
| spdlog::warn(msg); | |||||
| log::warn(msg); | |||||
| return; | return; | ||||
| } else { | } else { | ||||
| spdlog::info(msg + " - Replacing"); | |||||
| log::info(msg + " - Replacing"); | |||||
| } | } | ||||
| } | } | ||||
| auto tmp_copy = sd_dest; | auto tmp_copy = sd_dest; | ||||
| } | } | ||||
| fs::rename(tmp_copy, sd_dest); | fs::rename(tmp_copy, sd_dest); | ||||
| _sdists.insert(sdist::from_directory(sd_dest)); | _sdists.insert(sdist::from_directory(sd_dest)); | ||||
| spdlog::info("Source distribution '{}' successfully exported", sd.manifest.pkg_id.to_string()); | |||||
| log::info("Source distribution '{}' successfully exported", sd.manifest.pkg_id.to_string()); | |||||
| } | } | ||||
| const sdist* repository::find(const package_id& pkg) const noexcept { | const sdist* repository::find(const package_id& pkg) const noexcept { |
| #include "./solve.hpp" | #include "./solve.hpp" | ||||
| #include <dds/error/errors.hpp> | #include <dds/error/errors.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <pubgrub/solve.hpp> | #include <pubgrub/solve.hpp> | ||||
| #include <range/v3/range/conversion.hpp> | #include <range/v3/range/conversion.hpp> | ||||
| #include <range/v3/view/transform.hpp> | #include <range/v3/view/transform.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <sstream> | #include <sstream> | ||||
| void operator()(pubgrub::explain::premise<T> pr) { | void operator()(pubgrub::explain::premise<T> pr) { | ||||
| strm.str(""); | strm.str(""); | ||||
| put(pr.value); | put(pr.value); | ||||
| spdlog::error("{} {},", at_head ? "┌─ Given that" : "│ and", strm.str()); | |||||
| log::error("{} {},", at_head ? "┌─ Given that" : "│ and", strm.str()); | |||||
| at_head = false; | at_head = false; | ||||
| } | } | ||||
| at_head = true; | at_head = true; | ||||
| strm.str(""); | strm.str(""); | ||||
| put(cncl.value); | put(cncl.value); | ||||
| spdlog::error("╘═ then {}.", strm.str()); | |||||
| log::error("╘═ then {}.", strm.str()); | |||||
| } | } | ||||
| void operator()(pubgrub::explain::separator) { spdlog::error(""); } | |||||
| void operator()(pubgrub::explain::separator) { log::error(""); } | |||||
| }; | }; | ||||
| } // namespace | } // namespace | ||||
| auto solution = pubgrub::solve(wrap_req, solver_provider{pkgs_prov, deps_prov}); | auto solution = pubgrub::solve(wrap_req, solver_provider{pkgs_prov, deps_prov}); | ||||
| return solution | ranges::views::transform(as_pkg_id) | ranges::to_vector; | return solution | ranges::views::transform(as_pkg_id) | ranges::to_vector; | ||||
| } catch (const solve_fail_exc& failure) { | } catch (const solve_fail_exc& failure) { | ||||
| spdlog::error("Dependency resolution has failed! Explanation:"); | |||||
| log::error("Dependency resolution has failed! Explanation:"); | |||||
| pubgrub::generate_explaination(failure, explainer()); | pubgrub::generate_explaination(failure, explainer()); | ||||
| throw_user_error<errc::dependency_resolve_failure>(); | throw_user_error<errc::dependency_resolve_failure>(); | ||||
| } | } |
| #include <dds/library/root.hpp> | #include <dds/library/root.hpp> | ||||
| #include <dds/temp.hpp> | #include <dds/temp.hpp> | ||||
| #include <dds/util/fs.hpp> | #include <dds/util/fs.hpp> | ||||
| #include <dds/util/log.hpp> | |||||
| #include <libman/parse.hpp> | #include <libman/parse.hpp> | ||||
| #include <range/v3/algorithm/sort.hpp> | #include <range/v3/algorithm/sort.hpp> | ||||
| #include <range/v3/view/filter.hpp> | #include <range/v3/view/filter.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| using namespace dds; | using namespace dds; | ||||
| namespace { | namespace { | ||||
| void sdist_export_file(path_ref out_root, path_ref in_root, path_ref filepath) { | void sdist_export_file(path_ref out_root, path_ref in_root, path_ref filepath) { | ||||
| auto relpath = fs::relative(filepath, in_root); | auto relpath = fs::relative(filepath, in_root); | ||||
| spdlog::debug("Export file {}", relpath.string()); | |||||
| log::debug("Export file {}", relpath.string()); | |||||
| auto dest = out_root / relpath; | auto dest = out_root / relpath; | ||||
| fs::create_directories(dest.parent_path()); | fs::create_directories(dest.parent_path()); | ||||
| fs::copy(filepath, dest); | fs::copy(filepath, dest); | ||||
| } | } | ||||
| sdist_export_file(out_root, params.project_dir, *lib_man_path); | sdist_export_file(out_root, params.project_dir, *lib_man_path); | ||||
| spdlog::info("sdist: Export library from {}", lib.path().string()); | |||||
| log::info("sdist: Export library from {}", lib.path().string()); | |||||
| fs::create_directories(out_root); | fs::create_directories(out_root); | ||||
| for (const auto& source : sources_to_keep) { | for (const auto& source : sources_to_keep) { | ||||
| sdist_export_file(out_root, params.project_dir, source.path); | sdist_export_file(out_root, params.project_dir, source.path); | ||||
| } | } | ||||
| fs::create_directories(dest.parent_path()); | fs::create_directories(dest.parent_path()); | ||||
| safe_rename(tempdir.path(), dest); | safe_rename(tempdir.path(), dest); | ||||
| spdlog::info("Source distribution created in {}", dest.string()); | |||||
| log::info("Source distribution created in {}", dest.string()); | |||||
| return sdist::from_directory(dest); | return sdist::from_directory(dest); | ||||
| } | } | ||||
| auto pkg_man = package_manifest::load_from_file(*man_path); | auto pkg_man = package_manifest::load_from_file(*man_path); | ||||
| sdist_export_file(out, params.project_dir, *man_path); | sdist_export_file(out, params.project_dir, *man_path); | ||||
| spdlog::info("Generated export as {}", pkg_man.pkg_id.to_string()); | |||||
| log::info("Generated export as {}", pkg_man.pkg_id.to_string()); | |||||
| return sdist::from_directory(out); | return sdist::from_directory(out); | ||||
| } | } | ||||
| #include "./log.hpp" | |||||
| #include <neo/assert.hpp> | |||||
| #include <spdlog/spdlog.h> | |||||
| void dds::log::log_print(dds::log::level l, std::string_view msg) noexcept { | |||||
| static auto logger = [] { | |||||
| auto logger = spdlog::default_logger_raw(); | |||||
| logger->set_level(spdlog::level::trace); | |||||
| return logger; | |||||
| }(); | |||||
| const auto lvl = [&] { | |||||
| switch (l) { | |||||
| case level::trace: | |||||
| return spdlog::level::trace; | |||||
| case level::debug: | |||||
| return spdlog::level::debug; | |||||
| case level::info: | |||||
| return spdlog::level::info; | |||||
| case level::warn: | |||||
| return spdlog::level::warn; | |||||
| case level::error: | |||||
| return spdlog::level::err; | |||||
| case level::critical: | |||||
| return spdlog::level::critical; | |||||
| } | |||||
| neo_assert_always(invariant, false, "Invalid log level", msg, int(l)); | |||||
| }(); | |||||
| logger->log(lvl, msg); | |||||
| } |
| #pragma once | |||||
| #include <fmt/core.h> | |||||
| #include <string_view> | |||||
| namespace dds::log { | |||||
| enum class level : int { | |||||
| trace, | |||||
| debug, | |||||
| info, | |||||
| warn, | |||||
| error, | |||||
| critical, | |||||
| }; | |||||
| inline level current_log_level = level::info; | |||||
| void log_print(level l, std::string_view s) noexcept; | |||||
| // clang-format off | |||||
| template <typename T> | |||||
| concept formattable = requires (const T item) { | |||||
| fmt::format("{}", item); | |||||
| }; | |||||
| template <formattable... Args> | |||||
| void log(level l, std::string_view s, const Args&... args) { | |||||
| if (int(l) >= int(current_log_level)) { | |||||
| auto message = fmt::format(s, args...); | |||||
| log_print(l, message); | |||||
| } | |||||
| } | |||||
| template <formattable... Args> | |||||
| void trace(std::string_view s, const Args&... args) { | |||||
| log(level::trace, s, args...); | |||||
| } | |||||
| template <formattable... Args> | |||||
| void debug(std::string_view s, const Args&... args) { | |||||
| log(level::debug, s, args...); | |||||
| } | |||||
| template <formattable... Args> | |||||
| void info(std::string_view s, const Args&... args) { | |||||
| log(level::info, s, args...); | |||||
| } | |||||
| template <formattable... Args> | |||||
| void warn(std::string_view s, const Args&... args) { | |||||
| log(level::warn, s, args...); | |||||
| } | |||||
| template <formattable... Args> | |||||
| void error(std::string_view s, const Args&... args) { | |||||
| log(level::error, s, args...); | |||||
| } | |||||
| template <formattable... Args> | |||||
| void critical(std::string_view s, const Args&&... args) { | |||||
| log(level::critical, s, args...); | |||||
| } | |||||
| // clang-format on | |||||
| } // namespace dds::log |
| #include "./parallel.hpp" | #include "./parallel.hpp" | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <dds/util/log.hpp> | |||||
| using namespace dds; | using namespace dds; | ||||
| try { | try { | ||||
| std::rethrow_exception(eptr); | std::rethrow_exception(eptr); | ||||
| } catch (const std::exception& e) { | } catch (const std::exception& e) { | ||||
| spdlog::error(e.what()); | |||||
| log::error(e.what()); | |||||
| } | } | ||||
| } | } |
| #include "./paths.hpp" | #include "./paths.hpp" | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <dds/util/log.hpp> | |||||
| #include <cstdlib> | #include <cstdlib> | ||||
| static auto ret = []() -> fs::path { | static auto ret = []() -> fs::path { | ||||
| auto home_env = std::getenv("HOME"); | auto home_env = std::getenv("HOME"); | ||||
| if (!home_env) { | if (!home_env) { | ||||
| spdlog::warn("No HOME environment variable set!"); | |||||
| log::error("No HOME environment variable set!"); | |||||
| return "/"; | return "/"; | ||||
| } | } | ||||
| return fs::absolute(fs::path(home_env)); | return fs::absolute(fs::path(home_env)); |
| #include "./paths.hpp" | #include "./paths.hpp" | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <dds/util/log.hpp> | |||||
| #include <cstdlib> | #include <cstdlib> | ||||
| static auto ret = []() -> fs::path { | static auto ret = []() -> fs::path { | ||||
| auto home_env = std::getenv("HOME"); | auto home_env = std::getenv("HOME"); | ||||
| if (!home_env) { | if (!home_env) { | ||||
| spdlog::warn("No HOME environment variable set!"); | |||||
| log::warn("No HOME environment variable set!"); | |||||
| return "/"; | return "/"; | ||||
| } | } | ||||
| return fs::absolute(fs::path(home_env)); | return fs::absolute(fs::path(home_env)); |
| #include "./paths.hpp" | #include "./paths.hpp" | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <dds/util/log.hpp> | |||||
| #include <cstdlib> | #include <cstdlib> | ||||
| static auto ret = []() -> fs::path { | static auto ret = []() -> fs::path { | ||||
| auto userprofile_env = std::getenv("USERPROFILE"); | auto userprofile_env = std::getenv("USERPROFILE"); | ||||
| if (!userprofile_env) { | if (!userprofile_env) { | ||||
| spdlog::warn("No USERPROFILE environment variable set!"); | |||||
| log::warn("No USERPROFILE environment variable set!"); | |||||
| return "/"; | return "/"; | ||||
| } | } | ||||
| return fs::absolute(fs::path(userprofile_env)); | return fs::absolute(fs::path(userprofile_env)); |
| #include <libman/parse.hpp> | #include <libman/parse.hpp> | ||||
| #include <spdlog/spdlog.h> | |||||
| #include <fmt/core.h> | |||||
| using namespace lm; | using namespace lm; | ||||