2013-03-05 14:05:19 -06:00
|
|
|
package git
|
|
|
|
|
|
|
|
/*
|
|
|
|
#include <git2.h>
|
|
|
|
|
|
|
|
extern int _go_git_visit_submodule(git_repository *repo, void *fct);
|
|
|
|
*/
|
|
|
|
import "C"
|
2020-12-05 15:13:59 -06:00
|
|
|
|
2013-03-05 14:05:19 -06:00
|
|
|
import (
|
2020-12-05 15:13:59 -06:00
|
|
|
"errors"
|
2013-09-18 02:23:47 -05:00
|
|
|
"runtime"
|
2013-03-05 14:05:19 -06:00
|
|
|
"unsafe"
|
|
|
|
)
|
|
|
|
|
2015-01-06 16:02:44 -06:00
|
|
|
// SubmoduleUpdateOptions
|
|
|
|
type SubmoduleUpdateOptions struct {
|
|
|
|
*CheckoutOpts
|
2015-06-07 21:11:21 -05:00
|
|
|
*FetchOptions
|
2015-01-06 16:02:44 -06:00
|
|
|
}
|
|
|
|
|
2013-03-05 14:05:19 -06:00
|
|
|
// Submodule
|
|
|
|
type Submodule struct {
|
|
|
|
ptr *C.git_submodule
|
2017-07-08 09:07:51 -05:00
|
|
|
r *Repository
|
|
|
|
}
|
|
|
|
|
|
|
|
func newSubmoduleFromC(ptr *C.git_submodule, r *Repository) *Submodule {
|
|
|
|
s := &Submodule{ptr: ptr, r: r}
|
|
|
|
runtime.SetFinalizer(s, (*Submodule).Free)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
func (sub *Submodule) Free() {
|
|
|
|
runtime.SetFinalizer(sub, nil)
|
|
|
|
C.git_submodule_free(sub.ptr)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
type SubmoduleUpdate int
|
|
|
|
|
|
|
|
const (
|
2015-01-06 16:02:44 -06:00
|
|
|
SubmoduleUpdateCheckout SubmoduleUpdate = C.GIT_SUBMODULE_UPDATE_CHECKOUT
|
|
|
|
SubmoduleUpdateRebase SubmoduleUpdate = C.GIT_SUBMODULE_UPDATE_REBASE
|
|
|
|
SubmoduleUpdateMerge SubmoduleUpdate = C.GIT_SUBMODULE_UPDATE_MERGE
|
|
|
|
SubmoduleUpdateNone SubmoduleUpdate = C.GIT_SUBMODULE_UPDATE_NONE
|
2013-03-05 14:05:19 -06:00
|
|
|
)
|
|
|
|
|
|
|
|
type SubmoduleIgnore int
|
|
|
|
|
|
|
|
const (
|
2014-10-27 09:12:18 -05:00
|
|
|
SubmoduleIgnoreNone SubmoduleIgnore = C.GIT_SUBMODULE_IGNORE_NONE
|
|
|
|
SubmoduleIgnoreUntracked SubmoduleIgnore = C.GIT_SUBMODULE_IGNORE_UNTRACKED
|
|
|
|
SubmoduleIgnoreDirty SubmoduleIgnore = C.GIT_SUBMODULE_IGNORE_DIRTY
|
|
|
|
SubmoduleIgnoreAll SubmoduleIgnore = C.GIT_SUBMODULE_IGNORE_ALL
|
2013-03-05 14:05:19 -06:00
|
|
|
)
|
|
|
|
|
|
|
|
type SubmoduleStatus int
|
|
|
|
|
|
|
|
const (
|
|
|
|
SubmoduleStatusInHead SubmoduleStatus = C.GIT_SUBMODULE_STATUS_IN_HEAD
|
2014-10-27 09:12:18 -05:00
|
|
|
SubmoduleStatusInIndex SubmoduleStatus = C.GIT_SUBMODULE_STATUS_IN_INDEX
|
|
|
|
SubmoduleStatusInConfig SubmoduleStatus = C.GIT_SUBMODULE_STATUS_IN_CONFIG
|
|
|
|
SubmoduleStatusInWd SubmoduleStatus = C.GIT_SUBMODULE_STATUS_IN_WD
|
|
|
|
SubmoduleStatusIndexAdded SubmoduleStatus = C.GIT_SUBMODULE_STATUS_INDEX_ADDED
|
|
|
|
SubmoduleStatusIndexDeleted SubmoduleStatus = C.GIT_SUBMODULE_STATUS_INDEX_DELETED
|
|
|
|
SubmoduleStatusIndexModified SubmoduleStatus = C.GIT_SUBMODULE_STATUS_INDEX_MODIFIED
|
|
|
|
SubmoduleStatusWdUninitialized SubmoduleStatus = C.GIT_SUBMODULE_STATUS_WD_UNINITIALIZED
|
|
|
|
SubmoduleStatusWdAdded SubmoduleStatus = C.GIT_SUBMODULE_STATUS_WD_ADDED
|
|
|
|
SubmoduleStatusWdDeleted SubmoduleStatus = C.GIT_SUBMODULE_STATUS_WD_DELETED
|
|
|
|
SubmoduleStatusWdModified SubmoduleStatus = C.GIT_SUBMODULE_STATUS_WD_MODIFIED
|
|
|
|
SubmoduleStatusWdIndexModified SubmoduleStatus = C.GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED
|
|
|
|
SubmoduleStatusWdWdModified SubmoduleStatus = C.GIT_SUBMODULE_STATUS_WD_WD_MODIFIED
|
|
|
|
SubmoduleStatusWdUntracked SubmoduleStatus = C.GIT_SUBMODULE_STATUS_WD_UNTRACKED
|
2013-03-05 14:05:19 -06:00
|
|
|
)
|
|
|
|
|
2014-01-29 17:01:26 -06:00
|
|
|
type SubmoduleRecurse int
|
|
|
|
|
|
|
|
const (
|
|
|
|
SubmoduleRecurseNo SubmoduleRecurse = C.GIT_SUBMODULE_RECURSE_NO
|
2014-10-27 09:12:18 -05:00
|
|
|
SubmoduleRecurseYes SubmoduleRecurse = C.GIT_SUBMODULE_RECURSE_YES
|
|
|
|
SubmoduleRecurseOndemand SubmoduleRecurse = C.GIT_SUBMODULE_RECURSE_ONDEMAND
|
2014-01-29 17:01:26 -06:00
|
|
|
)
|
|
|
|
|
2015-06-27 17:58:31 -05:00
|
|
|
type SubmoduleCollection struct {
|
|
|
|
repo *Repository
|
|
|
|
}
|
|
|
|
|
2013-03-05 14:05:19 -06:00
|
|
|
func SubmoduleStatusIsUnmodified(status int) bool {
|
|
|
|
o := SubmoduleStatus(status) & ^(SubmoduleStatusInHead | SubmoduleStatusInIndex |
|
|
|
|
SubmoduleStatusInConfig | SubmoduleStatusInWd)
|
|
|
|
return o == 0
|
|
|
|
}
|
|
|
|
|
2015-06-27 17:58:31 -05:00
|
|
|
func (c *SubmoduleCollection) Lookup(name string) (*Submodule, error) {
|
2013-03-05 14:05:19 -06:00
|
|
|
cname := C.CString(name)
|
|
|
|
defer C.free(unsafe.Pointer(cname))
|
|
|
|
|
2017-07-08 09:07:51 -05:00
|
|
|
var ptr *C.git_submodule
|
2013-09-18 02:23:47 -05:00
|
|
|
|
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2017-07-08 09:07:51 -05:00
|
|
|
ret := C.git_submodule_lookup(&ptr, c.repo.ptr, cname)
|
2013-03-05 14:05:19 -06:00
|
|
|
if ret < 0 {
|
2013-07-07 09:43:44 -05:00
|
|
|
return nil, MakeGitError(ret)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
2017-07-08 09:07:51 -05:00
|
|
|
return newSubmoduleFromC(ptr, c.repo), nil
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
2020-12-05 09:23:44 -06:00
|
|
|
// SubmoduleCallback is a function that is called for every submodule found in SubmoduleCollection.Foreach.
|
|
|
|
type SubmoduleCallback func(sub *Submodule, name string) int
|
2020-12-05 15:13:59 -06:00
|
|
|
type submoduleCallbackData struct {
|
|
|
|
callback SubmoduleCallback
|
|
|
|
errorTarget *error
|
|
|
|
}
|
2013-03-05 14:05:19 -06:00
|
|
|
|
2020-12-05 09:23:44 -06:00
|
|
|
//export submoduleCallback
|
|
|
|
func submoduleCallback(csub unsafe.Pointer, name *C.char, handle unsafe.Pointer) C.int {
|
2017-07-08 09:07:51 -05:00
|
|
|
sub := &Submodule{(*C.git_submodule)(csub), nil}
|
2015-04-23 03:33:00 -05:00
|
|
|
|
2020-12-05 15:13:59 -06:00
|
|
|
data, ok := pointerHandles.Get(handle).(submoduleCallbackData)
|
|
|
|
if !ok {
|
2015-05-22 01:58:21 -05:00
|
|
|
panic("invalid submodule visitor callback")
|
2015-04-23 03:33:00 -05:00
|
|
|
}
|
2020-12-05 15:13:59 -06:00
|
|
|
|
|
|
|
ret := data.callback(sub, C.GoString(name))
|
|
|
|
if ret < 0 {
|
|
|
|
*data.errorTarget = errors.New(ErrorCode(ret).String())
|
|
|
|
return C.int(ErrorCodeUser)
|
|
|
|
}
|
|
|
|
|
|
|
|
return C.int(ErrorCodeOK)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
2020-12-05 15:13:59 -06:00
|
|
|
func (c *SubmoduleCollection) Foreach(callback SubmoduleCallback) error {
|
|
|
|
var err error
|
|
|
|
data := submoduleCallbackData{
|
|
|
|
callback: callback,
|
|
|
|
errorTarget: &err,
|
|
|
|
}
|
2013-09-18 02:23:47 -05:00
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2020-12-05 15:13:59 -06:00
|
|
|
handle := pointerHandles.Track(data)
|
2015-04-23 03:33:00 -05:00
|
|
|
defer pointerHandles.Untrack(handle)
|
|
|
|
|
2015-06-27 17:58:31 -05:00
|
|
|
ret := C._go_git_visit_submodule(c.repo.ptr, handle)
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(c)
|
2020-12-05 15:13:59 -06:00
|
|
|
if ret == C.int(ErrorCodeUser) && err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2013-03-05 14:05:19 -06:00
|
|
|
if ret < 0 {
|
2013-07-07 09:43:44 -05:00
|
|
|
return MakeGitError(ret)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
2020-12-05 15:13:59 -06:00
|
|
|
|
2013-03-05 14:05:19 -06:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-06-27 17:58:31 -05:00
|
|
|
func (c *SubmoduleCollection) Add(url, path string, use_git_link bool) (*Submodule, error) {
|
2013-03-05 14:05:19 -06:00
|
|
|
curl := C.CString(url)
|
|
|
|
defer C.free(unsafe.Pointer(curl))
|
|
|
|
cpath := C.CString(path)
|
|
|
|
defer C.free(unsafe.Pointer(cpath))
|
|
|
|
|
2013-09-18 02:23:47 -05:00
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2017-07-08 09:07:51 -05:00
|
|
|
var ptr *C.git_submodule
|
|
|
|
ret := C.git_submodule_add_setup(&ptr, c.repo.ptr, curl, cpath, cbool(use_git_link))
|
2013-03-05 14:05:19 -06:00
|
|
|
if ret < 0 {
|
2013-07-07 09:43:44 -05:00
|
|
|
return nil, MakeGitError(ret)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
2017-07-08 09:07:51 -05:00
|
|
|
return newSubmoduleFromC(ptr, c.repo), nil
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func (sub *Submodule) FinalizeAdd() error {
|
2013-09-18 02:23:47 -05:00
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2013-03-05 14:05:19 -06:00
|
|
|
ret := C.git_submodule_add_finalize(sub.ptr)
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(sub)
|
2013-03-05 14:05:19 -06:00
|
|
|
if ret < 0 {
|
2013-07-07 09:43:44 -05:00
|
|
|
return MakeGitError(ret)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (sub *Submodule) AddToIndex(write_index bool) error {
|
2013-09-18 02:23:47 -05:00
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2013-03-05 14:05:19 -06:00
|
|
|
ret := C.git_submodule_add_to_index(sub.ptr, cbool(write_index))
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(sub)
|
2013-03-05 14:05:19 -06:00
|
|
|
if ret < 0 {
|
2013-07-07 09:43:44 -05:00
|
|
|
return MakeGitError(ret)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (sub *Submodule) Name() string {
|
2017-07-08 09:07:51 -05:00
|
|
|
n := C.GoString(C.git_submodule_name(sub.ptr))
|
|
|
|
runtime.KeepAlive(sub)
|
|
|
|
return n
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func (sub *Submodule) Path() string {
|
2017-07-08 09:07:51 -05:00
|
|
|
n := C.GoString(C.git_submodule_path(sub.ptr))
|
|
|
|
runtime.KeepAlive(sub)
|
|
|
|
return n
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func (sub *Submodule) Url() string {
|
2017-07-08 09:07:51 -05:00
|
|
|
n := C.GoString(C.git_submodule_url(sub.ptr))
|
|
|
|
runtime.KeepAlive(sub)
|
|
|
|
return n
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
2015-06-27 17:58:31 -05:00
|
|
|
func (c *SubmoduleCollection) SetUrl(submodule, url string) error {
|
2015-06-27 17:34:54 -05:00
|
|
|
csubmodule := C.CString(submodule)
|
|
|
|
defer C.free(unsafe.Pointer(csubmodule))
|
2013-03-05 14:05:19 -06:00
|
|
|
curl := C.CString(url)
|
|
|
|
defer C.free(unsafe.Pointer(curl))
|
|
|
|
|
2013-09-18 02:23:47 -05:00
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2015-06-27 17:58:31 -05:00
|
|
|
ret := C.git_submodule_set_url(c.repo.ptr, csubmodule, curl)
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(c)
|
2013-03-05 14:05:19 -06:00
|
|
|
if ret < 0 {
|
2013-07-07 09:43:44 -05:00
|
|
|
return MakeGitError(ret)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (sub *Submodule) IndexId() *Oid {
|
2017-07-08 09:07:51 -05:00
|
|
|
var id *Oid
|
2013-03-05 14:05:19 -06:00
|
|
|
idx := C.git_submodule_index_id(sub.ptr)
|
2017-07-08 09:07:51 -05:00
|
|
|
if idx != nil {
|
|
|
|
id = newOidFromC(idx)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(sub)
|
|
|
|
return id
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func (sub *Submodule) HeadId() *Oid {
|
2017-07-08 09:07:51 -05:00
|
|
|
var id *Oid
|
2013-03-05 14:05:19 -06:00
|
|
|
idx := C.git_submodule_head_id(sub.ptr)
|
2017-07-08 09:07:51 -05:00
|
|
|
if idx != nil {
|
|
|
|
id = newOidFromC(idx)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(sub)
|
|
|
|
return id
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func (sub *Submodule) WdId() *Oid {
|
2017-07-08 09:07:51 -05:00
|
|
|
var id *Oid
|
2013-03-05 14:05:19 -06:00
|
|
|
idx := C.git_submodule_wd_id(sub.ptr)
|
2017-07-08 09:07:51 -05:00
|
|
|
if idx != nil {
|
|
|
|
id = newOidFromC(idx)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(sub)
|
|
|
|
return id
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func (sub *Submodule) Ignore() SubmoduleIgnore {
|
|
|
|
o := C.git_submodule_ignore(sub.ptr)
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(sub)
|
2013-03-05 14:05:19 -06:00
|
|
|
return SubmoduleIgnore(o)
|
|
|
|
}
|
|
|
|
|
2015-06-27 17:58:31 -05:00
|
|
|
func (c *SubmoduleCollection) SetIgnore(submodule string, ignore SubmoduleIgnore) error {
|
2015-06-27 17:34:54 -05:00
|
|
|
csubmodule := C.CString(submodule)
|
|
|
|
defer C.free(unsafe.Pointer(csubmodule))
|
|
|
|
|
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2015-06-27 17:58:31 -05:00
|
|
|
ret := C.git_submodule_set_ignore(c.repo.ptr, csubmodule, C.git_submodule_ignore_t(ignore))
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(c)
|
2015-06-27 17:34:54 -05:00
|
|
|
if ret < 0 {
|
|
|
|
return MakeGitError(ret)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
2015-01-06 16:02:44 -06:00
|
|
|
func (sub *Submodule) UpdateStrategy() SubmoduleUpdate {
|
|
|
|
o := C.git_submodule_update_strategy(sub.ptr)
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(sub)
|
2013-03-05 14:05:19 -06:00
|
|
|
return SubmoduleUpdate(o)
|
|
|
|
}
|
|
|
|
|
2015-06-27 17:58:31 -05:00
|
|
|
func (c *SubmoduleCollection) SetUpdate(submodule string, update SubmoduleUpdate) error {
|
2015-06-27 17:34:54 -05:00
|
|
|
csubmodule := C.CString(submodule)
|
|
|
|
defer C.free(unsafe.Pointer(csubmodule))
|
|
|
|
|
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2015-06-27 17:58:31 -05:00
|
|
|
ret := C.git_submodule_set_update(c.repo.ptr, csubmodule, C.git_submodule_update_t(update))
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(c)
|
2015-06-27 17:34:54 -05:00
|
|
|
if ret < 0 {
|
|
|
|
return MakeGitError(ret)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
2014-02-23 09:08:19 -06:00
|
|
|
func (sub *Submodule) FetchRecurseSubmodules() SubmoduleRecurse {
|
2014-02-26 12:41:20 -06:00
|
|
|
return SubmoduleRecurse(C.git_submodule_fetch_recurse_submodules(sub.ptr))
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
2015-06-27 17:58:31 -05:00
|
|
|
func (c *SubmoduleCollection) SetFetchRecurseSubmodules(submodule string, recurse SubmoduleRecurse) error {
|
2015-06-27 17:34:54 -05:00
|
|
|
csubmodule := C.CString(submodule)
|
|
|
|
defer C.free(unsafe.Pointer(csubmodule))
|
|
|
|
|
2013-09-18 02:23:47 -05:00
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2015-06-27 17:58:31 -05:00
|
|
|
ret := C.git_submodule_set_fetch_recurse_submodules(c.repo.ptr, csubmodule, C.git_submodule_recurse_t(recurse))
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(c)
|
2013-03-05 14:05:19 -06:00
|
|
|
if ret < 0 {
|
2014-02-26 09:14:31 -06:00
|
|
|
return MakeGitError(C.int(ret))
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (sub *Submodule) Init(overwrite bool) error {
|
2013-09-18 02:23:47 -05:00
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2013-03-05 14:05:19 -06:00
|
|
|
ret := C.git_submodule_init(sub.ptr, cbool(overwrite))
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(sub)
|
2013-03-05 14:05:19 -06:00
|
|
|
if ret < 0 {
|
2013-07-07 09:43:44 -05:00
|
|
|
return MakeGitError(ret)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (sub *Submodule) Sync() error {
|
2013-09-18 02:23:47 -05:00
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2013-03-05 14:05:19 -06:00
|
|
|
ret := C.git_submodule_sync(sub.ptr)
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(sub)
|
2013-03-05 14:05:19 -06:00
|
|
|
if ret < 0 {
|
2013-07-07 09:43:44 -05:00
|
|
|
return MakeGitError(ret)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (sub *Submodule) Open() (*Repository, error) {
|
2013-09-18 02:23:47 -05:00
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2015-06-30 12:12:39 -05:00
|
|
|
var ptr *C.git_repository
|
|
|
|
ret := C.git_submodule_open(&ptr, sub.ptr)
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(sub)
|
2013-03-05 14:05:19 -06:00
|
|
|
if ret < 0 {
|
2013-07-07 09:43:44 -05:00
|
|
|
return nil, MakeGitError(ret)
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
2015-06-30 12:12:39 -05:00
|
|
|
return newRepositoryFromC(ptr), nil
|
2013-03-05 14:05:19 -06:00
|
|
|
}
|
|
|
|
|
2015-01-08 15:44:58 -06:00
|
|
|
func (sub *Submodule) Update(init bool, opts *SubmoduleUpdateOptions) error {
|
2020-12-05 15:13:59 -06:00
|
|
|
var err error
|
|
|
|
cOpts := populateSubmoduleUpdateOptions(&C.git_submodule_update_options{}, opts, &err)
|
|
|
|
defer freeSubmoduleUpdateOptions(cOpts)
|
2015-01-08 15:44:58 -06:00
|
|
|
|
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2020-12-05 15:13:59 -06:00
|
|
|
ret := C.git_submodule_update(sub.ptr, cbool(init), cOpts)
|
2017-07-08 09:07:51 -05:00
|
|
|
runtime.KeepAlive(sub)
|
2020-12-05 15:13:59 -06:00
|
|
|
if ret == C.int(ErrorCodeUser) && err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2015-01-08 15:44:58 -06:00
|
|
|
if ret < 0 {
|
|
|
|
return MakeGitError(ret)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2020-12-10 09:19:41 -06:00
|
|
|
func populateSubmoduleUpdateOptions(copts *C.git_submodule_update_options, opts *SubmoduleUpdateOptions, errorTarget *error) *C.git_submodule_update_options {
|
|
|
|
C.git_submodule_update_options_init(copts, C.GIT_SUBMODULE_UPDATE_OPTIONS_VERSION)
|
2015-01-08 15:44:58 -06:00
|
|
|
if opts == nil {
|
2015-03-04 13:39:35 -06:00
|
|
|
return nil
|
2015-01-08 15:44:58 -06:00
|
|
|
}
|
|
|
|
|
2020-12-10 09:19:41 -06:00
|
|
|
populateCheckoutOptions(&copts.checkout_opts, opts.CheckoutOpts, errorTarget)
|
|
|
|
populateFetchOptions(&copts.fetch_opts, opts.FetchOptions, errorTarget)
|
2015-03-04 13:39:35 -06:00
|
|
|
|
2020-12-10 09:19:41 -06:00
|
|
|
return copts
|
2020-12-05 15:13:59 -06:00
|
|
|
}
|
|
|
|
|
2020-12-10 09:19:41 -06:00
|
|
|
func freeSubmoduleUpdateOptions(copts *C.git_submodule_update_options) {
|
|
|
|
if copts == nil {
|
2020-12-05 15:13:59 -06:00
|
|
|
return
|
|
|
|
}
|
2020-12-10 09:19:41 -06:00
|
|
|
freeCheckoutOptions(&copts.checkout_opts)
|
|
|
|
freeFetchOptions(&copts.fetch_opts)
|
2015-01-08 15:44:58 -06:00
|
|
|
}
|