X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/fcb69e5cdcfdfd0bdcea2127e5f4c9133a2282b9..d17e1dd2dae6bfd9e2e147a0dd3039848dd43abc:/progress.c diff --git a/progress.c b/progress.c index e842b9a9..42d8f357 100644 --- a/progress.c +++ b/progress.c @@ -1,19 +1,19 @@ /* -*- c-file-style: "linux" -*- - * - * Copyright (C) 1996-2000 by Andrew Tridgell + * + * Copyright (C) 1996-2000 by Andrew Tridgell * Copyright (C) Paul Mackerras 1996 * Copyright (C) 2001, 2002 by Martin Pool - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @@ -21,6 +21,9 @@ #include "rsync.h" +extern struct stats stats; +extern int am_server; + static OFF_T last_ofs; static struct timeval print_time; static struct timeval start_time; @@ -28,8 +31,8 @@ static OFF_T start_ofs; static unsigned long msdiff(struct timeval *t1, struct timeval *t2) { - return (t2->tv_sec - t1->tv_sec) * 1000 - + (t2->tv_usec - t1->tv_usec) / 1000; + return (t2->tv_sec - t1->tv_sec) * 1000 + + (t2->tv_usec - t1->tv_usec) / 1000; } @@ -43,75 +46,81 @@ static unsigned long msdiff(struct timeval *t1, struct timeval *t2) static void rprint_progress(OFF_T ofs, OFF_T size, struct timeval *now, int is_last) { - int pct = (ofs == size) ? 100 : (int)((100.0*ofs)/size); - unsigned long diff = msdiff(&start_time, now); - double rate = diff ? (double) (ofs-start_ofs) * 1000.0 / diff / 1024.0 : 0; - const char *units; - /* If we've finished transferring this file, show the time taken; - * otherwise show expected time to complete. That's kind of - * inconsistent, but people can probably cope. Hopefully we'll - * get more consistent and complete progress reporting soon. -- - * mbp */ - double remain = is_last - ? (double) diff / 1000.0 - : rate ? (double) (size-ofs) / rate / 1000.0 : 0.0; - int remain_h, remain_m, remain_s; + char eol[256]; + int pct = (ofs == size) ? 100 : (int)((100.0*ofs)/size); + unsigned long diff = msdiff(&start_time, now); + double rate = diff ? (double) (ofs-start_ofs) * 1000.0 / diff / 1024.0 : 0; + const char *units; + /* If we've finished transferring this file, show the time taken; + * otherwise show expected time to complete. That's kind of + * inconsistent, but people can probably cope. Hopefully we'll + * get more consistent and complete progress reporting soon. -- + * mbp */ + double remain = is_last ? (double) diff / 1000.0 + : rate ? (double) (size-ofs) / rate / 1000.0 : 0.0; + int remain_h, remain_m, remain_s; + + if (rate > 1024*1024) { + rate /= 1024.0 * 1024.0; + units = "GB/s"; + } else if (rate > 1024) { + rate /= 1024.0; + units = "MB/s"; + } else { + units = "kB/s"; + } - if (rate > 1024*1024) { - rate /= 1024.0 * 1024.0; - units = "GB/s"; - } else if (rate > 1024) { - rate /= 1024.0; - units = "MB/s"; - } else { - units = "kB/s"; - } + remain_s = (int) remain % 60; + remain_m = (int) (remain / 60.0) % 60; + remain_h = (int) (remain / 3600.0); - remain_s = (int) remain % 60; - remain_m = (int) (remain / 60.0) % 60; - remain_h = (int) (remain / 3600.0); - - rprintf(FINFO, "%12.0f %3d%% %7.2f%s %4d:%02d:%02d%s", - (double) ofs, pct, rate, units, - remain_h, remain_m, remain_s, - is_last ? "\n" : "\r"); + if (is_last) { + snprintf(eol, sizeof eol, " (%d, %.1f%% of %d)\n", + stats.num_transferred_files, + (float)(stats.current_file_index * 100) / stats.num_files, + stats.num_files); + } else + strcpy(eol, "\r"); + rprintf(FINFO, "%12.0f %3d%% %7.2f%s %4d:%02d:%02d%s", + (double) ofs, pct, rate, units, + remain_h, remain_m, remain_s, eol); } void end_progress(OFF_T size) { - extern int do_progress, am_server; - - if (do_progress && !am_server) { - struct timeval now; - gettimeofday(&now, NULL); - rprint_progress(size, size, &now, True); + if (!am_server) { + struct timeval now; + gettimeofday(&now, NULL); + rprint_progress(size, size, &now, True); } - last_ofs = 0; - start_ofs = 0; - print_time.tv_sec = print_time.tv_usec = 0; - start_time.tv_sec = start_time.tv_usec = 0; + last_ofs = 0; + start_ofs = 0; + print_time.tv_sec = print_time.tv_usec = 0; + start_time.tv_sec = start_time.tv_usec = 0; } void show_progress(OFF_T ofs, OFF_T size) { - extern int do_progress, am_server; - struct timeval now; + struct timeval now; - gettimeofday(&now, NULL); - - if (!start_time.tv_sec && !start_time.tv_usec) { - start_time.tv_sec = now.tv_sec; - start_time.tv_usec = now.tv_usec; - start_ofs = ofs; - } + if (!start_time.tv_sec) { + gettimeofday(&now, NULL); + start_time.tv_sec = now.tv_sec; + start_time.tv_usec = now.tv_usec; + start_ofs = ofs; + if (am_server) + return; + } + else { + if (am_server) + return; + gettimeofday(&now, NULL); + } - if (do_progress - && !am_server - && ofs > last_ofs + 1000 - && msdiff(&print_time, &now) > 250) { - rprint_progress(ofs, size, &now, False); - last_ofs = ofs; - print_time.tv_sec = now.tv_sec; - print_time.tv_usec = now.tv_usec; + if (ofs > last_ofs + 1000 && msdiff(&print_time, &now) > 250) { + rprint_progress(ofs, size, &now, False); + last_ofs = ofs; + print_time.tv_sec = now.tv_sec; + print_time.tv_usec = now.tv_usec; } }