summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--git.go52
-rw-r--r--git_test.go8
-rw-r--r--odb_test.go4
3 files changed, 33 insertions, 31 deletions
diff --git a/git.go b/git.go
index db9522b..b20f993 100644
--- a/git.go
+++ b/git.go
@@ -8,6 +8,7 @@ package git
import "C"
import (
"bytes"
+ "encoding/hex"
"errors"
"runtime"
"strings"
@@ -28,10 +29,8 @@ func init() {
C.git_threads_init()
}
-// Oid
-type Oid struct {
- bytes [20]byte
-}
+// Oid represents the id for a Git object.
+type Oid [20]byte
func newOidFromC(coid *C.git_oid) *Oid {
if coid == nil {
@@ -39,62 +38,57 @@ func newOidFromC(coid *C.git_oid) *Oid {
}
oid := new(Oid)
- copy(oid.bytes[0:20], C.GoBytes(unsafe.Pointer(coid), 20))
+ copy(oid[0:20], C.GoBytes(unsafe.Pointer(coid), 20))
return oid
}
-func NewOid(b []byte) *Oid {
+func NewOidFromBytes(b []byte) *Oid {
oid := new(Oid)
- copy(oid.bytes[0:20], b[0:20])
+ copy(oid[0:20], b[0:20])
return oid
}
func (oid *Oid) toC() *C.git_oid {
- return (*C.git_oid)(unsafe.Pointer(&oid.bytes))
+ return (*C.git_oid)(unsafe.Pointer(oid))
}
-func NewOidFromString(s string) (*Oid, error) {
- o := new(Oid)
- cs := C.CString(s)
- defer C.free(unsafe.Pointer(cs))
+func NewOid(s string) (*Oid, error) {
+ if len(s) > C.GIT_OID_HEXSZ {
+ return nil, errors.New("string is too long for oid")
+ }
- runtime.LockOSThread()
- defer runtime.UnlockOSThread()
+ o := new(Oid)
- if ret := C.git_oid_fromstr(o.toC(), cs); ret < 0 {
- return nil, MakeGitError(ret)
+ slice, error := hex.DecodeString(s)
+ if error != nil {
+ return nil, error
}
+ copy(o[:], slice[:20])
return o, nil
}
func (oid *Oid) String() string {
- buf := make([]byte, 40)
- C.git_oid_fmt((*C.char)(unsafe.Pointer(&buf[0])), oid.toC())
- return string(buf)
-}
-
-func (oid *Oid) Bytes() []byte {
- return oid.bytes[0:]
+ return hex.EncodeToString(oid[:])
}
func (oid *Oid) Cmp(oid2 *Oid) int {
- return bytes.Compare(oid.bytes[:], oid2.bytes[:])
+ return bytes.Compare(oid[:], oid2[:])
}
func (oid *Oid) Copy() *Oid {
ret := new(Oid)
- copy(ret.bytes[:], oid.bytes[:])
+ copy(ret[:], oid[:])
return ret
}
func (oid *Oid) Equal(oid2 *Oid) bool {
- return bytes.Equal(oid.bytes[:], oid2.bytes[:])
+ return bytes.Equal(oid[:], oid2[:])
}
func (oid *Oid) IsZero() bool {
- for _, a := range oid.bytes {
- if a != '0' {
+ for _, a := range oid {
+ if a != 0 {
return false
}
}
@@ -102,7 +96,7 @@ func (oid *Oid) IsZero() bool {
}
func (oid *Oid) NCmp(oid2 *Oid, n uint) int {
- return bytes.Compare(oid.bytes[:n], oid2.bytes[:n])
+ return bytes.Compare(oid[:n], oid2[:n])
}
func ShortenOids(ids []*Oid, minlen int) (int, error) {
diff --git a/git_test.go b/git_test.go
index fff3c6c..6542ca0 100644
--- a/git_test.go
+++ b/git_test.go
@@ -54,3 +54,11 @@ func seedTestRepo(t *testing.T, repo *Repository) (*Oid, *Oid) {
return commitId, treeId
}
+
+func TestOidZero(t *testing.T) {
+ var zeroId Oid
+
+ if !zeroId.IsZero() {
+ t.Error("Zero Oid is not zero")
+ }
+}
diff --git a/odb_test.go b/odb_test.go
index a4f8943..17b3ad2 100644
--- a/odb_test.go
+++ b/odb_test.go
@@ -27,7 +27,7 @@ func TestOdbStream(t *testing.T) {
error = stream.Close()
checkFatal(t, error)
- expectedId, error := NewOidFromString("30f51a3fba5274d53522d0f19748456974647b4f")
+ expectedId, error := NewOid("30f51a3fba5274d53522d0f19748456974647b4f")
checkFatal(t, error)
if stream.Id.Cmp(expectedId) != 0 {
t.Fatal("Wrong data written")
@@ -59,4 +59,4 @@ Initial commit.`;
if oid.Cmp(coid) != 0 {
t.Fatal("Hash and write Oids are different")
}
-} \ No newline at end of file
+}