From d2808d16101e113096b3a1c02e3f91122de74f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Sun, 28 Jun 2015 00:58:31 +0200 Subject: [PATCH] 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(-) 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 })