Submodule wrapping courtesy of @sbinet
This commit is contained in:
parent
1926f913b3
commit
439f7acf28
|
@ -0,0 +1,263 @@
|
||||||
|
package git
|
||||||
|
|
||||||
|
/*
|
||||||
|
#cgo pkg-config: libgit2
|
||||||
|
#include <git2.h>
|
||||||
|
#include <git2/errors.h>
|
||||||
|
|
||||||
|
extern int _go_git_visit_submodule(git_repository *repo, void *fct);
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Submodule
|
||||||
|
type Submodule struct {
|
||||||
|
ptr *C.git_submodule
|
||||||
|
}
|
||||||
|
|
||||||
|
type SubmoduleUpdate int
|
||||||
|
|
||||||
|
const (
|
||||||
|
SubmoduleUpdateDefault SubmoduleUpdate = C.GIT_SUBMODULE_UPDATE_DEFAULT
|
||||||
|
SubmoduleUpdateCheckout = C.GIT_SUBMODULE_UPDATE_CHECKOUT
|
||||||
|
SubmoduleUpdateRebase = C.GIT_SUBMODULE_UPDATE_REBASE
|
||||||
|
SubmoduleUpdateMerge = C.GIT_SUBMODULE_UPDATE_MERGE
|
||||||
|
SubmoduleUpdateNone = C.GIT_SUBMODULE_UPDATE_NONE
|
||||||
|
)
|
||||||
|
|
||||||
|
type SubmoduleIgnore int
|
||||||
|
|
||||||
|
const (
|
||||||
|
SubmoduleIgnoreDefault SubmoduleIgnore = C.GIT_SUBMODULE_IGNORE_DEFAULT
|
||||||
|
SubmoduleIgnoreNone = C.GIT_SUBMODULE_IGNORE_NONE
|
||||||
|
SubmoduleIgnoreUntracked = C.GIT_SUBMODULE_IGNORE_UNTRACKED
|
||||||
|
SubmoduleIgnoreDirty = C.GIT_SUBMODULE_IGNORE_DIRTY
|
||||||
|
SubmoduleIgnoreAll = C.GIT_SUBMODULE_IGNORE_ALL
|
||||||
|
)
|
||||||
|
|
||||||
|
type SubmoduleStatus int
|
||||||
|
|
||||||
|
const (
|
||||||
|
SubmoduleStatusInHead SubmoduleStatus = C.GIT_SUBMODULE_STATUS_IN_HEAD
|
||||||
|
SubmoduleStatusInIndex = C.GIT_SUBMODULE_STATUS_IN_INDEX
|
||||||
|
SubmoduleStatusInConfig = C.GIT_SUBMODULE_STATUS_IN_CONFIG
|
||||||
|
SubmoduleStatusInWd = C.GIT_SUBMODULE_STATUS_IN_WD
|
||||||
|
SubmoduleStatusIndexAdded = C.GIT_SUBMODULE_STATUS_INDEX_ADDED
|
||||||
|
SubmoduleStatusIndexDeleted = C.GIT_SUBMODULE_STATUS_INDEX_DELETED
|
||||||
|
SubmoduleStatusIndexModified = C.GIT_SUBMODULE_STATUS_INDEX_MODIFIED
|
||||||
|
SubmoduleStatusWdUninitialized = C.GIT_SUBMODULE_STATUS_WD_UNINITIALIZED
|
||||||
|
SubmoduleStatusWdAdded = C.GIT_SUBMODULE_STATUS_WD_ADDED
|
||||||
|
SubmoduleStatusWdDeleted = C.GIT_SUBMODULE_STATUS_WD_DELETED
|
||||||
|
SubmoduleStatusWdModified = C.GIT_SUBMODULE_STATUS_WD_MODIFIED
|
||||||
|
SubmoduleStatusWdIndexModified = C.GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED
|
||||||
|
SubmoduleStatusWdWdModified = C.GIT_SUBMODULE_STATUS_WD_WD_MODIFIED
|
||||||
|
SubmoduleStatusWdUntracked = C.GIT_SUBMODULE_STATUS_WD_UNTRACKED
|
||||||
|
)
|
||||||
|
|
||||||
|
func SubmoduleStatusIsUnmodified(status int) bool {
|
||||||
|
o := SubmoduleStatus(status) & ^(SubmoduleStatusInHead | SubmoduleStatusInIndex |
|
||||||
|
SubmoduleStatusInConfig | SubmoduleStatusInWd)
|
||||||
|
return o == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repository) LookupSubmodule(name string) (*Submodule, error) {
|
||||||
|
cname := C.CString(name)
|
||||||
|
defer C.free(unsafe.Pointer(cname))
|
||||||
|
|
||||||
|
sub := new(Submodule)
|
||||||
|
ret := C.git_submodule_lookup(&sub.ptr, repo.ptr, cname)
|
||||||
|
if ret < 0 {
|
||||||
|
return nil, LastError()
|
||||||
|
}
|
||||||
|
|
||||||
|
return sub, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type SubmoduleCbk func(sub *Submodule, name string) int
|
||||||
|
|
||||||
|
//export SubmoduleVisitor
|
||||||
|
func SubmoduleVisitor(csub unsafe.Pointer, name string, cfct unsafe.Pointer) int {
|
||||||
|
sub := &Submodule{(*C.git_submodule)(csub)}
|
||||||
|
fct := *(*SubmoduleCbk)(cfct)
|
||||||
|
return fct(sub, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repository) ForeachSubmodule(cbk SubmoduleCbk) error {
|
||||||
|
ret := C._go_git_visit_submodule(repo.ptr, unsafe.Pointer(&cbk))
|
||||||
|
if ret < 0 {
|
||||||
|
return LastError()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repository) AddSubmodule(url, path string, use_git_link bool) (*Submodule, error) {
|
||||||
|
curl := C.CString(url)
|
||||||
|
defer C.free(unsafe.Pointer(curl))
|
||||||
|
cpath := C.CString(path)
|
||||||
|
defer C.free(unsafe.Pointer(cpath))
|
||||||
|
|
||||||
|
sub := new(Submodule)
|
||||||
|
ret := C.git_submodule_add_setup(&sub.ptr, repo.ptr, curl, cpath, cbool(use_git_link))
|
||||||
|
if ret < 0 {
|
||||||
|
return nil, LastError()
|
||||||
|
}
|
||||||
|
return sub, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) FinalizeAdd() error {
|
||||||
|
ret := C.git_submodule_add_finalize(sub.ptr)
|
||||||
|
if ret < 0 {
|
||||||
|
return LastError()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) AddToIndex(write_index bool) error {
|
||||||
|
ret := C.git_submodule_add_to_index(sub.ptr, cbool(write_index))
|
||||||
|
if ret < 0 {
|
||||||
|
return LastError()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) Save() error {
|
||||||
|
ret := C.git_submodule_save(sub.ptr)
|
||||||
|
if ret < 0 {
|
||||||
|
return LastError()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) Owner() *Repository {
|
||||||
|
repo := C.git_submodule_owner(sub.ptr)
|
||||||
|
//FIXME: how to handle dangling references ?
|
||||||
|
return &Repository{repo}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) Name() string {
|
||||||
|
n := C.git_submodule_name(sub.ptr)
|
||||||
|
return C.GoString(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) Path() string {
|
||||||
|
n := C.git_submodule_path(sub.ptr)
|
||||||
|
return C.GoString(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) Url() string {
|
||||||
|
n := C.git_submodule_url(sub.ptr)
|
||||||
|
return C.GoString(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) SetUrl(url string) error {
|
||||||
|
curl := C.CString(url)
|
||||||
|
defer C.free(unsafe.Pointer(curl))
|
||||||
|
|
||||||
|
ret := C.git_submodule_set_url(sub.ptr, curl)
|
||||||
|
if ret < 0 {
|
||||||
|
return LastError()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) IndexId() *Oid {
|
||||||
|
idx := C.git_submodule_index_id(sub.ptr)
|
||||||
|
if idx == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return newOidFromC(idx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) HeadId() *Oid {
|
||||||
|
idx := C.git_submodule_head_id(sub.ptr)
|
||||||
|
if idx == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return newOidFromC(idx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) WdId() *Oid {
|
||||||
|
idx := C.git_submodule_wd_id(sub.ptr)
|
||||||
|
if idx == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return newOidFromC(idx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) Ignore() SubmoduleIgnore {
|
||||||
|
o := C.git_submodule_ignore(sub.ptr)
|
||||||
|
return SubmoduleIgnore(o)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) SetIgnore(ignore SubmoduleIgnore) SubmoduleIgnore {
|
||||||
|
o := C.git_submodule_set_ignore(sub.ptr, C.git_submodule_ignore_t(ignore))
|
||||||
|
return SubmoduleIgnore(o)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) Update() SubmoduleUpdate {
|
||||||
|
o := C.git_submodule_update(sub.ptr)
|
||||||
|
return SubmoduleUpdate(o)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) SetUpdate(update SubmoduleUpdate) SubmoduleUpdate {
|
||||||
|
o := C.git_submodule_set_update(sub.ptr, C.git_submodule_update_t(update))
|
||||||
|
return SubmoduleUpdate(o)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) FetchRecurseSubmodules() bool {
|
||||||
|
if 0 == C.git_submodule_fetch_recurse_submodules(sub.ptr) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) SetFetchRecurseSubmodules(v bool) error {
|
||||||
|
ret := C.git_submodule_set_fetch_recurse_submodules(sub.ptr, cbool(v))
|
||||||
|
if ret < 0 {
|
||||||
|
return LastError()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) Init(overwrite bool) error {
|
||||||
|
ret := C.git_submodule_init(sub.ptr, cbool(overwrite))
|
||||||
|
if ret < 0 {
|
||||||
|
return LastError()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) Sync() error {
|
||||||
|
ret := C.git_submodule_sync(sub.ptr)
|
||||||
|
if ret < 0 {
|
||||||
|
return LastError()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) Open() (*Repository, error) {
|
||||||
|
repo := new(Repository)
|
||||||
|
ret := C.git_submodule_open(&repo.ptr, sub.ptr)
|
||||||
|
if ret < 0 {
|
||||||
|
return nil, LastError()
|
||||||
|
}
|
||||||
|
return repo, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sub *Submodule) Reload() error {
|
||||||
|
ret := C.git_submodule_reload(sub.ptr)
|
||||||
|
if ret < 0 {
|
||||||
|
return LastError()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repository) ReloadAllSubmodules() error {
|
||||||
|
ret := C.git_submodule_reload_all(repo.ptr)
|
||||||
|
if ret < 0 {
|
||||||
|
return LastError()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -1,5 +1,13 @@
|
||||||
#include "_cgo_export.h"
|
#include "_cgo_export.h"
|
||||||
#include "git2.h"
|
#include "git2.h"
|
||||||
|
#include "git2/submodule.h"
|
||||||
|
|
||||||
|
typedef int (*gogit_submodule_cbk)(git_submodule *sm, const char *name, void *payload);
|
||||||
|
|
||||||
|
int _go_git_visit_submodule(git_repository *repo, void *fct)
|
||||||
|
{
|
||||||
|
return git_submodule_foreach(repo, (gogit_submodule_cbk)&SubmoduleVisitor, fct);
|
||||||
|
}
|
||||||
|
|
||||||
int _go_git_treewalk(git_tree *tree, git_treewalk_mode mode, void *ptr)
|
int _go_git_treewalk(git_tree *tree, git_treewalk_mode mode, void *ptr)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue