@@ -16,9 +16,11 @@ import (
16
16
issues_model "code.gitea.io/gitea/models/issues"
17
17
repo_model "code.gitea.io/gitea/models/repo"
18
18
user_model "code.gitea.io/gitea/models/user"
19
+ "code.gitea.io/gitea/modules/cache"
19
20
"code.gitea.io/gitea/modules/git"
20
21
"code.gitea.io/gitea/modules/gitrepo"
21
22
"code.gitea.io/gitea/modules/graceful"
23
+ "code.gitea.io/gitea/modules/json"
22
24
"code.gitea.io/gitea/modules/log"
23
25
"code.gitea.io/gitea/modules/optional"
24
26
"code.gitea.io/gitea/modules/queue"
@@ -99,7 +101,6 @@ func LoadBranches(ctx context.Context, repo *repo_model.Repository, gitRepo *git
99
101
if err != nil {
100
102
return nil , nil , 0 , fmt .Errorf ("loadOneBranch: %v" , err )
101
103
}
102
-
103
104
branches = append (branches , branch )
104
105
}
105
106
@@ -109,10 +110,44 @@ func LoadBranches(ctx context.Context, repo *repo_model.Repository, gitRepo *git
109
110
if err != nil {
110
111
return nil , nil , 0 , fmt .Errorf ("loadOneBranch: %v" , err )
111
112
}
112
-
113
113
return defaultBranch , branches , totalNumOfBranches , nil
114
114
}
115
115
116
+ func getDivergenceCacheKey (repoID int64 , branchName string ) string {
117
+ return fmt .Sprintf ("%d-%s" , repoID , branchName )
118
+ }
119
+
120
+ // getDivergenceFromCache gets the divergence from cache
121
+ func getDivergenceFromCache (repoID int64 , branchName string ) (* git.DivergeObject , bool ) {
122
+ data := cache .GetCache ().Get (getDivergenceCacheKey (repoID , branchName ))
123
+ res := git.DivergeObject {
124
+ Ahead : - 1 ,
125
+ Behind : - 1 ,
126
+ }
127
+ s , ok := data .([]byte )
128
+ if ! ok || len (s ) == 0 {
129
+ return & res , false
130
+ }
131
+
132
+ if err := json .Unmarshal (s , & res ); err != nil {
133
+ log .Error ("json.UnMarshal failed: %v" , err )
134
+ return & res , false
135
+ }
136
+ return & res , true
137
+ }
138
+
139
+ func putDivergenceFromCache (repoID int64 , branchName string , divergence * git.DivergeObject ) error {
140
+ bs , err := json .Marshal (divergence )
141
+ if err != nil {
142
+ return err
143
+ }
144
+ return cache .GetCache ().Put (getDivergenceCacheKey (repoID , branchName ), bs , 30 * 24 * 60 * 60 )
145
+ }
146
+
147
+ func DelDivergenceFromCache (repoID int64 , branchName string ) error {
148
+ return cache .GetCache ().Delete (getDivergenceCacheKey (repoID , branchName ))
149
+ }
150
+
116
151
func loadOneBranch (ctx context.Context , repo * repo_model.Repository , dbBranch * git_model.Branch , protectedBranches * git_model.ProtectedBranchRules ,
117
152
repoIDToRepo map [int64 ]* repo_model.Repository ,
118
153
repoIDToGitRepo map [int64 ]* git.Repository ,
@@ -130,10 +165,18 @@ func loadOneBranch(ctx context.Context, repo *repo_model.Repository, dbBranch *g
130
165
131
166
// it's not default branch
132
167
if repo .DefaultBranch != dbBranch .Name && ! dbBranch .IsDeleted {
133
- var err error
134
- divergence , err = files_service .CountDivergingCommits (ctx , repo , git .BranchPrefix + branchName )
135
- if err != nil {
136
- log .Error ("CountDivergingCommits: %v" , err )
168
+ var cached bool
169
+ divergence , cached = getDivergenceFromCache (repo .ID , dbBranch .Name )
170
+ if ! cached {
171
+ var err error
172
+ divergence , err = files_service .CountDivergingCommits (ctx , repo , git .BranchPrefix + branchName )
173
+ if err != nil {
174
+ log .Error ("CountDivergingCommits: %v" , err )
175
+ } else {
176
+ if err = putDivergenceFromCache (repo .ID , dbBranch .Name , divergence ); err != nil {
177
+ log .Error ("putDivergenceFromCache: %v" , err )
178
+ }
179
+ }
137
180
}
138
181
}
139
182
0 commit comments