5
5
package repository
6
6
7
7
import (
8
+ "context"
8
9
"errors"
9
10
"fmt"
11
+ "strings"
10
12
"time"
11
13
12
14
"code.gitea.io/gitea/models"
@@ -20,6 +22,7 @@ import (
20
22
"code.gitea.io/gitea/modules/repofiles"
21
23
repo_module "code.gitea.io/gitea/modules/repository"
22
24
"code.gitea.io/gitea/modules/setting"
25
+ "code.gitea.io/gitea/modules/timeutil"
23
26
pull_service "code.gitea.io/gitea/services/pull"
24
27
)
25
28
@@ -210,7 +213,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
210
213
}
211
214
212
215
// Cache for big repository
213
- if err := repo_module . CacheRef (graceful .GetManager ().HammerContext (), repo , gitRepo , opts .RefFullName ); err != nil {
216
+ if err := CacheRef (graceful .GetManager ().HammerContext (), repo , gitRepo , opts .RefFullName ); err != nil {
214
217
log .Error ("repo_module.CacheRef %s/%s failed: %v" , repo .ID , branch , err )
215
218
}
216
219
} else {
@@ -229,7 +232,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
229
232
log .Trace ("Non-tag and non-branch commits pushed." )
230
233
}
231
234
}
232
- if err := repo_module . PushUpdateAddDeleteTags (repo , gitRepo , addTags , delTags ); err != nil {
235
+ if err := PushUpdateAddDeleteTags (repo , gitRepo , addTags , delTags ); err != nil {
233
236
return fmt .Errorf ("PushUpdateAddDeleteTags: %v" , err )
234
237
}
235
238
@@ -240,3 +243,122 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
240
243
241
244
return nil
242
245
}
246
+
247
+ // PushUpdateAddDeleteTags updates a number of added and delete tags
248
+ func PushUpdateAddDeleteTags (repo * models.Repository , gitRepo * git.Repository , addTags , delTags []string ) error {
249
+ return db .WithTx (func (ctx context.Context ) error {
250
+ if err := models .PushUpdateDeleteTagsContext (ctx , repo , delTags ); err != nil {
251
+ return err
252
+ }
253
+ return pushUpdateAddTags (ctx , repo , gitRepo , addTags )
254
+ })
255
+ }
256
+
257
+ // pushUpdateAddTags updates a number of add tags
258
+ func pushUpdateAddTags (ctx context.Context , repo * models.Repository , gitRepo * git.Repository , tags []string ) error {
259
+ if len (tags ) == 0 {
260
+ return nil
261
+ }
262
+
263
+ lowerTags := make ([]string , 0 , len (tags ))
264
+ for _ , tag := range tags {
265
+ lowerTags = append (lowerTags , strings .ToLower (tag ))
266
+ }
267
+
268
+ releases , err := models .GetReleasesByRepoIDAndNames (ctx , repo .ID , lowerTags )
269
+ if err != nil {
270
+ return fmt .Errorf ("GetReleasesByRepoIDAndNames: %v" , err )
271
+ }
272
+ relMap := make (map [string ]* models.Release )
273
+ for _ , rel := range releases {
274
+ relMap [rel .LowerTagName ] = rel
275
+ }
276
+
277
+ newReleases := make ([]* models.Release , 0 , len (lowerTags )- len (relMap ))
278
+
279
+ emailToUser := make (map [string ]* models.User )
280
+
281
+ for i , lowerTag := range lowerTags {
282
+ tag , err := gitRepo .GetTag (tags [i ])
283
+ if err != nil {
284
+ return fmt .Errorf ("GetTag: %v" , err )
285
+ }
286
+ commit , err := tag .Commit ()
287
+ if err != nil {
288
+ return fmt .Errorf ("Commit: %v" , err )
289
+ }
290
+
291
+ sig := tag .Tagger
292
+ if sig == nil {
293
+ sig = commit .Author
294
+ }
295
+ if sig == nil {
296
+ sig = commit .Committer
297
+ }
298
+ var author * models.User
299
+ var createdAt = time .Unix (1 , 0 )
300
+
301
+ if sig != nil {
302
+ var ok bool
303
+ author , ok = emailToUser [sig .Email ]
304
+ if ! ok {
305
+ author , err = models .GetUserByEmailContext (ctx , sig .Email )
306
+ if err != nil && ! models .IsErrUserNotExist (err ) {
307
+ return fmt .Errorf ("GetUserByEmail: %v" , err )
308
+ }
309
+ if author != nil {
310
+ emailToUser [sig .Email ] = author
311
+ }
312
+ }
313
+ createdAt = sig .When
314
+ }
315
+
316
+ commitsCount , err := commit .CommitsCount ()
317
+ if err != nil {
318
+ return fmt .Errorf ("CommitsCount: %v" , err )
319
+ }
320
+
321
+ rel , has := relMap [lowerTag ]
322
+
323
+ if ! has {
324
+ rel = & models.Release {
325
+ RepoID : repo .ID ,
326
+ Title : "" ,
327
+ TagName : tags [i ],
328
+ LowerTagName : lowerTag ,
329
+ Target : "" ,
330
+ Sha1 : commit .ID .String (),
331
+ NumCommits : commitsCount ,
332
+ Note : "" ,
333
+ IsDraft : false ,
334
+ IsPrerelease : false ,
335
+ IsTag : true ,
336
+ CreatedUnix : timeutil .TimeStamp (createdAt .Unix ()),
337
+ }
338
+ if author != nil {
339
+ rel .PublisherID = author .ID
340
+ }
341
+
342
+ newReleases = append (newReleases , rel )
343
+ } else {
344
+ rel .Sha1 = commit .ID .String ()
345
+ rel .CreatedUnix = timeutil .TimeStamp (createdAt .Unix ())
346
+ rel .NumCommits = commitsCount
347
+ rel .IsDraft = false
348
+ if rel .IsTag && author != nil {
349
+ rel .PublisherID = author .ID
350
+ }
351
+ if err = models .UpdateRelease (ctx , rel ); err != nil {
352
+ return fmt .Errorf ("Update: %v" , err )
353
+ }
354
+ }
355
+ }
356
+
357
+ if len (newReleases ) > 0 {
358
+ if err = models .InsertReleasesContext (ctx , newReleases ); err != nil {
359
+ return fmt .Errorf ("Insert: %v" , err )
360
+ }
361
+ }
362
+
363
+ return nil
364
+ }
0 commit comments