summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <carlos@cmartin.tk>2012-07-13 12:01:11 +0200
committerCarlos Martín Nieto <carlos@cmartin.tk>2012-08-24 19:01:10 +0200
commitbffa852f89268390d6bc3e6f99f5f0cccdc88f63 (patch)
treeb83249451c776dc386856bd01e318acef801ba43
parentc920e162325d0f9acba46a19c4619e6bfa17707e (diff)
downloadlibgit2-bffa852f89268390d6bc3e6f99f5f0cccdc88f63.tar.gz
indexer: recognize and mark when all of the packfile has been downloaded
We can't always rely on the network telling us when the download is finished. Recognize it from the indexer itself.
-rw-r--r--examples/network/fetch.c2
-rw-r--r--include/git2/indexer.h2
-rw-r--r--src/fetch.c5
-rw-r--r--src/indexer.c12
4 files changed, 18 insertions, 3 deletions
diff --git a/examples/network/fetch.c b/examples/network/fetch.c
index 52e0412f4..372c85840 100644
--- a/examples/network/fetch.c
+++ b/examples/network/fetch.c
@@ -96,7 +96,7 @@ int fetch(git_repository *repo, int argc, char **argv)
// the download rate.
do {
usleep(10000);
- printf("\rReceived %d/%d objects in %zu bytes", stats.processed, stats.total, bytes);
+ printf("\rReceived %d/%d objects (%d) in %d bytes", stats.received, stats.total, stats.processed, bytes);
} while (!data.finished);
if (data.ret < 0)
diff --git a/include/git2/indexer.h b/include/git2/indexer.h
index d300ba01a..92d1d9e3a 100644
--- a/include/git2/indexer.h
+++ b/include/git2/indexer.h
@@ -19,6 +19,8 @@ GIT_BEGIN_DECL
typedef struct git_indexer_stats {
unsigned int total;
unsigned int processed;
+ unsigned int received;
+ unsigned int data_received;
} git_indexer_stats;
diff --git a/src/fetch.c b/src/fetch.c
index d96ac7781..eb13701f1 100644
--- a/src/fetch.c
+++ b/src/fetch.c
@@ -324,7 +324,10 @@ int git_fetch__download_pack(
goto on_error;
*bytes += recvd;
- } while(recvd > 0);
+ } while(recvd > 0 && !stats->data_received);
+
+ if (!stats->data_received)
+ giterr_set(GITERR_NET, "Early EOF while downloading packfile");
if (git_indexer_stream_finalize(idx, stats))
goto on_error;
diff --git a/src/indexer.c b/src/indexer.c
index 797a58275..30c6469a1 100644
--- a/src/indexer.c
+++ b/src/indexer.c
@@ -324,8 +324,8 @@ int git_indexer_stream_add(git_indexer_stream *idx, const void *data, size_t siz
if (git_vector_init(&idx->deltas, (unsigned int)(idx->nr_objects / 2), NULL) < 0)
return -1;
+ memset(stats, 0, sizeof(git_indexer_stats));
stats->total = (unsigned int)idx->nr_objects;
- stats->processed = 0;
}
/* Now that we have data in the pack, let's try to parse it */
@@ -361,6 +361,7 @@ int git_indexer_stream_add(git_indexer_stream *idx, const void *data, size_t siz
if (error < 0)
return error;
+ stats->received++;
continue;
}
@@ -379,8 +380,17 @@ int git_indexer_stream_add(git_indexer_stream *idx, const void *data, size_t siz
git__free(obj.data);
stats->processed = (unsigned int)++processed;
+ stats->received++;
}
+ /*
+ * If we've received all of the objects and our packfile is
+ * one hash beyond the end of the last object, all of the
+ * packfile is here.
+ */
+ if (stats->received == idx->nr_objects && idx->pack->mwf.size >= idx->off + 20)
+ stats->data_received = 1;
+
return 0;
on_error: