identity_subcache.go

 1package cache
 2
 3import (
 4	"fmt"
 5
 6	"github.com/MichaelMure/git-bug/entities/identity"
 7)
 8
 9type RepoCacheIdentity struct {
10	SubCache[*IdentityExcerpt, *IdentityCache, identity.Interface]
11}
12
13// ResolveIdentityImmutableMetadata retrieve an Identity that has the exact given metadata on
14// one of its version. If multiple version have the same key, the first defined take precedence.
15func (c *RepoCacheIdentity) ResolveIdentityImmutableMetadata(key string, value string) (*IdentityCache, error) {
16	return c.ResolveMatcher(func(excerpt *IdentityExcerpt) bool {
17		return excerpt.ImmutableMetadata[key] == value
18	})
19}
20
21func (c *RepoCacheIdentity) NewIdentityFromGitUser() (*IdentityCache, error) {
22	return c.NewIdentityFromGitUserRaw(nil)
23}
24
25func (c *RepoCacheIdentity) NewIdentityFromGitUserRaw(metadata map[string]string) (*IdentityCache, error) {
26	i, err := identity.NewFromGitUser(c.repo)
27	if err != nil {
28		return nil, err
29	}
30	return c.finishIdentity(i, metadata)
31}
32
33// NewIdentity create a new identity
34// The new identity is written in the repository (commit)
35func (c *RepoCacheIdentity) NewIdentity(name string, email string) (*IdentityCache, error) {
36	return c.NewIdentityRaw(name, email, "", "", nil, nil)
37}
38
39// NewIdentityFull create a new identity
40// The new identity is written in the repository (commit)
41func (c *RepoCacheIdentity) NewIdentityFull(name string, email string, login string, avatarUrl string, keys []*identity.Key) (*IdentityCache, error) {
42	return c.NewIdentityRaw(name, email, login, avatarUrl, keys, nil)
43}
44
45func (c *RepoCacheIdentity) NewIdentityRaw(name string, email string, login string, avatarUrl string, keys []*identity.Key, metadata map[string]string) (*IdentityCache, error) {
46	i, err := identity.NewIdentityFull(c.repo, name, email, login, avatarUrl, keys)
47	if err != nil {
48		return nil, err
49	}
50	return c.finishIdentity(i, metadata)
51}
52
53func (c *RepoCacheIdentity) finishIdentity(i *identity.Identity, metadata map[string]string) (*IdentityCache, error) {
54	for key, value := range metadata {
55		i.SetMetadata(key, value)
56	}
57
58	err := i.Commit(c.repo)
59	if err != nil {
60		return nil, err
61	}
62
63	c.mu.Lock()
64	if _, has := c.cached[i.Id()]; has {
65		return nil, fmt.Errorf("identity %s already exist in the cache", i.Id())
66	}
67
68	cached := NewIdentityCache(c, i)
69	c.cached[i.Id()] = cached
70	c.mu.Unlock()
71
72	// force the write of the excerpt
73	err = c.entityUpdated(i.Id())
74	if err != nil {
75		return nil, err
76	}
77
78	return cached, nil
79}