gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package v1_10
  4. import (
  5. "crypto/sha1"
  6. "fmt"
  7. "xorm.io/xorm"
  8. )
  9. func hashContext(context string) string {
  10. return fmt.Sprintf("%x", sha1.Sum([]byte(context)))
  11. }
  12. func AddCommitStatusContext(x *xorm.Engine) error {
  13. type CommitStatus struct {
  14. ID int64 `xorm:"pk autoincr"`
  15. ContextHash string `xorm:"char(40) index"`
  16. Context string `xorm:"TEXT"`
  17. }
  18. if err := x.Sync(new(CommitStatus)); err != nil {
  19. return err
  20. }
  21. sess := x.NewSession()
  22. defer sess.Close()
  23. start := 0
  24. for {
  25. statuses := make([]*CommitStatus, 0, 100)
  26. err := sess.OrderBy("id").Limit(100, start).Find(&statuses)
  27. if err != nil {
  28. return err
  29. }
  30. if len(statuses) == 0 {
  31. break
  32. }
  33. if err = sess.Begin(); err != nil {
  34. return err
  35. }
  36. for _, status := range statuses {
  37. status.ContextHash = hashContext(status.Context)
  38. if _, err := sess.ID(status.ID).Cols("context_hash").Update(status); err != nil {
  39. return err
  40. }
  41. }
  42. if err := sess.Commit(); err != nil {
  43. return err
  44. }
  45. if len(statuses) < 100 {
  46. break
  47. }
  48. start += len(statuses)
  49. }
  50. return nil
  51. }