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