git2go/index.go

120 lines
2.1 KiB
Go
Raw Normal View History

2013-03-06 06:10:53 -06:00
package git
/*
#include <git2.h>
#include <git2/errors.h>
*/
import "C"
import (
2013-05-22 07:41:42 -05:00
"fmt"
2013-03-06 06:10:53 -06:00
"runtime"
2013-05-22 07:41:42 -05:00
"time"
2013-03-06 06:10:53 -06:00
"unsafe"
)
type Index struct {
ptr *C.git_index
}
2013-05-22 07:41:42 -05:00
type IndexEntry struct {
Ctime time.Time
Mtime time.Time
Mode uint
Uid uint
Gid uint
Size uint
2014-03-20 22:49:05 -05:00
Id *Oid
2013-05-22 07:41:42 -05:00
Path string
}
2013-03-06 06:10:53 -06:00
func newIndexFromC(ptr *C.git_index) *Index {
idx := &Index{ptr}
runtime.SetFinalizer(idx, (*Index).Free)
return idx
}
func (v *Index) AddByPath(path string) error {
cstr := C.CString(path)
defer C.free(unsafe.Pointer(cstr))
runtime.LockOSThread()
defer runtime.UnlockOSThread()
2013-03-06 06:10:53 -06:00
ret := C.git_index_add_bypath(v.ptr, cstr)
if ret < 0 {
return MakeGitError(ret)
2013-03-06 06:10:53 -06:00
}
return nil
}
2014-03-20 22:49:05 -05:00
func (v *Index) WriteTreeTo(repo *Repository) (*Oid, error) {
oid := new(Oid)
runtime.LockOSThread()
defer runtime.UnlockOSThread()
ret := C.git_index_write_tree_to(oid.toC(), v.ptr, repo.ptr)
if ret < 0 {
return nil, MakeGitError(ret)
}
return oid, nil
}
2013-03-06 06:10:53 -06:00
func (v *Index) WriteTree() (*Oid, error) {
oid := new(Oid)
runtime.LockOSThread()
defer runtime.UnlockOSThread()
2013-03-06 06:10:53 -06:00
ret := C.git_index_write_tree(oid.toC(), v.ptr)
if ret < 0 {
return nil, MakeGitError(ret)
2013-03-06 06:10:53 -06:00
}
return oid, nil
}
2014-03-20 22:49:05 -05:00
func (v *Index) Write() error {
2014-01-23 19:10:23 -06:00
runtime.LockOSThread()
defer runtime.UnlockOSThread()
ret := C.git_index_write(v.ptr)
if ret < 0 {
2014-02-26 09:14:31 -06:00
return MakeGitError(ret)
2014-01-23 19:10:23 -06:00
}
return nil
}
2013-03-06 06:10:53 -06:00
func (v *Index) Free() {
runtime.SetFinalizer(v, nil)
C.git_index_free(v.ptr)
}
2013-05-22 07:41:42 -05:00
func (v *Index) EntryCount() uint {
return uint(C.git_index_entrycount(v.ptr))
}
func newIndexEntryFromC(entry *C.git_index_entry) *IndexEntry {
return &IndexEntry{
time.Unix(int64(entry.ctime.seconds), int64(entry.ctime.nanoseconds)),
time.Unix(int64(entry.mtime.seconds), int64(entry.mtime.nanoseconds)),
uint(entry.mode),
uint(entry.uid),
uint(entry.gid),
uint(entry.file_size),
2014-02-26 08:22:48 -06:00
newOidFromC(&entry.id),
2013-05-22 07:41:42 -05:00
C.GoString(entry.path),
}
}
func (v *Index) EntryByIndex(index uint) (*IndexEntry, error) {
centry := C.git_index_get_byindex(v.ptr, C.size_t(index))
if centry == nil {
return nil, fmt.Errorf("Index out of Bounds")
}
return newIndexEntryFromC(centry), nil
}