Repository: libgit2/git2go (go)

Issue:
Support git_repository_set_config
It would be nice to support https://github.com/libgit2/libgit2/blob/v1.1.0/include/git2/sys/repository.h#L86 which is introduced in v0.16.0 . Thank you! 

Pull request:
Implement git_repository_set_config (#735)
Closes #732

(cherry picked from commit 2fd0495c43c4a54a02e2bbfca886687621f83f9f)

Patch:
diff --git a/git.go b/git.go
index 1b01ec1..9e22231 100644
--- a/git.go
+++ b/git.go
@@ -196,9 +196,9 @@ func NewOid(s string) (*Oid, error) {
 
 	o := new(Oid)
 
-	slice, error := hex.DecodeString(s)
-	if error != nil {
-		return nil, error
+	slice, err := hex.DecodeString(s)
+	if err != nil {
+		return nil, err
 	}
 
 	if len(slice) != 20 {
diff --git a/index.go b/index.go
index 4960a73..31f1a96 100644
--- a/index.go
+++ b/index.go
@@ -57,8 +57,8 @@ type Index struct {
 }
 
 type IndexTime struct {
-	seconds     int32
-	nanoseconds uint32
+	Seconds     int32
+	Nanoseconds uint32
 }
 
 type IndexEntry struct {
@@ -89,10 +89,10 @@ func newIndexEntryFromC(entry *C.git_index_entry) *IndexEntry {
 }
 
 func populateCIndexEntry(source *IndexEntry, dest *C.git_index_entry) {
-	dest.ctime.seconds = C.int32_t(source.Ctime.seconds)
-	dest.ctime.nanoseconds = C.uint32_t(source.Ctime.nanoseconds)
-	dest.mtime.seconds = C.int32_t(source.Mtime.seconds)
-	dest.mtime.nanoseconds = C.uint32_t(source.Mtime.nanoseconds)
+	dest.ctime.seconds = C.int32_t(source.Ctime.Seconds)
+	dest.ctime.nanoseconds = C.uint32_t(source.Ctime.Nanoseconds)
+	dest.mtime.seconds = C.int32_t(source.Mtime.Seconds)
+	dest.mtime.nanoseconds = C.uint32_t(source.Mtime.Nanoseconds)
 	dest.mode = C.uint32_t(source.Mode)
 	dest.uid = C.uint32_t(source.Uid)
 	dest.gid = C.uint32_t(source.Gid)
diff --git a/repository.go b/repository.go
index 07f5df7..1ee9b36 100644
--- a/repository.go
+++ b/repository.go
@@ -165,6 +165,17 @@ func (v *Repository) Config() (*Config, error) {
 	return config, nil
 }
 
+// SetConfig sets the configuration file for this repository.
+//
+// This configuration file will be used for all configuration queries involving
+// this repository.
+func (v *Repository) SetConfig(c *Config) error {
+	C.git_repository_set_config(v.ptr, c.ptr)
+	runtime.KeepAlive(v)
+	runtime.KeepAlive(c)
+	return nil
+}
+
 func (v *Repository) Index() (*Index, error) {
 	var ptr *C.git_index
 


Test patch:
diff --git a/odb_test.go b/odb_test.go
index cb3ab55..ed5c24c 100644
--- a/odb_test.go
+++ b/odb_test.go
@@ -61,31 +61,31 @@ func TestOdbStream(t *testing.T) {
 
 	_, _ = seedTestRepo(t, repo)
 
-	odb, error := repo.Odb()
-	checkFatal(t, error)
+	odb, err := repo.Odb()
+	checkFatal(t, err)
 
 	str := "hello, world!"
 
-	writeStream, error := odb.NewWriteStream(int64(len(str)), ObjectBlob)
-	checkFatal(t, error)
-	n, error := io.WriteString(writeStream, str)
-	checkFatal(t, error)
+	writeStream, err := odb.NewWriteStream(int64(len(str)), ObjectBlob)
+	checkFatal(t, err)
+	n, err := io.WriteString(writeStream, str)
+	checkFatal(t, err)
 	if n != len(str) {
 		t.Fatalf("Bad write length %v != %v", n, len(str))
 	}
 
-	error = writeStream.Close()
-	checkFatal(t, error)
+	err = writeStream.Close()
+	checkFatal(t, err)
 
-	expectedId, error := NewOid("30f51a3fba5274d53522d0f19748456974647b4f")
-	checkFatal(t, error)
+	expectedId, err := NewOid("30f51a3fba5274d53522d0f19748456974647b4f")
+	checkFatal(t, err)
 	if writeStream.Id.Cmp(expectedId) != 0 {
 		t.Fatal("Wrong data written")
 	}
 
-	readStream, error := odb.NewReadStream(&writeStream.Id)
-	checkFatal(t, error)
-	data, error := ioutil.ReadAll(readStream)
+	readStream, err := odb.NewReadStream(&writeStream.Id)
+	checkFatal(t, err)
+	data, err := ioutil.ReadAll(readStream)
 	if str != string(data) {
 		t.Fatalf("Wrong data read %v != %v", str, string(data))
 	}
@@ -98,8 +98,8 @@ func TestOdbHash(t *testing.T) {
 
 	_, _ = seedTestRepo(t, repo)
 
-	odb, error := repo.Odb()
-	checkFatal(t, error)
+	odb, err := repo.Odb()
+	checkFatal(t, err)
 
 	str := `tree 115fcae49287c82eb55bb275cbbd4556fbed72b7
 parent 66e1c476199ebcd3e304659992233132c5a52c6c
@@ -109,11 +109,11 @@ committer John Doe <john@doe.com> 1390682018 +0000
 Initial commit.`
 
 	for _, data := range [][]byte{[]byte(str), doublePointerBytes()} {
-		oid, error := odb.Hash(data, ObjectCommit)
-		checkFatal(t, error)
+		oid, err := odb.Hash(data, ObjectCommit)
+		checkFatal(t, err)
 
-		coid, error := odb.Write(data, ObjectCommit)
-		checkFatal(t, error)
+		coid, err := odb.Write(data, ObjectCommit)
+		checkFatal(t, err)
 
 		if oid.Cmp(coid) != 0 {
 			t.Fatal("Hash and write Oids are different")
diff --git a/repository_test.go b/repository_test.go
index 1950c69..5a0f920 100644
--- a/repository_test.go
+++ b/repository_test.go
@@ -40,3 +40,55 @@ func TestCreateCommitFromIds(t *testing.T) {
 		t.Errorf("mismatched commit ids, expected %v, got %v", expectedCommitId.String(), commitId.String())
 	}
 }
+
+func TestRepositorySetConfig(t *testing.T) {
+	repo := createTestRepo(t)
+	defer cleanupTestRepo(t, repo)
+
+	loc, err := time.LoadLocation("Europe/Berlin")
+	checkFatal(t, err)
+	sig := &Signature{
+		Name:  "Rand Om Hacker",
+		Email: "random@hacker.com",
+		When:  time.Date(2013, 03, 06, 14, 30, 0, 0, loc),
+	}
+
+	idx, err := repo.Index()
+	checkFatal(t, err)
+	err = idx.AddByPath("README")
+
+	treeId, err := idx.WriteTree()
+	checkFatal(t, err)
+
+	message := "This is a commit\n"
+	tree, err := repo.LookupTree(treeId)
+	checkFatal(t, err)
+	_, err = repo.CreateCommit("HEAD", sig, sig, message, tree)
+	checkFatal(t, err)
+
+	repoConfig, err := repo.Config()
+	checkFatal(t, err)
+
+	temp := Config{}
+	localConfig, err := temp.OpenLevel(repoConfig, ConfigLevelLocal)
+	checkFatal(t, err)
+	repoConfig = nil
+
+	err = repo.SetConfig(localConfig)
+	checkFatal(t, err)
+
+	configFieldName := "core.filemode"
+	err = localConfig.SetBool(configFieldName, true)
+	checkFatal(t, err)
+
+	localConfig = nil
+
+	repoConfig, err = repo.Config()
+	checkFatal(t, err)
+
+	result, err := repoConfig.LookupBool(configFieldName)
+	checkFatal(t, err)
+	if result != true {
+		t.Fatal("result must be true")
+	}
+}