Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Nicolas Pitre authored and Junio C Hamano committed Nov 8, 2007
1 parent 53ed7b5 commit a984a06
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 11 deletions.
10 changes: 5 additions & 5 deletions index-pack.c
Expand Up @@ -792,6 +792,7 @@ int main(int argc, char **argv)
flush();
} else {
if (fix_thin_pack) {
char msg[48];
int nr_unresolved = nr_deltas - nr_resolved_deltas;
int nr_objects_initial = nr_objects;
if (nr_unresolved <= 0)
Expand All @@ -800,12 +801,11 @@ int main(int argc, char **argv)
(nr_objects + nr_unresolved + 1)
* sizeof(*objects));
fix_unresolved_deltas(nr_unresolved);
stop_progress(&progress);
if (verbose)
fprintf(stderr, "%d objects were added to complete this thin pack.\n",
nr_objects - nr_objects_initial);
sprintf(msg, "completed with %d local objects",
nr_objects - nr_objects_initial);
stop_progress_msg(&progress, msg);
fixup_pack_header_footer(output_fd, sha1,
curr_pack, nr_objects);
curr_pack, nr_objects);
}
if (nr_deltas != nr_resolved_deltas)
die("pack has %d unresolved deltas",
Expand Down
19 changes: 13 additions & 6 deletions progress.c
Expand Up @@ -69,9 +69,9 @@ static void clear_progress_signal(void)
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_update || --progress->delay)
Expand All @@ -90,7 +90,7 @@ static int display(struct progress *progress, unsigned n, int done)

progress->last_value = n;
tp = (progress->throughput) ? progress->throughput->display : "";
eol = done ? ", done. \n" : " \r";
eol = done ? done : " \r";
if (progress->total) {
unsigned percent = n * 100 / progress->total;
if (percent != progress->last_percent || progress_update) {
Expand Down Expand Up @@ -191,13 +191,13 @@ void display_throughput(struct progress *progress, off_t total)

throughput_string(tp, total, rate);
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)
{
return progress ? display(progress, n, 0) : 0;
return progress ? display(progress, n, NULL) : 0;
}

struct progress *start_progress_delay(const char *title, unsigned total,
Expand Down Expand Up @@ -226,21 +226,28 @@ struct progress *start_progress(const char *title, unsigned total)
}

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;
if (!progress)
return;
*p_progress = NULL;
if (progress->last_value != -1) {
/* Force the last update */
char buf[strlen(msg) + 5];
struct throughput *tp = progress->throughput;
if (tp) {
unsigned int rate = !tp->avg_misecs ? 0 :
tp->avg_bytes / tp->avg_misecs;
throughput_string(tp, tp->curr_total, rate);
}
progress_update = 1;
display(progress, progress->last_value, 1);
sprintf(buf, ", %s.\n", msg);
display(progress, progress->last_value, buf);
}
clear_progress_signal();
free(progress->throughput);
Expand Down
1 change: 1 addition & 0 deletions progress.h
Expand Up @@ -9,5 +9,6 @@ struct progress *start_progress(const char *title, unsigned total);
struct progress *start_progress_delay(const char *title, unsigned total,
unsigned percent_treshold, unsigned delay);
void stop_progress(struct progress **progress);
void stop_progress_msg(struct progress **progress, const char *msg);

#endif

0 comments on commit a984a06

Please sign in to comment.