diff --git a/include/git2/remote.h b/include/git2/remote.h index 74b0a05c6..a634b49c2 100644 --- a/include/git2/remote.h +++ b/include/git2/remote.h @@ -141,6 +141,16 @@ GIT_EXTERN(int) git_remote_download(char **filename, git_remote *remote); */ GIT_EXTERN(void) git_remote_free(struct git_remote *remote); +/** + * Update the tips to the new state + * + * Make sure that you only call this once you've successfully indexed + * or expanded the packfile. + * + * @param remote the remote to update + */ +GIT_EXTERN(int) git_remote_update_tips(struct git_remote *remote); + /** @} */ GIT_END_DECL #endif diff --git a/src/remote.c b/src/remote.c index 75f2dc700..618e8f083 100644 --- a/src/remote.c +++ b/src/remote.c @@ -31,6 +31,7 @@ #include "repository.h" #include "remote.h" #include "fetch.h" +#include "refs.h" static int refspec_parse(git_refspec *refspec, const char *str) { @@ -218,6 +219,32 @@ git_headarray *git_remote_tips(git_remote *remote) return &remote->refs; } +int git_remote_update_tips(struct git_remote *remote) +{ + int error = GIT_SUCCESS; + unsigned int i; + char refname[GIT_PATH_MAX]; + git_headarray *refs = &remote->refs; + git_remote_head *head; + git_reference *ref; + struct git_refspec *spec = &remote->fetch; + + memset(refname, 0x0, sizeof(refname)); + + for (i = 0; i < refs->len; ++i) { + head = refs->heads[i]; + error = git_refspec_transform(refname, sizeof(refname), spec, head->name); + if (error < GIT_SUCCESS) + return error; + + error = git_reference_create_oid(&ref, remote->repo, refname, &head->oid, 1); + if (error < GIT_SUCCESS) + return error; + } + + return GIT_SUCCESS; +} + void git_remote_free(git_remote *remote) { free(remote->fetch.src);