cli: change argument parsing convention for subcommands

previously we deleted the subcommand name from argv before passing to
the subcommand. In this version, the deletion is done in the actual
subcommands. Although this causes some duplication of code, it allows
us to be more flexible about how we parse command line arguments in
the subcommand, including possibly using off-the-shelf routines like
getopt_long that expect the name of the command in argv[0].
This commit is contained in:
David Bremner 2011-10-21 09:19:17 -03:00
parent 8bb5b6201e
commit 61f0a5b8ee
10 changed files with 21 additions and 1 deletions

View file

@ -735,6 +735,8 @@ notmuch_config_command_set (void *ctx, char *item, int argc, char *argv[])
int int
notmuch_config_command (void *ctx, int argc, char *argv[]) notmuch_config_command (void *ctx, int argc, char *argv[])
{ {
argc--; argv++; /* skip subcommand argument */
if (argc < 2) { if (argc < 2) {
fprintf (stderr, "Error: notmuch config requires at least two arguments.\n"); fprintf (stderr, "Error: notmuch config requires at least two arguments.\n");
return 1; return 1;

View file

@ -35,6 +35,8 @@ notmuch_count_command (void *ctx, int argc, char *argv[])
notmuch_sort_t sort = NOTMUCH_SORT_NEWEST_FIRST; notmuch_sort_t sort = NOTMUCH_SORT_NEWEST_FIRST;
#endif #endif
argc--; argv++; /* skip subcommand argument */
for (i = 0; i < argc && argv[i][0] == '-'; i++) { for (i = 0; i < argc && argv[i][0] == '-'; i++) {
if (strcmp (argv[i], "--") == 0) { if (strcmp (argv[i], "--") == 0) {
i++; i++;

View file

@ -41,6 +41,8 @@ notmuch_dump_command (unused (void *ctx), int argc, char *argv[])
if (notmuch == NULL) if (notmuch == NULL)
return 1; return 1;
argc--; argv++; /* skip subcommand argument */
if (argc && strcmp (argv[0], "--") != 0) { if (argc && strcmp (argv[0], "--") != 0) {
fprintf (stderr, "Warning: the output file argument of dump is deprecated.\n"); fprintf (stderr, "Warning: the output file argument of dump is deprecated.\n");
output = fopen (argv[0], "w"); output = fopen (argv[0], "w");

View file

@ -815,6 +815,8 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
add_files_state.verbose = 0; add_files_state.verbose = 0;
add_files_state.output_is_a_tty = isatty (fileno (stdout)); add_files_state.output_is_a_tty = isatty (fileno (stdout));
argc--; argv++; /* skip subcommand argument */
for (i = 0; i < argc && argv[i][0] == '-'; i++) { for (i = 0; i < argc && argv[i][0] == '-'; i++) {
if (STRNCMP_LITERAL (argv[i], "--verbose") == 0) { if (STRNCMP_LITERAL (argv[i], "--verbose") == 0) {
add_files_state.verbose = 1; add_files_state.verbose = 1;

View file

@ -628,6 +628,8 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
params.part = -1; params.part = -1;
params.cryptoctx = NULL; params.cryptoctx = NULL;
argc--; argv++; /* skip subcommand argument */
for (i = 0; i < argc && argv[i][0] == '-'; i++) { for (i = 0; i < argc && argv[i][0] == '-'; i++) {
if (strcmp (argv[i], "--") == 0) { if (strcmp (argv[i], "--") == 0) {
i++; i++;

View file

@ -44,6 +44,8 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config); synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);
argc--; argv++; /* skip subcommand argument */
if (argc) { if (argc) {
input = fopen (argv[0], "r"); input = fopen (argv[0], "r");
if (input == NULL) { if (input == NULL) {

View file

@ -395,6 +395,8 @@ notmuch_search_command (void *ctx, int argc, char *argv[])
int i, ret; int i, ret;
output_t output = OUTPUT_SUMMARY; output_t output = OUTPUT_SUMMARY;
argc--; argv++; /* skip subcommand argument */
for (i = 0; i < argc && argv[i][0] == '-'; i++) { for (i = 0; i < argc && argv[i][0] == '-'; i++) {
if (strcmp (argv[i], "--") == 0) { if (strcmp (argv[i], "--") == 0) {
i++; i++;

View file

@ -936,6 +936,8 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
params.cryptoctx = NULL; params.cryptoctx = NULL;
params.decrypt = 0; params.decrypt = 0;
argc--; argv++; /* skip subcommand argument */
for (i = 0; i < argc && argv[i][0] == '-'; i++) { for (i = 0; i < argc && argv[i][0] == '-'; i++) {
if (strcmp (argv[i], "--") == 0) { if (strcmp (argv[i], "--") == 0) {
i++; i++;

View file

@ -65,6 +65,8 @@ notmuch_tag_command (void *ctx, unused (int argc), unused (char *argv[]))
return 1; return 1;
} }
argc--; argv++; /* skip subcommand argument */
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
if (strcmp (argv[i], "--") == 0) { if (strcmp (argv[i], "--") == 0) {
i++; i++;

View file

@ -465,6 +465,8 @@ notmuch_help_command (unused (void *ctx), int argc, char *argv[])
command_t *command; command_t *command;
unsigned int i; unsigned int i;
argc--; argv++; /* Ignore "help" */
if (argc == 0) { if (argc == 0) {
printf ("The notmuch mail system.\n\n"); printf ("The notmuch mail system.\n\n");
usage (stdout); usage (stdout);
@ -639,7 +641,7 @@ main (int argc, char *argv[])
command = &commands[i]; command = &commands[i];
if (strcmp (argv[1], command->name) == 0) if (strcmp (argv[1], command->name) == 0)
return (command->function) (local, argc - 2, &argv[2]); return (command->function) (local, argc - 1, &argv[1]);
} }
fprintf (stderr, "Error: Unknown command '%s' (see \"notmuch help\")\n", fprintf (stderr, "Error: Unknown command '%s' (see \"notmuch help\")\n",