From 7b9e3895da699c7893975e96987015f43ed45c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Sat, 14 Sep 2013 17:39:38 +0200 Subject: [PATCH] Wrap some remote functions --- remote.go | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++ repository.go | 30 ++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 remote.go diff --git a/remote.go b/remote.go new file mode 100644 index 0000000..291a3b7 --- /dev/null +++ b/remote.go @@ -0,0 +1,106 @@ +package git + +/* +#cgo pkg-config: libgit2 +#include +#include +*/ +import "C" +import ( + "runtime" + "unsafe" +) + +type RemoteDirection int + +const ( + RemoteDirectionFetch RemoteDirection = C.GIT_DIRECTION_FETCH + RemoteDirectionPush = C.GIT_DIRECTION_PUSH +) + +type AutotagOption int + +const ( + AutotagAuto AutotagOption = C.GIT_REMOTE_DOWNLOAD_TAGS_AUTO + AutotagNone = C.GIT_REMOTE_DOWNLOAD_TAGS_NONE + AutotagAll = C.GIT_REMOTE_DOWNLOAD_TAGS_ALL +) + +type Remote struct { + Name string + Url string + ptr *C.git_remote +} + +func (r *Remote) Connect(direction RemoteDirection) error { + ret := C.git_remote_connect(r.ptr, C.git_direction(direction)) + if ret < 0 { + return LastError() + } + + return nil +} + +func (r *Remote) IsConnected() bool { + return C.git_remote_connected(r.ptr) != 0 +} + +func (r *Remote) Disconnect() { + C.git_remote_disconnect(r.ptr) +} + +func (r *Remote) Autotag() AutotagOption { + return AutotagOption(C.git_remote_autotag(r.ptr)) +} + +func (r *Remote) SetAutotag(opt AutotagOption) { + C.git_remote_set_autotag(r.ptr, C.git_remote_autotag_option_t(opt)) +} + +func (r *Remote) Stop() { + C.git_remote_stop(r.ptr) +} + +func (r *Remote) Save() error { + ret := C.git_remote_save(r.ptr) + if ret < 0 { + return LastError() + } + + return nil +} + +func (r *Remote) Free() { + runtime.SetFinalizer(r, nil) + C.git_remote_free(r.ptr) +} + +func newRemoteFromC(ptr *C.git_remote) *Remote { + remote := &Remote{ + ptr: ptr, + Name: C.GoString(C.git_remote_name(ptr)), + Url: C.GoString(C.git_remote_url(ptr)), + } + + runtime.SetFinalizer(remote, (*Remote).Free) + + return remote +} + + +// These belong to the git_remote namespace but don't require any remote + +func UrlIsValid(url string) bool { + curl := C.CString(url) + defer C.free(unsafe.Pointer(curl)) + + return C.git_remote_valid_url(curl) != 0 +} + + +func UrlIsSupported(url string) bool { + curl := C.CString(url) + defer C.free(unsafe.Pointer(curl)) + + return C.git_remote_supported_url(curl) != 0 +} diff --git a/repository.go b/repository.go index 34df0aa..d6b52ef 100644 --- a/repository.go +++ b/repository.go @@ -125,6 +125,20 @@ func (v *Repository) LookupReference(name string) (*Reference, error) { return newReferenceFromC(ptr), nil } +func (v *Repository) LookupRemote(name string) (*Remote, error) { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + + var remote *C.git_remote + ecode := C.git_remote_load(&remote, v.ptr, cname) + if ecode < 0 { + return nil, LastError() + } + + return newRemoteFromC(remote), nil + +} + func (v *Repository) CreateReference(name string, oid *Oid, force bool) (*Reference, error) { cname := C.CString(name) defer C.free(unsafe.Pointer(cname)) @@ -207,6 +221,22 @@ func (v *Repository) CreateCommit( return oid, nil } +func (v *Repository) CreateRemote(name, url string) (*Remote, error) { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + + curl := C.CString(url) + defer C.free(unsafe.Pointer(curl)) + + var remote *C.git_remote + ret := C.git_remote_create(&remote, v.ptr, cname, curl) + if ret < 0 { + return nil, LastError() + } + + return newRemoteFromC(remote), nil +} + func (v *Odb) Free() { runtime.SetFinalizer(v, nil) C.git_odb_free(v.ptr)