Jelajahi Sumber

revamp console output options

- the old meaning of -V[V] was moved to -D{n|N}, as these are really
  debugging options.
- don't print the info messages by default; this can be re-enabled with
  the -V switch, and is implied by most debug options (it was really
  kind of stupid that verbose/debug operation disabled these).
- the sync algo/state debugging can be separately enabled with -Ds now.
Oswald Buddenhagen 10 tahun lalu
induk
melakukan
0e1f8f9a3f
8 mengubah file dengan 167 tambahan dan 63 penghapusan
  1. 3 0
      NEWS
  2. 16 10
      src/common.h
  3. 6 6
      src/drv_imap.c
  4. 14 4
      src/drv_maildir.c
  5. 53 20
      src/main.c
  6. 21 6
      src/mbsync.1
  7. 23 3
      src/sync.c
  8. 31 14
      src/util.c

+ 3 - 0
NEWS

@@ -5,6 +5,9 @@ The 'isync' compatibility wrapper is now deprecated.
 An IMAP Path/NAMESPACE rooted in INBOX won't be handled specially any more.
 This means that some Patterns may need adjustment.
 
+The default output is a lot less verbose now.
+The meanings of the -V and -D options changed significantly.
+
 The SSL/TLS configuration has been re-designed.
 SSL is now explicitly enabled or disabled - "use SSL if available" is gone.
 Notice: Tunnels are assumed to be secure and thus default to no SSL.

+ 16 - 10
src/common.h

@@ -59,14 +59,18 @@ typedef unsigned int uint;
 
 /* main.c */
 
-#define DEBUG        1
-#define VERBOSE      2
-#define XVERBOSE     4
-#define QUIET        8
-#define VERYQUIET    16
-#define KEEPJOURNAL  32
-#define ZERODELAY    64
-#define CRASHDEBUG   128
+#define DEBUG_CRASH     0x01
+#define DEBUG_MAILDIR   0x02
+#define DEBUG_NET       0x04
+#define DEBUG_NET_ALL   0x08
+#define DEBUG_SYNC      0x10
+#define DEBUG_ALL       (0xFF & ~DEBUG_NET_ALL)
+#define QUIET           0x100
+#define VERYQUIET       0x200
+#define PROGRESS        0x400
+#define VERBOSE         0x800
+#define KEEPJOURNAL     0x1000
+#define ZERODELAY       0x2000
 
 extern int DFlags;
 extern int UseFSync;
@@ -86,10 +90,12 @@ void stats( void );
 
 /* util.c */
 
-void ATTR_PRINTFLIKE(1, 2) debug( const char *, ... );
-void ATTR_PRINTFLIKE(1, 2) debugn( const char *, ... );
+void vdebug( int, const char *, va_list va );
+void vdebugn( int, const char *, va_list va );
 void ATTR_PRINTFLIKE(1, 2) info( const char *, ... );
 void ATTR_PRINTFLIKE(1, 2) infon( const char *, ... );
+void ATTR_PRINTFLIKE(1, 2) progress( const char *, ... );
+void ATTR_PRINTFLIKE(1, 2) notice( const char *, ... );
 void ATTR_PRINTFLIKE(1, 2) warn( const char *, ... );
 void ATTR_PRINTFLIKE(1, 2) error( const char *, ... );
 void ATTR_PRINTFLIKE(1, 2) sys_error( const char *, ... );

+ 6 - 6
src/drv_imap.c

@@ -286,7 +286,7 @@ send_imap_cmd( imap_store_t *ctx, struct imap_cmd *cmd )
 	}
 	bufl = nfsnprintf( buf, sizeof(buf), buffmt,
 	                   cmd->tag, cmd->cmd, cmd->param.data_len );
-	if (DFlags & VERBOSE) {
+	if (DFlags & DEBUG_NET) {
 		if (ctx->num_in_progress)
 			printf( "(%d in progress) ", ctx->num_in_progress );
 		if (starts_with( cmd->cmd, -1, "LOGIN", 5 ))
@@ -743,7 +743,7 @@ parse_imap_list( imap_store_t *ctx, char **sp, parse_list_state_t *sts )
 			if (bytes > 0)
 				goto postpone;
 
-			if (DFlags & XVERBOSE) {
+			if (DFlags & DEBUG_NET_ALL) {
 				printf( "%s=========\n", ctx->label );
 				fwrite( cur->val, cur->len, 1, stdout );
 				printf( "%s=========\n", ctx->label );
@@ -755,7 +755,7 @@ parse_imap_list( imap_store_t *ctx, char **sp, parse_list_state_t *sts )
 				goto postpone;
 			if (s == (void *)~0)
 				goto badeof;
-			if (DFlags & VERBOSE) {
+			if (DFlags & DEBUG_NET) {
 				printf( "%s%s\n", ctx->label, s );
 				fflush( stdout );
 			}
@@ -1243,7 +1243,7 @@ imap_socket_read( void *aux )
 			/* A clean shutdown sequence ends with bad_callback as well (see imap_cleanup()). */
 			break;
 		}
-		if (DFlags & VERBOSE) {
+		if (DFlags & DEBUG_NET) {
 			printf( "%s%s\n", ctx->label, cmd );
 			fflush( stdout );
 		}
@@ -1895,12 +1895,12 @@ do_sasl_auth( imap_store_t *ctx, struct imap_cmd *cmdp ATTR_UNUSED, const char *
 		iov[0].takeOwn = GiveOwn;
 		iovcnt = 1;
 
-		if (DFlags & VERBOSE) {
+		if (DFlags & DEBUG_NET) {
 			printf( "%s>+> %s\n", ctx->label, enc );
 			fflush( stdout );
 		}
 	} else {
-		if (DFlags & VERBOSE) {
+		if (DFlags & DEBUG_NET) {
 			printf( "%s>+>\n", ctx->label );
 			fflush( stdout );
 		}

+ 14 - 4
src/drv_maildir.c

@@ -85,6 +85,16 @@ static struct flock lck;
 
 static int MaildirCount;
 
+static void ATTR_PRINTFLIKE(1, 2)
+debug( const char *msg, ... )
+{
+	va_list va;
+
+	va_start( va, msg );
+	vdebug( DEBUG_SYNC, msg, va );
+	va_end( va );
+}
+
 static const char Flags[] = { 'D', 'F', 'R', 'S', 'T' };
 
 static uchar
@@ -371,7 +381,7 @@ maildir_clear_tmp( char *buf, int bufsz, int bl )
 			/* This should happen infrequently enough that it won't be
 			 * bothersome to the user to display when it occurs.
 			 */
-			info( "Maildir notice: removing stale file %s\n", buf );
+			notice( "Maildir notice: removing stale file %s\n", buf );
 			if (unlink( buf ) && errno != ENOENT)
 				sys_error( "Maildir error: cannot remove %s", buf );
 		}
@@ -515,7 +525,7 @@ maildir_init_uidval( maildir_store_t *ctx )
 static int
 maildir_init_uidval_new( maildir_store_t *ctx )
 {
-	info( "Maildir notice: no UIDVALIDITY, creating new.\n" );
+	notice( "Maildir notice: no UIDVALIDITY, creating new.\n" );
 	return maildir_init_uidval( ctx );
 }
 
@@ -768,7 +778,7 @@ maildir_scan( maildir_store_t *ctx, msglist_t *msglist )
 				 * tell if there were further modifications during this second. So wait.
 				 * This has the nice side effect that we wait for "batches" of changes to
 				 * complete. On the downside, it can potentially block indefinitely. */
-				info( "Maildir notice: sleeping due to recent directory modification.\n" );
+				notice( "Maildir notice: sleeping due to recent directory modification.\n" );
 				sleep( 1 ); /* FIXME: should make this async */
 				goto restat;
 			}
@@ -900,7 +910,7 @@ maildir_scan( maildir_store_t *ctx, msglist_t *msglist )
 					maildir_free_scan( msglist );
 					return DRV_BOX_BAD;
 #else
-					info( "Maildir notice: duplicate UID; changing UIDVALIDITY.\n");
+					notice( "Maildir notice: duplicate UID; changing UIDVALIDITY.\n");
 					if ((ret = maildir_init_uid( ctx )) != DRV_OK) {
 						maildir_free_scan( msglist );
 						return ret;

+ 53 - 20
src/main.c

@@ -79,9 +79,9 @@ PACKAGE " " VERSION " - mailbox synchronizer\n"
 "  -C, --create		create mailboxes if nonexistent\n"
 "  -X, --expunge		expunge	deleted messages\n"
 "  -c, --config CONFIG	read an alternate config file (default: ~/." EXE "rc)\n"
-"  -D, --debug		print debugging messages\n"
-"  -V, --verbose		verbose mode (display network traffic)\n"
-"  -q, --quiet		don't display progress info\n"
+"  -D, --debug		debugging modes (see manual)\n"
+"  -V, --verbose		display what is happening\n"
+"  -q, --quiet		don't display progress counters\n"
 "  -v, --version		display version\n"
 "  -h, --help		display this help message\n"
 "\nIf neither --pull nor --push are specified, both are active.\n"
@@ -137,7 +137,7 @@ stats( void )
 	int t, l, ll, cls;
 	static int cols = -1;
 
-	if (DFlags & QUIET)
+	if (!(DFlags & PROGRESS))
 		return;
 
 	if (cols < 0 && (!(cs = getenv( "COLUMNS" )) || !(cols = atoi( cs ))))
@@ -152,7 +152,7 @@ stats( void )
 		if (l > cls)
 			buf[t][cls - 1] = '~';
 	}
-	infon( "\v\r%s  M: %.*s  S: %.*s", buf[2], cls, buf[0], cls, buf[1] );
+	progress( "\r%s  M: %.*s  S: %.*s", buf[2], cls, buf[0], cls, buf[1] );
 }
 
 static int
@@ -424,13 +424,25 @@ main( int argc, char **argv )
 					else
 						DFlags |= QUIET;
 				} else if (!strcmp( opt, "verbose" )) {
-					if (DFlags & VERBOSE)
-						DFlags |= XVERBOSE;
+					DFlags |= VERBOSE;
+				} else if (starts_with( opt, -1, "debug", 5 )) {
+					opt += 5;
+					if (!*opt)
+						op = VERBOSE | DEBUG_ALL;
+					else if (!strcmp( opt, "-crash" ))
+						op = DEBUG_CRASH;
+					else if (!strcmp( opt, "-maildir" ))
+						op = VERBOSE | DEBUG_MAILDIR;
+					else if (!strcmp( opt, "-net" ))
+						op = VERBOSE | DEBUG_NET;
+					else if (!strcmp( opt, "-net-all" ))
+						op = VERBOSE | DEBUG_NET_ALL;
+					else if (!strcmp( opt, "-sync" ))
+						op = VERBOSE | DEBUG_SYNC;
 					else
-						DFlags |= VERBOSE | QUIET;
-				} else if (!strcmp( opt, "debug" ))
-					DFlags |= DEBUG | QUIET;
-				else if (!strcmp( opt, "pull" ))
+						goto badopt;
+					DFlags |= op;
+				} else if (!strcmp( opt, "pull" ))
 					cops |= XOP_PULL, ops[M] |= XOP_HAVE_TYPE;
 				else if (!strcmp( opt, "push" ))
 					cops |= XOP_PUSH, ops[M] |= XOP_HAVE_TYPE;
@@ -595,16 +607,34 @@ main( int argc, char **argv )
 				DFlags |= QUIET;
 			break;
 		case 'V':
-			if (DFlags & VERBOSE)
-				DFlags |= XVERBOSE;
-			else
-				DFlags |= VERBOSE | QUIET;
+			DFlags |= VERBOSE;
 			break;
 		case 'D':
-			if (*ochar == 'C')
-				DFlags |= CRASHDEBUG, ochar++;
-			else
-				DFlags |= CRASHDEBUG | DEBUG | QUIET;
+			for (op = 0; *ochar; ochar++) {
+				switch (*ochar) {
+				case 'C':
+					op |= DEBUG_CRASH;
+					break;
+				case 'm':
+					op |= DEBUG_MAILDIR | VERBOSE;
+					break;
+				case 'n':
+					op |= DEBUG_NET | VERBOSE;
+					break;
+				case 'N':
+					op |= DEBUG_NET_ALL | VERBOSE;
+					break;
+				case 's':
+					op |= DEBUG_SYNC | VERBOSE;
+					break;
+				default:
+					error( "Unknown -D flag '%c'\n", *ochar );
+					return 1;
+				}
+			}
+			if (!op)
+				op = DEBUG_ALL | VERBOSE;
+			DFlags |= op;
 			break;
 		case 'J':
 			DFlags |= KEEPJOURNAL;
@@ -622,8 +652,11 @@ main( int argc, char **argv )
 		}
 	}
 
+	if (!(DFlags & (QUIET | DEBUG_ALL)) && isatty( 1 ))
+		DFlags |= PROGRESS;
+
 #ifdef __linux__
-	if (DFlags & CRASHDEBUG) {
+	if (DFlags & DEBUG_CRASH) {
 		signal( SIGSEGV, crashHandler );
 		signal( SIGBUS, crashHandler );
 		signal( SIGILL, crashHandler );

+ 21 - 6
src/mbsync.1

@@ -1,7 +1,7 @@
 .ig
 \" mbsync - mailbox synchronizer
 \" Copyright (C) 2000-2002 Michael R. Elkins <me@mutt.org>
-\" Copyright (C) 2002-2004,2011-2013 Oswald Buddenhagen <ossi@users.sf.net>
+\" Copyright (C) 2002-2004,2011-2015 Oswald Buddenhagen <ossi@users.sf.net>
 \" Copyright (C) 2004 Theodore Y. Ts'o <tytso@mit.edu>
 \"
 \"  This program is free software; you can redistribute it and/or modify
@@ -20,7 +20,7 @@
 \" As a special exception, mbsync may be linked with the OpenSSL library,
 \" despite that library's more restrictive license.
 ..
-.TH mbsync 1 "2013 Dec 14"
+.TH mbsync 1 "2015 Mar 22"
 ..
 .SH NAME
 mbsync - synchronize IMAP4 and Maildir mailboxes
@@ -78,13 +78,28 @@ Display a summary of command line options.
 Display version information.
 .TP
 \fB-V\fR, \fB--verbose\fR
-Enable \fIverbose\fR mode, which displays the IMAP4 network traffic.
+Enable \fIverbose\fR mode, which displays what is currently happening.
 .TP
-\fB-D\fR, \fB--debug\fR
-Enable printing \fIdebug\fR information.
+\fB-D\fR[\fBC\fR][\fBm\fR][\fBn\fR|\fBN\fR][\fBs\fR]\fR]\fR,\
+ \fB--debug\fR[\fB-crash\fR|\fB-maildir\fR|\fB-net\fR|\fB-net-all\fR|\fB-sync\fR]
+Enable debugging categories:
+.in +4
+\fBC\fR, \fBcrash\fR - use built-in crash handler
+.br
+\fBm\fR, \fBmaildir\fR - print maildir debug info
+.br
+\fBn\fR, \fBnet\fR - print network traffic (protocol only)
+.br
+\fBN\fR, \fBnet-all\fR - print network traffic (including payloads)
+.br
+\fBs\fR, \fBsync\fR - print synchronization debug info
+.in -4
+All categories except \fBcrash\fR implictly enable \fIverbose\fR mode.
+Without category specification, all categories except net-all are enabled.
 .TP
 \fB-q\fR, \fB--quiet\fR
-Suppress informational messages.
+Suppress progress counters (this is implicit if stdout is no TTY,
+or any debugging categories are enabled) and notices.
 If specified twice, suppress warning messages as well.
 ..
 .SH CONFIGURATION

+ 23 - 3
src/sync.c

@@ -45,6 +45,26 @@ group_conf_t *groups;
 
 const char *str_ms[] = { "master", "slave" }, *str_hl[] = { "push", "pull" };
 
+static void ATTR_PRINTFLIKE(1, 2)
+debug( const char *msg, ... )
+{
+	va_list va;
+
+	va_start( va, msg );
+	vdebug( DEBUG_SYNC, msg, va );
+	va_end( va );
+}
+
+static void ATTR_PRINTFLIKE(1, 2)
+debugn( const char *msg, ... )
+{
+	va_list va;
+
+	va_start( va, msg );
+	vdebugn( DEBUG_SYNC, msg, va );
+	va_end( va );
+}
+
 void
 Fclose( FILE *f, int safe )
 {
@@ -1347,7 +1367,7 @@ box_loaded( int sts, void *aux )
 		if (tmsg->srec) /* found by TUID */
 			continue;
 		uid = tmsg->uid;
-		if (DFlags & DEBUG) {
+		if (DFlags & DEBUG_SYNC) {
 			make_flags( tmsg->flags, fbuf );
 			printf( svars->ctx[t]->opts & OPEN_SIZE ? "  message %5d, %-4s, %6lu: " : "  message %5d, %-4s: ", uid, fbuf, tmsg->size );
 		}
@@ -1413,7 +1433,7 @@ box_loaded( int sts, void *aux )
 						srec->uid[S] = 0;
 					} else {
 						if (srec->msg[t] && (srec->msg[t]->status & M_FLAGS) && srec->msg[t]->flags != srec->flags)
-							info( "Info: conflicting changes in (%d,%d)\n", srec->uid[M], srec->uid[S] );
+							notice( "Notice: conflicting changes in (%d,%d)\n", srec->uid[M], srec->uid[S] );
 						if (svars->chan->ops[t] & OP_DELETE) {
 							debug( "  %sing delete\n", str_hl[t] );
 							srec->aflags[t] = F_DELETED;
@@ -1439,7 +1459,7 @@ box_loaded( int sts, void *aux )
 						}
 						srec->aflags[t] = sflags & ~srec->flags;
 						srec->dflags[t] = ~sflags & srec->flags;
-						if (DFlags & DEBUG) {
+						if (DFlags & DEBUG_SYNC) {
 							char afbuf[16], dfbuf[16]; /* enlarge when support for keywords is added */
 							make_flags( srec->aflags[t], afbuf );
 							make_flags( srec->dflags[t], dfbuf );

+ 31 - 14
src/util.c

@@ -53,39 +53,43 @@ printn( const char *msg, va_list va )
 }
 
 void
-debug( const char *msg, ... )
+vdebug( int cat, const char *msg, va_list va )
 {
-	va_list va;
-
-	if (DFlags & DEBUG) {
-		va_start( va, msg );
+	if (DFlags & cat) {
 		vprintf( msg, va );
-		va_end( va );
 		fflush( stdout );
 		need_nl = 0;
 	}
 }
 
 void
-debugn( const char *msg, ... )
+vdebugn( int cat, const char *msg, va_list va )
 {
-	va_list va;
-
-	if (DFlags & DEBUG) {
-		va_start( va, msg );
+	if (DFlags & cat) {
 		vprintf( msg, va );
-		va_end( va );
 		fflush( stdout );
 		need_nl = 1;
 	}
 }
 
+void
+progress( const char *msg, ... )
+{
+	va_list va;
+
+	va_start( va, msg );
+	vprintf( msg, va );
+	va_end( va );
+	fflush( stdout );
+	need_nl = 1;
+}
+
 void
 info( const char *msg, ... )
 {
 	va_list va;
 
-	if (!(DFlags & QUIET)) {
+	if (DFlags & VERBOSE) {
 		va_start( va, msg );
 		printn( msg, va );
 		va_end( va );
@@ -98,7 +102,7 @@ infon( const char *msg, ... )
 {
 	va_list va;
 
-	if (!(DFlags & QUIET)) {
+	if (DFlags & VERBOSE) {
 		va_start( va, msg );
 		printn( msg, va );
 		va_end( va );
@@ -106,6 +110,19 @@ infon( const char *msg, ... )
 	}
 }
 
+void
+notice( const char *msg, ... )
+{
+	va_list va;
+
+	if (!(DFlags & QUIET)) {
+		va_start( va, msg );
+		printn( msg, va );
+		va_end( va );
+		need_nl = 0;
+	}
+}
+
 void
 warn( const char *msg, ... )
 {