diff options
Diffstat (limited to 'cache')
-rw-r--r-- | cache/bug_excerpt.go | 2 | ||||
-rw-r--r-- | cache/repo_cache.go | 70 |
2 files changed, 71 insertions, 1 deletions
diff --git a/cache/bug_excerpt.go b/cache/bug_excerpt.go index 77c18175..f5844b64 100644 --- a/cache/bug_excerpt.go +++ b/cache/bug_excerpt.go @@ -20,7 +20,7 @@ type BugExcerpt struct { EditUnixTime int64 Status bug.Status - Author *identity.Identity + Author identity.Interface Labels []bug.Label CreateMetadata map[string]string diff --git a/cache/repo_cache.go b/cache/repo_cache.go index a149fd73..7d3e7d1d 100644 --- a/cache/repo_cache.go +++ b/cache/repo_cache.go @@ -30,6 +30,8 @@ type RepoCache struct { excerpts map[string]*BugExcerpt // bug loaded in memory bugs map[string]*BugCache + // identities loaded in memory + identities map[string]*identity.Identity } func NewRepoCache(r repository.ClockedRepo) (*RepoCache, error) { @@ -279,6 +281,7 @@ func (c *RepoCache) ResolveBugCreateMetadata(key string, value string) (*BugCach return c.ResolveBug(matching[0]) } +// QueryBugs return the id of all Bug matching the given Query func (c *RepoCache) QueryBugs(query *Query) []string { if query == nil { return c.AllBugsIds() @@ -525,3 +528,70 @@ func repoIsAvailable(repo repository.Repo) error { return nil } + +// ResolveIdentity retrieve an identity matching the exact given id +func (c *RepoCache) ResolveIdentity(id string) (*identity.Identity, error) { + cached, ok := c.identities[id] + if ok { + return cached, nil + } + + i, err := identity.Read(c.repo, id) + if err != nil { + return nil, err + } + + c.identities[id] = i + + return i, nil +} + +// ResolveIdentityPrefix retrieve an Identity matching an id prefix. It fails if multiple +// bugs match. +// func (c *RepoCache) ResolveIdentityPrefix(prefix string) (*BugCache, error) { +// // preallocate but empty +// matching := make([]string, 0, 5) +// +// for id := range c.excerpts { +// if strings.HasPrefix(id, prefix) { +// matching = append(matching, id) +// } +// } +// +// if len(matching) > 1 { +// return nil, bug.ErrMultipleMatch{Matching: matching} +// } +// +// if len(matching) == 0 { +// return nil, bug.ErrBugNotExist +// } +// +// return c.ResolveBug(matching[0]) +// } + +// ResolveIdentityImmutableMetadata retrieve an Identity that has the exact given metadata on +// one of it's version. If multiple version have the same key, the first defined take precedence. +func (c *RepoCache) ResolveIdentityImmutableMetadata(key string, value string) (*BugCache, error) { + // // preallocate but empty + // matching := make([]string, 0, 5) + // + // for id, excerpt := range c.excerpts { + // if excerpt.CreateMetadata[key] == value { + // matching = append(matching, id) + // } + // } + // + // if len(matching) > 1 { + // return nil, bug.ErrMultipleMatch{Matching: matching} + // } + // + // if len(matching) == 0 { + // return nil, bug.ErrBugNotExist + // } + // + // return c.ResolveBug(matching[0]) + + // TODO + + return nil, nil +} |