summaryrefslogtreecommitdiff
path: root/transport.c
diff options
context:
space:
mode:
authorNicolas Pitre <nico@cam.org>2009-08-24 00:04:09 -0400
committerJunio C Hamano <gitster@pobox.com>2009-08-24 15:03:56 -0700
commit86386829d425a3d3ae6ce713c58328607e50e523 (patch)
treec35215adc859d0f68f854fa10debf2e1ebd63e78 /transport.c
parent57f6ec029090f64377ec5c0926b6e2e39b0caa4f (diff)
downloadgit-86386829d425a3d3ae6ce713c58328607e50e523.tar.gz
fix simple deepening of a repo
If all refs sent by the remote repo during a fetch are reachable locally, then no further conversation is performed with the remote. This check is skipped when the --depth argument is provided to allow the deepening of a shallow clone which corresponding remote repo has no changed. However, some additional filtering was added in commit c29727d5 to remove those refs which are equal on both sides. If the remote repo has not changed, then the list of refs to give the remote process becomes empty and simply attempting to deepen a shallow repo always fails. Let's stop being smart in that case and simply send the whole list over when that condition is met. The remote will do the right thing anyways. Test cases for this issue are also provided. Signed-off-by: Nicolas Pitre <nico@cam.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'transport.c')
-rw-r--r--transport.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/transport.c b/transport.c
index efecb65258..5342f1e2ec 100644
--- a/transport.c
+++ b/transport.c
@@ -1049,11 +1049,12 @@ const struct ref *transport_get_remote_refs(struct transport *transport)
int transport_fetch_refs(struct transport *transport, const struct ref *refs)
{
int rc;
- int nr_heads = 0, nr_alloc = 0;
+ int nr_heads = 0, nr_alloc = 0, nr_refs = 0;
const struct ref **heads = NULL;
const struct ref *rm;
for (rm = refs; rm; rm = rm->next) {
+ nr_refs++;
if (rm->peer_ref &&
!hashcmp(rm->peer_ref->old_sha1, rm->old_sha1))
continue;
@@ -1061,6 +1062,19 @@ int transport_fetch_refs(struct transport *transport, const struct ref *refs)
heads[nr_heads++] = rm;
}
+ if (!nr_heads) {
+ /*
+ * When deepening of a shallow repository is requested,
+ * then local and remote refs are likely to still be equal.
+ * Just feed them all to the fetch method in that case.
+ * This condition shouldn't be met in a non-deepening fetch
+ * (see builtin-fetch.c:quickfetch()).
+ */
+ heads = xmalloc(nr_refs * sizeof(*heads));
+ for (rm = refs; rm; rm = rm->next)
+ heads[nr_heads++] = rm;
+ }
+
rc = transport->fetch(transport, nr_heads, heads);
free(heads);
return rc;