summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/fetch.c20
-rw-r--r--src/fetch.h6
-rw-r--r--src/remote.c11
-rw-r--r--src/remote.h1
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;