Skip to content

Commit

Permalink
common progress display support
Browse files Browse the repository at this point in the history
Instead of having this code duplicated in multiple places, let's have
a common interface for progress display.  If someday someone wishes to
display a cheezy progress bar instead then only one file will have to
be changed.

Note: I left merge-recursive.c out since it has a strange notion of
progress as it apparently increase the expected total number as it goes.
Someone with more intimate knowledge of what that is supposed to mean
might look at converting it to the common progress interface.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Nicolas Pitre authored and Junio C Hamano committed Apr 23, 2007
1 parent f1af60b commit 96a02f8
Show file tree
Hide file tree
Showing 7 changed files with 154 additions and 185 deletions.
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ LIB_H = \
diff.h object.h pack.h pkt-line.h quote.h refs.h list-objects.h sideband.h \
run-command.h strbuf.h tag.h tree.h git-compat-util.h revision.h \
tree-walk.h log-tree.h dir.h path-list.h unpack-trees.h builtin.h \
utf8.h reflog-walk.h patch-ids.h attr.h decorate.h
utf8.h reflog-walk.h patch-ids.h attr.h decorate.h progress.h

DIFF_OBJS = \
diff.o diff-lib.o diffcore-break.o diffcore-order.o \
Expand All @@ -305,7 +305,7 @@ LIB_OBJS = \
write_or_die.o trace.o list-objects.o grep.o match-trees.o \
alloc.o merge-file.o path-list.o help.o unpack-trees.o $(DIFF_OBJS) \
color.o wt-status.o archive-zip.o archive-tar.o shallow.o utf8.o \
convert.o attr.o decorate.o
convert.o attr.o decorate.o progress.o

BUILTIN_OBJS = \
builtin-add.o \
Expand Down
83 changes: 21 additions & 62 deletions builtin-pack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "diff.h"
#include "revision.h"
#include "list-objects.h"
#include "progress.h"

static const char pack_usage[] = "\
git-pack-objects [{ -q | --progress | --all-progress }] \n\
Expand Down Expand Up @@ -62,10 +63,10 @@ static const char *pack_tmp_name, *idx_tmp_name;
static char tmpname[PATH_MAX];
static unsigned char pack_file_sha1[20];
static int progress = 1;
static volatile sig_atomic_t progress_update;
static int window = 10;
static int pack_to_stdout;
static int num_preferred_base;
static struct progress progress_state;

/*
* The object names in objects array are hashed with this hashtable,
Expand Down Expand Up @@ -564,7 +565,6 @@ static off_t write_pack_file(void)
struct sha1file *f;
off_t offset, last_obj_offset = 0;
struct pack_header hdr;
unsigned last_percent = 999;
int do_progress = progress;

if (pack_to_stdout) {
Expand All @@ -580,8 +580,10 @@ static off_t write_pack_file(void)
f = sha1fd(fd, pack_tmp_name);
}

if (do_progress)
if (do_progress) {
fprintf(stderr, "Writing %u objects.\n", nr_result);
start_progress(&progress_state, "", nr_result);
}

hdr.hdr_signature = htonl(PACK_SIGNATURE);
hdr.hdr_version = htonl(PACK_VERSION);
Expand All @@ -593,18 +595,11 @@ static off_t write_pack_file(void)
for (i = 0; i < nr_objects; i++) {
last_obj_offset = offset;
offset = write_one(f, objects + i, offset);
if (do_progress) {
unsigned percent = written * 100 / nr_result;
if (progress_update || percent != last_percent) {
fprintf(stderr, "%4u%% (%u/%u) done\r",
percent, written, nr_result);
progress_update = 0;
last_percent = percent;
}
}
if (do_progress)
display_progress(&progress_state, written);
}
if (do_progress)
fputc('\n', stderr);
stop_progress(&progress_state);
done:
if (written != nr_result)
die("wrote %u objects while expecting %u", written, nr_result);
Expand Down Expand Up @@ -865,10 +860,8 @@ static int add_object_entry(const unsigned char *sha1, enum object_type type,
else
object_ix[-1 - ix] = nr_objects;

if (progress_update) {
fprintf(stderr, "Counting objects...%u\r", nr_objects);
progress_update = 0;
}
if (progress)
display_progress(&progress_state, nr_objects);

return 1;
}
Expand Down Expand Up @@ -1390,15 +1383,16 @@ static void find_deltas(struct object_entry **list, int window, int depth)
uint32_t i = nr_objects, idx = 0, processed = 0;
unsigned int array_size = window * sizeof(struct unpacked);
struct unpacked *array;
unsigned last_percent = 999;
int max_depth;

if (!nr_objects)
return;
array = xmalloc(array_size);
memset(array, 0, array_size);
if (progress)
if (progress) {
fprintf(stderr, "Deltifying %u objects.\n", nr_result);
start_progress(&progress_state, "", nr_result);
}

do {
struct object_entry *entry = list[--i];
Expand All @@ -1408,15 +1402,8 @@ static void find_deltas(struct object_entry **list, int window, int depth)
if (!entry->preferred_base)
processed++;

if (progress) {
unsigned percent = processed * 100 / nr_result;
if (percent != last_percent || progress_update) {
fprintf(stderr, "%4u%% (%u/%u) done\r",
percent, processed, nr_result);
progress_update = 0;
last_percent = percent;
}
}
if (progress)
display_progress(&progress_state, processed);

if (entry->delta)
/* This happens if we decided to reuse existing
Expand Down Expand Up @@ -1471,7 +1458,7 @@ static void find_deltas(struct object_entry **list, int window, int depth)
} while (i > 0);

if (progress)
fputc('\n', stderr);
stop_progress(&progress_state);

for (i = 0; i < window; ++i) {
free_delta_index(array[i].index);
Expand All @@ -1498,28 +1485,6 @@ static void prepare_pack(int window, int depth)
free(delta_list);
}

static void progress_interval(int signum)
{
progress_update = 1;
}

static void setup_progress_signal(void)
{
struct sigaction sa;
struct itimerval v;

memset(&sa, 0, sizeof(sa));
sa.sa_handler = progress_interval;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
sigaction(SIGALRM, &sa, NULL);

v.it_interval.tv_sec = 1;
v.it_interval.tv_usec = 0;
v.it_value = v.it_interval;
setitimer(ITIMER_REAL, &v, NULL);
}

static int git_pack_config(const char *k, const char *v)
{
if(!strcmp(k, "pack.window")) {
Expand Down Expand Up @@ -1759,31 +1724,25 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)

if (progress) {
fprintf(stderr, "Generating pack...\n");
setup_progress_signal();
start_progress(&progress_state, "Counting objects: ", 0);
}

if (!use_internal_rev_list)
read_object_list_from_stdin();
else {
rp_av[rp_ac] = NULL;
get_object_list(rp_ac, rp_av);
}

if (progress)
if (progress) {
stop_progress(&progress_state);
fprintf(stderr, "Done counting %u objects.\n", nr_objects);
}

if (non_empty && !nr_result)
return 0;
if (progress && (nr_objects != nr_result))
fprintf(stderr, "Result has %u objects.\n", nr_result);
if (nr_result)
prepare_pack(window, depth);
if (progress == 1 && pack_to_stdout) {
/* the other end usually displays progress itself */
struct itimerval v = {{0,},};
setitimer(ITIMER_REAL, &v, NULL);
signal(SIGALRM, SIG_IGN );
progress_update = 0;
}
last_obj_offset = write_pack_file();
if (!pack_to_stdout) {
unsigned char object_list_sha1[20];
Expand Down
38 changes: 17 additions & 21 deletions builtin-unpack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "commit.h"
#include "tag.h"
#include "tree.h"
#include "progress.h"

static int dry_run, quiet, recover, has_errors;
static const char unpack_usage[] = "git-unpack-objects [-n] [-q] [-r] < pack-file";
Expand Down Expand Up @@ -264,7 +265,7 @@ static void unpack_delta_entry(enum object_type type, unsigned long delta_size,
free(base);
}

static void unpack_one(unsigned nr, unsigned total)
static void unpack_one(unsigned nr)
{
unsigned shift;
unsigned char *pack, c;
Expand All @@ -286,20 +287,7 @@ static void unpack_one(unsigned nr, unsigned total)
size += (c & 0x7f) << shift;
shift += 7;
}
if (!quiet) {
static unsigned long last_sec;
static unsigned last_percent;
struct timeval now;
unsigned percentage = ((nr+1) * 100) / total;

gettimeofday(&now, NULL);
if (percentage != last_percent || now.tv_sec != last_sec) {
last_sec = now.tv_sec;
last_percent = percentage;
fprintf(stderr, "%4u%% (%u/%u) done\r",
percentage, (nr+1), total);
}
}

switch (type) {
case OBJ_COMMIT:
case OBJ_TREE:
Expand All @@ -323,19 +311,29 @@ static void unpack_one(unsigned nr, unsigned total)
static void unpack_all(void)
{
int i;
struct progress progress;
struct pack_header *hdr = fill(sizeof(struct pack_header));
unsigned nr_objects = ntohl(hdr->hdr_entries);

if (ntohl(hdr->hdr_signature) != PACK_SIGNATURE)
die("bad pack file");
if (!pack_version_ok(hdr->hdr_version))
die("unknown pack file version %d", ntohl(hdr->hdr_version));
fprintf(stderr, "Unpacking %d objects\n", nr_objects);
use(sizeof(struct pack_header));

if (!quiet) {
fprintf(stderr, "Unpacking %d objects\n", nr_objects);
start_progress(&progress, "", nr_objects);
}
obj_list = xmalloc(nr_objects * sizeof(*obj_list));
use(sizeof(struct pack_header));
for (i = 0; i < nr_objects; i++)
unpack_one(i, nr_objects);
for (i = 0; i < nr_objects; i++) {
unpack_one(i);
if (!quiet)
display_progress(&progress, i + 1);
}
if (!quiet)
stop_progress(&progress);

if (delta_list)
die("unresolved deltas left after unpacking");
}
Expand Down Expand Up @@ -404,7 +402,5 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
}

/* All done */
if (!quiet)
fprintf(stderr, "\n");
return has_errors;
}
Loading

0 comments on commit 96a02f8

Please sign in to comment.