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.ClockedRepo) 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.ClockedRepo) 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}