Skip to content

Commit

Permalink
remote-curl: show progress for fetches over dumb HTTP
Browse files Browse the repository at this point in the history
Fetching over dumb HTTP transport doesn't show any progress, even with
the option --progress.  If the connection is slow or there is a lot of
data to get then this can take a long time while the user is left to
wonder if git got stuck.

We don't know the number of objects to fetch at the outset, but we can
count the ones we got.  Show an open-ended progress indicator based on
that number if the user asked for it.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
rscharfe authored and gitster committed Mar 3, 2020
1 parent d0654dc commit 7655b41
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 1 deletion.
1 change: 1 addition & 0 deletions remote-curl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1026,6 +1026,7 @@ static int fetch_dumb(int nr_heads, struct ref **to_fetch)

walker = get_http_walker(url.buf);
walker->get_verbosely = options.verbosity >= 3;
walker->get_progress = options.progress;
walker->get_recover = 0;
ret = walker_fetch(walker, nr_heads, targets, NULL, NULL);
walker_free(walker);
Expand Down
13 changes: 12 additions & 1 deletion walker.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "tag.h"
#include "blob.h"
#include "refs.h"
#include "progress.h"

static struct object_id current_commit_oid;

Expand Down Expand Up @@ -162,6 +163,11 @@ static int process(struct walker *walker, struct object *obj)
static int loop(struct walker *walker)
{
struct object_list *elem;
struct progress *progress = NULL;
uint64_t nr = 0;

if (walker->get_progress)
progress = start_delayed_progress(_("Fetching objects"), 0);

while (process_queue) {
struct object *obj = process_queue->item;
Expand All @@ -176,15 +182,20 @@ static int loop(struct walker *walker)
*/
if (! (obj->flags & TO_SCAN)) {
if (walker->fetch(walker, obj->oid.hash)) {
stop_progress(&progress);
report_missing(obj);
return -1;
}
}
if (!obj->type)
parse_object(the_repository, &obj->oid);
if (process_object(walker, obj))
if (process_object(walker, obj)) {
stop_progress(&progress);
return -1;
}
display_progress(progress, ++nr);
}
stop_progress(&progress);
return 0;
}

Expand Down
1 change: 1 addition & 0 deletions walker.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ struct walker {
int (*fetch)(struct walker *, unsigned char *sha1);
void (*cleanup)(struct walker *);
int get_verbosely;
int get_progress;
int get_recover;

int corrupt_object_found;
Expand Down

0 comments on commit 7655b41

Please sign in to comment.