diff --git a/index.go b/index.go index f20dc31..f8ce6b3 100644 --- a/index.go +++ b/index.go @@ -66,6 +66,39 @@ func newIndexFromC(ptr *C.git_index) *Index { return idx } +// NewIndex allocates a new index. It won't be associated with any +// file on the filesystem or repository +func NewIndex() (*Index, error) { + var ptr *C.git_index + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + if err := C.git_index_new(&ptr); err < 0 { + return nil, MakeGitError(err) + } + + return &Index{ptr: ptr}, nil +} + +// Add adds or replaces the given entry to the index, making a copy of +// the data +func (v *Index) Add(entry *IndexEntry) error { + var centry C.git_index_entry + + populateCIndexEntry(entry, ¢ry) + defer freeCIndexEntry(¢ry) + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + if err := C.git_index_add(v.ptr, ¢ry); err < 0 { + return MakeGitError(err) + } + + return nil +} + func (v *Index) AddByPath(path string) error { cstr := C.CString(path) defer C.free(unsafe.Pointer(cstr)) diff --git a/index_test.go b/index_test.go index 5920b93..cd178b9 100644 --- a/index_test.go +++ b/index_test.go @@ -41,6 +41,36 @@ func TestIndexWriteTreeTo(t *testing.T) { } } +func TestIndexAddAndWriteTreeTo(t *testing.T) { + repo := createTestRepo(t) + defer os.RemoveAll(repo.Workdir()) + + odb, err := repo.Odb() + checkFatal(t, err) + + blobID, err := odb.Write([]byte("foo\n"), ObjectBlob) + checkFatal(t, err) + + idx, err := NewIndex() + checkFatal(t, err) + + entry := IndexEntry { + Path: "README", + Id: blobID, + Mode: FilemodeBlob, + } + + err = idx.Add(&entry) + checkFatal(t, err) + + treeId, err := idx.WriteTreeTo(repo) + checkFatal(t, err) + + if treeId.String() != "b7119b11e8ef7a1a5a34d3ac87f5b075228ac81e" { + t.Fatalf("%v", treeId.String()) + } +} + func checkFatal(t *testing.T, err error) { if err == nil { return