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> --- This is the most important patch of the series, without it it is truly impossible to 'git clone hg::/path/to/hg/repo' since when we try to guess remote_head, we use find_ref_by_name(refs, "HEAD"), which will not find anything unless we set refs to the updated refs _after_ doing the import. This is a result of the fact that we do not know the value of the remote HEAD until after the import is complete. builtin-clone.c | 7 +++++++ builtin-fetch.c | 4 ++++ transport-helper.c | 22 +++++++++++++++------- transport.h | 7 +++++-- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/builtin-clone.c b/builtin-clone.c index f281756..768668d 100644 --- a/builtin-clone.c +++ b/builtin-clone.c @@ -512,6 +512,13 @@ int cmd_clone(int argc, const char **argv, const char *prefix) if (refs) { struct ref *ref_cpy = copy_ref_list(refs); 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 63a4ff0..3aaac47 100644 --- a/builtin-fetch.c +++ b/builtin-fetch.c @@ -479,7 +479,11 @@ 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); + if (transport->update_refs) + 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 a361366..9a98fae 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -154,13 +154,6 @@ static int fetch_with_import(struct transport *transport, finish_command(&fastimport); free((char *) fastimport.argv[2]); free((char *) fastimport.argv[3]); - - for (i = 0; i < nr_heads; i++) { - posn = to_fetch[i]; - if (posn->status & REF_STATUS_UPTODATE) - continue; - read_ref(posn->symref ? posn->symref : posn->name, posn->old_sha1); - } return 0; } @@ -255,6 +248,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); @@ -264,5 +271,6 @@ int transport_helper_init(struct transport *transport, const char *name) transport->get_refs_list = get_refs_list; transport->fetch = fetch; transport->disconnect = release_helper; + transport->update_refs = update_refs; return 0; } diff --git a/transport.h b/transport.h index 40dfe64..6d31df3 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 -- 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