[PATCH 7/7] Factor ref updating out of fetch_with_import
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@gmail.com>
---
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(-)
Show changes to 4 files +31 −9
builtin-clone.c, builtin-fetch.c, transport-helper.c, transport.h
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