]> git.ipfire.org Git - thirdparty/rsync.git/commitdiff
The --progress output now leaves the cursor at the end of the line
authorWayne Davison <wayned@samba.org>
Sat, 5 Jul 2008 07:21:05 +0000 (00:21 -0700)
committerWayne Davison <wayned@samba.org>
Sat, 5 Jul 2008 07:31:46 +0000 (00:31 -0700)
(instead of the start) in order to be extra sure that an error won't
overwrite it.  We also ensure that the progress option can't be enabled
on the server side.

NEWS
cleanup.c
log.c
options.c
progress.c

diff --git a/NEWS b/NEWS
index 3cbe622115e98fa4489e54d6f3424d64c8f1fcd7..70af495f3dae0da857c51df2871dd6a4569240e8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -4,7 +4,8 @@ Changes since 3.0.3:
 
   BUG FIXES:
 
-    - ...
+    - Changed the way --progress overwrites its prior output in order to make
+      it nearly impossible for the progress to get overwritten by an error.
 
   ENHANCEMENTS:
 
index e59565daa7b705e85622ae923f4886f1f7a88a3b..279b532659fdae438e724128ee7a9a076e9ee1eb 100644 (file)
--- a/cleanup.c
+++ b/cleanup.c
@@ -27,6 +27,7 @@ extern int am_daemon;
 extern int io_error;
 extern int keep_partial;
 extern int got_xfer_error;
+extern int progress_is_active;
 extern char *partial_dir;
 extern char *logfile_name;
 
@@ -115,6 +116,11 @@ NORETURN void _exit_cleanup(int code, const char *file, int line)
 
                exit_code = unmodified_code = code;
 
+               if (progress_is_active) {
+                       fputc('\n', stdout);
+                       progress_is_active = 0;
+               }
+
                if (verbose > 3) {
                        rprintf(FINFO,
                                "_exit_cleanup(code=%d, file=%s, line=%d): entered\n",
diff --git a/log.c b/log.c
index 975ebaf3ce55273bf4eb8bacf068be1ae3d21b0b..9100f5dbc5cf238910b2dc73b48352f328e8ec21 100644 (file)
--- a/log.c
+++ b/log.c
@@ -321,7 +321,7 @@ void rwrite(enum logcode code, const char *buf, int len, int is_utf8)
                exit_cleanup(RERR_MESSAGEIO);
        }
 
-       if (progress_is_active && !am_server) {
+       if (progress_is_active) {
                fputc('\n', f);
                progress_is_active = 0;
        }
@@ -329,6 +329,12 @@ void rwrite(enum logcode code, const char *buf, int len, int is_utf8)
        trailing_CR_or_NL = len && (buf[len-1] == '\n' || buf[len-1] == '\r')
                          ? buf[--len] : 0;
 
+       if (len && buf[0] == '\r') {
+               fputc('\r', f);
+               buf++;
+               len--;
+       }
+
 #ifdef ICONV_CONST
        if (ic != (iconv_t)-1) {
                xbuf outbuf, inbuf;
index 0ad26f894bae64dae8e9a4bcc979d684683e67e7..0ac5bfd97ed4c630f955df5e5ec07b695675c4f7 100644 (file)
--- a/options.c
+++ b/options.c
@@ -1532,8 +1532,12 @@ int parse_arguments(int *argc_p, const char ***argv_p)
                log_before_transfer = !am_server;
        }
 
-       if (do_progress && !verbose && !log_before_transfer && !am_server)
-               verbose = 1;
+       if (do_progress) {
+               if (am_server)
+                       do_progress = 0;
+               else if (!verbose && !log_before_transfer && !am_server)
+                       verbose = 1;
+       }
 
        if (dry_run)
                do_xfers = 0;
index 86f8ea13823db80f88edf89ec1a320cbc27ed66b..25033b8b14e8da205890b1e2da4705219d3f4cc8 100644 (file)
@@ -71,6 +71,11 @@ static void rprint_progress(OFF_T ofs, OFF_T size, struct timeval *now,
        double rate, remain;
 
        if (is_last) {
+               snprintf(eol, sizeof eol,
+                       " (xfer#%d, to-check=%d/%d)\n",
+                       stats.num_transferred_files,
+                       stats.num_files - current_file_index - 1,
+                       stats.num_files);
                /* Compute stats based on the starting info. */
                if (!ph_start.time.tv_sec
                    || !(diff = msdiff(&ph_start.time, now)))
@@ -79,6 +84,7 @@ static void rprint_progress(OFF_T ofs, OFF_T size, struct timeval *now,
                /* Switch to total time taken for our last update. */
                remain = (double) diff / 1000.0;
        } else {
+               strlcpy(eol, "  ", sizeof eol);
                /* Compute stats based on recent progress. */
                if (!(diff = msdiff(&ph_list[oldest_hpos].time, now)))
                        diff = 1;
@@ -106,18 +112,13 @@ static void rprint_progress(OFF_T ofs, OFF_T size, struct timeval *now,
                         (int) remain % 60);
        }
 
-       if (is_last) {
-               snprintf(eol, sizeof eol, " (xfer#%d, to-check=%d/%d)\n",
-                       stats.num_transferred_files,
-                       stats.num_files - current_file_index - 1,
-                       stats.num_files);
-       } else
-               strlcpy(eol, "\r", sizeof eol);
        progress_is_active = 0;
-       rprintf(FCLIENT, "%12s %3d%% %7.2f%s %s%s",
+       rprintf(FCLIENT, "\r%12s %3d%% %7.2f%s %s%s",
                human_num(ofs), pct, rate, units, rembuf, eol);
-       if (!is_last)
+       if (!is_last) {
                progress_is_active = 1;
+               fflush(stdout);
+       }
 }
 
 void set_current_file_index(struct file_struct *file, int ndx)