Commit 306475eb by Carlos Martín Nieto

remote: expose the remote's symref mappings

Add a symref_target field to git_remote_head to expose the symref
mappings to the user.
parent 8156835d
...@@ -41,6 +41,11 @@ struct git_remote_head { ...@@ -41,6 +41,11 @@ struct git_remote_head {
git_oid oid; git_oid oid;
git_oid loid; git_oid loid;
char *name; char *name;
/**
* If the server send a symref mapping for this ref, this will
* point to the target.
*/
char *symref_target;
}; };
/** /**
......
...@@ -75,6 +75,25 @@ int git_smart__update_heads(transport_smart *t, git_vector *symrefs) ...@@ -75,6 +75,25 @@ int git_smart__update_heads(transport_smart *t, git_vector *symrefs)
if (pkt->type != GIT_PKT_REF) if (pkt->type != GIT_PKT_REF)
continue; continue;
if (symrefs) {
git_refspec *spec;
git_buf buf = GIT_BUF_INIT;
size_t j;
int error;
git_vector_foreach(symrefs, j, spec) {
git_buf_clear(&buf);
if (git_refspec_src_matches(spec, ref->head.name) &&
!(error = git_refspec_transform(&buf, spec, ref->head.name)))
ref->head.symref_target = git_buf_detach(&buf);
}
git_buf_free(&buf);
if (error < 0)
return error;
}
if (git_vector_insert(&t->heads, &ref->head) < 0) if (git_vector_insert(&t->heads, &ref->head) < 0)
return -1; return -1;
} }
......
...@@ -433,6 +433,7 @@ void git_pkt_free(git_pkt *pkt) ...@@ -433,6 +433,7 @@ void git_pkt_free(git_pkt *pkt)
if (pkt->type == GIT_PKT_REF) { if (pkt->type == GIT_PKT_REF) {
git_pkt_ref *p = (git_pkt_ref *) pkt; git_pkt_ref *p = (git_pkt_ref *) pkt;
git__free(p->head.name); git__free(p->head.name);
git__free(p->head.symref_target);
} }
if (pkt->type == GIT_PKT_OK) { if (pkt->type == GIT_PKT_OK) {
......
...@@ -184,3 +184,21 @@ void test_online_fetch__ls_disconnected(void) ...@@ -184,3 +184,21 @@ void test_online_fetch__ls_disconnected(void)
git_remote_free(remote); git_remote_free(remote);
} }
void test_online_fetch__remote_symrefs(void)
{
const git_remote_head **refs;
size_t refs_len;
git_remote *remote;
cl_git_pass(git_remote_create(&remote, _repo, "test",
"http://github.com/libgit2/TestGitRepository.git"));
cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH));
git_remote_disconnect(remote);
cl_git_pass(git_remote_ls(&refs, &refs_len, remote));
cl_assert_equal_s("HEAD", refs[0]->name);
cl_assert_equal_s("refs/heads/master", refs[0]->symref_target);
git_remote_free(remote);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment