mirror of
https://github.com/transmission/transmission
synced 2024-12-26 09:37:56 +00:00
refactor: remove tr_strvPath() (#3509)
This commit is contained in:
parent
0da1cbb6ec
commit
9bf2918ad0
5 changed files with 28 additions and 58 deletions
|
@ -121,7 +121,7 @@ static std::string xdgConfigHome()
|
||||||
return ret;
|
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)
|
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
|
#endif
|
||||||
|
|
||||||
session->config_dir = config_dir;
|
session->config_dir = config_dir;
|
||||||
session->resume_dir = tr_strvPath(config_dir, ResumeSubdir);
|
session->resume_dir = fmt::format("{:s}/{:s}"sv, config_dir, ResumeSubdir);
|
||||||
session->torrent_dir = tr_strvPath(config_dir, TorrentSubdir);
|
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->resume_dir, TR_SYS_DIR_CREATE_PARENTS, 0777);
|
||||||
tr_sys_dir_create(session->torrent_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__
|
#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)
|
#elif defined(_WIN32)
|
||||||
|
|
||||||
char* appdata = win32_get_known_folder(FOLDERID_LocalAppData);
|
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);
|
tr_free(appdata);
|
||||||
|
|
||||||
#elif defined(__HAIKU__)
|
#elif defined(__HAIKU__)
|
||||||
|
|
||||||
char buf[PATH_MAX];
|
char buf[PATH_MAX];
|
||||||
find_directory(B_USER_SETTINGS_DIRECTORY, -1, true, buf, sizeof(buf));
|
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
|
#else
|
||||||
|
|
||||||
s = tr_strvDup(tr_strvPath(xdgConfigHome(), appname));
|
s = tr_strvDup(fmt::format("{:s}/{:s}"sv, xdgConfigHome(), appname));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -196,7 +196,7 @@ char const* tr_getDefaultConfigDir(char const* appname)
|
||||||
static std::string getXdgEntryFromUserDirs(std::string_view key)
|
static std::string getXdgEntryFromUserDirs(std::string_view key)
|
||||||
{
|
{
|
||||||
auto content = std::vector<char>{};
|
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))
|
if (!tr_sys_path_exists(filename) || !tr_loadFile(filename, content) || std::empty(content))
|
||||||
{
|
{
|
||||||
return {};
|
return {};
|
||||||
|
@ -248,9 +248,9 @@ char const* tr_getDefaultDownloadDir()
|
||||||
if (user_dir == nullptr)
|
if (user_dir == nullptr)
|
||||||
{
|
{
|
||||||
#ifdef __HAIKU__
|
#ifdef __HAIKU__
|
||||||
user_dir = tr_strvDup(tr_strvPath(getHomeDir(), "Desktop"));
|
user_dir = tr_strvDup(fmt::format("{:s}/Desktop"sv, getHomeDir()));
|
||||||
#else
|
#else
|
||||||
user_dir = tr_strvDup(tr_strvPath(getHomeDir(), "Downloads"));
|
user_dir = tr_strvDup(fmt::format("{:s}/Downloads"sv, getHomeDir()));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -371,7 +371,7 @@ char const* tr_getWebClientDir([[maybe_unused]] tr_session const* session)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
candidates.emplace_back(tr_strvPath(getHomeDir(), ".local"sv, "share"sv));
|
candidates.emplace_back(fmt::format("{:s}/.local/share"sv, getHomeDir()));
|
||||||
}
|
}
|
||||||
tr_free(tmp);
|
tr_free(tmp);
|
||||||
|
|
||||||
|
@ -419,7 +419,7 @@ std::string tr_getSessionIdDir()
|
||||||
#else
|
#else
|
||||||
|
|
||||||
char* program_data_dir = win32_get_known_folder_ex(FOLDERID_ProgramData, KF_FLAG_CREATE);
|
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_free(program_data_dir);
|
||||||
tr_sys_dir_create(result, 0, 0);
|
tr_sys_dir_create(result, 0, 0);
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -2665,11 +2665,11 @@ static void renameTorrentFileString(tr_torrent* tor, char const* oldpath, char c
|
||||||
{
|
{
|
||||||
if (oldpath_len >= std::size(subpath))
|
if (oldpath_len >= std::size(subpath))
|
||||||
{
|
{
|
||||||
name = tr_strvPath(newname);
|
name = newname;
|
||||||
}
|
}
|
||||||
else
|
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
|
else
|
||||||
|
@ -2683,11 +2683,11 @@ static void renameTorrentFileString(tr_torrent* tor, char const* oldpath, char c
|
||||||
|
|
||||||
if (oldpath_len >= std::size(subpath))
|
if (oldpath_len >= std::size(subpath))
|
||||||
{
|
{
|
||||||
name = tr_strvPath(tmp, newname);
|
name = fmt::format(FMT_STRING("{:s}/{:s}"sv), tmp, newname);
|
||||||
}
|
}
|
||||||
else
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -232,27 +232,6 @@ template<typename T>
|
||||||
**** std::string_view utils
|
**** 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>
|
template<typename T>
|
||||||
[[nodiscard]] constexpr bool tr_strvContains(std::string_view sv, T key) noexcept // c++23
|
[[nodiscard]] constexpr bool tr_strvContains(std::string_view sv, T key) noexcept // c++23
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,6 +27,8 @@
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
using namespace std::literals;
|
||||||
|
|
||||||
inline std::ostream& operator<<(std::ostream& os, tr_error const& err)
|
inline std::ostream& operator<<(std::ostream& os, tr_error const& err)
|
||||||
{
|
{
|
||||||
os << err.message << ' ' << err.code;
|
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)
|
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)
|
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_dir_create_temp(std::data(path));
|
||||||
tr_sys_path_native_separators(std::data(path));
|
tr_sys_path_native_separators(std::data(path));
|
||||||
return path;
|
return path;
|
||||||
|
@ -310,18 +313,18 @@ private:
|
||||||
ensureFormattersInited();
|
ensureFormattersInited();
|
||||||
|
|
||||||
// download dir
|
// download dir
|
||||||
auto sv = std::string_view{};
|
auto sv = "Downloads"sv;
|
||||||
auto q = TR_KEY_download_dir;
|
auto q = TR_KEY_download_dir;
|
||||||
auto const download_dir = tr_variantDictFindStrView(settings, q, &sv) ? tr_strvPath(sandboxDir(), sv) :
|
(void)tr_variantDictFindStrView(settings, q, &sv);
|
||||||
tr_strvPath(sandboxDir(), "Downloads");
|
auto const download_dir = tr_pathbuf{ sandboxDir(), '/', sv };
|
||||||
tr_sys_dir_create(download_dir, TR_SYS_DIR_CREATE_PARENTS, 0700);
|
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
|
// incomplete dir
|
||||||
|
sv = "Incomplete"sv;
|
||||||
q = TR_KEY_incomplete_dir;
|
q = TR_KEY_incomplete_dir;
|
||||||
auto const incomplete_dir = tr_variantDictFindStrView(settings, q, &sv) ? tr_strvPath(sandboxDir(), sv) :
|
(void)tr_variantDictFindStrView(settings, q, &sv);
|
||||||
tr_strvPath(sandboxDir(), "Incomplete");
|
tr_variantDictAddStr(settings, q, tr_pathbuf{ sandboxDir(), '/', sv });
|
||||||
tr_variantDictAddStr(settings, q, incomplete_dir.c_str());
|
|
||||||
|
|
||||||
// blocklists
|
// blocklists
|
||||||
tr_sys_dir_create(tr_pathbuf{ sandboxDir(), "/blocklists" }, TR_SYS_DIR_CREATE_PARENTS, 0700);
|
tr_sys_dir_create(tr_pathbuf{ sandboxDir(), "/blocklists" }, TR_SYS_DIR_CREATE_PARENTS, 0700);
|
||||||
|
|
|
@ -122,18 +122,6 @@ TEST_F(UtilsTest, trStrvDup)
|
||||||
tr_free(str);
|
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)
|
TEST_F(UtilsTest, trStrvUtf8Clean)
|
||||||
{
|
{
|
||||||
auto in = "hello world"sv;
|
auto in = "hello world"sv;
|
||||||
|
|
Loading…
Reference in a new issue