gitea源码

v157.go 1.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package v1_14
  4. import (
  5. "xorm.io/xorm"
  6. )
  7. func FixRepoTopics(x *xorm.Engine) error {
  8. type Repository struct {
  9. ID int64 `xorm:"pk autoincr"`
  10. Topics []string `xorm:"TEXT JSON"`
  11. }
  12. const batchSize = 100
  13. sess := x.NewSession()
  14. defer sess.Close()
  15. repos := make([]*Repository, 0, batchSize)
  16. topics := make([]string, 0, batchSize)
  17. for start := 0; ; start += batchSize {
  18. repos = repos[:0]
  19. if err := sess.Begin(); err != nil {
  20. return err
  21. }
  22. if err := sess.Limit(batchSize, start).Find(&repos); err != nil {
  23. return err
  24. }
  25. if len(repos) == 0 {
  26. break
  27. }
  28. for _, repo := range repos {
  29. topics = topics[:0]
  30. if err := sess.Select("name").Table("topic").
  31. Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id").
  32. Where("repo_topic.repo_id = ?", repo.ID).Desc("topic.repo_count").Find(&topics); err != nil {
  33. return err
  34. }
  35. repo.Topics = topics
  36. if _, err := sess.ID(repo.ID).Cols("topics").Update(repo); err != nil {
  37. return err
  38. }
  39. }
  40. if err := sess.Commit(); err != nil {
  41. return err
  42. }
  43. }
  44. return nil
  45. }