Remove fmt tasks switch from fmt to std::format internally.

This commit is contained in:
Mikaël Capelle
2024-05-25 14:25:11 +02:00
parent b0d26f30a9
commit 4db6ff40f1
30 changed files with 96 additions and 11242 deletions
+7 -10
View File
@@ -116,13 +116,13 @@ namespace mob {
if (!task) if (!task)
return 1; return 1;
u8cout << "checking out pr " << pr.number << " " u8cout << "checking out pr " << pr.number << " " << "in "
<< "in " << task->name() << "\n"; << task->name() << "\n";
git_wrap g(task->source_path()); git_wrap g(task->source_path());
g.fetch(task->git_url().string(), g.fetch(task->git_url().string(),
fmt::format("pull/{}/head", pr.number)); std::format("pull/{}/head", pr.number));
g.checkout("FETCH_HEAD"); g.checkout("FETCH_HEAD");
} }
@@ -208,13 +208,10 @@ namespace mob {
{ {
nlohmann::json json; nlohmann::json json;
constexpr auto* pattern = constexpr auto* pattern = "https://api.github.com/search/issues?per_page=100&q="
"https://api.github.com/search/issues?per_page=100&q=" "is:pr+org:{0:}+author:{1:}+is:open+head:{2:}";
"is:pr+org:{org:}+author:{author:}+is:open+head:{branch:}";
const auto search_url = const auto search_url = std::format(pattern, org, author, branch);
fmt::format(pattern, fmt::arg("org", org), fmt::arg("author", author),
fmt::arg("branch", branch));
u8cout << "search url is " << search_url << "\n"; u8cout << "search url is " << search_url << "\n";
@@ -275,7 +272,7 @@ namespace mob {
return {}; return {};
} }
const url u(fmt::format("https://api.github.com/repos/{}/{}/pulls/{}", const url u(std::format("https://api.github.com/repos/{}/{}/pulls/{}",
task->org(), task->repo(), pr)); task->org(), task->repo(), pr));
curl_downloader dl; curl_downloader dl;
+2 -2
View File
@@ -367,7 +367,7 @@ namespace mob {
} }
const auto q = const auto q =
fmt::format("prefix {} already exists, delete?", path_to_utf8(prefix)); std::format("prefix {} already exists, delete?", path_to_utf8(prefix));
if (ask_yes_no(q, yn::no) != yn::yes) if (ask_yes_no(q, yn::no) != yn::yes)
return false; return false;
@@ -489,7 +489,7 @@ namespace mob {
const auto* lcp = static_cast<LANGANDCODEPAGE*>(value_pointer); const auto* lcp = static_cast<LANGANDCODEPAGE*>(value_pointer);
const auto sub_block = const auto sub_block =
fmt::format(L"\\StringFileInfo\\{:04x}{:04x}\\FileVersion", lcp->wLanguage, std::format(L"\\StringFileInfo\\{:04x}{:04x}\\FileVersion", lcp->wLanguage,
lcp->wCodePage); lcp->wCodePage);
ret = VerQueryValueW(buffer.get(), sub_block.c_str(), &value_pointer, ret = VerQueryValueW(buffer.get(), sub_block.c_str(), &value_pointer,
-19
View File
@@ -5,25 +5,6 @@
#include "../utility.h" #include "../utility.h"
#include "conf.h" #include "conf.h"
namespace mob::details {
std::string converter<std::wstring>::convert(const std::wstring& s)
{
return utf16_to_utf8(s);
}
std::string converter<fs::path>::convert(const fs::path& s)
{
return utf16_to_utf8(s.native());
}
std::string converter<url>::convert(const url& u)
{
return u.string();
}
} // namespace mob::details
namespace mob { namespace mob {
// timestamps are relative to this // timestamps are relative to this
+14 -52
View File
@@ -1,45 +1,7 @@
#pragma once #pragma once
#include "../utility.h" #include "../utility.h"
#include "./formatters.h"
// T to std::string converters
//
// those are kept in this namespace so they don't leak all over the place;
// they're used directly by context::do_log() below
namespace mob::details {
class mob::url;
template <class T, class = void>
struct converter {
static const T& convert(const T& t) { return t; }
};
template <>
struct converter<std::wstring> {
static std::string convert(const std::wstring& s);
};
template <>
struct converter<fs::path> {
static std::string convert(const fs::path& s);
};
template <>
struct converter<url> {
static std::string convert(const url& u);
};
template <class T>
struct converter<T, std::enable_if_t<std::is_enum_v<T>>> {
static std::string convert(T e)
{
return std::to_string(static_cast<std::underlying_type_t<T>>(e));
}
};
} // namespace mob::details
namespace mob { namespace mob {
@@ -57,7 +19,7 @@ namespace mob {
// in places where there is no context available, there's a global one can that // in places where there is no context available, there's a global one can that
// be retrieved with gcx() for logging // be retrieved with gcx() for logging
// //
// all log functions will use fmt::format() internally, so they can be used // all log functions will use std::format() internally, so they can be used
// like: // like:
// //
// cx.log(context::generic, "eat more {}", "potatoes"); // cx.log(context::generic, "eat more {}", "potatoes");
@@ -161,7 +123,7 @@ namespace mob {
// logs a formatted string with the dump level // logs a formatted string with the dump level
// //
template <class... Args> template <class... Args>
void dump(reason r, const char* f, Args&&... args) const void dump(reason r, std::format_string<Args...> f, Args&&... args) const
{ {
do_log(false, r, level::dump, f, std::forward<Args>(args)...); do_log(false, r, level::dump, f, std::forward<Args>(args)...);
} }
@@ -169,7 +131,7 @@ namespace mob {
// logs a formatted string with the trace level // logs a formatted string with the trace level
// //
template <class... Args> template <class... Args>
void trace(reason r, const char* f, Args&&... args) const void trace(reason r, std::format_string<Args...> f, Args&&... args) const
{ {
do_log(false, r, level::trace, f, std::forward<Args>(args)...); do_log(false, r, level::trace, f, std::forward<Args>(args)...);
} }
@@ -177,7 +139,7 @@ namespace mob {
// logs a formatted string with the debug level // logs a formatted string with the debug level
// //
template <class... Args> template <class... Args>
void debug(reason r, const char* f, Args&&... args) const void debug(reason r, std::format_string<Args...> f, Args&&... args) const
{ {
do_log(false, r, level::debug, f, std::forward<Args>(args)...); do_log(false, r, level::debug, f, std::forward<Args>(args)...);
} }
@@ -185,7 +147,7 @@ namespace mob {
// logs a formatted string with the info level // logs a formatted string with the info level
// //
template <class... Args> template <class... Args>
void info(reason r, const char* f, Args&&... args) const void info(reason r, std::format_string<Args...> f, Args&&... args) const
{ {
do_log(false, r, level::info, f, std::forward<Args>(args)...); do_log(false, r, level::info, f, std::forward<Args>(args)...);
} }
@@ -193,7 +155,7 @@ namespace mob {
// logs a formatted string with the warning level // logs a formatted string with the warning level
// //
template <class... Args> template <class... Args>
void warning(reason r, const char* f, Args&&... args) const void warning(reason r, std::format_string<Args...> f, Args&&... args) const
{ {
do_log(false, r, level::warning, f, std::forward<Args>(args)...); do_log(false, r, level::warning, f, std::forward<Args>(args)...);
} }
@@ -201,7 +163,7 @@ namespace mob {
// logs a formatted string with the error level // logs a formatted string with the error level
// //
template <class... Args> template <class... Args>
void error(reason r, const char* f, Args&&... args) const void error(reason r, std::format_string<Args...> f, Args&&... args) const
{ {
do_log(false, r, level::error, f, std::forward<Args>(args)...); do_log(false, r, level::error, f, std::forward<Args>(args)...);
} }
@@ -211,7 +173,8 @@ namespace mob {
// tasks // tasks
// //
template <class... Args> template <class... Args>
[[noreturn]] void bail_out(reason r, const char* f, Args&&... args) const [[noreturn]] void bail_out(reason r, std::format_string<Args...> f,
Args&&... args) const
{ {
do_log(true, r, level::error, f, std::forward<Args>(args)...); do_log(true, r, level::error, f, std::forward<Args>(args)...);
} }
@@ -227,7 +190,8 @@ namespace mob {
// bailed exception after logging // bailed exception after logging
// //
template <class... Args> template <class... Args>
void do_log(bool bail, reason r, level lv, const char* f, Args&&... args) const void do_log(bool bail, reason r, level lv, std::format_string<Args...> f,
Args&&... args) const
{ {
// discard log if it's not enabled and it's not bailing out // discard log if it's not enabled and it's not bailing out
if (!bail && !enabled(lv)) if (!bail && !enabled(lv))
@@ -235,9 +199,7 @@ namespace mob {
try { try {
// formatting string // formatting string
const std::string s = const std::string s = std::format(f, std::forward<Args>(args)...);
fmt::format(f, details::converter<std::decay_t<Args>>::convert(
std::forward<Args>(args))...);
do_log_impl(bail, r, lv, s); do_log_impl(bail, r, lv, s);
} }
@@ -253,7 +215,7 @@ namespace mob {
// a ghetto conversion and hope it gives enough info // a ghetto conversion and hope it gives enough info
std::wstring s; std::wstring s;
const char* p = f; const char* p = f.get().data();
while (*p) { while (*p) {
s += (wchar_t)*p; s += (wchar_t)*p;
++p; ++p;
+35
View File
@@ -0,0 +1,35 @@
#pragma once
#include "../utility/string.h"
template <>
struct std::formatter<std::wstring, char> : std::formatter<std::string, char> {
template <class FmtContext>
FmtContext::iterator format(std::wstring const& s, FmtContext& ctx) const
{
return std::formatter<std::string, char>::format(mob::utf16_to_utf8(s), ctx);
}
};
template <>
struct std::formatter<std::filesystem::path, char>
: std::formatter<std::basic_string<std::filesystem::path::value_type>, char> {
template <class FmtContext>
FmtContext::iterator format(std::filesystem::path const& s, FmtContext& ctx) const
{
return std::formatter<std::basic_string<std::filesystem::path::value_type>,
char>::format(s.native(), ctx);
}
};
template <class Enum, class CharT>
requires std::is_enum_v<Enum>
struct std::formatter<Enum, CharT>
: std::formatter<std::underlying_type_t<Enum>, CharT> {
template <class FmtContext>
FmtContext::iterator format(Enum v, FmtContext& ctx) const
{
return std::formatter<std::underlying_type_t<Enum>, CharT>::format(
static_cast<std::underlying_type_t<Enum>>(v), ctx);
}
};
+2 -2
View File
@@ -10,11 +10,11 @@
namespace mob { namespace mob {
template <class... Args> template <class... Args>
void ini_error(const ini_data& ini, std::size_t line, std::string_view f, void ini_error(const ini_data& ini, std::size_t line, std::format_string<Args...> f,
Args&&... args) Args&&... args)
{ {
gcx().bail_out(context::conf, "{}:{}: {}", path_to_utf8(ini.path), (line + 1), gcx().bail_out(context::conf, "{}:{}: {}", path_to_utf8(ini.path), (line + 1),
fmt::format(f, std::forward<Args>(args)...)); std::format(f, std::forward<Args>(args)...));
} }
ini_data::kv_map& ini_data::get_section(std::string_view name) ini_data::kv_map& ini_data::get_section(std::string_view name)
+1 -1
View File
@@ -326,7 +326,7 @@ namespace mob {
// check known installation paths for a bunch of versions // check known installation paths for a bunch of versions
for (int v : {5, 6, 7, 8}) { for (int v : {5, 6, 7, 8}) {
const fs::path inno_dir = fmt::format("Inno Setup {}", v); const fs::path inno_dir = std::format("Inno Setup {}", v);
// check for both architectures // check for both architectures
for (fs::path pf : {conf().path().pf_x86(), conf().path().pf_x64()}) { for (fs::path pf : {conf().path().pf_x86(), conf().path().pf_x64()}) {
-1
View File
@@ -29,7 +29,6 @@ namespace mob {
add_task<parallel_tasks>() add_task<parallel_tasks>()
.add_task<sevenz>() .add_task<sevenz>()
.add_task<zlib>() .add_task<zlib>()
.add_task<fmt>()
.add_task<gtest>() .add_task<gtest>()
.add_task<libbsarch>() .add_task<libbsarch>()
.add_task<libloot>() .add_task<libloot>()
+9
View File
@@ -115,3 +115,12 @@ namespace mob {
}; };
} // namespace mob } // namespace mob
template <>
struct std::formatter<mob::url, char> : std::formatter<std::string, char> {
template <class FmtContext>
FmtContext::iterator format(mob::url const& u, FmtContext& ctx) const
{
return std::formatter<std::string, char>::format(u.string(), ctx);
}
};
-1
View File
@@ -1,2 +1 @@
#include "pch.h" #include "pch.h"
#include <fmt/format.cc>
+1 -1
View File
@@ -48,6 +48,7 @@
#include <atomic> #include <atomic>
#include <charconv> #include <charconv>
#include <filesystem> #include <filesystem>
#include <format>
#include <fstream> #include <fstream>
#include <functional> #include <functional>
#include <iostream> #include <iostream>
@@ -69,7 +70,6 @@
#include <clipp.h> #include <clipp.h>
#include <curl/curl.h> #include <curl/curl.h>
#include <fmt/format.h>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
#pragma warning(pop) #pragma warning(pop)
-94
View File
@@ -1,94 +0,0 @@
#include "pch.h"
#include "tasks.h"
namespace mob::tasks {
namespace {
url source_url()
{
return "https://github.com/fmtlib/fmt/releases/download/" + fmt::version() +
"/fmt-" + fmt::version() + ".zip";
}
cmake create_cmake_tool(const fs::path& src_path,
cmake::ops o = cmake::ops::generate)
{
return std::move(cmake(o)
.generator(cmake::vs)
.root(src_path)
.prefix(src_path / "build")
.def("FMT_TEST", "OFF")
.def("FMT_DOC", "OFF"));
}
fs::path solution_path()
{
const auto build_path = create_cmake_tool(fmt::source_path()).build_path();
return build_path / "INSTALL.vcxproj";
}
msbuild create_msbuild_tool(msbuild::ops o = msbuild::ops::build)
{
return std::move(msbuild(o).solution(solution_path()));
}
} // namespace
fmt::fmt() : basic_task("fmt") {}
std::string fmt::version()
{
return conf().version().get("fmt");
}
bool fmt::prebuilt()
{
// no prebuilts available
return false;
}
fs::path fmt::source_path()
{
return conf().path().build() / ("fmt-" + version());
}
void fmt::do_clean(clean c)
{
// delete download
if (is_set(c, clean::redownload))
run_tool(downloader(source_url(), downloader::clean));
// delete the whole directory
if (is_set(c, clean::reextract)) {
cx().trace(context::reextract, "deleting {}", source_path());
op::delete_directory(cx(), source_path(), op::optional);
// no need to do anything else
return;
}
// cmake clean
if (is_set(c, clean::reconfigure))
run_tool(create_cmake_tool(source_path(), cmake::clean));
// msbuild clean
if (is_set(c, clean::rebuild))
run_tool(create_msbuild_tool(msbuild::clean));
}
void fmt::do_fetch()
{
const auto file = run_tool(downloader(source_url()));
run_tool(extractor().file(file).output(source_path()));
}
void fmt::do_build_and_install()
{
run_tool(create_cmake_tool(source_path()));
run_tool(create_msbuild_tool());
}
} // namespace mob::tasks
-1
View File
@@ -211,7 +211,6 @@ namespace mob::tasks {
.def("DEPENDENCIES_DIR", conf().path().build()) .def("DEPENDENCIES_DIR", conf().path().build())
.def("BOOST_ROOT", boost::source_path()) .def("BOOST_ROOT", boost::source_path())
.def("BOOST_LIBRARYDIR", boost::lib_path(arch::x64)) .def("BOOST_LIBRARYDIR", boost::lib_path(arch::x64))
.def("FMT_ROOT", fmt::source_path())
.def("SPDLOG_ROOT", spdlog::source_path()) .def("SPDLOG_ROOT", spdlog::source_path())
.def("LOOT_PATH", libloot::source_path()) .def("LOOT_PATH", libloot::source_path())
.def("LZ4_ROOT", lz4::source_path()) .def("LZ4_ROOT", lz4::source_path())
-14
View File
@@ -90,20 +90,6 @@ namespace mob::tasks {
void do_fetch() override; void do_fetch() override;
}; };
class fmt : public basic_task<fmt> {
public:
fmt();
static std::string version();
static bool prebuilt();
static fs::path source_path();
protected:
void do_clean(clean c) override;
void do_fetch() override;
void do_build_and_install() override;
};
class gtest : public basic_task<gtest> { class gtest : public basic_task<gtest> {
public: public:
gtest(); gtest();
+5 -5
View File
@@ -135,7 +135,7 @@ namespace mob::tasks {
if (dir_cs.size() != 2) { if (dir_cs.size() != 2) {
warnings_.push_back( warnings_.push_back(
::fmt::format("bad directory name '{}'; skipping", dir_name)); ::std::format("bad directory name '{}'; skipping", dir_name));
return {}; return {};
} }
@@ -143,7 +143,7 @@ namespace mob::tasks {
const auto project_name = trim_copy(dir_cs[1]); const auto project_name = trim_copy(dir_cs[1]);
if (project_name.empty()) { if (project_name.empty()) {
warnings_.push_back( warnings_.push_back(
::fmt::format("bad directory name '{}', skipping", dir_name)); ::std::format("bad directory name '{}', skipping", dir_name));
return {}; return {};
} }
@@ -162,7 +162,7 @@ namespace mob::tasks {
// there should only be .ts files in there // there should only be .ts files in there
if (path.extension() != ".ts") { if (path.extension() != ".ts") {
warnings_.push_back( warnings_.push_back(
::fmt::format("{} is not a .ts file", path_to_utf8(path))); ::std::format("{} is not a .ts file", path_to_utf8(path)));
continue; continue;
} }
@@ -204,7 +204,7 @@ namespace mob::tasks {
if (!warned_.contains(gamebryo_ts)) { if (!warned_.contains(gamebryo_ts)) {
warned_.insert(gamebryo_ts); warned_.insert(gamebryo_ts);
warnings_.push_back(::fmt::format( warnings_.push_back(::std::format(
"{} is a gamebryo plugin but there is no '{}'; the " "{} is a gamebryo plugin but there is no '{}'; the "
".qm file will be missing some translations (will " ".qm file will be missing some translations (will "
"only warn once)", "only warn once)",
@@ -223,7 +223,7 @@ namespace mob::tasks {
if (!t) { if (!t) {
warnings_.push_back( warnings_.push_back(
::fmt::format("directory '{}' was parsed as project '{}', but there's " ::std::format("directory '{}' was parsed as project '{}', but there's "
"no task with this name", "no task with this name",
dir, project)); dir, project));
+10 -14
View File
@@ -27,14 +27,11 @@ namespace mob::details {
// returns a github url for the given org and git file // returns a github url for the given org and git file
// //
std::string make_url(const std::string& org, const std::string& git_file, std::string make_url(const std::string& org, const std::string& git_file,
const std::string& url_pattern) std::optional<git_url_pattern_format_string> url_pattern)
{ {
const std::string default_github_url_pattern = "git@github.com:{}/{}"; return std::format(
url_pattern.value_or(git_url_pattern_format_string{"git@github.com:{}/{}"}),
const std::string pattern = org, git_file);
url_pattern.empty() ? default_github_url_pattern : url_pattern;
return fmt::format(pattern, org, git_file);
} }
// creates a basic git process, used by all the functions below // creates a basic git process, used by all the functions below
@@ -412,14 +409,13 @@ namespace mob {
return (run(details::has_remote(root_, name)) == 0); return (run(details::has_remote(root_, name)) == 0);
} }
void git_wrap::add_remote(const std::string& remote_name, void git_wrap::add_remote(
const std::string& username, const std::string& key, const std::string& remote_name, const std::string& username,
bool push_default, const std::string& url_pattern, const std::string& key, bool push_default,
const std::string& opt_git_file) std::optional<details::git_url_pattern_format_string> url_pattern,
std::optional<std::string> opt_git_file)
{ {
auto gf = opt_git_file; auto gf = opt_git_file.value_or(git_file());
if (gf.empty())
gf = git_file();
if (!has_remote(remote_name)) { if (!has_remote(remote_name)) {
run(details::add_remote(root_, remote_name, run(details::add_remote(root_, remote_name,
+10 -4
View File
@@ -2,6 +2,11 @@
namespace mob { namespace mob {
namespace details {
using git_url_pattern_format_string =
std::format_string<std::string const&, std::string const&>;
}
// wrapper around git commands used by the git tool below or various `mob git` // wrapper around git commands used by the git tool below or various `mob git`
// commands // commands
// //
@@ -102,10 +107,11 @@ namespace mob {
// set_origin_and_upstream_remotes() because the "origin" // set_origin_and_upstream_remotes() because the "origin"
// remote might not exist at that point // remote might not exist at that point
// //
void add_remote(const std::string& remote_name, const std::string& org, void add_remote(
const std::string& key, bool push_default, const std::string& remote_name, const std::string& org,
const std::string& url_pattern = {}, const std::string& key, bool push_default,
const std::string& git_file = {}); std::optional<details::git_url_pattern_format_string> url_pattern = {},
std::optional<std::string> git_file = {});
// renames remote `from` to `to` // renames remote `from` to `to`
// //
-1119
View File
File diff suppressed because it is too large Load Diff
-568
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More