Also allow the new update_refs to actually update the refs set, this way the remote helper can set the value of previously unknown refs. Signed-off-by: Sverre Rabbelier <srabbelier@xxxxxxxxx> --- Daniel, if we can get wanted_peer_refs to keep HEAD as a wanted ref somehow this patch could be a lot simpler. builtin-clone.c | 7 +++++++ builtin-fetch.c | 3 +++ transport-helper.c | 15 +++++++++++++++ transport.c | 6 ++++++ transport.h | 8 ++++++-- 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/builtin-clone.c b/builtin-clone.c index 0042bee..7c90ce2 100644 --- a/builtin-clone.c +++ b/builtin-clone.c @@ -529,6 +529,13 @@ int cmd_clone(int argc, const char **argv, const char *prefix) struct ref *ref_cpy = wanted_peer_refs(refs, refspec); mapped_refs = ref_cpy; transport_fetch_refs(transport, ref_cpy); + if (transport->update_refs) + { + ref_cpy = copy_ref_list(refs); + transport_update_refs(transport, ref_cpy); + refs = ref_cpy; + mapped_refs = wanted_peer_refs(refs, refspec); + } } } diff --git a/builtin-fetch.c b/builtin-fetch.c index 013a6ba..c35188b 100644 --- a/builtin-fetch.c +++ b/builtin-fetch.c @@ -479,7 +479,10 @@ static int fetch_refs(struct transport *transport, struct ref *ref_map) { int ret = quickfetch(ref_map); if (ret) + { ret = transport_fetch_refs(transport, ref_map); + transport_update_refs(transport, ref_map); + } if (!ret) ret |= store_updated_refs(transport->url, transport->remote->name, diff --git a/transport-helper.c b/transport-helper.c index f840842..ab40a9a 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -207,6 +207,20 @@ static struct ref *get_refs_list(struct transport *transport, int for_push) return ret; } +static int update_refs(struct transport *transport, struct ref *refs) +{ + struct ref *ref = refs; + + while (ref) { + if (ref->status & REF_STATUS_UPTODATE) + continue; + read_ref(ref->symref ? ref->symref : ref->name, ref->old_sha1); + ref = ref->next; + } + + return 0; +} + int transport_helper_init(struct transport *transport, const char *name) { struct helper_data *data = xcalloc(sizeof(*data), 1); @@ -215,6 +229,7 @@ int transport_helper_init(struct transport *transport, const char *name) transport->data = data; transport->get_refs_list = get_refs_list; transport->fetch = fetch; + transport->update_refs = update_refs; transport->disconnect = disconnect_helper; return 0; } diff --git a/transport.c b/transport.c index 13bab4e..741a3a7 100644 --- a/transport.c +++ b/transport.c @@ -966,6 +966,12 @@ int transport_fetch_refs(struct transport *transport, struct ref *refs) return rc; } +void transport_update_refs(struct transport *transport, struct ref *refs) +{ + if (transport->update_refs) + transport->update_refs(transport, refs); +} + void transport_unlock_pack(struct transport *transport) { if (transport->pack_lockfile) { diff --git a/transport.h b/transport.h index 503db11..1aba16c 100644 --- a/transport.h +++ b/transport.h @@ -32,12 +32,15 @@ struct transport { /** * Fetch the objects for the given refs. Note that this gets * an array, and should ignore the list structure. - * + **/ + int (*fetch)(struct transport *transport, int refs_nr, struct ref **refs); + + /** * If the transport did not get hashes for refs in * get_refs_list(), it should set the old_sha1 fields in the * provided refs now. **/ - int (*fetch)(struct transport *transport, int refs_nr, struct ref **refs); + int (*update_refs)(struct transport *transport, struct ref *refs); /** * Push the objects and refs. Send the necessary objects, and @@ -112,6 +115,7 @@ int transport_push(struct transport *connection, const struct ref *transport_get_remote_refs(struct transport *transport); int transport_fetch_refs(struct transport *transport, struct ref *refs); +void transport_update_refs(struct transport *transport, struct ref *refs); void transport_unlock_pack(struct transport *transport); int transport_disconnect(struct transport *transport); char *transport_anonymize_url(const char *url); -- 1.6.5.2.291.gf76a3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html