Commits

Bruce Momjian  committed 6dd9584

Improve pg_upgrade's status display

Pg_upgrade displays file names during copy and database names during
dump/restore. Andrew Dunstan identified three bugs:

* long file names were being truncated to 60 _leading_ characters, which
often do not change for long file names

* file names were truncated to 60 characters in log files

* carriage returns were being output to log files

This commit fixes these --- it prints 60 _trailing_ characters to the
status display, and full path names without carriage returns to log
files. It also suppresses status output to the log file unless verbose
mode is used.

  • Participants
  • Parent commits ef754fb

Comments (0)

Files changed (5)

File contrib/pg_upgrade/dump.c

 		char 		file_name[MAXPGPATH];
 		DbInfo     *old_db = &old_cluster.dbarr.dbs[dbnum];
 
-		pg_log(PG_REPORT, OVERWRITE_MESSAGE, old_db->db_name);
+		pg_log(PG_STATUS, "%s", old_db->db_name);
 		snprintf(file_name, sizeof(file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
 
 		exec_prog(RESTORE_LOG_FILE, NULL, true,

File contrib/pg_upgrade/pg_upgrade.c

 		char file_name[MAXPGPATH];
 		DbInfo     *old_db = &old_cluster.dbarr.dbs[dbnum];
 
-		pg_log(PG_REPORT, OVERWRITE_MESSAGE, old_db->db_name);
+		pg_log(PG_STATUS, "%s", old_db->db_name);
 		snprintf(file_name, sizeof(file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
 
 		/*

File contrib/pg_upgrade/pg_upgrade.h

 
 #define MIGRATOR_API_VERSION	1
 
-#define MESSAGE_WIDTH		"60"
+#define MESSAGE_WIDTH		60
 
-#define OVERWRITE_MESSAGE	"  %-" MESSAGE_WIDTH "." MESSAGE_WIDTH "s\r"
 #define GET_MAJOR_VERSION(v)	((v) / 100)
 
 /* contains both global db information and CREATE DATABASE commands */
 typedef enum
 {
 	PG_VERBOSE,
+	PG_STATUS,
 	PG_REPORT,
 	PG_WARNING,
 	PG_FATAL

File contrib/pg_upgrade/relfilenode.c

 		unlink(new_file);
 	
 		/* Copying files might take some time, so give feedback. */
-		pg_log(PG_REPORT, OVERWRITE_MESSAGE, old_file);
+		pg_log(PG_STATUS, "%s", old_file);
 	
 		if ((user_opts.transfer_mode == TRANSFER_MODE_LINK) && (pageConverter != NULL))
 			pg_log(PG_FATAL, "This upgrade requires page-by-page conversion, "

File contrib/pg_upgrade/util.c

 	if (strlen(message) > 0 && message[strlen(message) - 1] == '\n')
 		pg_log(PG_REPORT, "%s", message);
 	else
-		pg_log(PG_REPORT, "%-" MESSAGE_WIDTH "s", message);
+		/* trim strings that don't end in a newline */
+		pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, message);
 }
 
 
 	vsnprintf(message, sizeof(message), fmt, args);
 	va_end(args);
 
-	/* PG_VERBOSE is only output in verbose mode */
+	/* PG_VERBOSE and PG_STATUS are only output in verbose mode */
 	/* fopen() on log_opts.internal might have failed, so check it */
-	if ((type != PG_VERBOSE || log_opts.verbose) && log_opts.internal != NULL)
+	if (((type != PG_VERBOSE && type != PG_STATUS) || log_opts.verbose) &&
+		log_opts.internal != NULL)
 	{
-		/*
-		 * There's nothing much we can do about it if fwrite fails, but some
-		 * platforms declare fwrite with warn_unused_result.  Do a little
-		 * dance with casting to void to shut up the compiler in such cases.
-		 */
-		size_t		rc;
-
-		rc = fwrite(message, strlen(message), 1, log_opts.internal);
-		/* if we are using OVERWRITE_MESSAGE, add newline to log file */
-		if (strchr(message, '\r') != NULL)
-			rc = fwrite("\n", 1, 1, log_opts.internal);
-		(void) rc;
+		if (type == PG_STATUS)
+			/* status messages need two leading spaces and a newline */
+			fprintf(log_opts.internal, "  %s\n", message);
+		else
+			fprintf(log_opts.internal, "%s", message);
 		fflush(log_opts.internal);
 	}
 
 				printf("%s", _(message));
 			break;
 
+		case PG_STATUS:
+			/* for output to a display, do leading truncation and append \r */
+			if (isatty(fileno(stdout)))
+				/* -2 because we use a 2-space indent */
+				printf("  %s%-*.*s\r", 
+						/* prefix with "..." if we do leading truncation */
+						strlen(message) <= MESSAGE_WIDTH - 2 ? "" : "...",
+						MESSAGE_WIDTH - 2, MESSAGE_WIDTH - 2,
+						/* optional leading truncation */
+						strlen(message) <= MESSAGE_WIDTH - 2 ? message :
+						message + strlen(message) - MESSAGE_WIDTH + 3 + 2);
+			else
+				printf("  %s\n", _(message));
+			break;
+
 		case PG_REPORT:
 		case PG_WARNING:
 			printf("%s", _(message));