summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVicent Martí <vicent@github.com>2013-04-15 15:27:27 -0700
committerVicent Martí <vicent@github.com>2013-04-15 15:27:27 -0700
commit54e05482348c3844c6002b3a96ab05264cf66993 (patch)
treeaea0df5db615724227e0bda375a48f94762142be /src
parent77849ebf1e39126bcb9f1245423749d45d226022 (diff)
parent404eadb089f5757842d2703ab1de849dd1f79a24 (diff)
downloadlibgit2-54e05482348c3844c6002b3a96ab05264cf66993.tar.gz
Merge pull request #1470 from carlosmn/remote-ls-after-close
Fetch fixes
Diffstat (limited to 'src')
-rw-r--r--src/remote.c9
-rw-r--r--src/transports/local.c26
-rw-r--r--src/transports/smart.c14
3 files changed, 26 insertions, 23 deletions
diff --git a/src/remote.c b/src/remote.c
index 896361e30..56853834b 100644
--- a/src/remote.c
+++ b/src/remote.c
@@ -586,11 +586,6 @@ int git_remote_ls(git_remote *remote, git_headlist_cb list_cb, void *payload)
{
assert(remote);
- if (!git_remote_connected(remote)) {
- giterr_set(GITERR_NET, "The remote is not connected");
- return -1;
- }
-
return remote->transport->ls(remote->transport, list_cb, payload);
}
@@ -736,6 +731,10 @@ static int git_remote_write_fetchhead(git_remote *remote, git_vector *update_hea
assert(remote);
+ /* no heads, nothing to do */
+ if (update_heads->length == 0)
+ return 0;
+
spec = &remote->fetch;
if (git_vector_init(&fetchhead_refs, update_heads->length, git_fetchhead_ref_cmp) < 0)
diff --git a/src/transports/local.c b/src/transports/local.c
index ce89bb213..8af970eac 100644
--- a/src/transports/local.c
+++ b/src/transports/local.c
@@ -36,7 +36,8 @@ typedef struct {
git_atomic cancelled;
git_repository *repo;
git_vector refs;
- unsigned connected : 1;
+ unsigned connected : 1,
+ have_refs : 1;
} transport_local;
static int add_ref(transport_local *t, const char *name)
@@ -139,6 +140,7 @@ static int store_refs(transport_local *t)
goto on_error;
}
+ t->have_refs = 1;
git_strarray_free(&ref_names);
return 0;
@@ -208,8 +210,8 @@ static int local_ls(git_transport *transport, git_headlist_cb list_cb, void *pay
unsigned int i;
git_remote_head *head = NULL;
- if (!t->connected) {
- giterr_set(GITERR_NET, "The transport is not connected");
+ if (!t->have_refs) {
+ giterr_set(GITERR_NET, "The transport has not yet loaded the refs");
return -1;
}
@@ -569,8 +571,6 @@ static void local_cancel(git_transport *transport)
static int local_close(git_transport *transport)
{
transport_local *t = (transport_local *)transport;
- size_t i;
- git_remote_head *head;
t->connected = 0;
@@ -579,13 +579,6 @@ static int local_close(git_transport *transport)
t->repo = NULL;
}
- git_vector_foreach(&t->refs, i, head) {
- git__free(head->name);
- git__free(head);
- }
-
- git_vector_free(&t->refs);
-
if (t->url) {
git__free(t->url);
t->url = NULL;
@@ -597,10 +590,19 @@ static int local_close(git_transport *transport)
static void local_free(git_transport *transport)
{
transport_local *t = (transport_local *)transport;
+ size_t i;
+ git_remote_head *head;
/* Close the transport, if it's still open. */
local_close(transport);
+ git_vector_foreach(&t->refs, i, head) {
+ git__free(head->name);
+ git__free(head);
+ }
+
+ git_vector_free(&t->refs);
+
/* Free the transport */
git__free(t);
}
diff --git a/src/transports/smart.c b/src/transports/smart.c
index bfcce0c08..416eb221f 100644
--- a/src/transports/smart.c
+++ b/src/transports/smart.c
@@ -253,7 +253,6 @@ static int git_smart__read_flags(git_transport *transport, int *flags)
static int git_smart__close(git_transport *transport)
{
transport_smart *t = (transport_smart *)transport;
- git_vector *refs = &t->refs;
git_vector *common = &t->common;
unsigned int i;
git_pkt *p;
@@ -261,11 +260,6 @@ static int git_smart__close(git_transport *transport)
ret = git_smart__reset_stream(t, true);
- git_vector_foreach(refs, i, p)
- git_pkt_free(p);
-
- git_vector_free(refs);
-
git_vector_foreach(common, i, p)
git_pkt_free(p);
@@ -284,6 +278,9 @@ static int git_smart__close(git_transport *transport)
static void git_smart__free(git_transport *transport)
{
transport_smart *t = (transport_smart *)transport;
+ git_vector *refs = &t->refs;
+ unsigned int i;
+ git_pkt *p;
/* Make sure that the current stream is closed, if we have one. */
git_smart__close(transport);
@@ -291,6 +288,11 @@ static void git_smart__free(git_transport *transport)
/* Free the subtransport */
t->wrapped->free(t->wrapped);
+ git_vector_foreach(refs, i, p)
+ git_pkt_free(p);
+
+ git_vector_free(refs);
+
git__free(t);
}