diff options
| author | Jesse Ezell <[email protected]> | 2014-03-26 11:18:21 -0700 |
|---|---|---|
| committer | Jesse Ezell <[email protected]> | 2014-03-26 11:18:21 -0700 |
| commit | 85420f2002ae85b2e86b3c37c04e462c1cef462a (patch) | |
| tree | 943fd6fef1b14db9bd6818d4b14243e6d3641b1d /clone.go | |
| parent | 8ad5cbc53763ca8e89ede40f91edab80c8def1f1 (diff) | |
| parent | 2811845a1287d949a74b8ed80a5791fd8875002a (diff) | |
Merge branch 'master' of http://github.com/libgit2/git2go into merge
Diffstat (limited to 'clone.go')
| -rw-r--r-- | clone.go | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/clone.go b/clone.go new file mode 100644 index 0000000..1bc3261 --- /dev/null +++ b/clone.go @@ -0,0 +1,75 @@ +package git + +/* +#include <git2.h> +#include <git2/errors.h> + +*/ +import "C" +import ( + "runtime" + "unsafe" +) + +type CloneOptions struct { + *CheckoutOpts + *RemoteCallbacks + Bare bool + IgnoreCertErrors bool + RemoteName string + CheckoutBranch string +} + +func Clone(url string, path string, options *CloneOptions) (*Repository, error) { + repo := new(Repository) + + curl := C.CString(url) + defer C.free(unsafe.Pointer(curl)) + + cpath := C.CString(path) + defer C.free(unsafe.Pointer(cpath)) + + var copts C.git_clone_options + populateCloneOptions(&copts, options) + + // finish populating clone options here so we can defer CString free + if len(options.RemoteName) != 0 { + copts.remote_name = C.CString(options.RemoteName) + defer C.free(unsafe.Pointer(copts.remote_name)) + } + + if len(options.CheckoutBranch) != 0 { + copts.checkout_branch = C.CString(options.CheckoutBranch) + defer C.free(unsafe.Pointer(copts.checkout_branch)) + } + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + ret := C.git_clone(&repo.ptr, curl, cpath, &copts) + if ret < 0 { + return nil, MakeGitError(ret) + } + + runtime.SetFinalizer(repo, (*Repository).Free) + return repo, nil +} + +func populateCloneOptions(ptr *C.git_clone_options, opts *CloneOptions) { + C.git_clone_init_options(ptr, C.GIT_CLONE_OPTIONS_VERSION) + + if opts == nil { + return + } + populateCheckoutOpts(&ptr.checkout_opts, opts.CheckoutOpts) + populateRemoteCallbacks(&ptr.remote_callbacks, opts.RemoteCallbacks) + if opts.Bare { + ptr.bare = 1 + } else { + ptr.bare = 0 + } + if opts.IgnoreCertErrors { + ptr.ignore_cert_errors = 1 + } else { + ptr.ignore_cert_errors = 0 + } +} |
