diff --git a/Scheduler/Console/Executor.cc b/Scheduler/Console/Executor.cc index 8f054c789c70885b7cc01fb76220189235cfbc2d..d6218d8c7972446987b1bd5e450fe29f91be2444 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 2c33677817016f4de70bfd79abe9182aaba91194..705622e1699a5e02933a08fe5aa8f52e3aaa1530 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"); }