commit - 85e8591f64a845fcf84d74d5158c9905dec81c4e
commit + baa9fea074326a73792e66efbca9746a1bccc596
blob - e4bbfb0c494e0df6e355a7bcc31c0af2d86a4b07
blob + 9fce345c5049ce75a157248987a26b165a993c82
--- got/got.c
+++ got/got.c
}
static const struct got_error *
-fetch_progress(void *arg, const char *message, off_t packfile_size)
+fetch_progress(void *arg, const char *message, off_t packfile_size,
+ int nobjects_total, int nobjects_indexed)
{
int *did_something = arg;
char scaled[FMT_SCALED_STRSIZE];
if (message) {
printf("\rserver: %s", message);
*did_something = 1;
- } else if (packfile_size > 0 && fmt_scaled(packfile_size, scaled) == 0) {
- printf("\rfetching... %*s", FMT_SCALED_STRSIZE, scaled);
+ } else if (packfile_size > 0 || nobjects_indexed > 0) {
+ printf("\rfetching...");
+ if (fmt_scaled(packfile_size, scaled) == 0)
+ printf(" %*s", FMT_SCALED_STRSIZE, scaled);
+ if (nobjects_indexed > 0)
+ printf(" indexed %d/%d objects", nobjects_indexed,
+ nobjects_total);
*did_something = 1;
}
fflush(stdout);
blob - 773e689afb160f0428740fef229371814d293eb0
blob + 5c84e0ca2a0a85854b24b9704a1dfeafb4994c52
--- include/got_fetch.h
+++ include/got_fetch.h
/* A callback function which gets invoked with progress information to print. */
typedef const struct got_error *(*got_fetch_progress_cb)(void *,
- const char *, off_t);
+ const char *, off_t, int, int);
/*
* Attempt to fetch a packfile from a server. This pack file will contain
blob - cb016271f82e01a23936226d46a6fda2b45f5dd7
blob + 734df058a9220e2d98f2e29f7605822aa1c9c4cc
--- lib/fetch.c
+++ lib/fetch.c
while ((s = strsep(&s0, "\r")) != NULL) {
if (*s == '\0')
continue;
- err = progress_cb(progress_arg, s, 0);
+ err = progress_cb(progress_arg, s, 0, 0, 0);
if (err)
break;
}
goto done;
} else if (packfile_size_cur != packfile_size) {
err = progress_cb(progress_arg, NULL,
- packfile_size_cur);
+ packfile_size_cur, 0, 0);
if (err)
break;
packfile_size = packfile_size_cur;
if (err != NULL)
goto done;
nidxfd = -1;
- err = got_privsep_wait_index_pack_done(&idxibuf);
- if (err != NULL)
- goto done;
- imsg_clear(&idxibuf);
+ done = 0;
+ while (!done) {
+ int nobjects_total, nobjects_indexed;
+ err = got_privsep_recv_index_progress(&done, &nobjects_total,
+ &nobjects_indexed, &idxibuf);
+ if (err != NULL)
+ goto done;
+ if (nobjects_indexed != 0) {
+ err = progress_cb(progress_arg, NULL,
+ packfile_size, nobjects_total,
+ nobjects_indexed);
+ if (err)
+ break;
+ }
+ imsg_clear(&idxibuf);
+ }
if (close(imsg_idxfds[0]) == -1) {
err = got_error_from_errno("close");
goto done;
blob - c557473418f6733044e922f4df08164429fe995f
blob + 20e77442a08f16547d7bddcb93d3bf617d9afdd9
--- lib/got_lib_privsep.h
+++ lib/got_lib_privsep.h
GOT_IMSG_FETCH_DOWNLOAD_PROGRESS,
GOT_IMSG_FETCH_DONE,
GOT_IMSG_IDXPACK_REQUEST,
+ GOT_IMSG_IDXPACK_PROGRESS,
GOT_IMSG_IDXPACK_DONE,
/* Messages related to pack files. */
struct got_imsg_fetch_download_progress {
/* Number of packfile data bytes downloaded so far. */
off_t packfile_bytes;
+};
+
+/* Structure for GOT_IMSG_IDXPACK_PROGRESS data. */
+struct got_imsg_index_pack_progress {
+ /* Total number of objects in pack file. */
+ int nobjects_total;
+ /* Number of objects indexed so far. */
+ int nobjects_indexed;
};
/* Structure for GOT_IMSG_PACKIDX. */
struct got_object *);
const struct got_error *got_privsep_send_index_pack_req(struct imsgbuf *, int,
struct got_object_id *);
+const struct got_error *got_privsep_send_index_pack_progress(struct imsgbuf *,
+ int, int);
const struct got_error *got_privsep_send_index_pack_done(struct imsgbuf *);
-const struct got_error *got_privsep_wait_index_pack_done(struct imsgbuf *);
+const struct got_error *got_privsep_recv_index_progress(int *, int *, int *,
+ struct imsgbuf *ibuf);
const struct got_error *got_privsep_send_fetch_req(struct imsgbuf *, int,
struct got_pathlist_head *);
const struct got_error *got_privsep_send_fetch_symrefs(struct imsgbuf *,
blob - 96c8759b3613fda441384c283df161cf5059f8fa
blob + 986fccc8b38434f6702bead30a7eddae76b24dd5
--- lib/privsep.c
+++ lib/privsep.c
close(fd);
return err;
}
+ return flush_imsg(ibuf);
+}
+
+const struct got_error *
+got_privsep_send_index_pack_progress(struct imsgbuf *ibuf, int nobjects_total,
+ int nobjects_indexed)
+{
+ struct got_imsg_index_pack_progress iprogress;
+
+ iprogress.nobjects_total = nobjects_total;
+ iprogress.nobjects_indexed = nobjects_indexed;
+
+ if (imsg_compose(ibuf, GOT_IMSG_IDXPACK_PROGRESS, 0, 0, -1,
+ &iprogress, sizeof(iprogress)) == -1)
+ return got_error_from_errno("imsg_compose IDXPACK_PROGRESS");
+
return flush_imsg(ibuf);
}
}
const struct got_error *
-got_privsep_wait_index_pack_done(struct imsgbuf *ibuf)
+got_privsep_recv_index_progress(int *done, int *nobjects_total,
+ int *nobjects_indexed, struct imsgbuf *ibuf)
{
const struct got_error *err = NULL;
struct imsg imsg;
+ struct got_imsg_index_pack_progress *iprogress;
+ size_t datalen;
+ *done = 0;
+ *nobjects_total = 0;
+ *nobjects_indexed = 0;
+
err = got_privsep_recv_imsg(&imsg, ibuf, 0);
if (err)
return err;
- if (imsg.hdr.type == GOT_IMSG_IDXPACK_DONE)
- return NULL;
- else
- return got_error(GOT_ERR_PRIVSEP_MSG);
+
+ datalen = imsg.hdr.len - IMSG_HEADER_SIZE;
+ switch (imsg.hdr.type) {
+ case GOT_IMSG_ERROR:
+ if (datalen < sizeof(struct got_imsg_error)) {
+ err = got_error(GOT_ERR_PRIVSEP_LEN);
+ break;
+ }
+ err = recv_imsg_error(&imsg, datalen);
+ break;
+ case GOT_IMSG_IDXPACK_PROGRESS:
+ if (datalen < sizeof(*iprogress)) {
+ err = got_error(GOT_ERR_PRIVSEP_LEN);
+ break;
+ }
+ iprogress = (struct got_imsg_index_pack_progress *)imsg.data;
+ *nobjects_total = iprogress->nobjects_total;
+ *nobjects_indexed = iprogress->nobjects_indexed;
+ break;
+ case GOT_IMSG_IDXPACK_DONE:
+ if (datalen != 0) {
+ err = got_error(GOT_ERR_PRIVSEP_LEN);
+ break;
+ }
+ *done = 1;
+ break;
+ default:
+ err = got_error(GOT_ERR_PRIVSEP_MSG);
+ break;
+ }
+
imsg_free(&imsg);
+ return err;
}
const struct got_error *
blob - 1e044637ec38d03deda6d442ef53cad1853a8456
blob + 4247c3edb9fba18b593047110c5cd3c2330efdfc
--- libexec/got-index-pack/got-index-pack.c
+++ libexec/got-index-pack/got-index-pack.c
}
int
-indexpack(int packfd, int idxfd, struct got_object_id *packhash)
+indexpack(int packfd, int idxfd, struct got_object_id *packhash,
+ struct imsgbuf *ibuf)
{
char hdr[4*3], buf[8];
int nobj, nvalid, nbig, n, i, step;
if(!step)
step++;
while (nvalid != nobj) {
- fprintf(stderr, "indexing (%d/%d):", nvalid, nobj);
+ got_privsep_send_index_pack_progress(ibuf, nobj, nvalid);
n = 0;
for (i = 0; i < nobj; i++) {
if (valid[i]) {
n++;
continue;
}
- if (i % step == 0)
- fprintf(stderr, ".");
if (!objects[i]) {
o = emalloc(sizeof(Object));
o->off = ftello(f);
if(objectcrc(f, o) == -1)
return -1;
}
- fprintf(stderr, "\n");
if (n == nvalid) {
errx(1, "fix point reached too early: %d/%d", nvalid, nobj);
goto error;
}
idxfd = imsg.fd;
- indexpack(packfd, idxfd, &packhash);
+ indexpack(packfd, idxfd, &packhash, &ibuf);
done:
if(err != NULL)
got_privsep_send_error(&ibuf, err);