#include "sds.h"
#include "zmalloc.h"
#include "linenoise.h"
+#include "help.h"
#define REDIS_NOTUSED(V) ((void) V)
} config;
static void usage();
+char *redisGitSHA1(void);
/*------------------------------------------------------------------------------
* Utility functions
return mst;
}
+/*------------------------------------------------------------------------------
+ * Help functions
+ *--------------------------------------------------------------------------- */
+
+/* Output command help to stdout. */
+static void outputCommandHelp(struct commandHelp *help) {
+ printf("\n \x1b[1m%s\x1b[0m \x1b[90m%s\x1b[0m\n", help->name, help->params);
+ printf(" \x1b[33msummary:\x1b[0m %s\n", help->summary);
+ printf(" \x1b[33msince:\x1b[0m %s\n", help->since);
+ printf(" \x1b[33mgroup:\x1b[0m %s\n", commandGroups[help->group]);
+}
+
+/* Return command group type by name string. */
+static int commandGroupIndex(const char *name) {
+ int i, len = sizeof(commandGroups)/sizeof(char*);
+ for (i = 0; i < len; i++)
+ if (strcasecmp(name, commandGroups[i]) == 0)
+ return i;
+ return -1;
+}
+
+/* Output group names. */
+static void outputGroupHelp() {
+ int i, len = sizeof(commandGroups)/sizeof(char*);
+ for (i = 0; i < len; i++)
+ printf(" \x1b[90m-\x1b[0m %s\n", commandGroups[i]);
+}
+
+/* Output all command help, filtering by group or command name. */
+static void outputHelp(int argc, char **argv) {
+ int i, len = sizeof(commandHelp) / sizeof(struct commandHelp);
+ int group;
+ struct commandHelp *help;
+
+ if (argc && strcasecmp("groups", argv[0]) == 0) {
+ outputGroupHelp();
+ return;
+ }
+
+ group = argc ? commandGroupIndex(argv[0]) : -1;
+ for (i = 0; i < len; i++) {
+ help = &commandHelp[i];
+ if (group == -1) {
+ if (argc) {
+ if (strcasecmp(help->name, argv[0]) == 0) {
+ outputCommandHelp(help);
+ }
+ } else {
+ outputCommandHelp(help);
+ }
+ } else {
+ if (group == help->group) {
+ outputCommandHelp(help);
+ }
+ }
+ }
+ puts("");
+}
+
/*------------------------------------------------------------------------------
* Networking / parsing
*--------------------------------------------------------------------------- */
return REDIS_OK;
}
-static void showInteractiveHelp(void) {
- printf(
- "\n"
- "Welcome to redis-cli " REDIS_VERSION "!\n"
- "Just type any valid Redis command to see a pretty printed output.\n"
- "\n"
- "It is possible to quote strings, like in:\n"
- " set \"my key\" \"some string \\xff\\n\"\n"
- "\n"
- "You can find a list of valid Redis commands at\n"
- " http://code.google.com/p/redis/wiki/CommandReference\n"
- "\n"
- "Note: redis-cli supports line editing, use up/down arrows for history."
- "\n\n");
-}
-
static int cliSendCommand(int argc, char **argv, int repeat) {
char *command = argv[0];
size_t *argvlen;
config.raw_output = !strcasecmp(command,"info");
if (!strcasecmp(command,"help")) {
- showInteractiveHelp();
+ outputHelp(--argc, ++argv);
return REDIS_OK;
}
if (!strcasecmp(command,"shutdown")) config.shutdown = 1;
redisAppendCommandArgv(context,argc,(const char**)argv,argvlen);
while (config.monitor_mode) {
if (cliReadReply() != REDIS_OK) exit(1);
+ fflush(stdout);
}
if (config.pubsub_mode) {
"automatically used as last argument.\n"
);
} else if (!strcmp(argv[i],"-v")) {
- printf("redis-cli shipped with Redis version %s\n", REDIS_VERSION);
+ printf("redis-cli shipped with Redis version %s (%s)\n", REDIS_VERSION, redisGitSHA1());
exit(0);
} else {
break;