[notmuch] [PATCH] Support for printing file paths in new command

Adrian Perez aperez at igalia.com
Sun Nov 22 16:10:44 PST 2009


For very large mail boxes, it is desirable to know which files are being
processed e.g. when a crash occurs to know which one was the cause. Also,
it may be interesting to have a better idea of how the operation is
progressing when processing mailboxes with big messages.

This patch adds support for printing messages as they are processed by
"notmuch new":

* The "new" command now supports a "--verbose" flag.

* When running in verbose mode, the file path of the message about to be
  processed is printed in the following format:

    current/total: /path/to/message/file

  Where "current" is the number of messages processed so far and "total" is
  the total count of files to be processed.

* The status line is erased using an ANSI sequence "\033[K" (erase current
  line from the cursor to the end of line) each time it is refreshed. This
  should not pose a problem because nearly every terminal supports it.

* When output is not being sent to a terminal, then each file processed is
  printed in a new line and ANSI escapes are not used at all.

* The signal handler for SIGALRM and the timer are not enabled when running
  in verbose mode, because we are already printing progress with each file,
  periodical reports are not neccessary.
---
 notmuch-client.h |    2 ++
 notmuch-new.c    |   32 +++++++++++++++++++++++++++++---
 notmuch.c        |   11 +++++++++--
 3 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/notmuch-client.h b/notmuch-client.h
index ea77686..4fe182e 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -74,6 +74,8 @@ typedef void (*add_files_callback_t) (notmuch_message_t *message);
 typedef struct {
     int ignore_read_only_directories;
     int saw_read_only_directory;
+    int output_is_a_tty;
+    int verbose;
 
     int total_files;
     int processed_files;
diff --git a/notmuch-new.c b/notmuch-new.c
index 0dd2784..b5c6cc6 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -179,6 +179,19 @@ add_files_recursive (notmuch_database_t *notmuch,
 	    if (path_dbtime == 0 || st->st_mtime > path_dbtime) {
 		state->processed_files++;
 
+		if (state->verbose) {
+		    if (state->output_is_a_tty)
+			printf("\r\033[K");
+
+		    printf ("%i/%i: %s",
+			    state->processed_files,
+			    state->total_files,
+			    next);
+
+		    putchar((state->output_is_a_tty) ? '\r' : '\n');
+		    fflush (stdout);
+		}
+
 		status = notmuch_database_add_message (notmuch, next, &message);
 		switch (status) {
 		    /* success */
@@ -275,7 +288,7 @@ add_files (notmuch_database_t *notmuch,
     }
 
     /* Setup our handler for SIGALRM */
-    if (isatty (fileno (stdout)) && ! debugger_is_active ()) {
+    if (state->output_is_a_tty && ! debugger_is_active () && ! state->verbose) {
 	memset (&action, 0, sizeof (struct sigaction));
 	action.sa_handler = handle_sigalrm;
 	sigemptyset (&action.sa_mask);
@@ -296,6 +309,7 @@ add_files (notmuch_database_t *notmuch,
 
     /* Now stop the timer. */
     if (timer_is_active) {
+	/* Now stop the timer. */
 	timerval.it_interval.tv_sec = 0;
 	timerval.it_interval.tv_usec = 0;
 	timerval.it_value.tv_sec = 0;
@@ -380,8 +394,7 @@ count_files (const char *path, int *count)
 }
 
 int
-notmuch_new_command (void *ctx,
-		     unused (int argc), unused (char *argv[]))
+notmuch_new_command (void *ctx, int argc, char *argv[])
 {
     notmuch_config_t *config;
     notmuch_database_t *notmuch;
@@ -393,6 +406,19 @@ notmuch_new_command (void *ctx,
     const char *db_path;
     char *dot_notmuch_path;
     struct sigaction action;
+    int i;
+
+    add_files_state.verbose = 0;
+    add_files_state.output_is_a_tty = isatty (fileno (stdout));
+
+    for (i = 0; i < argc && argv[i][0] == '-'; i++) {
+	if (STRNCMP_LITERAL (argv[i], "--verbose") == 0) {
+	    add_files_state.verbose = 1;
+	} else {
+	    fprintf (stderr, "Unrecognized option: %s\n", argv[i]);
+	    return 1;
+	}
+    }
 
     /* Setup our handler for SIGINT */
     memset (&action, 0, sizeof (struct sigaction));
diff --git a/notmuch.c b/notmuch.c
index 5cc8e4c..8cb1310 100644
--- a/notmuch.c
+++ b/notmuch.c
@@ -107,8 +107,8 @@ command_t commands[] = {
       "\t\tInvoking notmuch with no command argument will run setup if\n"
       "\t\tthe setup command has not previously been completed." },
     { "new", notmuch_new_command,
-      NULL,
-      "Find and import new messages to the notmuch database.",
+      "[--verbose]",
+      "\t\tFind and import new messages to the notmuch database.",
       "\t\tScans all sub-directories of the mail directory, performing\n"
       "\t\tfull-text indexing on new messages that are found. Each new\n"
       "\t\tmessage will be tagged as both \"inbox\" and \"unread\".\n"
@@ -122,6 +122,13 @@ command_t commands[] = {
       "\t\tis delivered and you wish to incorporate it into the database.\n"
       "\t\tThese subsequent runs will be much quicker than the initial run.\n"
       "\n"
+      "\t\tSupported options for new include:\n"
+      "\n"
+      "\t\t--verbose\n"
+      "\n"
+      "\t\t\tVerbose operation. Shows paths of message files as\n"
+      "\t\t\tthey are being indexed.\n"
+      "\n"
       "\t\tNote: \"notmuch new\" runs (other than the first run) will\n"
       "\t\tskip any read-only directories, so you can use that to mark\n"
       "\t\tdirectories that will not receive any new mail (and make\n"
-- 
1.6.5.2



More information about the notmuch mailing list