package main import ( "C" "io" "io/ioutil" "gopkg.in/src-d/go-git.v4" "gopkg.in/src-d/go-git.v4/core" ) //export c_File_get_Name func c_File_get_Name(f uint64) *C.char { obj, ok := GetObject(Handle(f)) if !ok { return nil } file := obj.(*git.File) return C.CString(file.Name) } //export c_File_get_Mode func c_File_get_Mode(f uint64) uint32 { obj, ok := GetObject(Handle(f)) if !ok { return 0 } file := obj.(*git.File) return uint32(file.Mode) } //export c_File_get_Hash func c_File_get_Hash(b uint64) *C.char { obj, ok := GetObject(Handle(b)) if !ok { return nil } file := obj.(*git.File) return CBytes(file.Hash[:]) } //export c_File_Size func c_File_Size(b uint64) int64 { obj, ok := GetObject(Handle(b)) if !ok { return -1 } file := obj.(*git.File) return file.Size } //export c_File_Decode func c_File_Decode(o uint64) uint64 { obj, ok := GetObject(Handle(o)) if !ok { return IH } cobj := obj.(*core.Object) file := git.File{} file.Decode(*cobj) return uint64(RegisterObject(&file)) } //export c_File_Read func c_File_Read(b uint64) (int, *C.char) { obj, ok := GetObject(Handle(b)) if !ok { return ErrorCodeNotFound, C.CString(MessageNotFound) } file := obj.(*git.File) reader, err := file.Reader() if err != nil { return ErrorCodeInternal, C.CString(err.Error()) } data, err := ioutil.ReadAll(reader) reader.Close() if err != nil { return ErrorCodeInternal, C.CString(err.Error()) } return len(data), CBytes(data) } //export c_File_Type func c_File_Type(c uint64) int8 { obj, ok := GetObject(Handle(c)) if !ok { return -1 } file := obj.(*git.File) return int8(file.Type()) } //export c_NewFileIter func c_NewFileIter(r uint64, t uint64) uint64 { obj, ok := GetObject(Handle(r)) if !ok { return IH } repo := obj.(*git.Repository) obj, ok = GetObject(Handle(t)) if !ok { return IH } tree := obj.(*git.Tree) iter := git.NewFileIter(repo, tree) return uint64(RegisterObject(iter)) } //export c_FileIter_Next func c_FileIter_Next(i uint64) (uint64, int, *C.char) { obj, ok := GetObject(Handle(i)) if !ok { return IH, ErrorCodeNotFound, C.CString(MessageNotFound) } iter := obj.(*git.FileIter) file, err := iter.Next() if err != nil { if err == io.EOF { return IH, ErrorCodeSuccess, nil } return IH, ErrorCodeInternal, C.CString(err.Error()) } return uint64(RegisterObject(file)), ErrorCodeSuccess, nil } //export c_FileIter_Close func c_FileIter_Close(i uint64) { obj, ok := GetObject(Handle(i)) if !ok { return } iter := obj.(*git.FileIter) iter.Close() }