-
Notifications
You must be signed in to change notification settings - Fork 9
/
ignoredcache.go
72 lines (63 loc) · 1.44 KB
/
ignoredcache.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package git
import (
"sync"
"github.com/Equationzhao/g/internal/cached"
"github.com/Equationzhao/pathbeautify"
"github.com/zeebo/xxh3"
)
var (
ignored *cached.Map[RepoPath, *FileGits]
IgnoredInitOnce sync.Once
TopLevelCache *cached.Map[RepoPath, RepoPath]
TopLevelInitOnce sync.Once
)
const size = 20
// your custom hash function
func hasher(s string) uintptr {
return uintptr(xxh3.HashString(s))
}
type Cache = *cached.Map[RepoPath, *FileGits]
func GetCache() Cache {
IgnoredInitOnce.Do(
func() {
ignored = cached.NewCacheMap[RepoPath, *FileGits](size)
ignored.SetHasher(hasher)
},
)
return ignored
}
func DefaultInit(repoPath RepoPath) func() *FileGits {
return func() *FileGits {
res := make(FileGits, 0)
out, err := GetShortGitStatus(repoPath)
if err == nil && out != "" {
res = ParseShort(out)
}
return &res
}
}
// GetTopLevel returns the top level of the repoPath
// the returned path is cleaned by pathbeautify.CleanSeparator
func GetTopLevel(path string) (RepoPath, error) {
TopLevelInitOnce.Do(
func() {
if TopLevelCache == nil {
TopLevelCache = cached.NewCacheMap[RepoPath, RepoPath](size)
TopLevelCache.SetHasher(hasher)
}
},
)
var err error
actual, _ := TopLevelCache.GetOrCompute(
path, func() RepoPath {
out, err_ := getTopLevel(path)
if err_ != nil {
err = err_
return ""
}
return out
},
)
actual = pathbeautify.CleanSeparator(actual)
return actual, err
}