Skip to content

Commit 540ca51

Browse files
hebastoryanofsky
andcommitted
util: Add ArgsManager::GetPathArg() function
Co-authored-by: Ryan Ofsky <[email protected]>
1 parent 5e8e0b3 commit 540ca51

File tree

3 files changed

+109
-0
lines changed

3 files changed

+109
-0
lines changed

src/test/getarg_tests.cpp

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,98 @@ BOOST_AUTO_TEST_CASE(intarg)
159159
BOOST_CHECK_EQUAL(m_local_args.GetIntArg("-bar", 11), 0);
160160
}
161161

162+
BOOST_AUTO_TEST_CASE(patharg)
163+
{
164+
const auto dir = std::make_pair("-dir", ArgsManager::ALLOW_ANY);
165+
SetupArgs({dir});
166+
ResetArgs("");
167+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), fs::path{});
168+
169+
const fs::path root_path{"/"};
170+
ResetArgs("-dir=/");
171+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), root_path);
172+
173+
ResetArgs("-dir=/.");
174+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), root_path);
175+
176+
ResetArgs("-dir=/./");
177+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), root_path);
178+
179+
ResetArgs("-dir=/.//");
180+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), root_path);
181+
182+
#ifdef WIN32
183+
const fs::path win_root_path{"C:\\"};
184+
ResetArgs("-dir=C:\\");
185+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), win_root_path);
186+
187+
ResetArgs("-dir=C:/");
188+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), win_root_path);
189+
190+
ResetArgs("-dir=C:\\\\");
191+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), win_root_path);
192+
193+
ResetArgs("-dir=C:\\.");
194+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), win_root_path);
195+
196+
ResetArgs("-dir=C:\\.\\");
197+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), win_root_path);
198+
199+
ResetArgs("-dir=C:\\.\\\\");
200+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), win_root_path);
201+
#endif
202+
203+
const fs::path absolute_path{"/home/user/.bitcoin"};
204+
ResetArgs("-dir=/home/user/.bitcoin");
205+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), absolute_path);
206+
207+
ResetArgs("-dir=/root/../home/user/.bitcoin");
208+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), absolute_path);
209+
210+
ResetArgs("-dir=/home/./user/.bitcoin");
211+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), absolute_path);
212+
213+
ResetArgs("-dir=/home/user/.bitcoin/");
214+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), absolute_path);
215+
216+
ResetArgs("-dir=/home/user/.bitcoin//");
217+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), absolute_path);
218+
219+
ResetArgs("-dir=/home/user/.bitcoin/.");
220+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), absolute_path);
221+
222+
ResetArgs("-dir=/home/user/.bitcoin/./");
223+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), absolute_path);
224+
225+
ResetArgs("-dir=/home/user/.bitcoin/.//");
226+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), absolute_path);
227+
228+
const fs::path relative_path{"user/.bitcoin"};
229+
ResetArgs("-dir=user/.bitcoin");
230+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), relative_path);
231+
232+
ResetArgs("-dir=somewhere/../user/.bitcoin");
233+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), relative_path);
234+
235+
ResetArgs("-dir=user/./.bitcoin");
236+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), relative_path);
237+
238+
ResetArgs("-dir=user/.bitcoin/");
239+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), relative_path);
240+
241+
ResetArgs("-dir=user/.bitcoin//");
242+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), relative_path);
243+
244+
ResetArgs("-dir=user/.bitcoin/.");
245+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), relative_path);
246+
247+
ResetArgs("-dir=user/.bitcoin/./");
248+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), relative_path);
249+
250+
ResetArgs("-dir=user/.bitcoin/.//");
251+
BOOST_CHECK_EQUAL(m_local_args.GetPathArg("-dir"), relative_path);
252+
}
253+
162254
BOOST_AUTO_TEST_CASE(doubledash)
163255
{
164256
const auto foo = std::make_pair("-foo", ArgsManager::ALLOW_ANY);

src/util/system.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,13 @@ std::optional<unsigned int> ArgsManager::GetArgFlags(const std::string& name) co
399399
return std::nullopt;
400400
}
401401

402+
fs::path ArgsManager::GetPathArg(std::string pathlike_arg) const
403+
{
404+
auto result = fs::PathFromString(GetArg(pathlike_arg, "")).lexically_normal();
405+
// Remove trailing slash, if present.
406+
return result.has_filename() ? result : result.parent_path();
407+
}
408+
402409
const fs::path& ArgsManager::GetBlocksDirPath() const
403410
{
404411
LOCK(cs_args);

src/util/system.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,16 @@ class ArgsManager
264264
*/
265265
std::optional<const Command> GetCommand() const;
266266

267+
/**
268+
* Get a normalized path from a specified pathlike argument
269+
*
270+
* It is guaranteed that the returned path has no trailing slashes.
271+
*
272+
* @param pathlike_arg Pathlike argument to get a path from (e.g., "-datadir", "-blocksdir" or "-walletdir")
273+
* @return Normalized path which is get from a specified pathlike argument
274+
*/
275+
fs::path GetPathArg(std::string pathlike_arg) const;
276+
267277
/**
268278
* Get blocks directory path
269279
*

0 commit comments

Comments
 (0)