mirror of
https://github.com/hanzoai/forge.git
synced 2026-10-30 15:00:39 +00:00
2978 files. The fork is 2026-07-15 (rebrand: gitea.dev -> github.com/hanzoai/git), so 2026 is the year, and "Copyright 2026 Hanzo AI, Inc." was already the form used by the handful of files that had ours. Shape is now: // Copyright 2026 Hanzo AI, Inc. All rights reserved. // Copyright 2015 The Gogs Authors. All rights reserved. // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT Ours on top, theirs retained verbatim. Retained because MIT requires it, and separately because they are true — those authors did write that code. Not renamed to "The Git Authors": Git is a different project under a different license, and putting its name here would attribute this code to people who have nothing to do with it. Adding our line is the fix; overwriting theirs would have been both a licence violation and a false statement. gofmt still reports import-order drift in some of these files. It predates this change (verified against a stash) and is left alone rather than burying a one-line-per-file legal change under 3000 files of unrelated reordering. Build clean. Co-authored-by: Hanzo Dev <[email protected]>
45 lines
1.6 KiB
Go
45 lines
1.6 KiB
Go
// Copyright 2026 Hanzo AI, Inc. All rights reserved.
|
|
// Copyright 2022 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package cache
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
)
|
|
|
|
type cacheContextKeyType struct{}
|
|
|
|
var cacheContextKey = cacheContextKeyType{}
|
|
|
|
// contextCacheLifetime is the max lifetime of context cache.
|
|
// Since context cache is used to cache data in a request level context, 5 minutes is enough.
|
|
// If a context cache is used more than 5 minutes, it's probably abused.
|
|
const contextCacheLifetime = 5 * time.Minute
|
|
|
|
func WithCacheContext(ctx context.Context) context.Context {
|
|
if c := GetContextCache(ctx); c != nil {
|
|
return ctx
|
|
}
|
|
return context.WithValue(ctx, cacheContextKey, NewEphemeralCache(contextCacheLifetime))
|
|
}
|
|
|
|
func GetContextCache(ctx context.Context) *EphemeralCache {
|
|
c, _ := ctx.Value(cacheContextKey).(*EphemeralCache)
|
|
return c
|
|
}
|
|
|
|
// GetWithContextCache returns the cache value of the given key in the given context.
|
|
// FIXME: in some cases, the "context cache" should not be used, because it has uncontrollable behaviors
|
|
// For example, these calls:
|
|
// * GetWithContextCache(TargetID) -> OtherCodeCreateModel(TargetID) -> GetWithContextCache(TargetID)
|
|
// Will cause the second call is not able to get the correct created target.
|
|
// UNLESS it is certain that the target won't be changed during the request, DO NOT use it.
|
|
func GetWithContextCache[T, K any](ctx context.Context, groupKey string, targetKey K, f func(context.Context, K) (T, error)) (T, error) {
|
|
if c := GetContextCache(ctx); c != nil {
|
|
return GetWithEphemeralCache(ctx, c, groupKey, targetKey, f)
|
|
}
|
|
return f(ctx, targetKey)
|
|
}
|