From 51afebdab218f2ab4af8ed21044c3dec0ef5461d Mon Sep 17 00:00:00 2001
From: g0dil <g0dil@wiback.org>
Date: Wed, 3 Jun 2009 14:47:16 +0000
Subject: [PATCH] Utils/Console: Add short help to 'ls' output

---
 Utils/Console/Executor.cc           | 19 +++++++++++--------
 Utils/Console/Executor.test.cc      |  9 ++++++---
 Utils/Console/OverloadedCommand.cc  | 11 ++++++++++-
 Utils/Console/ParsedCommand.test.cc |  2 +-
 4 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/Utils/Console/Executor.cc b/Utils/Console/Executor.cc
index 3bfa19bd4..e3f09216f 100644
--- a/Utils/Console/Executor.cc
+++ b/Utils/Console/Executor.cc
@@ -30,6 +30,7 @@
 #include <boost/utility.hpp>
 #include <boost/range/iterator_range.hpp>
 #include <boost/bind.hpp>
+#include <boost/format.hpp>
 #include "../../Utils/senfassert.hh"
 #include "../../Utils/Range.hh"
 #include "../../Utils/String.hh"
@@ -222,14 +223,16 @@ prefix_ void senf::console::Executor::ls(std::ostream & output,
     DirectoryNode & node (*dir.back().lock());
     DirectoryNode::child_iterator i (node.children().begin());
     DirectoryNode::child_iterator const i_end (node.children().end());
-    for (; i != i_end; ++i) {
-        output << i->first;
-        if (i->second->isDirectory())
-            output << "/";
-        else if (i->second->isLink())
-            output << "@";
-        output << "\n";
-    }
+    boost::format fmt ("%s%s  %|20t|%.59s\n");
+    for (; i != i_end; ++i)
+        output << fmt
+            % i->first
+            % ( i->second->isDirectory()
+                ? "/"
+                : i->second->isLink()
+                ? "@"
+                : "" )
+            % i->second->shorthelp();
 }
 
 prefix_ void senf::console::Executor::pushd(ParseCommandInfo::TokensRange dir)
diff --git a/Utils/Console/Executor.test.cc b/Utils/Console/Executor.test.cc
index 833aa4559..f02943bf2 100644
--- a/Utils/Console/Executor.test.cc
+++ b/Utils/Console/Executor.test.cc
@@ -99,7 +99,10 @@ BOOST_AUTO_UNIT_TEST(executor)
         parser.parse("ls", &setCommand);
         executor(os, commands.back());
         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinLS );
-        BOOST_CHECK_EQUAL( os.str(), "dir1/\ndir2/\nsys/\n" );
+        BOOST_CHECK_EQUAL( os.str(), 
+                           "dir1/               \n"
+                           "dir2/               Helptext\n"
+                           "sys/                \n" );
     }
 
     {
@@ -107,7 +110,7 @@ BOOST_AUTO_UNIT_TEST(executor)
         parser.parse("ls dir1", &setCommand);
         executor(os, commands.back());
         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinLS );
-        BOOST_CHECK_EQUAL( os.str(), "dir3/\n" );
+        BOOST_CHECK_EQUAL( os.str(), "dir3/               \n" );
     }
 
     {
@@ -213,7 +216,7 @@ BOOST_AUTO_UNIT_TEST(executorPolicy)
         parser.parse("ls dir1", &setCommand);
         executor(os, commands.back());
         BOOST_CHECK_EQUAL( commands.back().builtin(), senf::console::ParseCommandInfo::BuiltinLS );
-        BOOST_CHECK_EQUAL( os.str(), "dir3/\n" );
+        BOOST_CHECK_EQUAL( os.str(), "dir3/               \n" );
     }
 
     {
diff --git a/Utils/Console/OverloadedCommand.cc b/Utils/Console/OverloadedCommand.cc
index 8a0c631ca..cb405a78b 100644
--- a/Utils/Console/OverloadedCommand.cc
+++ b/Utils/Console/OverloadedCommand.cc
@@ -160,7 +160,16 @@ prefix_ std::string senf::console::OverloadedCommandNode::v_shorthelp()
 {
     if (!shortdoc_.empty())
         return shortdoc_;
-    return doc_.substr(0,doc_.find('\n'));
+    if (!doc_.empty())
+        return doc_.substr(0,doc_.find('\n'));
+    Overloads::const_iterator i (overloads_.begin());
+    Overloads::const_iterator const i_end (overloads_.end());
+    for (; i != i_end; ++i) {
+        std::string overloadDoc ((*i)->doc());
+        if (! overloadDoc.empty()) 
+            return overloadDoc.substr(0,doc_.find('\n'));
+    }
+    return "";
 }
 
 prefix_ void senf::console::OverloadedCommandNode::v_execute(boost::any & rv,
diff --git a/Utils/Console/ParsedCommand.test.cc b/Utils/Console/ParsedCommand.test.cc
index 74f57d735..595365848 100644
--- a/Utils/Console/ParsedCommand.test.cc
+++ b/Utils/Console/ParsedCommand.test.cc
@@ -303,7 +303,7 @@ BOOST_AUTO_UNIT_TEST(directoryReturn)
         SENF_CHECK_NO_THROW(
             parser.parse("test/test { ls; }",
                          boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
-        BOOST_CHECK_EQUAL( ss.str(), "<Directory at '/test/dircb'>\ncb1\n" );
+        BOOST_CHECK_EQUAL( ss.str(), "<Directory at '/test/dircb'>\ncb1                 \n" );
     }
     
 }
-- 
GitLab