qpid-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jim Meyering <...@meyering.net>
Subject better --help output for qpidd; new option --version
Date Tue, 05 Dec 2006 21:43:11 GMT
I started off writing patches to make qpidd's --help output regular
enough so that we can use help2man <http://www.gnu.org/software/help2man/>
to automatically generate a man page for it.

With the following patch, qpidd --help prints this:

--------------------
Usage: qpidd [OPTION]...
Start the Qpid broker daemon.

Options:
  -t, --trace
            Print incoming & outgoing frames to the console (default=false)
  -p, --port <value>
            Set the port to listen on (default=5672)
      --worker-threads <value>
            Set the number of worker threads to use (default=5).
      --max-connections <value>
            Set the maximum number of connections the broker can accept (default=500).
      --connection-backlog <value>
            Set the connection backlog for the servers socket (default=10)
  -s, --store <value>
            Set the message store module to use (default='' which implies no store)
      --help
            Print usage information
      --version
            Print version information

Report bugs to <qpid-dev@incubator.apache.org>.
--------------------

I also added a new option, --version.
It prints using this familiar format:

  qpidd (qpid) version 0.1

That's "program_name" (package name) and the package
version number recorded early in configure.ac:

  AC_INIT([qpid], [0.1], [qpid-dev@incubator.apache.org])

This is similar to the --version output from programs like
GNU ls, cp, rm, mv, etc.

-------------------------------------------------------------------------
Here's the patch:
[I see I also removed trailing spaces in Configuration.cpp.
 If that's a problem, let me know and I'll resubmit without
 those hunks.  ]

2006-12-05  Jim Meyering  <meyering@redhat.com>

	Improve --help output.  Add --version option.
	* lib/broker/Configuration.cpp: Include <config.h>.
	(Configuration::Configuration): Use the active voice.
	Handle --version.
	(Configuration::usage): Add Usage:... and bug-reporting address.
	Output short+long options like "-o, --option ...", so that help2man
	will format them properly.
	* lib/broker/Configuration.h:
	(class Configuration) [version, programName]: New members.
	(parse): Update prototype.
	(isVersion, setValue): New prototypes.
	* src/qpidd.cpp: Include <config.h>.
	(programName): New file-scoped global.
	(handle_signal, main): Emit diagnostics to stderr.
	(main): Pass program name to config.parse.
	(main): Handle new --version option.

Index: lib/broker/Configuration.cpp
===================================================================
--- lib/broker/Configuration.cpp	(revision 482785)
+++ lib/broker/Configuration.cpp	(working copy)
@@ -7,9 +7,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *   http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -20,18 +20,20 @@
  */
 #include <Configuration.h>
 #include <string.h>
+#include <config.h>

 using namespace qpid::broker;
 using namespace std;

-Configuration::Configuration() : 
+Configuration::Configuration() :
     trace('t', "trace", "Print incoming & outgoing frames to the console (default=false)",
false),
-    port('p', "port", "Sets the port to listen on (default=5672)", 5672),
-    workerThreads("worker-threads", "Sets the number of worker threads to use (default=5).",
5),
-    maxConnections("max-connections", "Sets the maximum number of connections the broker
can accept (default=500).", 500),
-    connectionBacklog("connection-backlog", "Sets the connection backlog for the servers
socket (default=10)", 10),
-    store('s', "store", "Sets the message store module to use (default='' which implies no
store)", ""),
-    help("help", "Prints usage information", false)
+    port('p', "port", "Set the port to listen on (default=5672)", 5672),
+    workerThreads("worker-threads", "Set the number of worker threads to use (default=5).",
5),
+    maxConnections("max-connections", "Set the maximum number of connections the broker can
accept (default=500).", 500),
+    connectionBacklog("connection-backlog", "Set the connection backlog for the servers socket
(default=10)", 10),
+    store('s', "store", "Set the message store module to use (default='' which implies no
store)", ""),
+    help("help", "Print usage information", false),
+    version("version", "Print version information", false)
 {
     options.push_back(&trace);
     options.push_back(&port);
@@ -40,11 +42,13 @@
     options.push_back(&connectionBacklog);
     options.push_back(&store);
     options.push_back(&help);
+    options.push_back(&version);
 }

 Configuration::~Configuration(){}

-void Configuration::parse(int argc, char** argv){
+void Configuration::parse(char const *progName, int argc, char** argv){
+    programName = progName;
     int position = 1;
     while(position < argc){
         bool matched(false);
@@ -59,15 +63,25 @@
 }

 void Configuration::usage(){
+    std::cout << "Usage: " << programName << " [OPTION]..." << std::endl
+	      << "Start the Qpid broker daemon." << std::endl << std::endl
+	      << "Options:" << std::endl;
     for(op_iterator i = options.begin(); i < options.end(); i++){
         (*i)->print(std::cout);
     }
+
+    std::cout << std::endl << "Report bugs to <" << PACKAGE_BUGREPORT
<< ">."
+	      << std::endl;
 }

 bool Configuration::isHelp() const {
     return help.getValue();
 }

+bool Configuration::isVersion() const {
+    return version.getValue();
+}
+
 bool Configuration::isTrace() const {
     return trace.getValue();
 }
@@ -92,10 +106,10 @@
     return store.getValue();
 }

-Configuration::Option::Option(const char _flag, const string& _name, const string&
_desc) : 
+Configuration::Option::Option(const char _flag, const string& _name, const string&
_desc) :
     flag(string("-") + _flag), name("--" +_name), desc(_desc) {}

-Configuration::Option::Option(const string& _name, const string& _desc) : 
+Configuration::Option::Option(const string& _name, const string& _desc) :
     flag(""), name("--" + _name), desc(_desc) {}

 Configuration::Option::~Option(){}
@@ -121,12 +135,14 @@
 }

 void Configuration::Option::print(ostream& out) const {
-    out << "    ";
+    out << "  ";
     if(flag.length() > 0){
-        out << flag << " or ";
+        out << flag << ", ";
+    } else {
+        out << "    ";
     }
     out << name;
-    if(needsValue()) out << "<value>";
+    if(needsValue()) out << " <value>";
     out << std::endl;
     out << "            " << desc << std::endl;
 }
@@ -134,10 +150,10 @@

 // String Option:

-Configuration::StringOption::StringOption(const char _flag, const string& _name, const
string& _desc, const string _value) : 
+Configuration::StringOption::StringOption(const char _flag, const string& _name, const
string& _desc, const string _value) :
     Option(_flag,_name,_desc), defaultValue(_value), value(_value) {}

-Configuration::StringOption::StringOption(const string& _name, const string& _desc,
const string _value) : 
+Configuration::StringOption::StringOption(const string& _name, const string& _desc,
const string _value) :
     Option(_name,_desc), defaultValue(_value), value(_value) {}

 Configuration::StringOption::~StringOption(){}
@@ -156,10 +172,10 @@

 // Int Option:

-Configuration::IntOption::IntOption(const char _flag, const string& _name, const string&
_desc, const int _value) : 
+Configuration::IntOption::IntOption(const char _flag, const string& _name, const string&
_desc, const int _value) :
     Option(_flag,_name,_desc), defaultValue(_value), value(_value) {}

-Configuration::IntOption::IntOption(const string& _name, const string& _desc, const
int _value) : 
+Configuration::IntOption::IntOption(const string& _name, const string& _desc, const
int _value) :
     Option(_name,_desc), defaultValue(_value), value(_value) {}

 Configuration::IntOption::~IntOption(){}
@@ -178,10 +194,10 @@

 // Bool Option:

-Configuration::BoolOption::BoolOption(const char _flag, const string& _name, const string&
_desc, const bool _value) : 
+Configuration::BoolOption::BoolOption(const char _flag, const string& _name, const string&
_desc, const bool _value) :
     Option(_flag,_name,_desc), defaultValue(_value), value(_value) {}

-Configuration::BoolOption::BoolOption(const string& _name, const string& _desc, const
bool _value) : 
+Configuration::BoolOption::BoolOption(const string& _name, const string& _desc, const
bool _value) :
     Option(_name,_desc), defaultValue(_value), value(_value) {}

 Configuration::BoolOption::~BoolOption(){}
Index: lib/broker/Configuration.h
===================================================================
--- lib/broker/Configuration.h	(revision 482785)
+++ lib/broker/Configuration.h	(working copy)
@@ -97,6 +97,8 @@
             IntOption connectionBacklog;
             StringOption store;
             BoolOption help;
+            BoolOption version;
+            char const *programName;

             typedef std::vector<Option*>::iterator op_iterator;
             std::vector<Option*> options;
@@ -111,9 +113,10 @@
             Configuration();
             ~Configuration();

-            void parse(int argc, char** argv);
+            void parse(char const*, int argc, char** argv);

             bool isHelp() const;
+            bool isVersion() const;
             bool isTrace() const;
             int getPort() const;
             int getWorkerThreads() const;
@@ -122,6 +125,7 @@
             const std::string& getStore() const;

             void setHelp(bool b) { help.setValue(b); }
+            void setVersion(bool b) { version.setValue(b); }
             void setTrace(bool b) { trace.setValue(b); }
             void setPort(int i) { port.setValue(i); }
             void setWorkerThreads(int i) { workerThreads.setValue(i); }
Index: src/qpidd.cpp
===================================================================
--- src/qpidd.cpp	(revision 482785)
+++ src/qpidd.cpp	(working copy)
@@ -7,9 +7,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *   http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -23,14 +23,17 @@
 #include <signal.h>
 #include <iostream>
 #include <memory>
+#include <config.h>

+static char const* programName = "qpidd";
+
 using namespace qpid::broker;
 using namespace qpid::sys;

 Broker::shared_ptr broker;

 void handle_signal(int /*signal*/){
-    std::cout << "Shutting down..." << std::endl;
+    std::cerr << "Shutting down..." << std::endl;
     broker->shutdown();
 }

@@ -38,9 +41,12 @@
 {
     Configuration config;
     try {
-        config.parse(argc, argv);
+        config.parse(programName, argc, argv);
         if(config.isHelp()){
             config.usage();
+        }else if(config.isVersion()){
+            std::cout << programName << " (" << PACKAGE_NAME << ")
version "
+                      << PACKAGE_VERSION << std::endl;
         }else{
             broker = Broker::create(config);
             signal(SIGINT, handle_signal);
@@ -48,7 +54,7 @@
         }
         return 0;
     } catch(const std::exception& e) {
-        std::cout << e.what() << std::endl;
+        std::cerr << e.what() << std::endl;
     }
     return 1;
 }

Mime
View raw message