refactor: remove tr_strvPath() (#3509)

This commit is contained in:
Charles Kerr 2022-07-22 13:07:23 -05:00 committed by GitHub
parent 0da1cbb6ec
commit 9bf2918ad0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 28 additions and 58 deletions

View File

@ -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<char>{};
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;

View File

@ -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));
}
}

View File

@ -232,27 +232,6 @@ template<typename T>
**** std::string_view utils
***/
template<typename... T, typename std::enable_if_t<(std::is_convertible_v<T, std::string_view> && ...), 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<typename T>
[[nodiscard]] constexpr bool tr_strvContains(std::string_view sv, T key) noexcept // c++23
{

View File

@ -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);

View File

@ -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;