nicer display of thin pack completion

In the same spirit of prettifying Git's output display for mere mortals,
here's a simple extension to the progress API allowing for a final
message to be provided when terminating a progress line, and use it for
the display of the number of objects needed to complete a thin pack,
saving yet one more line of screen display.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nicolas Pitre 2007-11-08 15:45:41 -05:00 committed by Junio C Hamano
parent 53ed7b5a5d
commit a984a06a07
3 changed files with 19 additions and 11 deletions

View File

@ -792,6 +792,7 @@ int main(int argc, char **argv)
flush(); flush();
} else { } else {
if (fix_thin_pack) { if (fix_thin_pack) {
char msg[48];
int nr_unresolved = nr_deltas - nr_resolved_deltas; int nr_unresolved = nr_deltas - nr_resolved_deltas;
int nr_objects_initial = nr_objects; int nr_objects_initial = nr_objects;
if (nr_unresolved <= 0) if (nr_unresolved <= 0)
@ -800,12 +801,11 @@ int main(int argc, char **argv)
(nr_objects + nr_unresolved + 1) (nr_objects + nr_unresolved + 1)
* sizeof(*objects)); * sizeof(*objects));
fix_unresolved_deltas(nr_unresolved); fix_unresolved_deltas(nr_unresolved);
stop_progress(&progress); sprintf(msg, "completed with %d local objects",
if (verbose) nr_objects - nr_objects_initial);
fprintf(stderr, "%d objects were added to complete this thin pack.\n", stop_progress_msg(&progress, msg);
nr_objects - nr_objects_initial);
fixup_pack_header_footer(output_fd, sha1, fixup_pack_header_footer(output_fd, sha1,
curr_pack, nr_objects); curr_pack, nr_objects);
} }
if (nr_deltas != nr_resolved_deltas) if (nr_deltas != nr_resolved_deltas)
die("pack has %d unresolved deltas", die("pack has %d unresolved deltas",

View File

@ -69,9 +69,9 @@ static void clear_progress_signal(void)
progress_update = 0; progress_update = 0;
} }
static int display(struct progress *progress, unsigned n, int done) static int display(struct progress *progress, unsigned n, const char *done)
{ {
char *eol, *tp; const char *eol, *tp;
if (progress->delay) { if (progress->delay) {
if (!progress_update || --progress->delay) if (!progress_update || --progress->delay)
@ -90,7 +90,7 @@ static int display(struct progress *progress, unsigned n, int done)
progress->last_value = n; progress->last_value = n;
tp = (progress->throughput) ? progress->throughput->display : ""; tp = (progress->throughput) ? progress->throughput->display : "";
eol = done ? ", done. \n" : " \r"; eol = done ? done : " \r";
if (progress->total) { if (progress->total) {
unsigned percent = n * 100 / progress->total; unsigned percent = n * 100 / progress->total;
if (percent != progress->last_percent || progress_update) { if (percent != progress->last_percent || progress_update) {
@ -191,13 +191,13 @@ void display_throughput(struct progress *progress, off_t total)
throughput_string(tp, total, rate); throughput_string(tp, total, rate);
if (progress->last_value != -1 && progress_update) if (progress->last_value != -1 && progress_update)
display(progress, progress->last_value, 0); display(progress, progress->last_value, NULL);
} }
} }
int display_progress(struct progress *progress, unsigned n) int display_progress(struct progress *progress, unsigned n)
{ {
return progress ? display(progress, n, 0) : 0; return progress ? display(progress, n, NULL) : 0;
} }
struct progress *start_progress_delay(const char *title, unsigned total, struct progress *start_progress_delay(const char *title, unsigned total,
@ -226,6 +226,11 @@ struct progress *start_progress(const char *title, unsigned total)
} }
void stop_progress(struct progress **p_progress) void stop_progress(struct progress **p_progress)
{
stop_progress_msg(p_progress, "done");
}
void stop_progress_msg(struct progress **p_progress, const char *msg)
{ {
struct progress *progress = *p_progress; struct progress *progress = *p_progress;
if (!progress) if (!progress)
@ -233,6 +238,7 @@ void stop_progress(struct progress **p_progress)
*p_progress = NULL; *p_progress = NULL;
if (progress->last_value != -1) { if (progress->last_value != -1) {
/* Force the last update */ /* Force the last update */
char buf[strlen(msg) + 5];
struct throughput *tp = progress->throughput; struct throughput *tp = progress->throughput;
if (tp) { if (tp) {
unsigned int rate = !tp->avg_misecs ? 0 : unsigned int rate = !tp->avg_misecs ? 0 :
@ -240,7 +246,8 @@ void stop_progress(struct progress **p_progress)
throughput_string(tp, tp->curr_total, rate); throughput_string(tp, tp->curr_total, rate);
} }
progress_update = 1; progress_update = 1;
display(progress, progress->last_value, 1); sprintf(buf, ", %s.\n", msg);
display(progress, progress->last_value, buf);
} }
clear_progress_signal(); clear_progress_signal();
free(progress->throughput); free(progress->throughput);

View File

@ -9,5 +9,6 @@ struct progress *start_progress(const char *title, unsigned total);
struct progress *start_progress_delay(const char *title, unsigned total, struct progress *start_progress_delay(const char *title, unsigned total,
unsigned percent_treshold, unsigned delay); unsigned percent_treshold, unsigned delay);
void stop_progress(struct progress **progress); void stop_progress(struct progress **progress);
void stop_progress_msg(struct progress **progress, const char *msg);
#endif #endif