[PATCH 1/5] Allow late reporting of fetched hashes
From: Daniel Barkalow <hidden>
Date: 2016-06-15 22:46:28
Subsystem:
the rest · Maintainer:
Linus Torvalds
Some future transports (in particular, foreign VCS importers) will only report the hashes of new commits when the objects are also available. In preparation, allow fetch_refs() to modify the refs it gets (in particular, the remote side's sha1), and treat the null sha1, when reported by get_ref_list(), as different from any value, including itself (which, when local, indicates that the local version doesn't exist yet). Signed-off-by: Daniel Barkalow <redacted> --- builtin-clone.c | 6 ++++-- transport.c | 17 +++++++++-------- transport.h | 4 ++-- 3 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/builtin-clone.c b/builtin-clone.c
index 0031b5f..ab51974 100644
--- a/builtin-clone.c
+++ b/builtin-clone.c@@ -485,8 +485,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix) option_upload_pack); refs = transport_get_remote_refs(transport); - if(refs) - transport_fetch_refs(transport, refs); + if (refs) { + struct ref *ref_cpy = copy_ref_list(refs); + transport_fetch_refs(transport, ref_cpy); + } } if (refs) {
diff --git a/transport.c b/transport.c
index 3dfb03c..26c578e 100644
--- a/transport.c
+++ b/transport.c@@ -207,7 +207,7 @@ static struct ref *get_refs_via_rsync(struct transport *transport, int for_push) } static int fetch_objs_via_rsync(struct transport *transport, - int nr_objs, const struct ref **to_fetch) + int nr_objs, struct ref **to_fetch) { struct strbuf buf = STRBUF_INIT; struct child_process rsync;
@@ -356,7 +356,7 @@ static int rsync_transport_push(struct transport *transport, #ifndef NO_CURL /* http fetch is the only user */ static int fetch_objs_via_walker(struct transport *transport, - int nr_objs, const struct ref **to_fetch) + int nr_objs, struct ref **to_fetch) { char *dest = xstrdup(transport->url); struct walker *walker = transport->data;
@@ -523,7 +523,7 @@ static struct ref *get_refs_via_curl(struct transport *transport, int for_push) } static int fetch_objs_via_curl(struct transport *transport, - int nr_objs, const struct ref **to_fetch) + int nr_objs, struct ref **to_fetch) { if (!transport->data) transport->data = get_http_walker(transport->url,
@@ -563,7 +563,7 @@ static struct ref *get_refs_from_bundle(struct transport *transport, int for_pus } static int fetch_refs_from_bundle(struct transport *transport, - int nr_heads, const struct ref **to_fetch) + int nr_heads, struct ref **to_fetch) { struct bundle_transport_data *data = transport->data; return unbundle(&data->header, data->fd);
@@ -641,7 +641,7 @@ static struct ref *get_refs_via_connect(struct transport *transport, int for_pus } static int fetch_refs_via_pack(struct transport *transport, - int nr_heads, const struct ref **to_fetch) + int nr_heads, struct ref **to_fetch) { struct git_transport_data *data = transport->data; char **heads = xmalloc(nr_heads * sizeof(*heads));
@@ -1046,15 +1046,16 @@ const struct ref *transport_get_remote_refs(struct transport *transport) return transport->remote_refs; } -int transport_fetch_refs(struct transport *transport, const struct ref *refs) +int transport_fetch_refs(struct transport *transport, struct ref *refs) { int rc; int nr_heads = 0, nr_alloc = 0; - const struct ref **heads = NULL; - const struct ref *rm; + struct ref **heads = NULL; + struct ref *rm; for (rm = refs; rm; rm = rm->next) { if (rm->peer_ref && + !is_null_sha1(rm->old_sha1) && !hashcmp(rm->peer_ref->old_sha1, rm->old_sha1)) continue; ALLOC_GROW(heads, nr_heads + 1, nr_alloc);
diff --git a/transport.h b/transport.h
index b1c2252..489e96a 100644
--- a/transport.h
+++ b/transport.h@@ -19,7 +19,7 @@ struct transport { const char *value); struct ref *(*get_refs_list)(struct transport *transport, int for_push); - int (*fetch)(struct transport *transport, int refs_nr, const struct ref **refs); + int (*fetch)(struct transport *transport, int refs_nr, struct ref **refs); int (*push_refs)(struct transport *transport, struct ref *refs, int flags); int (*push)(struct transport *connection, int refspec_nr, const char **refspec, int flags);
@@ -71,7 +71,7 @@ int transport_push(struct transport *connection, const struct ref *transport_get_remote_refs(struct transport *transport); -int transport_fetch_refs(struct transport *transport, const struct ref *refs); +int transport_fetch_refs(struct transport *transport, struct ref *refs); void transport_unlock_pack(struct transport *transport); int transport_disconnect(struct transport *transport);
--
1.6.2.1.476.g9bf04b