From 9bf2918ad09ee6c89e105adfb865d9130f987bed Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Fri, 22 Jul 2022 13:07:23 -0500 Subject: [PATCH] refactor: remove tr_strvPath() (#3509) --- libtransmission/platform.cc | 24 ++++++++++++------------ libtransmission/torrent.cc | 8 ++++---- libtransmission/utils.h | 21 --------------------- tests/libtransmission/test-fixtures.h | 21 ++++++++++++--------- tests/libtransmission/utils-test.cc | 12 ------------ 5 files changed, 28 insertions(+), 58 deletions(-) diff --git a/libtransmission/platform.cc b/libtransmission/platform.cc index 0aed8dc02..d306424de 100644 --- a/libtransmission/platform.cc +++ b/libtransmission/platform.cc @@ -121,7 +121,7 @@ static std::string xdgConfigHome() return ret; } - return tr_strvPath(getHomeDir(), ".config"sv); + return fmt::format("{:s}/.config"sv, getHomeDir()); } void tr_setConfigDir(tr_session* session, std::string_view config_dir) @@ -135,8 +135,8 @@ void tr_setConfigDir(tr_session* session, std::string_view config_dir) #endif session->config_dir = config_dir; - session->resume_dir = tr_strvPath(config_dir, ResumeSubdir); - session->torrent_dir = tr_strvPath(config_dir, TorrentSubdir); + session->resume_dir = fmt::format("{:s}/{:s}"sv, config_dir, ResumeSubdir); + session->torrent_dir = fmt::format("{:s}/{:s}"sv, config_dir, TorrentSubdir); tr_sys_dir_create(session->resume_dir, TR_SYS_DIR_CREATE_PARENTS, 0777); tr_sys_dir_create(session->torrent_dir, TR_SYS_DIR_CREATE_PARENTS, 0777); } @@ -168,23 +168,23 @@ char const* tr_getDefaultConfigDir(char const* appname) { #ifdef __APPLE__ - s = tr_strvDup(tr_strvPath(getHomeDir(), "Library", "Application Support", appname)); + s = tr_strvDup(fmt::format("{:s}/Library/Application Support/{:s}"sv, getHomeDir(), appname)); #elif defined(_WIN32) char* appdata = win32_get_known_folder(FOLDERID_LocalAppData); - s = tr_strvDup(tr_strvPath(appdata, appname)); + s = tr_strvDup(fmt::format("{:s}/{:s}"sv, appdata, appname)); tr_free(appdata); #elif defined(__HAIKU__) char buf[PATH_MAX]; find_directory(B_USER_SETTINGS_DIRECTORY, -1, true, buf, sizeof(buf)); - s = tr_strvDup(tr_strvPath(buf, appname)); + s = tr_strvDup(fmt::format("{:s}/{:s}"sv, buf, appname); #else - s = tr_strvDup(tr_strvPath(xdgConfigHome(), appname)); + s = tr_strvDup(fmt::format("{:s}/{:s}"sv, xdgConfigHome(), appname)); #endif } @@ -196,7 +196,7 @@ char const* tr_getDefaultConfigDir(char const* appname) static std::string getXdgEntryFromUserDirs(std::string_view key) { auto content = std::vector{}; - auto const filename = tr_strvPath(xdgConfigHome(), "user-dirs.dirs"sv); + auto const filename = fmt::format("{:s}/{:s}"sv, xdgConfigHome(), "user-dirs.dirs"sv); if (!tr_sys_path_exists(filename) || !tr_loadFile(filename, content) || std::empty(content)) { return {}; @@ -248,9 +248,9 @@ char const* tr_getDefaultDownloadDir() if (user_dir == nullptr) { #ifdef __HAIKU__ - user_dir = tr_strvDup(tr_strvPath(getHomeDir(), "Desktop")); + user_dir = tr_strvDup(fmt::format("{:s}/Desktop"sv, getHomeDir())); #else - user_dir = tr_strvDup(tr_strvPath(getHomeDir(), "Downloads")); + user_dir = tr_strvDup(fmt::format("{:s}/Downloads"sv, getHomeDir())); #endif } } @@ -371,7 +371,7 @@ char const* tr_getWebClientDir([[maybe_unused]] tr_session const* session) } else { - candidates.emplace_back(tr_strvPath(getHomeDir(), ".local"sv, "share"sv)); + candidates.emplace_back(fmt::format("{:s}/.local/share"sv, getHomeDir())); } tr_free(tmp); @@ -419,7 +419,7 @@ std::string tr_getSessionIdDir() #else char* program_data_dir = win32_get_known_folder_ex(FOLDERID_ProgramData, KF_FLAG_CREATE); - auto const result = tr_strvPath(program_data_dir, "Transmission"); + auto result = fmt::format("{:s}/Transmission"sv, program_data_dir); tr_free(program_data_dir); tr_sys_dir_create(result, 0, 0); return result; diff --git a/libtransmission/torrent.cc b/libtransmission/torrent.cc index 9913c2836..484094792 100644 --- a/libtransmission/torrent.cc +++ b/libtransmission/torrent.cc @@ -2665,11 +2665,11 @@ static void renameTorrentFileString(tr_torrent* tor, char const* oldpath, char c { if (oldpath_len >= std::size(subpath)) { - name = tr_strvPath(newname); + name = newname; } else { - name = tr_strvPath(newname, subpath.substr(oldpath_len + 1)); + name = fmt::format(FMT_STRING("{:s}/{:s}"sv), newname, subpath.substr(oldpath_len + 1)); } } else @@ -2683,11 +2683,11 @@ static void renameTorrentFileString(tr_torrent* tor, char const* oldpath, char c if (oldpath_len >= std::size(subpath)) { - name = tr_strvPath(tmp, newname); + name = fmt::format(FMT_STRING("{:s}/{:s}"sv), tmp, newname); } else { - name = tr_strvPath(tmp, newname, subpath.substr(oldpath_len + 1)); + name = fmt::format(FMT_STRING("{:s}/{:s}/{:s}"sv), tmp, newname, subpath.substr(oldpath_len + 1)); } } diff --git a/libtransmission/utils.h b/libtransmission/utils.h index 3d5e5978e..726297359 100644 --- a/libtransmission/utils.h +++ b/libtransmission/utils.h @@ -232,27 +232,6 @@ template **** std::string_view utils ***/ -template && ...), bool> = true> -[[nodiscard]] std::string tr_strvPath(T... args) -{ - auto setme = std::string{}; - auto const n_args = sizeof...(args); - auto const n = n_args + (std::size(std::string_view{ args }) + ...); - if (setme.capacity() < n) - { - setme.reserve(n); - } - - auto const foo = [&setme](std::string_view a) - { - setme += a; - setme += TR_PATH_DELIMITER; - }; - (foo(args), ...); - setme.resize(setme.size() - 1); - return setme; -} - template [[nodiscard]] constexpr bool tr_strvContains(std::string_view sv, T key) noexcept // c++23 { diff --git a/tests/libtransmission/test-fixtures.h b/tests/libtransmission/test-fixtures.h index 748182b04..238a0b721 100644 --- a/tests/libtransmission/test-fixtures.h +++ b/tests/libtransmission/test-fixtures.h @@ -27,6 +27,8 @@ #include "gtest/gtest.h" +using namespace std::literals; + inline std::ostream& operator<<(std::ostream& os, tr_error const& err) { os << err.message << ' ' << err.code; @@ -53,7 +55,8 @@ static void depthFirstWalk(char const* path, file_func_t func) { if (strcmp(name, ".") != 0 && strcmp(name, "..") != 0) { - depthFirstWalk(tr_strvPath(path, name).c_str(), func); + auto const child = fmt::format("{:s}/{:s}"sv, path, name); + depthFirstWalk(child.c_str(), func); } } @@ -135,7 +138,7 @@ protected: static std::string create_sandbox(std::string const& parent_dir, std::string const& tmpl) { - auto path = tr_strvPath(parent_dir, tmpl); + auto path = fmt::format(FMT_STRING("{:s}/{:s}"sv), parent_dir, tmpl); tr_sys_dir_create_temp(std::data(path)); tr_sys_path_native_separators(std::data(path)); return path; @@ -310,18 +313,18 @@ private: ensureFormattersInited(); // download dir - auto sv = std::string_view{}; + auto sv = "Downloads"sv; auto q = TR_KEY_download_dir; - auto const download_dir = tr_variantDictFindStrView(settings, q, &sv) ? tr_strvPath(sandboxDir(), sv) : - tr_strvPath(sandboxDir(), "Downloads"); + (void)tr_variantDictFindStrView(settings, q, &sv); + auto const download_dir = tr_pathbuf{ sandboxDir(), '/', sv }; tr_sys_dir_create(download_dir, TR_SYS_DIR_CREATE_PARENTS, 0700); - tr_variantDictAddStr(settings, q, download_dir.data()); + tr_variantDictAddStr(settings, q, download_dir); // incomplete dir + sv = "Incomplete"sv; q = TR_KEY_incomplete_dir; - auto const incomplete_dir = tr_variantDictFindStrView(settings, q, &sv) ? tr_strvPath(sandboxDir(), sv) : - tr_strvPath(sandboxDir(), "Incomplete"); - tr_variantDictAddStr(settings, q, incomplete_dir.c_str()); + (void)tr_variantDictFindStrView(settings, q, &sv); + tr_variantDictAddStr(settings, q, tr_pathbuf{ sandboxDir(), '/', sv }); // blocklists tr_sys_dir_create(tr_pathbuf{ sandboxDir(), "/blocklists" }, TR_SYS_DIR_CREATE_PARENTS, 0700); diff --git a/tests/libtransmission/utils-test.cc b/tests/libtransmission/utils-test.cc index 75df65a09..3b3cb8126 100644 --- a/tests/libtransmission/utils-test.cc +++ b/tests/libtransmission/utils-test.cc @@ -122,18 +122,6 @@ TEST_F(UtilsTest, trStrvDup) tr_free(str); } -TEST_F(UtilsTest, trStrvPath) -{ - EXPECT_EQ("foo" TR_PATH_DELIMITER_STR "bar", tr_strvPath("foo", "bar")); - EXPECT_EQ(TR_PATH_DELIMITER_STR "foo" TR_PATH_DELIMITER_STR "bar", tr_strvPath("", "foo", "bar")); - - EXPECT_EQ("", tr_strvPath(""sv)); - EXPECT_EQ("foo"sv, tr_strvPath("foo"sv)); - EXPECT_EQ( - "foo" TR_PATH_DELIMITER_STR "bar" TR_PATH_DELIMITER_STR "baz" TR_PATH_DELIMITER_STR "mum"sv, - tr_strvPath("foo"sv, "bar", std::string{ "baz" }, "mum"sv)); -} - TEST_F(UtilsTest, trStrvUtf8Clean) { auto in = "hello world"sv;