Add a settings package

This lets us modify the libgit2-wide options/settings.
This commit is contained in:
Carlos Martín Nieto 2014-03-25 00:12:32 +01:00
parent 2811845a12
commit b2a2a279d9
5 changed files with 181 additions and 7 deletions

View File

@ -5,8 +5,7 @@ go:
- 1.1 - 1.1
- tip - tip
env:
- PKG_CONFIG_PATH=libgit2/install/lib/pkgconfig LD_LIBRARY_PATH=libgit2/install/lib
install: install:
- script/build-libgit2.sh - script/build-libgit2.sh
- export PKG_CONFIG_PATH=$PWD/libgit2/install/lib/pkgconfig
- export LD_LIBRARY_PATH=$PWD/libgit2/install/lib

4
git.go
View File

@ -149,6 +149,10 @@ func MakeGitError(errorCode C.int) error {
return &GitError{C.GoString(err.message), int(err.klass), int(errorCode)} return &GitError{C.GoString(err.message), int(err.klass), int(errorCode)}
} }
func MakeGitError2(err int) error {
return MakeGitError(C.int(err))
}
func cbool(b bool) C.int { func cbool(b bool) C.int {
if b { if b {
return C.int(1) return C.int(1)

View File

@ -11,7 +11,3 @@ cmake -DTHREADSAFE=ON \
. .
make install make install
# Let the Go build system know where to find libgit2
export LD_LIBRARY_PATH="$TMPDIR/libgit2/install/lib"
export PKG_CONFIG_PATH="$TMPDIR/libgit2/install/lib/pkgconfig"

109
settings/settings.go Normal file
View File

@ -0,0 +1,109 @@
package settings
/*
#cgo pkg-config: libgit2
#include <git2.h>
int _go_git_opts_get_search_path(int level, git_buf *buf)
{
return git_libgit2_opts(GIT_OPT_GET_SEARCH_PATH, level, buf);
}
int _go_git_opts_set_search_path(int level, const char *path)
{
return git_libgit2_opts(GIT_OPT_SET_SEARCH_PATH, level, path);
}
int _go_git_opts_set_size_t(int opt, size_t val)
{
return git_libgit2_opts(opt, val);
}
int _go_git_opts_get_size_t(int opt, size_t *val)
{
return git_libgit2_opts(opt, val);
}
*/
import "C"
import (
"runtime"
"unsafe"
"github.com/libgit2/git2go"
)
func MakeGitError(err C.int) error {
return git.MakeGitError2(int(err))
}
func SearchPath(level git.ConfigLevel) (string, error) {
var buf C.git_buf
defer C.git_buf_free(&buf)
runtime.LockOSThread()
defer runtime.UnlockOSThread()
err := C._go_git_opts_get_search_path(C.int(level), &buf)
if err < 0 {
return "", MakeGitError(err)
}
return C.GoString(buf.ptr), nil
}
func SetSearchPath(level git.ConfigLevel, path string) error {
cpath := C.CString(path)
defer C.free(unsafe.Pointer(cpath))
runtime.LockOSThread()
defer runtime.UnlockOSThread()
err := C._go_git_opts_set_search_path(C.int(level), cpath)
if err < 0 {
return MakeGitError(err)
}
return nil
}
func getSizet(opt C.int) (int, error) {
runtime.LockOSThread()
defer runtime.UnlockOSThread()
var val C.size_t
err := C._go_git_opts_get_size_t(opt, &val);
if err < 0 {
return 0, MakeGitError(err)
}
return int(val), nil
}
func setSizet(opt C.int, val int) error {
runtime.LockOSThread()
defer runtime.UnlockOSThread()
cval := C.size_t(val)
err := C._go_git_opts_set_size_t(opt, cval);
if err < 0 {
return MakeGitError(err)
}
return nil
}
func MwindowSize() (int, error) {
return getSizet(C.GIT_OPT_GET_MWINDOW_SIZE)
}
func SetMwindowSize(size int) error {
return setSizet(C.GIT_OPT_SET_MWINDOW_SIZE, size)
}
func MwindowMappedLimit() (int, error) {
return getSizet(C.GIT_OPT_GET_MWINDOW_MAPPED_LIMIT)
}
func SetMwindowMappedLimit(size int) error {
return setSizet(C.GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size)
}

66
settings/settings_test.go Normal file
View File

@ -0,0 +1,66 @@
package settings
import (
"testing"
"runtime"
"github.com/libgit2/git2go"
)
type pathPair struct {
Level git.ConfigLevel
Path string
}
func TestSearchPath(t *testing.T) {
paths := []pathPair{
pathPair{git.ConfigLevelSystem, "/tmp/system"},
pathPair{git.ConfigLevelGlobal, "/tmp/global"},
pathPair{git.ConfigLevelXDG, "/tmp/xdg"},
}
for _, pair := range paths {
err := SetSearchPath(pair.Level, pair.Path)
checkFatal(t, err)
actual, err := SearchPath(pair.Level)
checkFatal(t, err)
if pair.Path != actual {
t.Fatal("Search paths don't match")
}
}
}
func TestMmapSizes(t *testing.T) {
size := 42 * 1024
err := SetMwindowSize(size)
checkFatal(t, err)
actual, err := MwindowSize()
if size != actual {
t.Fatal("Sizes don't match")
}
err = SetMwindowMappedLimit(size)
checkFatal(t, err)
actual, err = MwindowMappedLimit()
if size != actual {
t.Fatal("Sizes don't match")
}
}
func checkFatal(t *testing.T, err error) {
if err == nil {
return
}
// The failure happens at wherever we were called, not here
_, file, line, ok := runtime.Caller(1)
if !ok {
t.Fatal()
}
t.Fatalf("Fail at %v:%v; %v", file, line, err)
}