You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

v82.go 1.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package migrations
  5. import (
  6. "code.gitea.io/git"
  7. "code.gitea.io/gitea/models"
  8. "github.com/go-xorm/xorm"
  9. )
  10. func fixReleaseSha1OnReleaseTable(x *xorm.Engine) error {
  11. type Release struct {
  12. ID int64
  13. RepoID int64
  14. Sha1 string
  15. TagName string
  16. }
  17. // Update release sha1
  18. const batchSize = 100
  19. sess := x.NewSession()
  20. defer sess.Close()
  21. var (
  22. err error
  23. count int
  24. gitRepoCache = make(map[int64]*git.Repository)
  25. repoCache = make(map[int64]*models.Repository)
  26. )
  27. if err = sess.Begin(); err != nil {
  28. return err
  29. }
  30. for start := 0; ; start += batchSize {
  31. releases := make([]*Release, 0, batchSize)
  32. if err = sess.Limit(batchSize, start).Asc("id").Where("is_tag=?", false).Find(&releases); err != nil {
  33. return err
  34. }
  35. if len(releases) == 0 {
  36. break
  37. }
  38. for _, release := range releases {
  39. gitRepo, ok := gitRepoCache[release.RepoID]
  40. if !ok {
  41. repo, ok := repoCache[release.RepoID]
  42. if !ok {
  43. repo, err = models.GetRepositoryByID(release.RepoID)
  44. if err != nil {
  45. return err
  46. }
  47. repoCache[release.RepoID] = repo
  48. }
  49. gitRepo, err = git.OpenRepository(repo.RepoPath())
  50. if err != nil {
  51. return err
  52. }
  53. gitRepoCache[release.RepoID] = gitRepo
  54. }
  55. release.Sha1, err = gitRepo.GetTagCommitID(release.TagName)
  56. if err != nil {
  57. return err
  58. }
  59. if _, err = sess.ID(release.ID).Cols("sha1").Update(release); err != nil {
  60. return err
  61. }
  62. count++
  63. if count >= 1000 {
  64. if err = sess.Commit(); err != nil {
  65. return err
  66. }
  67. if err = sess.Begin(); err != nil {
  68. return err
  69. }
  70. count = 0
  71. }
  72. }
  73. }
  74. return sess.Commit()
  75. }