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

migrate.go 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package models
  4. import (
  5. "context"
  6. "code.gitea.io/gitea/models/db"
  7. issues_model "code.gitea.io/gitea/models/issues"
  8. repo_model "code.gitea.io/gitea/models/repo"
  9. "code.gitea.io/gitea/modules/container"
  10. "code.gitea.io/gitea/modules/structs"
  11. )
  12. // InsertMilestones creates milestones of repository.
  13. func InsertMilestones(ms ...*issues_model.Milestone) (err error) {
  14. if len(ms) == 0 {
  15. return nil
  16. }
  17. ctx, committer, err := db.TxContext(db.DefaultContext)
  18. if err != nil {
  19. return err
  20. }
  21. defer committer.Close()
  22. sess := db.GetEngine(ctx)
  23. // to return the id, so we should not use batch insert
  24. for _, m := range ms {
  25. if _, err = sess.NoAutoTime().Insert(m); err != nil {
  26. return err
  27. }
  28. }
  29. if _, err = db.Exec(ctx, "UPDATE `repository` SET num_milestones = num_milestones + ? WHERE id = ?", len(ms), ms[0].RepoID); err != nil {
  30. return err
  31. }
  32. return committer.Commit()
  33. }
  34. // InsertIssues insert issues to database
  35. func InsertIssues(issues ...*issues_model.Issue) error {
  36. ctx, committer, err := db.TxContext(db.DefaultContext)
  37. if err != nil {
  38. return err
  39. }
  40. defer committer.Close()
  41. for _, issue := range issues {
  42. if err := insertIssue(ctx, issue); err != nil {
  43. return err
  44. }
  45. }
  46. return committer.Commit()
  47. }
  48. func insertIssue(ctx context.Context, issue *issues_model.Issue) error {
  49. sess := db.GetEngine(ctx)
  50. if _, err := sess.NoAutoTime().Insert(issue); err != nil {
  51. return err
  52. }
  53. issueLabels := make([]issues_model.IssueLabel, 0, len(issue.Labels))
  54. for _, label := range issue.Labels {
  55. issueLabels = append(issueLabels, issues_model.IssueLabel{
  56. IssueID: issue.ID,
  57. LabelID: label.ID,
  58. })
  59. }
  60. if len(issueLabels) > 0 {
  61. if _, err := sess.Insert(issueLabels); err != nil {
  62. return err
  63. }
  64. }
  65. for _, reaction := range issue.Reactions {
  66. reaction.IssueID = issue.ID
  67. }
  68. if len(issue.Reactions) > 0 {
  69. if _, err := sess.Insert(issue.Reactions); err != nil {
  70. return err
  71. }
  72. }
  73. return nil
  74. }
  75. // InsertIssueComments inserts many comments of issues.
  76. func InsertIssueComments(comments []*issues_model.Comment) error {
  77. if len(comments) == 0 {
  78. return nil
  79. }
  80. issueIDs := make(container.Set[int64])
  81. for _, comment := range comments {
  82. issueIDs.Add(comment.IssueID)
  83. }
  84. ctx, committer, err := db.TxContext(db.DefaultContext)
  85. if err != nil {
  86. return err
  87. }
  88. defer committer.Close()
  89. for _, comment := range comments {
  90. if _, err := db.GetEngine(ctx).NoAutoTime().Insert(comment); err != nil {
  91. return err
  92. }
  93. for _, reaction := range comment.Reactions {
  94. reaction.IssueID = comment.IssueID
  95. reaction.CommentID = comment.ID
  96. }
  97. if len(comment.Reactions) > 0 {
  98. if err := db.Insert(ctx, comment.Reactions); err != nil {
  99. return err
  100. }
  101. }
  102. }
  103. for issueID := range issueIDs {
  104. if _, err := db.Exec(ctx, "UPDATE issue set num_comments = (SELECT count(*) FROM comment WHERE issue_id = ? AND `type`=?) WHERE id = ?",
  105. issueID, issues_model.CommentTypeComment, issueID); err != nil {
  106. return err
  107. }
  108. }
  109. return committer.Commit()
  110. }
  111. // InsertPullRequests inserted pull requests
  112. func InsertPullRequests(prs ...*issues_model.PullRequest) error {
  113. ctx, committer, err := db.TxContext(db.DefaultContext)
  114. if err != nil {
  115. return err
  116. }
  117. defer committer.Close()
  118. sess := db.GetEngine(ctx)
  119. for _, pr := range prs {
  120. if err := insertIssue(ctx, pr.Issue); err != nil {
  121. return err
  122. }
  123. pr.IssueID = pr.Issue.ID
  124. if _, err := sess.NoAutoTime().Insert(pr); err != nil {
  125. return err
  126. }
  127. }
  128. return committer.Commit()
  129. }
  130. // InsertReleases migrates release
  131. func InsertReleases(rels ...*repo_model.Release) error {
  132. ctx, committer, err := db.TxContext(db.DefaultContext)
  133. if err != nil {
  134. return err
  135. }
  136. defer committer.Close()
  137. sess := db.GetEngine(ctx)
  138. for _, rel := range rels {
  139. if _, err := sess.NoAutoTime().Insert(rel); err != nil {
  140. return err
  141. }
  142. if len(rel.Attachments) > 0 {
  143. for i := range rel.Attachments {
  144. rel.Attachments[i].ReleaseID = rel.ID
  145. }
  146. if _, err := sess.NoAutoTime().Insert(rel.Attachments); err != nil {
  147. return err
  148. }
  149. }
  150. }
  151. return committer.Commit()
  152. }
  153. // UpdateMigrationsByType updates all migrated repositories' posterid from gitServiceType to replace originalAuthorID to posterID
  154. func UpdateMigrationsByType(tp structs.GitServiceType, externalUserID string, userID int64) error {
  155. if err := issues_model.UpdateIssuesMigrationsByType(tp, externalUserID, userID); err != nil {
  156. return err
  157. }
  158. if err := issues_model.UpdateCommentsMigrationsByType(tp, externalUserID, userID); err != nil {
  159. return err
  160. }
  161. if err := repo_model.UpdateReleasesMigrationsByType(tp, externalUserID, userID); err != nil {
  162. return err
  163. }
  164. if err := issues_model.UpdateReactionsMigrationsByType(tp, externalUserID, userID); err != nil {
  165. return err
  166. }
  167. return issues_model.UpdateReviewsMigrationsByType(tp, externalUserID, userID)
  168. }