aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Muré <batolettre@gmail.com>2022-06-06 13:26:29 +0200
committerGitHub <noreply@github.com>2022-06-06 13:26:29 +0200
commitdd8134b638508fb712c116d6733ed1f4437d1b67 (patch)
tree385775542fe924750db7de0215f4cbca675483a7
parentee0bac6b54e28bb52cbe18332fec84bdefb37194 (diff)
parentccc342e81482e5fe6144fdb6c547331eab2cb98a (diff)
downloadgit-bug-dd8134b638508fb712c116d6733ed1f4437d1b67.tar.gz
Merge pull request #803 from MichaelMure/feat/configurable-local-storage
Feat/configurable local storage
-rw-r--r--commands/env.go4
-rw-r--r--entity/dag/example_test.go7
-rw-r--r--misc/random_bugs/cmd/main.go4
-rw-r--r--repository/gogit.go52
-rw-r--r--repository/gogit_test.go49
-rw-r--r--repository/gogit_testing.go6
6 files changed, 90 insertions, 32 deletions
diff --git a/commands/env.go b/commands/env.go
index ac7b789a..a6bca7e4 100644
--- a/commands/env.go
+++ b/commands/env.go
@@ -14,6 +14,8 @@ import (
"github.com/MichaelMure/git-bug/util/interrupt"
)
+const gitBugNamespace = "git-bug"
+
// Env is the environment of a command
type Env struct {
repo repository.ClockedRepo
@@ -54,7 +56,7 @@ func loadRepo(env *Env) func(*cobra.Command, []string) error {
return fmt.Errorf("unable to get the current working directory: %q", err)
}
- env.repo, err = repository.OpenGoGitRepo(cwd, []repository.ClockLoader{bug.ClockLoader})
+ env.repo, err = repository.OpenGoGitRepo(cwd, gitBugNamespace, []repository.ClockLoader{bug.ClockLoader})
if err == repository.ErrNotARepo {
return fmt.Errorf("%s must be run from within a git repo", rootCommandName)
}
diff --git a/entity/dag/example_test.go b/entity/dag/example_test.go
index d034e59d..948d6aeb 100644
--- a/entity/dag/example_test.go
+++ b/entity/dag/example_test.go
@@ -336,14 +336,17 @@ func Read(repo repository.ClockedRepo, id entity.Id) (*ProjectConfig, error) {
}
func Example_entity() {
+ const gitBugNamespace = "git-bug"
// Note: this example ignore errors for readability
// Note: variable names get a little confusing as we are simulating both side in the same function
// Let's start by defining two git repository and connecting them as remote
repoRenePath, _ := os.MkdirTemp("", "")
repoIsaacPath, _ := os.MkdirTemp("", "")
- repoRene, _ := repository.InitGoGitRepo(repoRenePath)
- repoIsaac, _ := repository.InitGoGitRepo(repoIsaacPath)
+ repoRene, _ := repository.InitGoGitRepo(repoRenePath, gitBugNamespace)
+ defer repoRene.Close()
+ repoIsaac, _ := repository.InitGoGitRepo(repoIsaacPath, gitBugNamespace)
+ defer repoIsaac.Close()
_ = repoRene.AddRemote("origin", repoIsaacPath)
_ = repoIsaac.AddRemote("origin", repoRenePath)
diff --git a/misc/random_bugs/cmd/main.go b/misc/random_bugs/cmd/main.go
index 010ae6d1..c3506efb 100644
--- a/misc/random_bugs/cmd/main.go
+++ b/misc/random_bugs/cmd/main.go
@@ -11,6 +11,8 @@ import (
// This program will randomly generate a collection of bugs in the repository
// of the current path
func main() {
+ const gitBugNamespace = "git-bug"
+
dir, err := os.Getwd()
if err != nil {
panic(err)
@@ -20,7 +22,7 @@ func main() {
bug.ClockLoader,
}
- repo, err := repository.OpenGoGitRepo(dir, loaders)
+ repo, err := repository.OpenGoGitRepo(dir, gitBugNamespace, loaders)
if err != nil {
panic(err)
}
diff --git a/repository/gogit.go b/repository/gogit.go
index 54677902..71cddfb2 100644
--- a/repository/gogit.go
+++ b/repository/gogit.go
@@ -26,6 +26,7 @@ import (
)
const clockPath = "clocks"
+const indexPath = "indexes"
var _ ClockedRepo = &GoGitRepo{}
var _ TestedRepo = &GoGitRepo{}
@@ -49,8 +50,11 @@ type GoGitRepo struct {
localStorage billy.Filesystem
}
-// OpenGoGitRepo open an already existing repo at the given path
-func OpenGoGitRepo(path string, clockLoaders []ClockLoader) (*GoGitRepo, error) {
+// OpenGoGitRepo opens an already existing repo at the given path and
+// with the specified LocalStorage namespace. Given a repository path
+// of "~/myrepo" and a namespace of "git-bug", local storage for the
+// GoGitRepo will be configured at "~/myrepo/.git/git-bug".
+func OpenGoGitRepo(path, namespace string, clockLoaders []ClockLoader) (*GoGitRepo, error) {
path, err := detectGitPath(path)
if err != nil {
return nil, err
@@ -72,7 +76,7 @@ func OpenGoGitRepo(path string, clockLoaders []ClockLoader) (*GoGitRepo, error)
clocks: make(map[string]lamport.Clock),
indexes: make(map[string]bleve.Index),
keyring: k,
- localStorage: osfs.New(filepath.Join(path, "git-bug")),
+ localStorage: osfs.New(filepath.Join(path, namespace)),
}
for _, loader := range clockLoaders {
@@ -94,8 +98,11 @@ func OpenGoGitRepo(path string, clockLoaders []ClockLoader) (*GoGitRepo, error)
return repo, nil
}
-// InitGoGitRepo create a new empty git repo at the given path
-func InitGoGitRepo(path string) (*GoGitRepo, error) {
+// InitGoGitRepo creates a new empty git repo at the given path and
+// with the specified LocalStorage namespace. Given a repository path
+// of "~/myrepo" and a namespace of "git-bug", local storage for the
+// GoGitRepo will be configured at "~/myrepo/.git/git-bug".
+func InitGoGitRepo(path, namespace string) (*GoGitRepo, error) {
r, err := gogit.PlainInit(path, false)
if err != nil {
return nil, err
@@ -112,12 +119,15 @@ func InitGoGitRepo(path string) (*GoGitRepo, error) {
clocks: make(map[string]lamport.Clock),
indexes: make(map[string]bleve.Index),
keyring: k,
- localStorage: osfs.New(filepath.Join(path, ".git", "git-bug")),
+ localStorage: osfs.New(filepath.Join(path, ".git", namespace)),
}, nil
}
-// InitBareGoGitRepo create a new --bare empty git repo at the given path
-func InitBareGoGitRepo(path string) (*GoGitRepo, error) {
+// InitBareGoGitRepo creates a new --bare empty git repo at the given
+// path and with the specified LocalStorage namespace. Given a repository
+// path of "~/myrepo" and a namespace of "git-bug", local storage for the
+// GoGitRepo will be configured at "~/myrepo/.git/git-bug".
+func InitBareGoGitRepo(path, namespace string) (*GoGitRepo, error) {
r, err := gogit.PlainInit(path, true)
if err != nil {
return nil, err
@@ -134,7 +144,7 @@ func InitBareGoGitRepo(path string) (*GoGitRepo, error) {
clocks: make(map[string]lamport.Clock),
indexes: make(map[string]bleve.Index),
keyring: k,
- localStorage: osfs.New(filepath.Join(path, "git-bug")),
+ localStorage: osfs.New(filepath.Join(path, namespace)),
}, nil
}
@@ -295,7 +305,8 @@ func (repo *GoGitRepo) GetRemotes() (map[string]string, error) {
return result, nil
}
-// LocalStorage return a billy.Filesystem giving access to $RepoPath/.git/git-bug
+// LocalStorage returns a billy.Filesystem giving access to
+// $RepoPath/.git/$Namespace.
func (repo *GoGitRepo) LocalStorage() billy.Filesystem {
return repo.localStorage
}
@@ -309,7 +320,7 @@ func (repo *GoGitRepo) GetBleveIndex(name string) (bleve.Index, error) {
return index, nil
}
- path := filepath.Join(repo.path, "git-bug", "indexes", name)
+ path := filepath.Join(repo.localStorage.Root(), indexPath, name)
index, err := bleve.Open(path)
if err == nil {
@@ -340,21 +351,20 @@ func (repo *GoGitRepo) ClearBleveIndex(name string) error {
repo.indexesMutex.Lock()
defer repo.indexesMutex.Unlock()
- path := filepath.Join(repo.path, "git-bug", "indexes", name)
-
- err := os.RemoveAll(path)
- if err != nil {
- return err
- }
-
if index, ok := repo.indexes[name]; ok {
- err = index.Close()
+ err := index.Close()
if err != nil {
return err
}
delete(repo.indexes, name)
}
+ path := filepath.Join(repo.localStorage.Root(), indexPath, name)
+ err := os.RemoveAll(path)
+ if err != nil {
+ return err
+ }
+
return nil
}
@@ -569,7 +579,7 @@ func (repo *GoGitRepo) StoreCommit(treeHash Hash, parents ...Hash) (Hash, error)
return repo.StoreSignedCommit(treeHash, nil, parents...)
}
-// StoreCommit will store a Git commit with the given Git tree. If signKey is not nil, the commit
+// StoreSignedCommit will store a Git commit with the given Git tree. If signKey is not nil, the commit
// will be signed accordingly.
func (repo *GoGitRepo) StoreSignedCommit(treeHash Hash, signKey *openpgp.Entity, parents ...Hash) (Hash, error) {
cfg, err := repo.r.Config()
@@ -781,7 +791,7 @@ func (repo *GoGitRepo) AllClocks() (map[string]lamport.Clock, error) {
result := make(map[string]lamport.Clock)
- files, err := ioutil.ReadDir(filepath.Join(repo.path, "git-bug", clockPath))
+ files, err := ioutil.ReadDir(filepath.Join(repo.localStorage.Root(), clockPath))
if os.IsNotExist(err) {
return nil, nil
}
diff --git a/repository/gogit_test.go b/repository/gogit_test.go
index a2bb49b9..c376de22 100644
--- a/repository/gogit_test.go
+++ b/repository/gogit_test.go
@@ -15,19 +15,25 @@ func TestNewGoGitRepo(t *testing.T) {
// Plain
plainRoot, err := ioutil.TempDir("", "")
require.NoError(t, err)
- defer os.RemoveAll(plainRoot)
+ t.Cleanup(func() {
+ require.NoError(t, os.RemoveAll(plainRoot))
+ })
- _, err = InitGoGitRepo(plainRoot)
+ plainRepo, err := InitGoGitRepo(plainRoot, namespace)
require.NoError(t, err)
+ require.NoError(t, plainRepo.Close())
plainGitDir := filepath.Join(plainRoot, ".git")
// Bare
bareRoot, err := ioutil.TempDir("", "")
require.NoError(t, err)
- defer os.RemoveAll(bareRoot)
+ t.Cleanup(func() {
+ require.NoError(t, os.RemoveAll(bareRoot))
+ })
- _, err = InitBareGoGitRepo(bareRoot)
+ bareRepo, err := InitBareGoGitRepo(bareRoot, namespace)
require.NoError(t, err)
+ require.NoError(t, bareRepo.Close())
bareGitDir := bareRoot
tests := []struct {
@@ -52,13 +58,14 @@ func TestNewGoGitRepo(t *testing.T) {
}
for i, tc := range tests {
- r, err := OpenGoGitRepo(tc.inPath, nil)
+ r, err := OpenGoGitRepo(tc.inPath, namespace, nil)
if tc.err {
require.Error(t, err, i)
} else {
require.NoError(t, err, i)
assert.Equal(t, filepath.ToSlash(tc.outPath), filepath.ToSlash(r.path), i)
+ require.NoError(t, r.Close())
}
}
}
@@ -66,3 +73,35 @@ func TestNewGoGitRepo(t *testing.T) {
func TestGoGitRepo(t *testing.T) {
RepoTest(t, CreateGoGitTestRepo, CleanupTestRepos)
}
+
+func TestGoGitRepo_Indexes(t *testing.T) {
+ plainRoot := t.TempDir()
+
+ repo, err := InitGoGitRepo(plainRoot, namespace)
+ require.NoError(t, err)
+ t.Cleanup(func() {
+ require.NoError(t, repo.Close())
+ })
+
+ // Can create indices
+ indexA, err := repo.GetBleveIndex("a")
+ require.NoError(t, err)
+ require.NotZero(t, indexA)
+ require.FileExists(t, filepath.Join(plainRoot, ".git", namespace, "indexes", "a", "index_meta.json"))
+ require.FileExists(t, filepath.Join(plainRoot, ".git", namespace, "indexes", "a", "store"))
+
+ indexB, err := repo.GetBleveIndex("b")
+ require.NoError(t, err)
+ require.NotZero(t, indexB)
+ require.DirExists(t, filepath.Join(plainRoot, ".git", namespace, "indexes", "b"))
+
+ // Can get an existing index
+ indexA, err = repo.GetBleveIndex("a")
+ require.NoError(t, err)
+ require.NotZero(t, indexA)
+
+ // Can delete an index
+ err = repo.ClearBleveIndex("a")
+ require.NoError(t, err)
+ require.NoDirExists(t, filepath.Join(plainRoot, ".git", namespace, "indexes", "a"))
+}
diff --git a/repository/gogit_testing.go b/repository/gogit_testing.go
index cad776b3..7647c711 100644
--- a/repository/gogit_testing.go
+++ b/repository/gogit_testing.go
@@ -7,6 +7,8 @@ import (
"github.com/99designs/keyring"
)
+const namespace = "git-bug"
+
// This is intended for testing only
func CreateGoGitTestRepo(bare bool) TestedRepo {
@@ -15,7 +17,7 @@ func CreateGoGitTestRepo(bare bool) TestedRepo {
log.Fatal(err)
}
- var creator func(string) (*GoGitRepo, error)
+ var creator func(string, string) (*GoGitRepo, error)
if bare {
creator = InitBareGoGitRepo
@@ -23,7 +25,7 @@ func CreateGoGitTestRepo(bare bool) TestedRepo {
creator = InitGoGitRepo
}
- repo, err := creator(dir)
+ repo, err := creator(dir, namespace)
if err != nil {
log.Fatal(err)
}