···
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
"tangled.sh/tangled.sh/core/patchutil"
···
func (g *GitRepo) MergeCheck(patchData []byte, targetBranch string) error {
opts.FormatPatch = patchutil.IsFormatPatch(string(patchData))
···
defer os.RemoveAll(tmpDir)
-
return g.applyPatch(tmpDir, patchFile, true, &opts)
func (g *GitRepo) Merge(patchData []byte, targetBranch string) error {
···
+
"github.com/dgraph-io/ristretto"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
"tangled.sh/tangled.sh/core/patchutil"
+
type MergeCheckCache struct {
+
mergeCheckCache MergeCheckCache = NewMergeCheckCache()
+
func NewMergeCheckCache() MergeCheckCache {
+
cache, _ := ristretto.NewCache(&ristretto.Config{
+
TtlTickerDurationInSec: 60 * 60 * 24 * 2, // 2 days
+
return MergeCheckCache{cache}
+
func (m *MergeCheckCache) cacheKey(g *GitRepo, patch []byte, targetBranch string) string {
+
hash := sha256.Sum256(fmt.Append([]byte{}, g.path, sep, g.h.String(), sep, patch, sep, targetBranch))
+
return fmt.Sprintf("%x", hash)
+
// we can't cache "mergeable" in risetto, nil is not cacheable
+
// we use the sentinel value instead
+
func (m *MergeCheckCache) cacheVal(check error) any {
+
func (m *MergeCheckCache) Set(g *GitRepo, patch []byte, targetBranch string, mergeCheck error) {
+
key := m.cacheKey(g, patch, targetBranch)
+
val := m.cacheVal(mergeCheck)
+
m.cache.Set(key, val, 0)
+
func (m *MergeCheckCache) Get(g *GitRepo, patch []byte, targetBranch string) (error, bool) {
+
key := m.cacheKey(g, patch, targetBranch)
+
if val, ok := m.cache.Get(key); ok {
+
// cache hit for mergeable
+
} else if e, ok := val.(error); ok {
+
// cache hit for merge conflict
···
func (g *GitRepo) MergeCheck(patchData []byte, targetBranch string) error {
+
if val, ok := mergeCheckCache.Get(g, patchData, targetBranch); ok {
opts.FormatPatch = patchutil.IsFormatPatch(string(patchData))
···
defer os.RemoveAll(tmpDir)
+
result := g.applyPatch(tmpDir, patchFile, true, &opts)
+
mergeCheckCache.Set(g, patchData, targetBranch, result)
func (g *GitRepo) Merge(patchData []byte, targetBranch string) error {