summaryrefslogtreecommitdiff
path: root/src/remote.c
diff options
context:
space:
mode:
authorCarlos Martín Nieto <carlos@cmartin.tk>2011-06-23 03:04:23 +0200
committerCarlos Martín Nieto <carlos@cmartin.tk>2011-06-27 02:12:40 +0200
commit9ba49bb5c861651c5136ad6678fc1570801ddec1 (patch)
treefbe1d71384587a1be506cca4219a1bff129f3ff8 /src/remote.c
parentc7c787ce0cd944c0e904d47c5ef1088de2fcf85a (diff)
downloadlibgit2-9ba49bb5c861651c5136ad6678fc1570801ddec1.tar.gz
Add git_remote_connect and git_remote_ls
These allow you to implement git-ls-remote when given a reference name and a repository. Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
Diffstat (limited to 'src/remote.c')
-rw-r--r--src/remote.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/remote.c b/src/remote.c
index aa22debce..59ea6a797 100644
--- a/src/remote.c
+++ b/src/remote.c
@@ -172,6 +172,35 @@ const git_refspec *git_remote_pushspec(struct git_remote *remote)
return &remote->push;
}
+int git_remote_connect(git_remote *remote, git_net_direction dir)
+{
+ int error;
+ git_transport *t;
+
+ error = git_transport_new(&t, remote->url);
+ if (error < GIT_SUCCESS)
+ return git__rethrow(error, "Failed to create transport");
+
+ error = git_transport_connect(t, dir);
+ if (error < GIT_SUCCESS) {
+ error = git__rethrow(error, "Failed to connect the transport");
+ goto cleanup;
+ }
+
+ remote->transport = t;
+
+cleanup:
+ if (error < GIT_SUCCESS)
+ git_transport_free(t);
+
+ return error;
+}
+
+int git_remote_ls(git_remote *remote, git_headarray *refs)
+{
+ return git_transport_ls(remote->transport, refs);
+}
+
void git_remote_free(git_remote *remote)
{
free(remote->fetch.src);
@@ -180,5 +209,10 @@ void git_remote_free(git_remote *remote)
free(remote->push.dst);
free(remote->url);
free(remote->name);
+ if (remote->transport != NULL) {
+ if (remote->transport->connected)
+ git_transport_close(remote->transport);
+ git_transport_free(remote->transport);
+ }
free(remote);
}