mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-25 10:43:19 -03:00
Replace fs::absolute calls with AbsPathJoin calls
This adds better test coverage and will make it easier in #20744 to remove our dependency on the two-argument boost::filesystem::absolute() function which does not have a direct equivalent in C++17.
This commit is contained in:
parent
66576c4fd5
commit
da9caa1ced
8 changed files with 41 additions and 7 deletions
|
@ -31,6 +31,12 @@ FILE *fopen(const fs::path& p, const char *mode)
|
|||
#endif
|
||||
}
|
||||
|
||||
fs::path AbsPathJoin(const fs::path& base, const fs::path& path)
|
||||
{
|
||||
assert(base.is_absolute());
|
||||
return fs::absolute(path, base);
|
||||
}
|
||||
|
||||
#ifndef WIN32
|
||||
|
||||
static std::string GetErrorReason()
|
||||
|
|
11
src/fs.h
11
src/fs.h
|
@ -21,6 +21,17 @@ namespace fs = boost::filesystem;
|
|||
namespace fsbridge {
|
||||
FILE *fopen(const fs::path& p, const char *mode);
|
||||
|
||||
/**
|
||||
* Helper function for joining two paths
|
||||
*
|
||||
* @param[in] base Base path
|
||||
* @param[in] path Path to combine with base
|
||||
* @returns path unchanged if it is an absolute path, otherwise returns base joined with path. Returns base unchanged if path is empty.
|
||||
* @pre Base path must be absolute
|
||||
* @post Returned path will always be absolute
|
||||
*/
|
||||
fs::path AbsPathJoin(const fs::path& base, const fs::path& path);
|
||||
|
||||
class FileLock
|
||||
{
|
||||
public:
|
||||
|
|
|
@ -2399,10 +2399,10 @@ static RPCHelpMan dumptxoutset()
|
|||
},
|
||||
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
|
||||
{
|
||||
fs::path path = fs::absolute(request.params[0].get_str(), GetDataDir());
|
||||
const fs::path path = fsbridge::AbsPathJoin(GetDataDir(), request.params[0].get_str());
|
||||
// Write to a temporary path and then move into `path` on completion
|
||||
// to avoid confusion due to an interruption.
|
||||
fs::path temppath = fs::absolute(request.params[0].get_str() + ".incomplete", GetDataDir());
|
||||
const fs::path temppath = fsbridge::AbsPathJoin(GetDataDir(), request.params[0].get_str() + ".incomplete");
|
||||
|
||||
if (fs::exists(path)) {
|
||||
throw JSONRPCError(
|
||||
|
|
|
@ -52,6 +52,23 @@ BOOST_AUTO_TEST_CASE(fsbridge_fstream)
|
|||
file >> input_buffer;
|
||||
BOOST_CHECK_EQUAL(input_buffer, "bitcoin");
|
||||
}
|
||||
{
|
||||
// Join an absolute path and a relative path.
|
||||
fs::path p = fsbridge::AbsPathJoin(tmpfolder, "fs_tests_₿_🏃");
|
||||
BOOST_CHECK(p.is_absolute());
|
||||
BOOST_CHECK_EQUAL(tmpfile1, p);
|
||||
}
|
||||
{
|
||||
// Join two absolute paths.
|
||||
fs::path p = fsbridge::AbsPathJoin(tmpfile1, tmpfile2);
|
||||
BOOST_CHECK(p.is_absolute());
|
||||
BOOST_CHECK_EQUAL(tmpfile2, p);
|
||||
}
|
||||
{
|
||||
// Ensure joining with empty paths does not add trailing path components.
|
||||
BOOST_CHECK_EQUAL(tmpfile1, fsbridge::AbsPathJoin(tmpfile1, ""));
|
||||
BOOST_CHECK_EQUAL(tmpfile1, fsbridge::AbsPathJoin(tmpfile1, {}));
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
|
|
@ -398,7 +398,7 @@ bool ArgsManager::GetSettingsPath(fs::path* filepath, bool temp) const
|
|||
}
|
||||
if (filepath) {
|
||||
std::string settings = GetArg("-settings", BITCOIN_SETTINGS_FILENAME);
|
||||
*filepath = fs::absolute(temp ? settings + ".tmp" : settings, GetDataDir(/* net_specific= */ true));
|
||||
*filepath = fsbridge::AbsPathJoin(GetDataDir(/* net_specific= */ true), temp ? settings + ".tmp" : settings);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -1311,7 +1311,7 @@ fs::path AbsPathForConfigVal(const fs::path& path, bool net_specific)
|
|||
if (path.is_absolute()) {
|
||||
return path;
|
||||
}
|
||||
return fs::absolute(path, GetDataDir(net_specific));
|
||||
return fsbridge::AbsPathJoin(GetDataDir(net_specific), path);
|
||||
}
|
||||
|
||||
void ScheduleBatchPriority()
|
||||
|
|
|
@ -62,7 +62,7 @@ bool VerifyWallets(interfaces::Chain& chain)
|
|||
std::set<fs::path> wallet_paths;
|
||||
|
||||
for (const auto& wallet_file : gArgs.GetArgs("-wallet")) {
|
||||
const fs::path path = fs::absolute(wallet_file, GetWalletDir());
|
||||
const fs::path path = fsbridge::AbsPathJoin(GetWalletDir(), wallet_file);
|
||||
|
||||
if (!wallet_paths.insert(path).second) {
|
||||
chain.initWarning(strprintf(_("Ignoring duplicate -wallet %s."), wallet_file));
|
||||
|
|
|
@ -3780,7 +3780,7 @@ std::unique_ptr<WalletDatabase> MakeWalletDatabase(const std::string& name, cons
|
|||
// 2. Path to an existing directory.
|
||||
// 3. Path to a symlink to a directory.
|
||||
// 4. For backwards compatibility, the name of a data file in -walletdir.
|
||||
const fs::path& wallet_path = fs::absolute(name, GetWalletDir());
|
||||
const fs::path wallet_path = fsbridge::AbsPathJoin(GetWalletDir(), name);
|
||||
fs::file_type path_type = fs::symlink_status(wallet_path).type();
|
||||
if (!(path_type == fs::file_not_found || path_type == fs::directory_file ||
|
||||
(path_type == fs::symlink_file && fs::is_directory(wallet_path)) ||
|
||||
|
|
|
@ -105,7 +105,7 @@ static void WalletShowInfo(CWallet* wallet_instance)
|
|||
|
||||
bool ExecuteWalletToolFunc(const ArgsManager& args, const std::string& command, const std::string& name)
|
||||
{
|
||||
fs::path path = fs::absolute(name, GetWalletDir());
|
||||
const fs::path path = fsbridge::AbsPathJoin(GetWalletDir(), name);
|
||||
|
||||
if (args.IsArgSet("-format") && command != "createfromdump") {
|
||||
tfm::format(std::cerr, "The -format option can only be used with the \"createfromdump\" command.\n");
|
||||
|
|
Loading…
Add table
Reference in a new issue