[notmuch] [PATCH] ANSI escapes in "new" only when output is a tty

Adrian Perez aperez at igalia.com
Sun Nov 22 16:54:35 PST 2009


When running "notmuch new --verbose", ANSI escapes are used. This may not be
desirable when the output of the command is *not* being sent to a terminal
(e.g. when piping output into another command). In that case each file
processed is printed in a new line and ANSI escapes are not used at all.
---
 notmuch-client.h |    1 +
 notmuch-new.c    |   12 ++++++++----
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/notmuch-client.h b/notmuch-client.h
index f105c8b..4fe182e 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -74,6 +74,7 @@ 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;
diff --git a/notmuch-new.c b/notmuch-new.c
index a2b30bd..8172b49 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -180,10 +180,15 @@ add_files_recursive (notmuch_database_t *notmuch,
 		state->processed_files++;
 
 		if (state->verbose) {
-		    printf ("\r\033[K%i/%i: %s\r",
+		    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);
 		}
 
@@ -282,9 +287,7 @@ add_files (notmuch_database_t *notmuch,
 	return NOTMUCH_STATUS_FILE_ERROR;
     }
 
-    if (isatty (fileno (stdout)) && ! debugger_is_active ()
-	&& ! state->verbose)
-    {
+    if (state->output_is_a_tty && ! debugger_is_active () && ! state->verbose) {
 	/* Setup our handler for SIGALRM */
 	memset (&action, 0, sizeof (struct sigaction));
 	action.sa_handler = handle_sigalrm;
@@ -405,6 +408,7 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
     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) {
-- 
1.6.5.2



More information about the notmuch mailing list