From ec940f0400f34e9194a9d2f74507f41ce3dd962a Mon Sep 17 00:00:00 2001
From: g0dil <g0dil@wiback.org>
Date: Fri, 5 Jun 2009 11:35:32 +0000
Subject: [PATCH] Utils/Console: Implement senf::console::dump() helper
 Utils/Console: Repeat repeated command on console

---
 Utils/Console/Node.cc      | 25 +++++++++++++++++++++++++
 Utils/Console/Node.hh      |  1 +
 Utils/Console/Node.test.cc | 11 +++++++++++
 Utils/Console/Server.cc    |  5 +++--
 4 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/Utils/Console/Node.cc b/Utils/Console/Node.cc
index 5a043179c..69e1bfb24 100644
--- a/Utils/Console/Node.cc
+++ b/Utils/Console/Node.cc
@@ -39,6 +39,31 @@ prefix_ senf::console::DirectoryNode & senf::console::root()
     return *rootNode;
 }
 
+namespace {
+    void dodump(std::ostream & output, unsigned level, senf::console::DirectoryNode & node)
+    {
+        std::string pad (2*level, ' ');
+        senf::console::DirectoryNode::child_iterator i (node.children().begin());
+        senf::console::DirectoryNode::child_iterator const i_end (node.children().end());
+        for (; i != i_end; ++i) {
+            output << pad << i->first;
+            if (i->second->isDirectory()) {
+                output << "/\n";
+                dodump(output, level+1,static_cast<senf::console::DirectoryNode&>(*i->second));
+            }
+            else if (i->second->isLink()) 
+                output << "@ -> " << i->second->followLink().path() << '\n';
+            else
+                output << '\n';
+        }
+    }
+}
+
+prefix_ void senf::console::dump(std::ostream & os, DirectoryNode & dir)
+{
+    dodump(os,0,dir);
+}
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::GenericNode
 
diff --git a/Utils/Console/Node.hh b/Utils/Console/Node.hh
index 4772b45ba..4cd15d103 100644
--- a/Utils/Console/Node.hh
+++ b/Utils/Console/Node.hh
@@ -224,6 +224,7 @@ namespace console {
     class CommandNode;
 
     DirectoryNode & root();
+    void dump(std::ostream & os, DirectoryNode & dir=root());
 
     /** \brief Config/console node tree base-class
 
diff --git a/Utils/Console/Node.test.cc b/Utils/Console/Node.test.cc
index aeea861d3..f88b91d93 100644
--- a/Utils/Console/Node.test.cc
+++ b/Utils/Console/Node.test.cc
@@ -117,6 +117,17 @@ BOOST_AUTO_UNIT_TEST(directoryNode)
     p->shortdoc("short doc");
     BOOST_CHECK_EQUAL( p->shorthelp(), "short doc" );
 
+    ss.str("");
+    senf::console::root()["dir2"].mkdir("dir4");
+    senf::console::root()["dir2"].link("link", *p);
+    senf::console::root()["dir2"]["dir4"].link("link", senf::console::root());
+    senf::console::dump(ss, senf::console::root()["dir2"]);
+    BOOST_CHECK_EQUAL( ss.str(),
+                       "dir3/\n"
+                       "dir4/\n"
+                       "  link@ -> /\n"
+                       "link@ -> /dir1\n" );
+
     BOOST_CHECK( senf::console::root().remove("dir1") == p );
     senf::console::root().remove("dir2");
     senf::console::root().remove("fn");
diff --git a/Utils/Console/Server.cc b/Utils/Console/Server.cc
index afcf92282..26a625fc2 100644
--- a/Utils/Console/Server.cc
+++ b/Utils/Console/Server.cc
@@ -284,9 +284,10 @@ prefix_ void senf::console::Client::setNoninteractive()
 prefix_ std::string::size_type senf::console::Client::handleInput(std::string data,
                                                                   bool incremental)
 {
-    if (data.empty() && ! incremental)
+    if (data.empty() && ! incremental) {
         data = lastCommand_;
-    else
+        stream() << "repeat: " << data << std::endl;
+    } else
         lastCommand_ = data;
 
     std::string::size_type n (data.size());
-- 
GitLab