From c4fce1a218fd33938c0be90e939531c0a00ebf7f Mon Sep 17 00:00:00 2001 From: Carlos Martín Nieto Date: Sun, 15 Mar 2015 01:49:32 +0100 Subject: Update to libgit2 d675982a153 There's been some changes to the checkout strategy, especially the SAFE_CREATE mode, which is now the RECREATE_MISSING flag, though that shouldn't be necessary to use in the general case. The largest changes come from the removal of the signture from ref-modifying functions/methods and the removal of the reflog string in all but those directly related to moving references. --- repository.go | 52 ++++++++-------------------------------------------- 1 file changed, 8 insertions(+), 44 deletions(-) (limited to 'repository.go') diff --git a/repository.go b/repository.go index 7fac277..b65867b 100644 --- a/repository.go +++ b/repository.go @@ -206,65 +206,35 @@ func (v *Repository) Head() (*Reference, error) { return newReferenceFromC(ptr, v), nil } -func (v *Repository) SetHead(refname string, sig *Signature, msg string) error { +func (v *Repository) SetHead(refname string) error { cname := C.CString(refname) defer C.free(unsafe.Pointer(cname)) - csig, err := sig.toC() - if err != nil { - return err - } - defer C.free(unsafe.Pointer(csig)) - - var cmsg *C.char - if msg != "" { - cmsg = C.CString(msg) - defer C.free(unsafe.Pointer(cmsg)) - } - runtime.LockOSThread() defer runtime.UnlockOSThread() - ecode := C.git_repository_set_head(v.ptr, cname, csig, cmsg) + ecode := C.git_repository_set_head(v.ptr, cname) if ecode != 0 { return MakeGitError(ecode) } return nil } -func (v *Repository) SetHeadDetached(id *Oid, sig *Signature, msg string) error { - csig, err := sig.toC() - if err != nil { - return err - } - defer C.free(unsafe.Pointer(csig)) - - var cmsg *C.char - if msg != "" { - cmsg = C.CString(msg) - defer C.free(unsafe.Pointer(cmsg)) - } - +func (v *Repository) SetHeadDetached(id *Oid) error { runtime.LockOSThread() defer runtime.UnlockOSThread() - ecode := C.git_repository_set_head_detached(v.ptr, id.toC(), csig, cmsg) + ecode := C.git_repository_set_head_detached(v.ptr, id.toC()) if ecode != 0 { return MakeGitError(ecode) } return nil } -func (v *Repository) CreateReference(name string, id *Oid, force bool, sig *Signature, msg string) (*Reference, error) { +func (v *Repository) CreateReference(name string, id *Oid, force bool, msg string) (*Reference, error) { cname := C.CString(name) defer C.free(unsafe.Pointer(cname)) - csig, err := sig.toC() - if err != nil { - return nil, err - } - defer C.free(unsafe.Pointer(csig)) - var cmsg *C.char if msg == "" { cmsg = nil @@ -278,7 +248,7 @@ func (v *Repository) CreateReference(name string, id *Oid, force bool, sig *Sign runtime.LockOSThread() defer runtime.UnlockOSThread() - ecode := C.git_reference_create(&ptr, v.ptr, cname, id.toC(), cbool(force), csig, cmsg) + ecode := C.git_reference_create(&ptr, v.ptr, cname, id.toC(), cbool(force), cmsg) if ecode < 0 { return nil, MakeGitError(ecode) } @@ -286,19 +256,13 @@ func (v *Repository) CreateReference(name string, id *Oid, force bool, sig *Sign return newReferenceFromC(ptr, v), nil } -func (v *Repository) CreateSymbolicReference(name, target string, force bool, sig *Signature, msg string) (*Reference, error) { +func (v *Repository) CreateSymbolicReference(name, target string, force bool, msg string) (*Reference, error) { cname := C.CString(name) defer C.free(unsafe.Pointer(cname)) ctarget := C.CString(target) defer C.free(unsafe.Pointer(ctarget)) - csig, err := sig.toC() - if err != nil { - return nil, err - } - defer C.free(unsafe.Pointer(csig)) - var cmsg *C.char if msg == "" { cmsg = nil @@ -312,7 +276,7 @@ func (v *Repository) CreateSymbolicReference(name, target string, force bool, si runtime.LockOSThread() defer runtime.UnlockOSThread() - ecode := C.git_reference_symbolic_create(&ptr, v.ptr, cname, ctarget, cbool(force), csig, cmsg) + ecode := C.git_reference_symbolic_create(&ptr, v.ptr, cname, ctarget, cbool(force), cmsg) if ecode < 0 { return nil, MakeGitError(ecode) } -- cgit v1.2.3 From b374e16db84c451cddc49d064cae69ca00993982 Mon Sep 17 00:00:00 2001 From: Carlos Martín Nieto Date: Sat, 18 Apr 2015 04:50:39 +0200 Subject: Update to libgit2 4c02d3937 --- merge.go | 10 +++++----- repository.go | 9 ++++++--- vendor/libgit2 | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) (limited to 'repository.go') diff --git a/merge.go b/merge.go index 5b68a8b..65dc03e 100644 --- a/merge.go +++ b/merge.go @@ -84,8 +84,8 @@ const ( ) type MergeOptions struct { - Version uint - Flags MergeTreeFlag + Version uint + TreeFlags MergeTreeFlag RenameThreshold uint TargetLimit uint @@ -97,7 +97,7 @@ type MergeOptions struct { func mergeOptionsFromC(opts *C.git_merge_options) MergeOptions { return MergeOptions{ Version: uint(opts.version), - Flags: MergeTreeFlag(opts.flags), + TreeFlags: MergeTreeFlag(opts.tree_flags), RenameThreshold: uint(opts.rename_threshold), TargetLimit: uint(opts.target_limit), FileFavor: MergeFileFavor(opts.file_favor), @@ -123,7 +123,7 @@ func (mo *MergeOptions) toC() *C.git_merge_options { } return &C.git_merge_options{ version: C.uint(mo.Version), - flags: C.git_merge_tree_flag_t(mo.Flags), + tree_flags: C.git_merge_tree_flag_t(mo.TreeFlags), rename_threshold: C.uint(mo.RenameThreshold), target_limit: C.uint(mo.TargetLimit), file_favor: C.git_merge_file_favor_t(mo.FileFavor), @@ -333,7 +333,7 @@ func populateCMergeFileOptions(c *C.git_merge_file_options, options MergeFileOpt c.our_label = C.CString(options.OurLabel) c.their_label = C.CString(options.TheirLabel) c.favor = C.git_merge_file_favor_t(options.Favor) - c.flags = C.git_merge_file_flags_t(options.Flags) + c.flags = C.uint(options.Flags) } func freeCMergeFileOptions(c *C.git_merge_file_options) { diff --git a/repository.go b/repository.go index b65867b..9917c60 100644 --- a/repository.go +++ b/repository.go @@ -616,16 +616,19 @@ func (v *Repository) RemoveNote(ref string, author, committer *Signature, id *Oi // DefaultNoteRef returns the default notes reference for a repository func (v *Repository) DefaultNoteRef() (string, error) { - var ptr *C.char + buf := C.git_buf{} runtime.LockOSThread() defer runtime.UnlockOSThread() - if ret := C.git_note_default_ref(&ptr, v.ptr); ret < 0 { + if ret := C.git_note_default_ref(&buf, v.ptr); ret < 0 { return "", MakeGitError(ret) } - return C.GoString(ptr), nil + ret := C.GoString(buf.ptr) + C.git_buf_free(&buf) + + return ret, nil } type RepositoryState int diff --git a/vendor/libgit2 b/vendor/libgit2 index d675982..4c02d39 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit d675982a15388d8c413acda139b4662062cf3286 +Subproject commit 4c02d393748d0db382450871ad9ef6898a2ce360 -- cgit v1.2.3 From 4b9cbd78fd266767f6bdf55257c4ee2b1611bbe0 Mon Sep 17 00:00:00 2001 From: Carlos Martín Nieto Date: Sun, 28 Jun 2015 00:51:17 +0200 Subject: Create a RemoteCollection for managing remotes Instead of making the 'Remote' part of the function calls, create a collection object which serves to namespace the operations for the remotes. --- push_test.go | 2 +- remote.go | 44 ++++++++++++++++++++++++-------------------- remote_test.go | 20 ++++++++++---------- repository.go | 19 ++++++++++++++----- 4 files changed, 49 insertions(+), 36 deletions(-) (limited to 'repository.go') diff --git a/push_test.go b/push_test.go index 4686c65..a9fc90d 100644 --- a/push_test.go +++ b/push_test.go @@ -11,7 +11,7 @@ func TestRemotePush(t *testing.T) { localRepo := createTestRepo(t) defer cleanupTestRepo(t, localRepo) - remote, err := localRepo.CreateRemote("test_push", repo.Path()) + remote, err := localRepo.Remotes.Create("test_push", repo.Path()) checkFatal(t, err) seedTestRepo(t, localRepo) diff --git a/remote.go b/remote.go index 4ff2040..5bed309 100644 --- a/remote.go +++ b/remote.go @@ -317,13 +317,17 @@ func (r *Remote) Free() { C.git_remote_free(r.ptr) } -func (repo *Repository) ListRemotes() ([]string, error) { +type RemoteCollection struct { + repo *Repository +} + +func (c *RemoteCollection) List() ([]string, error) { var r C.git_strarray runtime.LockOSThread() defer runtime.UnlockOSThread() - ecode := C.git_remote_list(&r, repo.ptr) + ecode := C.git_remote_list(&r, c.repo.ptr) if ecode < 0 { return nil, MakeGitError(ecode) } @@ -333,7 +337,7 @@ func (repo *Repository) ListRemotes() ([]string, error) { return remotes, nil } -func (repo *Repository) CreateRemote(name string, url string) (*Remote, error) { +func (c *RemoteCollection) Create(name string, url string) (*Remote, error) { remote := &Remote{} cname := C.CString(name) @@ -344,7 +348,7 @@ func (repo *Repository) CreateRemote(name string, url string) (*Remote, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_remote_create(&remote.ptr, repo.ptr, cname, curl) + ret := C.git_remote_create(&remote.ptr, c.repo.ptr, cname, curl) if ret < 0 { return nil, MakeGitError(ret) } @@ -352,21 +356,21 @@ func (repo *Repository) CreateRemote(name string, url string) (*Remote, error) { return remote, nil } -func (repo *Repository) DeleteRemote(name string) error { +func (c *RemoteCollection) Delete(name string) error { cname := C.CString(name) defer C.free(unsafe.Pointer(cname)) runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_remote_delete(repo.ptr, cname) + ret := C.git_remote_delete(c.repo.ptr, cname) if ret < 0 { return MakeGitError(ret) } return nil } -func (repo *Repository) CreateRemoteWithFetchspec(name string, url string, fetch string) (*Remote, error) { +func (c *RemoteCollection) CreateWithFetchspec(name string, url string, fetch string) (*Remote, error) { remote := &Remote{} cname := C.CString(name) @@ -379,7 +383,7 @@ func (repo *Repository) CreateRemoteWithFetchspec(name string, url string, fetch runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_remote_create_with_fetchspec(&remote.ptr, repo.ptr, cname, curl, cfetch) + ret := C.git_remote_create_with_fetchspec(&remote.ptr, c.repo.ptr, cname, curl, cfetch) if ret < 0 { return nil, MakeGitError(ret) } @@ -387,7 +391,7 @@ func (repo *Repository) CreateRemoteWithFetchspec(name string, url string, fetch return remote, nil } -func (repo *Repository) CreateAnonymousRemote(url string) (*Remote, error) { +func (c *RemoteCollection) CreateAnonymous(url string) (*Remote, error) { remote := &Remote{} curl := C.CString(url) @@ -396,7 +400,7 @@ func (repo *Repository) CreateAnonymousRemote(url string) (*Remote, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_remote_create_anonymous(&remote.ptr, repo.ptr, curl) + ret := C.git_remote_create_anonymous(&remote.ptr, c.repo.ptr, curl) if ret < 0 { return nil, MakeGitError(ret) } @@ -404,7 +408,7 @@ func (repo *Repository) CreateAnonymousRemote(url string) (*Remote, error) { return remote, nil } -func (repo *Repository) LookupRemote(name string) (*Remote, error) { +func (c *RemoteCollection) Lookup(name string) (*Remote, error) { remote := &Remote{} cname := C.CString(name) @@ -413,7 +417,7 @@ func (repo *Repository) LookupRemote(name string) (*Remote, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_remote_lookup(&remote.ptr, repo.ptr, cname) + ret := C.git_remote_lookup(&remote.ptr, c.repo.ptr, cname) if ret < 0 { return nil, MakeGitError(ret) } @@ -433,7 +437,7 @@ func (o *Remote) PushUrl() string { return C.GoString(C.git_remote_pushurl(o.ptr)) } -func (o *Repository) RemoteSetUrl(remote, url string) error { +func (c *RemoteCollection) SetUrl(remote, url string) error { curl := C.CString(url) defer C.free(unsafe.Pointer(curl)) cremote := C.CString(remote) @@ -442,14 +446,14 @@ func (o *Repository) RemoteSetUrl(remote, url string) error { runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_remote_set_url(o.ptr, cremote, curl) + ret := C.git_remote_set_url(c.repo.ptr, cremote, curl) if ret < 0 { return MakeGitError(ret) } return nil } -func (o *Repository) RemoteSetPushUrl(remote, url string) error { +func (c *RemoteCollection) SetPushUrl(remote, url string) error { curl := C.CString(url) defer C.free(unsafe.Pointer(curl)) cremote := C.CString(remote) @@ -458,14 +462,14 @@ func (o *Repository) RemoteSetPushUrl(remote, url string) error { runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_remote_set_pushurl(o.ptr, cremote, curl) + ret := C.git_remote_set_pushurl(c.repo.ptr, cremote, curl) if ret < 0 { return MakeGitError(ret) } return nil } -func (o *Repository) RemoteAddFetch(remote, refspec string) error { +func (c *RemoteCollection) AddFetch(remote, refspec string) error { crefspec := C.CString(refspec) defer C.free(unsafe.Pointer(crefspec)) cremote := C.CString(remote) @@ -474,7 +478,7 @@ func (o *Repository) RemoteAddFetch(remote, refspec string) error { runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_remote_add_fetch(o.ptr, cremote, crefspec) + ret := C.git_remote_add_fetch(c.repo.ptr, cremote, crefspec) if ret < 0 { return MakeGitError(ret) } @@ -535,7 +539,7 @@ func (o *Remote) FetchRefspecs() ([]string, error) { return refspecs, nil } -func (o *Repository) RemoteAddPush(remote, refspec string) error { +func (c *RemoteCollection) AddPush(remote, refspec string) error { crefspec := C.CString(refspec) defer C.free(unsafe.Pointer(crefspec)) cremote := C.CString(remote) @@ -544,7 +548,7 @@ func (o *Repository) RemoteAddPush(remote, refspec string) error { runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_remote_add_push(o.ptr, cremote, crefspec) + ret := C.git_remote_add_push(c.repo.ptr, cremote, crefspec) if ret < 0 { return MakeGitError(ret) } diff --git a/remote_test.go b/remote_test.go index cbb52aa..4e64489 100644 --- a/remote_test.go +++ b/remote_test.go @@ -9,7 +9,7 @@ func TestListRemotes(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) - _, err := repo.CreateRemote("test", "git://foo/bar") + _, err := repo.Remotes.Create("test", "git://foo/bar") checkFatal(t, err) @@ -17,7 +17,7 @@ func TestListRemotes(t *testing.T) { "test", } - actual, err := repo.ListRemotes() + actual, err := repo.Remotes.List() checkFatal(t, err) compareStringList(t, expected, actual) @@ -36,7 +36,7 @@ func TestCertificateCheck(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) - remote, err := repo.CreateRemote("origin", "https://github.com/libgit2/TestGitRepository") + remote, err := repo.Remotes.Create("origin", "https://github.com/libgit2/TestGitRepository") checkFatal(t, err) options := FetchOptions { @@ -55,7 +55,7 @@ func TestRemoteConnect(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) - remote, err := repo.CreateRemote("origin", "https://github.com/libgit2/TestGitRepository") + remote, err := repo.Remotes.Create("origin", "https://github.com/libgit2/TestGitRepository") checkFatal(t, err) err = remote.ConnectFetch(nil) @@ -66,7 +66,7 @@ func TestRemoteLs(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) - remote, err := repo.CreateRemote("origin", "https://github.com/libgit2/TestGitRepository") + remote, err := repo.Remotes.Create("origin", "https://github.com/libgit2/TestGitRepository") checkFatal(t, err) err = remote.ConnectFetch(nil) @@ -84,7 +84,7 @@ func TestRemoteLsFiltering(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) - remote, err := repo.CreateRemote("origin", "https://github.com/libgit2/TestGitRepository") + remote, err := repo.Remotes.Create("origin", "https://github.com/libgit2/TestGitRepository") checkFatal(t, err) err = remote.ConnectFetch(nil) @@ -117,10 +117,10 @@ func TestRemotePruneRefs(t *testing.T) { err = config.SetBool("remote.origin.prune", true) checkFatal(t, err) - _, err = repo.CreateRemote("origin", "https://github.com/libgit2/TestGitRepository") + _, err = repo.Remotes.Create("origin", "https://github.com/libgit2/TestGitRepository") checkFatal(t, err) - remote, err := repo.LookupRemote("origin") + remote, err := repo.Remotes.Lookup("origin") checkFatal(t, err) if !remote.PruneRefs() { @@ -148,7 +148,7 @@ func TestRemotePrune(t *testing.T) { defer config.Free() remoteUrl := fmt.Sprintf("file://%s", remoteRepo.Workdir()) - remote, err := repo.CreateRemote("origin", remoteUrl) + remote, err := repo.Remotes.Create("origin", remoteUrl) checkFatal(t, err) err = remote.Fetch([]string{"test-prune"}, nil, "") @@ -163,7 +163,7 @@ func TestRemotePrune(t *testing.T) { err = config.SetBool("remote.origin.prune", true) checkFatal(t, err) - rr, err := repo.LookupRemote("origin") + rr, err := repo.Remotes.Lookup("origin") checkFatal(t, err) err = rr.ConnectFetch(nil) diff --git a/repository.go b/repository.go index 9917c60..860050f 100644 --- a/repository.go +++ b/repository.go @@ -12,7 +12,16 @@ import ( // Repository type Repository struct { - ptr *C.git_repository + ptr *C.git_repository + // Remotes represents the collection of remotes and can be + // used to add, remove and configure remotes for this + // repository. + Remotes RemoteCollection +} + +func initRepositoryObject(repo *Repository) { + repo.Remotes.repo = repo + runtime.SetFinalizer(repo, (*Repository).Free) } func OpenRepository(path string) (*Repository, error) { @@ -29,7 +38,7 @@ func OpenRepository(path string) (*Repository, error) { return nil, MakeGitError(ret) } - runtime.SetFinalizer(repo, (*Repository).Free) + initRepositoryObject(repo) return repo, nil } @@ -47,7 +56,7 @@ func OpenRepositoryExtended(path string) (*Repository, error) { return nil, MakeGitError(ret) } - runtime.SetFinalizer(repo, (*Repository).Free) + initRepositoryObject(repo) return repo, nil } @@ -65,7 +74,7 @@ func InitRepository(path string, isbare bool) (*Repository, error) { return nil, MakeGitError(ret) } - runtime.SetFinalizer(repo, (*Repository).Free) + initRepositoryObject(repo) return repo, nil } @@ -80,7 +89,7 @@ func NewRepositoryWrapOdb(odb *Odb) (repo *Repository, err error) { return nil, MakeGitError(ret) } - runtime.SetFinalizer(repo, (*Repository).Free) + initRepositoryObject(repo) return repo, nil } -- cgit v1.2.3 From d2808d16101e113096b3a1c02e3f91122de74f15 Mon Sep 17 00:00:00 2001 From: Carlos Martín Nieto Date: Sun, 28 Jun 2015 00:58:31 +0200 Subject: Create a SubmoduleCollection for managing submodules Similarly to RemoteCollection, this allows us to namespace the submodule operations much more concisely and removes API on the Repository. --- repository.go | 7 ++++++- submodule.go | 32 ++++++++++++++++++-------------- submodule_test.go | 4 ++-- 3 files changed, 26 insertions(+), 17 deletions(-) (limited to 'repository.go') diff --git a/repository.go b/repository.go index 860050f..0427d85 100644 --- a/repository.go +++ b/repository.go @@ -17,10 +17,15 @@ type Repository struct { // used to add, remove and configure remotes for this // repository. Remotes RemoteCollection + // Submodules represents the collectin of submodules and can + // be used to add, remove and configure submodules in this + // repostiory. + Submodules SubmoduleCollection } func initRepositoryObject(repo *Repository) { - repo.Remotes.repo = repo + repo.Remotes.repo = repo + repo.Submodules.repo = repo runtime.SetFinalizer(repo, (*Repository).Free) } diff --git a/submodule.go b/submodule.go index 971011b..6d4dc28 100644 --- a/submodule.go +++ b/submodule.go @@ -68,13 +68,17 @@ const ( SubmoduleRecurseOndemand SubmoduleRecurse = C.GIT_SUBMODULE_RECURSE_ONDEMAND ) +type SubmoduleCollection struct { + repo *Repository +} + func SubmoduleStatusIsUnmodified(status int) bool { o := SubmoduleStatus(status) & ^(SubmoduleStatusInHead | SubmoduleStatusInIndex | SubmoduleStatusInConfig | SubmoduleStatusInWd) return o == 0 } -func (repo *Repository) LookupSubmodule(name string) (*Submodule, error) { +func (c *SubmoduleCollection) Lookup(name string) (*Submodule, error) { cname := C.CString(name) defer C.free(unsafe.Pointer(cname)) @@ -83,7 +87,7 @@ func (repo *Repository) LookupSubmodule(name string) (*Submodule, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_submodule_lookup(&sub.ptr, repo.ptr, cname) + ret := C.git_submodule_lookup(&sub.ptr, c.repo.ptr, cname) if ret < 0 { return nil, MakeGitError(ret) } @@ -104,21 +108,21 @@ func SubmoduleVisitor(csub unsafe.Pointer, name *C.char, handle unsafe.Pointer) } } -func (repo *Repository) ForeachSubmodule(cbk SubmoduleCbk) error { +func (c *SubmoduleCollection) Foreach(cbk SubmoduleCbk) error { runtime.LockOSThread() defer runtime.UnlockOSThread() handle := pointerHandles.Track(cbk) defer pointerHandles.Untrack(handle) - ret := C._go_git_visit_submodule(repo.ptr, handle) + ret := C._go_git_visit_submodule(c.repo.ptr, handle) if ret < 0 { return MakeGitError(ret) } return nil } -func (repo *Repository) AddSubmodule(url, path string, use_git_link bool) (*Submodule, error) { +func (c *SubmoduleCollection) Add(url, path string, use_git_link bool) (*Submodule, error) { curl := C.CString(url) defer C.free(unsafe.Pointer(curl)) cpath := C.CString(path) @@ -129,7 +133,7 @@ func (repo *Repository) AddSubmodule(url, path string, use_git_link bool) (*Subm runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_submodule_add_setup(&sub.ptr, repo.ptr, curl, cpath, cbool(use_git_link)) + ret := C.git_submodule_add_setup(&sub.ptr, c.repo.ptr, curl, cpath, cbool(use_git_link)) if ret < 0 { return nil, MakeGitError(ret) } @@ -173,7 +177,7 @@ func (sub *Submodule) Url() string { return C.GoString(n) } -func (o *Repository) SubmoduleSetUrl(submodule, url string) error { +func (c *SubmoduleCollection) SetUrl(submodule, url string) error { csubmodule := C.CString(submodule) defer C.free(unsafe.Pointer(csubmodule)) curl := C.CString(url) @@ -182,7 +186,7 @@ func (o *Repository) SubmoduleSetUrl(submodule, url string) error { runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_submodule_set_url(o.ptr, csubmodule, curl) + ret := C.git_submodule_set_url(c.repo.ptr, csubmodule, curl) if ret < 0 { return MakeGitError(ret) } @@ -218,14 +222,14 @@ func (sub *Submodule) Ignore() SubmoduleIgnore { return SubmoduleIgnore(o) } -func (o *Repository) SubmoduleSetIgnore(submodule string, ignore SubmoduleIgnore) error { +func (c *SubmoduleCollection) SetIgnore(submodule string, ignore SubmoduleIgnore) error { csubmodule := C.CString(submodule) defer C.free(unsafe.Pointer(csubmodule)) runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_submodule_set_ignore(o.ptr, csubmodule, C.git_submodule_ignore_t(ignore)) + ret := C.git_submodule_set_ignore(c.repo.ptr, csubmodule, C.git_submodule_ignore_t(ignore)) if ret < 0 { return MakeGitError(ret) } @@ -238,14 +242,14 @@ func (sub *Submodule) UpdateStrategy() SubmoduleUpdate { return SubmoduleUpdate(o) } -func (o *Repository) SubmoduleSetUpdate(submodule string, update SubmoduleUpdate) error { +func (c *SubmoduleCollection) SetUpdate(submodule string, update SubmoduleUpdate) error { csubmodule := C.CString(submodule) defer C.free(unsafe.Pointer(csubmodule)) runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_submodule_set_update(o.ptr, csubmodule, C.git_submodule_update_t(update)) + ret := C.git_submodule_set_update(c.repo.ptr, csubmodule, C.git_submodule_update_t(update)) if ret < 0 { return MakeGitError(ret) } @@ -257,14 +261,14 @@ func (sub *Submodule) FetchRecurseSubmodules() SubmoduleRecurse { return SubmoduleRecurse(C.git_submodule_fetch_recurse_submodules(sub.ptr)) } -func (o *Repository) SubmoduleSetFetchRecurseSubmodules(submodule string, recurse SubmoduleRecurse) error { +func (c *SubmoduleCollection) SetFetchRecurseSubmodules(submodule string, recurse SubmoduleRecurse) error { csubmodule := C.CString(submodule) defer C.free(unsafe.Pointer(csubmodule)) runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_submodule_set_fetch_recurse_submodules(o.ptr, csubmodule, C.git_submodule_recurse_t(recurse)) + ret := C.git_submodule_set_fetch_recurse_submodules(c.repo.ptr, csubmodule, C.git_submodule_recurse_t(recurse)) if ret < 0 { return MakeGitError(C.int(ret)) } diff --git a/submodule_test.go b/submodule_test.go index 27bc193..43c890a 100644 --- a/submodule_test.go +++ b/submodule_test.go @@ -10,11 +10,11 @@ func TestSubmoduleForeach(t *testing.T) { seedTestRepo(t, repo) - _, err := repo.AddSubmodule("http://example.org/submodule", "submodule", true) + _, err := repo.Submodules.Add("http://example.org/submodule", "submodule", true) checkFatal(t, err) i := 0 - err = repo.ForeachSubmodule(func(sub *Submodule, name string) int { + err = repo.Submodules.Foreach(func(sub *Submodule, name string) int { i++ return 0 }) -- cgit v1.2.3 From 01a2d8d38d4683c6e29da21240ffff7ae7b3a680 Mon Sep 17 00:00:00 2001 From: Carlos Martín Nieto Date: Sun, 28 Jun 2015 01:12:32 +0200 Subject: Create a ReferenceCollection for managing references As with the other commits, this clears up the clutter in naming and around the Repository's API. --- merge_test.go | 4 +- push_test.go | 4 +- reference.go | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++ reference_test.go | 22 +++++----- remote_test.go | 4 +- repository.go | 126 +++--------------------------------------------------- revparse_test.go | 2 +- 7 files changed, 147 insertions(+), 139 deletions(-) (limited to 'repository.go') diff --git a/merge_test.go b/merge_test.go index 0b1faca..5c62f5c 100644 --- a/merge_test.go +++ b/merge_test.go @@ -10,7 +10,7 @@ func TestMergeWithSelf(t *testing.T) { seedTestRepo(t, repo) - master, err := repo.LookupReference("refs/heads/master") + master, err := repo.References.Lookup("refs/heads/master") checkFatal(t, err) mergeHead, err := repo.AnnotatedCommitFromRef(master) @@ -28,7 +28,7 @@ func TestMergeAnalysisWithSelf(t *testing.T) { seedTestRepo(t, repo) - master, err := repo.LookupReference("refs/heads/master") + master, err := repo.References.Lookup("refs/heads/master") checkFatal(t, err) mergeHead, err := repo.AnnotatedCommitFromRef(master) diff --git a/push_test.go b/push_test.go index a9fc90d..8f6e806 100644 --- a/push_test.go +++ b/push_test.go @@ -19,9 +19,9 @@ func TestRemotePush(t *testing.T) { err = remote.Push([]string{"refs/heads/master"}, nil) checkFatal(t, err) - _, err = localRepo.LookupReference("refs/remotes/test_push/master") + _, err = localRepo.References.Lookup("refs/remotes/test_push/master") checkFatal(t, err) - _, err = repo.LookupReference("refs/heads/master") + _, err = repo.References.Lookup("refs/heads/master") checkFatal(t, err) } diff --git a/reference.go b/reference.go index 61e2b26..d24e054 100644 --- a/reference.go +++ b/reference.go @@ -21,6 +21,130 @@ type Reference struct { repo *Repository } +type ReferenceCollection struct { + repo *Repository +} + +func (c *ReferenceCollection) Lookup(name string) (*Reference, error) { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + var ptr *C.git_reference + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ecode := C.git_reference_lookup(&ptr, c.repo.ptr, cname) + if ecode < 0 { + return nil, MakeGitError(ecode) + } + + return newReferenceFromC(ptr, c.repo), nil +} + +func (c *ReferenceCollection) Create(name string, id *Oid, force bool, msg string) (*Reference, error) { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + + var cmsg *C.char + if msg == "" { + cmsg = nil + } else { + cmsg = C.CString(msg) + defer C.free(unsafe.Pointer(cmsg)) + } + + var ptr *C.git_reference + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ecode := C.git_reference_create(&ptr, c.repo.ptr, cname, id.toC(), cbool(force), cmsg) + if ecode < 0 { + return nil, MakeGitError(ecode) + } + + return newReferenceFromC(ptr, c.repo), nil +} + +func (c *ReferenceCollection) CreateSymbolic(name, target string, force bool, msg string) (*Reference, error) { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + + ctarget := C.CString(target) + defer C.free(unsafe.Pointer(ctarget)) + + var cmsg *C.char + if msg == "" { + cmsg = nil + } else { + cmsg = C.CString(msg) + defer C.free(unsafe.Pointer(cmsg)) + } + + var ptr *C.git_reference + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ecode := C.git_reference_symbolic_create(&ptr, c.repo.ptr, cname, ctarget, cbool(force), cmsg) + if ecode < 0 { + return nil, MakeGitError(ecode) + } + + return newReferenceFromC(ptr, c.repo), nil +} + +// EnsureLog ensures that there is a reflog for the given reference +// name and creates an empty one if necessary. +func (c *ReferenceCollection) EnsureLog(name string) error { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ret := C.git_reference_ensure_log(c.repo.ptr, cname) + if ret < 0 { + return MakeGitError(ret) + } + + return nil +} + +// HasLog returns whether there is a reflog for the given reference +// name +func (c *ReferenceCollection) HasLog(name string) (bool, error) { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ret := C.git_reference_has_log(c.repo.ptr, cname) + if ret < 0 { + return false, MakeGitError(ret) + } + + return ret == 1, nil +} + +// Dwim looks up a reference by DWIMing its short name +func (c *ReferenceCollection) Dwim(name string) (*Reference, error) { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + var ptr *C.git_reference + ret := C.git_reference_dwim(&ptr, c.repo.ptr, cname) + if ret < 0 { + return nil, MakeGitError(ret) + } + + return newReferenceFromC(ptr, c.repo), nil +} + func newReferenceFromC(ptr *C.git_reference, repo *Repository) *Reference { ref := &Reference{ptr: ptr, repo: repo} runtime.SetFinalizer(ref, (*Reference).Free) diff --git a/reference_test.go b/reference_test.go index e891e7a..f1546e2 100644 --- a/reference_test.go +++ b/reference_test.go @@ -13,14 +13,14 @@ func TestRefModification(t *testing.T) { commitId, treeId := seedTestRepo(t, repo) - _, err := repo.CreateReference("refs/tags/tree", treeId, true, "testTreeTag") + _, err := repo.References.Create("refs/tags/tree", treeId, true, "testTreeTag") checkFatal(t, err) - tag, err := repo.LookupReference("refs/tags/tree") + tag, err := repo.References.Lookup("refs/tags/tree") checkFatal(t, err) checkRefType(t, tag, ReferenceOid) - ref, err := repo.LookupReference("HEAD") + ref, err := repo.References.Lookup("HEAD") checkFatal(t, err) checkRefType(t, ref, ReferenceSymbolic) @@ -46,7 +46,7 @@ func TestRefModification(t *testing.T) { _, err = tag.Rename("refs/tags/renamed", false, "") checkFatal(t, err) - tag, err = repo.LookupReference("refs/tags/renamed") + tag, err = repo.References.Lookup("refs/tags/renamed") checkFatal(t, err) checkRefType(t, ref, ReferenceOid) @@ -77,13 +77,13 @@ func TestReferenceIterator(t *testing.T) { commitId, err := repo.CreateCommit("HEAD", sig, sig, message, tree) checkFatal(t, err) - _, err = repo.CreateReference("refs/heads/one", commitId, true, "headOne") + _, err = repo.References.Create("refs/heads/one", commitId, true, "headOne") checkFatal(t, err) - _, err = repo.CreateReference("refs/heads/two", commitId, true, "headTwo") + _, err = repo.References.Create("refs/heads/two", commitId, true, "headTwo") checkFatal(t, err) - _, err = repo.CreateReference("refs/heads/three", commitId, true, "headThree") + _, err = repo.References.Create("refs/heads/three", commitId, true, "headThree") checkFatal(t, err) iter, err := repo.NewReferenceIterator() @@ -136,7 +136,7 @@ func TestReferenceOwner(t *testing.T) { commitId, _ := seedTestRepo(t, repo) - ref, err := repo.CreateReference("refs/heads/foo", commitId, true, "") + ref, err := repo.References.Create("refs/heads/foo", commitId, true, "") checkFatal(t, err) owner := ref.Owner() @@ -155,10 +155,10 @@ func TestUtil(t *testing.T) { commitId, _ := seedTestRepo(t, repo) - ref, err := repo.CreateReference("refs/heads/foo", commitId, true, "") + ref, err := repo.References.Create("refs/heads/foo", commitId, true, "") checkFatal(t, err) - ref2, err := repo.DwimReference("foo") + ref2, err := repo.References.Dwim("foo") checkFatal(t, err) if ref.Cmp(ref2) != 0 { @@ -169,7 +169,7 @@ func TestUtil(t *testing.T) { t.Fatalf("refs/heads/foo has no foo shorthand") } - hasLog, err := repo.HasLog("refs/heads/foo") + hasLog, err := repo.References.HasLog("refs/heads/foo") checkFatal(t, err) if !hasLog { t.Fatalf("branches have logs by default") diff --git a/remote_test.go b/remote_test.go index 4e64489..73c637f 100644 --- a/remote_test.go +++ b/remote_test.go @@ -154,7 +154,7 @@ func TestRemotePrune(t *testing.T) { err = remote.Fetch([]string{"test-prune"}, nil, "") checkFatal(t, err) - _, err = repo.CreateReference("refs/remotes/origin/test-prune", head, true, "remote reference") + _, err = repo.References.Create("refs/remotes/origin/test-prune", head, true, "remote reference") checkFatal(t, err) err = remoteRef.Delete() @@ -172,7 +172,7 @@ func TestRemotePrune(t *testing.T) { err = rr.Prune(nil) checkFatal(t, err) - _, err = repo.LookupReference("refs/remotes/origin/test-prune") + _, err = repo.References.Lookup("refs/remotes/origin/test-prune") if err == nil { t.Fatal("Expected error getting a pruned reference") } diff --git a/repository.go b/repository.go index 0427d85..8aa39ef 100644 --- a/repository.go +++ b/repository.go @@ -17,15 +17,19 @@ type Repository struct { // used to add, remove and configure remotes for this // repository. Remotes RemoteCollection - // Submodules represents the collectin of submodules and can + // Submodules represents the collection of submodules and can // be used to add, remove and configure submodules in this // repostiory. Submodules SubmoduleCollection + // References represents the collection of references and can + // be used to create, remove or update refernces for this repository. + References ReferenceCollection } func initRepositoryObject(repo *Repository) { repo.Remotes.repo = repo repo.Submodules.repo = repo + repo.References.repo = repo runtime.SetFinalizer(repo, (*Repository).Free) } @@ -190,22 +194,6 @@ func (v *Repository) LookupTag(id *Oid) (*Tag, error) { return obj.(*Tag), nil } -func (v *Repository) LookupReference(name string) (*Reference, error) { - cname := C.CString(name) - defer C.free(unsafe.Pointer(cname)) - var ptr *C.git_reference - - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - ecode := C.git_reference_lookup(&ptr, v.ptr, cname) - if ecode < 0 { - return nil, MakeGitError(ecode) - } - - return newReferenceFromC(ptr, v), nil -} - func (v *Repository) Head() (*Reference, error) { var ptr *C.git_reference @@ -245,59 +233,6 @@ func (v *Repository) SetHeadDetached(id *Oid) error { return nil } -func (v *Repository) CreateReference(name string, id *Oid, force bool, msg string) (*Reference, error) { - cname := C.CString(name) - defer C.free(unsafe.Pointer(cname)) - - var cmsg *C.char - if msg == "" { - cmsg = nil - } else { - cmsg = C.CString(msg) - defer C.free(unsafe.Pointer(cmsg)) - } - - var ptr *C.git_reference - - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - ecode := C.git_reference_create(&ptr, v.ptr, cname, id.toC(), cbool(force), cmsg) - if ecode < 0 { - return nil, MakeGitError(ecode) - } - - return newReferenceFromC(ptr, v), nil -} - -func (v *Repository) CreateSymbolicReference(name, target string, force bool, msg string) (*Reference, error) { - cname := C.CString(name) - defer C.free(unsafe.Pointer(cname)) - - ctarget := C.CString(target) - defer C.free(unsafe.Pointer(ctarget)) - - var cmsg *C.char - if msg == "" { - cmsg = nil - } else { - cmsg = C.CString(msg) - defer C.free(unsafe.Pointer(cmsg)) - } - - var ptr *C.git_reference - - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - ecode := C.git_reference_symbolic_create(&ptr, v.ptr, cname, ctarget, cbool(force), cmsg) - if ecode < 0 { - return nil, MakeGitError(ecode) - } - - return newReferenceFromC(ptr, v), nil -} - func (v *Repository) Walk() (*RevWalk, error) { var walkPtr *C.git_revwalk @@ -479,57 +414,6 @@ func (v *Repository) TreeBuilderFromTree(tree *Tree) (*TreeBuilder, error) { return bld, nil } -// EnsureLog ensures that there is a reflog for the given reference -// name and creates an empty one if necessary. -func (v *Repository) EnsureLog(name string) error { - cname := C.CString(name) - defer C.free(unsafe.Pointer(cname)) - - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - ret := C.git_reference_ensure_log(v.ptr, cname) - if ret < 0 { - return MakeGitError(ret) - } - - return nil -} - -// HasLog returns whether there is a reflog for the given reference -// name -func (v *Repository) HasLog(name string) (bool, error) { - cname := C.CString(name) - defer C.free(unsafe.Pointer(cname)) - - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - ret := C.git_reference_has_log(v.ptr, cname) - if ret < 0 { - return false, MakeGitError(ret) - } - - return ret == 1, nil -} - -// DwimReference looks up a reference by DWIMing its short name -func (v *Repository) DwimReference(name string) (*Reference, error) { - cname := C.CString(name) - defer C.free(unsafe.Pointer(cname)) - - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - var ptr *C.git_reference - ret := C.git_reference_dwim(&ptr, v.ptr, cname) - if ret < 0 { - return nil, MakeGitError(ret) - } - - return newReferenceFromC(ptr, v), nil -} - // CreateNote adds a note for an object func (v *Repository) CreateNote( ref string, author, committer *Signature, id *Oid, diff --git a/revparse_test.go b/revparse_test.go index 4bc327c..091a76b 100644 --- a/revparse_test.go +++ b/revparse_test.go @@ -34,7 +34,7 @@ func TestRevparseExt(t *testing.T) { _, treeId := seedTestRepo(t, repo) - ref, err := repo.CreateReference("refs/heads/master", treeId, true, "") + ref, err := repo.References.Create("refs/heads/master", treeId, true, "") checkFatal(t, err) obj, ref, err := repo.RevparseExt("master") -- cgit v1.2.3 From 70c95a7655eddffda4cd8fddd87536c5580136fe Mon Sep 17 00:00:00 2001 From: Carlos Martín Nieto Date: Sun, 28 Jun 2015 01:19:22 +0200 Subject: Create a NotesCollection for managing notes As with the others, move these methods into their own namespace. --- note.go | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ note_test.go | 14 +++---- repository.go | 119 ++------------------------------------------------------- 3 files changed, 132 insertions(+), 122 deletions(-) (limited to 'repository.go') diff --git a/note.go b/note.go index 3cdd340..a1b15d8 100644 --- a/note.go +++ b/note.go @@ -10,6 +10,127 @@ import ( "unsafe" ) +// This object represents the possible operations which can be +// performed on the collection of notes for a repository. +type NoteCollection struct { + repo *Repository +} + +// Create adds a note for an object +func (c *NoteCollection) Create( + ref string, author, committer *Signature, id *Oid, + note string, force bool) (*Oid, error) { + + oid := new(Oid) + + var cref *C.char + if ref == "" { + cref = nil + } else { + cref = C.CString(ref) + defer C.free(unsafe.Pointer(cref)) + } + + authorSig, err := author.toC() + if err != nil { + return nil, err + } + defer C.git_signature_free(authorSig) + + committerSig, err := committer.toC() + if err != nil { + return nil, err + } + defer C.git_signature_free(committerSig) + + cnote := C.CString(note) + defer C.free(unsafe.Pointer(cnote)) + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ret := C.git_note_create( + oid.toC(), c.repo.ptr, cref, authorSig, + committerSig, id.toC(), cnote, cbool(force)) + + if ret < 0 { + return nil, MakeGitError(ret) + } + return oid, nil +} + +// Read reads the note for an object +func (c *NoteCollection) Read(ref string, id *Oid) (*Note, error) { + var cref *C.char + if ref == "" { + cref = nil + } else { + cref = C.CString(ref) + defer C.free(unsafe.Pointer(cref)) + } + + note := new(Note) + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + if ret := C.git_note_read(¬e.ptr, c.repo.ptr, cref, id.toC()); ret < 0 { + return nil, MakeGitError(ret) + } + + runtime.SetFinalizer(note, (*Note).Free) + return note, nil +} + +// Remove removes the note for an object +func (c *NoteCollection) Remove(ref string, author, committer *Signature, id *Oid) error { + var cref *C.char + if ref == "" { + cref = nil + } else { + cref = C.CString(ref) + defer C.free(unsafe.Pointer(cref)) + } + + authorSig, err := author.toC() + if err != nil { + return err + } + defer C.git_signature_free(authorSig) + + committerSig, err := committer.toC() + if err != nil { + return err + } + defer C.git_signature_free(committerSig) + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ret := C.git_note_remove(c.repo.ptr, cref, authorSig, committerSig, id.toC()) + if ret < 0 { + return MakeGitError(ret) + } + return nil +} + +// DefaultRef returns the default notes reference for a repository +func (c *NoteCollection) DefaultRef() (string, error) { + buf := C.git_buf{} + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + if ret := C.git_note_default_ref(&buf, c.repo.ptr); ret < 0 { + return "", MakeGitError(ret) + } + + ret := C.GoString(buf.ptr) + C.git_buf_free(&buf) + + return ret, nil +} + // Note type Note struct { ptr *C.git_note diff --git a/note_test.go b/note_test.go index e6c378d..27e04be 100644 --- a/note_test.go +++ b/note_test.go @@ -53,7 +53,7 @@ func TestNoteIterator(t *testing.T) { break } - note, err := repo.ReadNote("", commitId) + note, err := repo.Notes.Read("", commitId) checkFatal(t, err) if !reflect.DeepEqual(note.Id(), noteId) { @@ -73,13 +73,13 @@ func TestRemoveNote(t *testing.T) { note, _ := createTestNote(t, repo, commit) - _, err = repo.ReadNote("", commit.Id()) + _, err = repo.Notes.Read("", commit.Id()) checkFatal(t, err) - err = repo.RemoveNote("", note.Author(), note.Committer(), commitId) + err = repo.Notes.Remove("", note.Author(), note.Committer(), commitId) checkFatal(t, err) - _, err = repo.ReadNote("", commit.Id()) + _, err = repo.Notes.Read("", commit.Id()) if err == nil { t.Fatal("note remove failed") } @@ -89,7 +89,7 @@ func TestDefaultNoteRef(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) - ref, err := repo.DefaultNoteRef() + ref, err := repo.Notes.DefaultRef() checkFatal(t, err) compareStrings(t, "refs/notes/commits", ref) @@ -103,10 +103,10 @@ func createTestNote(t *testing.T, repo *Repository, commit *Commit) (*Note, *Oid When: time.Date(2015, 01, 05, 13, 0, 0, 0, loc), } - noteId, err := repo.CreateNote("", sig, sig, commit.Id(), "I am a note\n", false) + noteId, err := repo.Notes.Create("", sig, sig, commit.Id(), "I am a note\n", false) checkFatal(t, err) - note, err := repo.ReadNote("", commit.Id()) + note, err := repo.Notes.Read("", commit.Id()) checkFatal(t, err) return note, noteId diff --git a/repository.go b/repository.go index 8aa39ef..5a2b815 100644 --- a/repository.go +++ b/repository.go @@ -24,12 +24,16 @@ type Repository struct { // References represents the collection of references and can // be used to create, remove or update refernces for this repository. References ReferenceCollection + // Notes represents the collection of notes and can be used to + // read, write and delete notes from this repository. + Notes NoteCollection } func initRepositoryObject(repo *Repository) { repo.Remotes.repo = repo repo.Submodules.repo = repo repo.References.repo = repo + repo.Notes.repo = repo runtime.SetFinalizer(repo, (*Repository).Free) } @@ -414,121 +418,6 @@ func (v *Repository) TreeBuilderFromTree(tree *Tree) (*TreeBuilder, error) { return bld, nil } -// CreateNote adds a note for an object -func (v *Repository) CreateNote( - ref string, author, committer *Signature, id *Oid, - note string, force bool) (*Oid, error) { - - oid := new(Oid) - - var cref *C.char - if ref == "" { - cref = nil - } else { - cref = C.CString(ref) - defer C.free(unsafe.Pointer(cref)) - } - - authorSig, err := author.toC() - if err != nil { - return nil, err - } - defer C.git_signature_free(authorSig) - - committerSig, err := committer.toC() - if err != nil { - return nil, err - } - defer C.git_signature_free(committerSig) - - cnote := C.CString(note) - defer C.free(unsafe.Pointer(cnote)) - - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - ret := C.git_note_create( - oid.toC(), v.ptr, cref, authorSig, - committerSig, id.toC(), cnote, cbool(force)) - - if ret < 0 { - return nil, MakeGitError(ret) - } - return oid, nil -} - -// ReadNote reads the note for an object -func (v *Repository) ReadNote(ref string, id *Oid) (*Note, error) { - var cref *C.char - if ref == "" { - cref = nil - } else { - cref = C.CString(ref) - defer C.free(unsafe.Pointer(cref)) - } - - note := new(Note) - - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - if ret := C.git_note_read(¬e.ptr, v.ptr, cref, id.toC()); ret < 0 { - return nil, MakeGitError(ret) - } - - runtime.SetFinalizer(note, (*Note).Free) - return note, nil -} - -// RemoveNote removes the note for an object -func (v *Repository) RemoveNote(ref string, author, committer *Signature, id *Oid) error { - var cref *C.char - if ref == "" { - cref = nil - } else { - cref = C.CString(ref) - defer C.free(unsafe.Pointer(cref)) - } - - authorSig, err := author.toC() - if err != nil { - return err - } - defer C.git_signature_free(authorSig) - - committerSig, err := committer.toC() - if err != nil { - return err - } - defer C.git_signature_free(committerSig) - - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - ret := C.git_note_remove(v.ptr, cref, authorSig, committerSig, id.toC()) - if ret < 0 { - return MakeGitError(ret) - } - return nil -} - -// DefaultNoteRef returns the default notes reference for a repository -func (v *Repository) DefaultNoteRef() (string, error) { - buf := C.git_buf{} - - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - if ret := C.git_note_default_ref(&buf, v.ptr); ret < 0 { - return "", MakeGitError(ret) - } - - ret := C.GoString(buf.ptr) - C.git_buf_free(&buf) - - return ret, nil -} - type RepositoryState int const ( -- cgit v1.2.3 From 66d266f97185020fe80f4b573411c39fc354fc91 Mon Sep 17 00:00:00 2001 From: Carlos Martín Nieto Date: Tue, 30 Jun 2015 19:03:52 +0200 Subject: Repository: move to use an actual constructor This should further reduce the changes of the creation of the object going badly. --- repository.go | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) (limited to 'repository.go') diff --git a/repository.go b/repository.go index 5a2b815..2e2e897 100644 --- a/repository.go +++ b/repository.go @@ -29,81 +29,78 @@ type Repository struct { Notes NoteCollection } -func initRepositoryObject(repo *Repository) { +func newRepositoryFromC(ptr *C.git_repository) *Repository { + repo := &Repository{ptr: ptr} + repo.Remotes.repo = repo repo.Submodules.repo = repo repo.References.repo = repo repo.Notes.repo = repo + runtime.SetFinalizer(repo, (*Repository).Free) + + return repo } func OpenRepository(path string) (*Repository, error) { - repo := new(Repository) - cpath := C.CString(path) defer C.free(unsafe.Pointer(cpath)) runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_repository_open(&repo.ptr, cpath) + var ptr *C.git_repository + ret := C.git_repository_open(&ptr, cpath) if ret < 0 { return nil, MakeGitError(ret) } - initRepositoryObject(repo) - return repo, nil + return newRepositoryFromC(ptr), nil } func OpenRepositoryExtended(path string) (*Repository, error) { - repo := new(Repository) - cpath := C.CString(path) defer C.free(unsafe.Pointer(cpath)) runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_repository_open_ext(&repo.ptr, cpath, 0, nil) + var ptr *C.git_repository + ret := C.git_repository_open_ext(&ptr, cpath, 0, nil) if ret < 0 { return nil, MakeGitError(ret) } - initRepositoryObject(repo) - return repo, nil + return newRepositoryFromC(ptr), nil } func InitRepository(path string, isbare bool) (*Repository, error) { - repo := new(Repository) - cpath := C.CString(path) defer C.free(unsafe.Pointer(cpath)) runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_repository_init(&repo.ptr, cpath, ucbool(isbare)) + var ptr *C.git_repository + ret := C.git_repository_init(&ptr, cpath, ucbool(isbare)) if ret < 0 { return nil, MakeGitError(ret) } - initRepositoryObject(repo) - return repo, nil + return newRepositoryFromC(ptr), nil } func NewRepositoryWrapOdb(odb *Odb) (repo *Repository, err error) { - repo = new(Repository) - runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_repository_wrap_odb(&repo.ptr, odb.ptr) + var ptr *C.git_repository + ret := C.git_repository_wrap_odb(&ptr, odb.ptr) if ret < 0 { return nil, MakeGitError(ret) } - initRepositoryObject(repo) - return repo, nil + return newRepositoryFromC(ptr), nil } func (v *Repository) SetRefdb(refdb *Refdb) { -- cgit v1.2.3 From 12311c8528c577ebb11006f24c026c7a4d2f2de3 Mon Sep 17 00:00:00 2001 From: Calin Seciu Date: Fri, 31 Jul 2015 09:51:19 +0200 Subject: Add TagsCollection --- repository.go | 4 ++++ tag.go | 4 ++++ 2 files changed, 8 insertions(+) (limited to 'repository.go') diff --git a/repository.go b/repository.go index 44509af..b17745d 100644 --- a/repository.go +++ b/repository.go @@ -27,6 +27,9 @@ type Repository struct { // Notes represents the collection of notes and can be used to // read, write and delete notes from this repository. Notes NoteCollection + // Tags represents the collection of tags and can be used to create, + // list and iterate tags in this repository. + Tags TagsCollection } func newRepositoryFromC(ptr *C.git_repository) *Repository { @@ -36,6 +39,7 @@ func newRepositoryFromC(ptr *C.git_repository) *Repository { repo.Submodules.repo = repo repo.References.repo = repo repo.Notes.repo = repo + repo.Tags.repo = repo runtime.SetFinalizer(repo, (*Repository).Free) diff --git a/tag.go b/tag.go index 89ac8bd..74b18d8 100644 --- a/tag.go +++ b/tag.go @@ -42,3 +42,7 @@ func (t Tag) TargetId() *Oid { func (t Tag) TargetType() ObjectType { return ObjectType(C.git_tag_target_type(t.cast_ptr)) } + +type TagsCollection struct { + repo *Repository +} -- cgit v1.2.3 From def4494b74ec1c8fd12669e3f65bd29d6315c83c Mon Sep 17 00:00:00 2001 From: Carlos Martín Nieto Date: Fri, 31 Jul 2015 20:23:05 +0200 Subject: Move CreateTag to the tags collection --- repository.go | 30 ------------------------------ tag.go | 30 ++++++++++++++++++++++++++++++ tag_test.go | 4 ++-- 3 files changed, 32 insertions(+), 32 deletions(-) (limited to 'repository.go') diff --git a/repository.go b/repository.go index b17745d..62fde6d 100644 --- a/repository.go +++ b/repository.go @@ -321,36 +321,6 @@ func (v *Repository) CreateCommit( return oid, nil } -func (v *Repository) CreateTag( - name string, commit *Commit, tagger *Signature, message string) (*Oid, error) { - - oid := new(Oid) - - cname := C.CString(name) - defer C.free(unsafe.Pointer(cname)) - - cmessage := C.CString(message) - defer C.free(unsafe.Pointer(cmessage)) - - taggerSig, err := tagger.toC() - if err != nil { - return nil, err - } - defer C.git_signature_free(taggerSig) - - ctarget := commit.gitObject.ptr - - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - ret := C.git_tag_create(oid.toC(), v.ptr, cname, ctarget, taggerSig, cmessage, 0) - if ret < 0 { - return nil, MakeGitError(ret) - } - - return oid, nil -} - func (v *Odb) Free() { runtime.SetFinalizer(v, nil) C.git_odb_free(v.ptr) diff --git a/tag.go b/tag.go index 5801c99..ca85156 100644 --- a/tag.go +++ b/tag.go @@ -53,6 +53,36 @@ type TagsCollection struct { repo *Repository } +func (c *TagsCollection) Create( + name string, commit *Commit, tagger *Signature, message string) (*Oid, error) { + + oid := new(Oid) + + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + + cmessage := C.CString(message) + defer C.free(unsafe.Pointer(cmessage)) + + taggerSig, err := tagger.toC() + if err != nil { + return nil, err + } + defer C.git_signature_free(taggerSig) + + ctarget := commit.gitObject.ptr + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ret := C.git_tag_create(oid.toC(), c.repo.ptr, cname, ctarget, taggerSig, cmessage, 0) + if ret < 0 { + return nil, MakeGitError(ret) + } + + return oid, nil +} + // CreateLightweight creates a new lightweight tag pointing to a commit // and returns the id of the target object. // diff --git a/tag_test.go b/tag_test.go index 4bf3889..2fdfe00 100644 --- a/tag_test.go +++ b/tag_test.go @@ -180,7 +180,7 @@ func createTestTag(t *testing.T, repo *Repository, commit *Commit) *Oid { When: time.Date(2013, 03, 06, 14, 30, 0, 0, loc), } - tagId, err := repo.CreateTag("v0.0.0", commit, sig, "This is a tag") + tagId, err := repo.Tags.Create("v0.0.0", commit, sig, "This is a tag") checkFatal(t, err) return tagId } @@ -194,7 +194,7 @@ func createTag(t *testing.T, repo *Repository, commit *Commit, name, message str When: time.Date(2013, 03, 06, 14, 30, 0, 0, loc), } - tagId, err := repo.CreateTag(name, commit, sig, message) + tagId, err := repo.Tags.Create(name, commit, sig, message) checkFatal(t, err) return tagId } -- cgit v1.2.3