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