multi_repo_cache.go

 1package cache
 2
 3import (
 4	"fmt"
 5
 6	"github.com/MichaelMure/git-bug/repository"
 7)
 8
 9const lockfile = "lock"
10
11type MultiRepoCache struct {
12	repos map[string]*RepoCache
13}
14
15func NewMultiRepoCache() MultiRepoCache {
16	return MultiRepoCache{
17		repos: make(map[string]*RepoCache),
18	}
19}
20
21// RegisterRepository register a named repository. Use this for multi-repo setup
22func (c *MultiRepoCache) RegisterRepository(ref string, repo repository.Repo) error {
23	r, err := NewRepoCache(repo)
24	if err != nil {
25		return err
26	}
27
28	c.repos[ref] = r
29	return nil
30}
31
32// RegisterDefaultRepository register a unnamed repository. Use this for mono-repo setup
33func (c *MultiRepoCache) RegisterDefaultRepository(repo repository.Repo) error {
34	r, err := NewRepoCache(repo)
35	if err != nil {
36		return err
37	}
38
39	c.repos[""] = r
40	return nil
41}
42
43// ResolveRepo retrieve a repository by name
44func (c *MultiRepoCache) DefaultRepo() (*RepoCache, error) {
45	if len(c.repos) != 1 {
46		return nil, fmt.Errorf("repository is not unique")
47	}
48
49	for _, r := range c.repos {
50		return r, nil
51	}
52
53	panic("unreachable")
54}
55
56// DefaultRepo retrieve the default repository
57func (c *MultiRepoCache) ResolveRepo(ref string) (*RepoCache, error) {
58	r, ok := c.repos[ref]
59	if !ok {
60		return nil, fmt.Errorf("unknown repo")
61	}
62	return r, nil
63}
64
65// Close will do anything that is needed to close the cache properly
66func (c *MultiRepoCache) Close() error {
67	for _, cachedRepo := range c.repos {
68		err := cachedRepo.Close()
69		if err != nil {
70			return err
71		}
72	}
73	return nil
74}