From 3c79c686d86bf3fc2a7e4f10011ac3fe6e1af640 Mon Sep 17 00:00:00 2001 From: g0dil <g0dil@wiback.org> Date: Thu, 27 Nov 2008 09:35:27 +0000 Subject: [PATCH] Scheduler/Console: Make '..' work in Console (closes: #14754) --- Scheduler/Console/Executor.cc | 11 ++++++++++- Scheduler/Console/Executor.test.cc | 20 ++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Scheduler/Console/Executor.cc b/Scheduler/Console/Executor.cc index 8f054c789..d6218d8c7 100644 --- a/Scheduler/Console/Executor.cc +++ b/Scheduler/Console/Executor.cc @@ -249,8 +249,17 @@ senf::console::Executor::traverseNode(ParseCommandInfo::TokensRange const & path path.begin(), boost::prior(path.end())), dir); + // For auto-cd support we need to check against '.' and '..' here too + Token const & tok (*boost::prior(path.end())); + if (tok == WordToken("..")) { + if (dir.size() > 1) + dir.pop_back(); + return *dir.back().lock(); + } DirectoryNode & base (*dir.back().lock()); - std::string const & name (complete(base, boost::prior(path.end())->value())); + if (tok == WordToken(".")) + return base; + std::string const & name (complete(base, tok.value())); if (policy_) policy_( base, name ); return dir.back().lock()->get(name); diff --git a/Scheduler/Console/Executor.test.cc b/Scheduler/Console/Executor.test.cc index 2c3367781..705622e16 100644 --- a/Scheduler/Console/Executor.test.cc +++ b/Scheduler/Console/Executor.test.cc @@ -231,7 +231,7 @@ BOOST_AUTO_UNIT_TEST(executorPolicy) BOOST_AUTO_UNIT_TEST(executorAuto) { - senf::console::root().mkdir("dir1").mkdir("dir3"); + senf::console::root().mkdir("tdir1").mkdir("dir3"); senf::console::root().mkdir("dir2").doc("Helptext").add("test",&testCommand); senf::console::Executor executor; @@ -247,6 +247,22 @@ BOOST_AUTO_UNIT_TEST(executorAuto) BOOST_CHECK_EQUAL( executor.cwdPath(), "/dir2" ); BOOST_CHECK_EQUAL( os.str(), "" ); } + + { + std::stringstream os; + parser.parse("..", &setCommand); + executor(os, commands.back()); + BOOST_CHECK_EQUAL( executor.cwdPath(), "/" ); + BOOST_CHECK_EQUAL( os.str(), "" ); + } + + { + std::stringstream os; + parser.parse("d", &setCommand); + executor(os, commands.back()); + BOOST_CHECK_EQUAL( executor.cwdPath(), "/dir2" ); + BOOST_CHECK_EQUAL( os.str(), "" ); + } { std::stringstream os; @@ -257,7 +273,7 @@ BOOST_AUTO_UNIT_TEST(executorAuto) commands.clear(); - senf::console::root().remove("dir1"); + senf::console::root().remove("tdir1"); senf::console::root().remove("dir2"); } -- GitLab