From a1444d9367554df7965705536ab3ccc0481ed9c0 Mon Sep 17 00:00:00 2001
From: Zooko O'Whielacronx <zooko@zooko.com>
Date: Mon, 25 Jan 2010 20:45:59 -0800
Subject: [PATCH] cli: merge the better version of David-Sarah's
 split-usage-and-help patch with the earlier version that I mistakenly
 committed

---
 src/allmydata/scripts/create_node.py |  6 ++---
 src/allmydata/scripts/runner.py      | 36 ++++++++++++++++++++--------
 2 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/src/allmydata/scripts/create_node.py b/src/allmydata/scripts/create_node.py
index 7e49ba43..4e23ac07 100644
--- a/src/allmydata/scripts/create_node.py
+++ b/src/allmydata/scripts/create_node.py
@@ -164,9 +164,9 @@ def create_introducer(basedir, config, out=sys.stdout, err=sys.stderr):
 
 
 subCommands = [
-    ["create-client", None, CreateClientOptions, "Create a client node."],
-    ["create-introducer", None, CreateIntroducerOptions, "Create a introducer node."],
-
+    ["create-node", None, CreateNodeOptions, "Create a node that acts as a client, server or both."],
+    ["create-client", None, CreateClientOptions, "Create a client node (with storage initially disabled)."],
+    ["create-introducer", None, CreateIntroducerOptions, "Create an introducer node."],
 ]
 
 dispatch = {
diff --git a/src/allmydata/scripts/runner.py b/src/allmydata/scripts/runner.py
index 235cc2a0..1ac8984e 100644
--- a/src/allmydata/scripts/runner.py
+++ b/src/allmydata/scripts/runner.py
@@ -10,24 +10,40 @@ pkg_resources.require('allmydata-tahoe')
 from allmydata.scripts.common import BaseOptions
 import debug, create_node, startstop_node, cli, keygen, stats_gatherer
 
-_general_commands = ( create_node.subCommands
-                    + keygen.subCommands
-                    + stats_gatherer.subCommands
-                    + debug.subCommands
-                    + cli.subCommands
-                    )
+def group(s):
+    return [["\n" + s, None, None, None]]
+
+_commandUsage = ( group("Administration")
+                +   create_node.subCommands
+                +   keygen.subCommands
+                +   stats_gatherer.subCommands
+                + group("Controlling a node")
+                +   startstop_node.subCommands
+                + group("Debugging")
+                +   debug.subCommands
+                + group("Using the filesystem")
+                +   cli.subCommands
+                )
+
+_subCommands = filter(lambda (a, b, c, d): not a.startswith("\n"), _commandUsage)
+_synopsis = "Usage:  tahoe <command> [command options]"
 
 class Options(BaseOptions, usage.Options):
-    synopsis = "Usage:  tahoe <command> [command options]"
+    synopsis = _synopsis
+    subCommands = _subCommands
 
-    subCommands = []
-    subCommands += _general_commands
-    subCommands += startstop_node.subCommands
+    def getUsage(self, **kwargs):
+        t = _Usage().getUsage(**kwargs)
+        return t + "\nPlease run 'tahoe <command> --help' for more details on each command.\n"
 
     def postOptions(self):
         if not hasattr(self, 'subOptions'):
             raise usage.UsageError("must specify a command")
 
+class _Usage(BaseOptions, usage.Options):
+    synopsis = _synopsis
+    subCommands = _commandUsage
+
 def runner(argv,
            run_by_human=True,
            stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr,
-- 
2.45.2