diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/fetch.c | 20 | ||||
-rw-r--r-- | src/fetch.h | 6 | ||||
-rw-r--r-- | src/remote.c | 11 | ||||
-rw-r--r-- | src/remote.h | 1 |
4 files changed, 29 insertions, 9 deletions
diff --git a/src/fetch.c b/src/fetch.c index 5dc044065..b1da7a19f 100644 --- a/src/fetch.c +++ b/src/fetch.c @@ -32,6 +32,7 @@ #include "transport.h" #include "remote.h" #include "refspec.h" +#include "fetch.h" /* * Don't forget that this depends on the enum being correctly set @@ -44,11 +45,7 @@ static int whn_cmp(const void *a, const void *b) return headb->type - heada->type; } -/* - * FIXME: we assume that the transport has been connected, enforce - * that somehow, we also want to be called from _negotiate - */ -int git_fetch_list_want(git_headarray *whn_list, git_remote *remote) +int filter_wants(git_remote *remote) { git_vector list; git_headarray refs; @@ -122,8 +119,8 @@ int git_fetch_list_want(git_headarray *whn_list, git_remote *remote) } git_vector_sort(&list); - whn_list->len = list.length; - whn_list->heads = (git_remote_head **) list.contents; + remote->refs.len = list.length; + remote->refs.heads = (git_remote_head **) list.contents; return GIT_SUCCESS; @@ -137,19 +134,24 @@ cleanup: * them out. When we get an ACK we hide that commit and continue * traversing until we're done */ -int git_fetch_negotiate(git_headarray *list, git_remote *remote) +int git_fetch_negotiate(git_remote *remote) { git_revwalk *walk; int error; unsigned int i; git_reference *ref; git_strarray refs; + git_headarray *list = &remote->refs; git_repository *repo = remote->repo; git_oid oid; + error = filter_wants(remote); + if (error < GIT_SUCCESS) + return git__rethrow(error, "Failed to filter the reference list for wants"); + /* Don't try to negotiate when we don't want anything */ if (list->len == 0) - return GIT_EINVALIDARGS; + return GIT_SUCCESS; /* * Now we have everything set up so we can start tell the server diff --git a/src/fetch.h b/src/fetch.h new file mode 100644 index 000000000..2856f12ee --- /dev/null +++ b/src/fetch.h @@ -0,0 +1,6 @@ +#ifndef INCLUDE_fetch_h__ +#define INCLUDE_fetch_h__ + +int git_fetch_negotiate(git_remote *remote); + +#endif diff --git a/src/remote.c b/src/remote.c index 809bfbb57..07628d8d0 100644 --- a/src/remote.c +++ b/src/remote.c @@ -30,6 +30,7 @@ #include "config.h" #include "repository.h" #include "remote.h" +#include "fetch.h" static int refspec_parse(git_refspec *refspec, const char *str) { @@ -202,6 +203,16 @@ int git_remote_ls(git_remote *remote, git_headarray *refs) return git_transport_ls(remote->transport, refs); } +int git_remote_negotiate(git_remote *remote) +{ + return git_fetch_negotiate(remote); +} + +git_headarray *git_remote_tips(git_remote *remote) +{ + return &remote->refs; +} + void git_remote_free(git_remote *remote) { free(remote->fetch.src); diff --git a/src/remote.h b/src/remote.h index b94193c8f..f5686a29c 100644 --- a/src/remote.h +++ b/src/remote.h @@ -8,6 +8,7 @@ struct git_remote { char *name; char *url; + git_headarray refs; struct git_refspec fetch; struct git_refspec push; git_transport *transport; |