summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <[email protected]>2014-02-23 16:02:35 +0100
committerCarlos Martín Nieto <[email protected]>2014-02-23 16:02:35 +0100
commit0a1052b0e08d6a2174734d0c92ae192b726b2990 (patch)
tree966ea0fb9bc4088c541850ee8a98339eca2e402a
parentaf80cc73ad16550f9b79e1b551b49f94bce5809a (diff)
parentbf209ca2ba293116bdd3062ba9ff5ac071f9ddd5 (diff)
Merge pull request #52 from ursachec/master
Support for git_odb_hash.
-rw-r--r--odb.go16
-rw-r--r--odb_test.go27
2 files changed, 43 insertions, 0 deletions
diff --git a/odb.go b/odb.go
index 638ef74..953791c 100644
--- a/odb.go
+++ b/odb.go
@@ -79,6 +79,22 @@ func (v *Odb) ForEach() chan *Oid {
return ch
}
+// Hash determines the object-ID (sha1) of a data buffer.
+func (v *Odb) Hash(data []byte, otype ObjectType) (oid *Oid, err error) {
+ oid = new(Oid)
+ header := (*reflect.SliceHeader)(unsafe.Pointer(&data))
+ ptr := unsafe.Pointer(header.Data)
+
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
+ ret := C.git_odb_hash(oid.toC(), ptr, C.size_t(header.Len), C.git_otype(otype));
+ if ret < 0 {
+ err = LastError()
+ }
+ return
+}
+
// NewReadStream opens a read stream from the ODB. Reading from it will give you the
// contents of the object.
func (v *Odb) NewReadStream(id *Oid) (*OdbReadStream, error) {
diff --git a/odb_test.go b/odb_test.go
index 3c7624c..a4f8943 100644
--- a/odb_test.go
+++ b/odb_test.go
@@ -32,4 +32,31 @@ func TestOdbStream(t *testing.T) {
if stream.Id.Cmp(expectedId) != 0 {
t.Fatal("Wrong data written")
}
+}
+
+func TestOdbHash(t *testing.T) {
+
+ repo := createTestRepo(t)
+ defer os.RemoveAll(repo.Workdir())
+ _, _ = seedTestRepo(t, repo)
+
+ odb, error := repo.Odb()
+ checkFatal(t, error)
+
+ str := `tree 115fcae49287c82eb55bb275cbbd4556fbed72b7
+parent 66e1c476199ebcd3e304659992233132c5a52c6c
+author John Doe <[email protected]> 1390682018 +0000
+committer John Doe <[email protected]> 1390682018 +0000
+
+Initial commit.`;
+
+ oid, error := odb.Hash([]byte(str), ObjectCommit)
+ checkFatal(t, error)
+
+ coid, error := odb.Write([]byte(str), ObjectCommit)
+ checkFatal(t, error)
+
+ if oid.Cmp(coid) != 0 {
+ t.Fatal("Hash and write Oids are different")
+ }
} \ No newline at end of file