some improvements

This commit is contained in:
Lunny Xiao 2025-03-25 12:05:56 -07:00
parent 12237939cb
commit 262b562391
3 changed files with 10 additions and 25 deletions

View File

@ -4,7 +4,6 @@
package repo
import (
"errors"
"net/http"
"code.gitea.io/gitea/modules/templates"
@ -30,11 +29,7 @@ func CodeFrequency(ctx *context.Context) {
// CodeFrequencyData returns JSON of code frequency data
func CodeFrequencyData(ctx *context.Context) {
if contributorStats, err := contributors_service.GetContributorStats(ctx, ctx.Cache, ctx.Repo.Repository, ctx.Repo.Repository.DefaultBranch); err != nil {
if errors.Is(err, contributors_service.ErrAwaitGeneration) {
ctx.Status(http.StatusAccepted)
return
}
ctx.ServerError("GetContributorStats", err)
ctx.ServerError("GetCodeFrequencyData", err)
} else {
ctx.JSON(http.StatusOK, contributorStats["total"].Weeks)
}

View File

@ -4,8 +4,6 @@
package repo
import (
std_ctx "context"
"errors"
"net/http"
"code.gitea.io/gitea/modules/templates"
@ -28,10 +26,6 @@ func Contributors(ctx *context.Context) {
// ContributorsData renders JSON of contributors along with their weekly commit statistics
func ContributorsData(ctx *context.Context) {
if contributorStats, err := contributors_service.GetContributorStats(ctx, ctx.Cache, ctx.Repo.Repository, ctx.Repo.Repository.DefaultBranch); err != nil {
if errors.Is(err, contributors_service.ErrAwaitGeneration) || errors.Is(err, std_ctx.DeadlineExceeded) {
ctx.Status(http.StatusAccepted)
return
}
ctx.ServerError("GetContributorStats", err)
} else {
ctx.JSON(http.StatusOK, contributorStats)

View File

@ -29,10 +29,7 @@ const (
contributorStatsCacheTimeout int64 = 60 * 10
)
var (
ErrAwaitGeneration = errors.New("generation took longer than ")
awaitGenerationTime = time.Second * 60
)
var ErrAwaitGeneration = errors.New("generation took longer than ")
type WeekData struct {
Week int64 `json:"week"` // Starting day of the week as Unix timestamp
@ -95,19 +92,18 @@ func GetContributorStats(ctx context.Context, cache cache.StringCache, repo *rep
}
defer releaser()
// set a timeout for the generation
ctx, cancel := context.WithTimeout(ctx, awaitGenerationTime)
defer cancel()
// check if generation is already completed by other request
if cache.IsExist(cacheKey) {
var res map[string]*ContributorData
if _, cacheErr := cache.GetJSON(cacheKey, &res); cacheErr != nil {
return nil, fmt.Errorf("cached error: %w", cacheErr.ToError())
}
return res, nil
}
// run generation async
res, err := generateContributorStats(ctx, cache, cacheKey, repo, revision)
if err != nil {
switch {
case errors.Is(err, context.DeadlineExceeded):
_ = cache.PutJSON(cacheKey, fmt.Errorf("generateContributorStats: %w", ErrAwaitGeneration), contributorStatsCacheTimeout)
default:
_ = cache.PutJSON(cacheKey, fmt.Errorf("generateContributorStats: %w", err), contributorStatsCacheTimeout)
}
return nil, err
}