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.

pull.go 4.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // Copyright 2020 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 convert
  5. import (
  6. "code.gitea.io/gitea/models"
  7. "code.gitea.io/gitea/modules/git"
  8. "code.gitea.io/gitea/modules/log"
  9. repo_module "code.gitea.io/gitea/modules/repository"
  10. api "code.gitea.io/gitea/modules/structs"
  11. )
  12. // ToAPIPullRequest assumes following fields have been assigned with valid values:
  13. // Required - Issue
  14. // Optional - Merger
  15. func ToAPIPullRequest(pr *models.PullRequest) *api.PullRequest {
  16. var (
  17. baseBranch *git.Branch
  18. headBranch *git.Branch
  19. baseCommit *git.Commit
  20. headCommit *git.Commit
  21. err error
  22. )
  23. if err = pr.Issue.LoadRepo(); err != nil {
  24. log.Error("loadRepo[%d]: %v", pr.ID, err)
  25. return nil
  26. }
  27. apiIssue := pr.Issue.APIFormat()
  28. if pr.BaseRepo == nil {
  29. pr.BaseRepo, err = models.GetRepositoryByID(pr.BaseRepoID)
  30. if err != nil {
  31. log.Error("GetRepositoryById[%d]: %v", pr.ID, err)
  32. return nil
  33. }
  34. }
  35. if pr.HeadRepo == nil {
  36. pr.HeadRepo, err = models.GetRepositoryByID(pr.HeadRepoID)
  37. if err != nil {
  38. log.Error("GetRepositoryById[%d]: %v", pr.ID, err)
  39. return nil
  40. }
  41. }
  42. if err = pr.Issue.LoadRepo(); err != nil {
  43. log.Error("pr.Issue.loadRepo[%d]: %v", pr.ID, err)
  44. return nil
  45. }
  46. apiPullRequest := &api.PullRequest{
  47. ID: pr.ID,
  48. URL: pr.Issue.HTMLURL(),
  49. Index: pr.Index,
  50. Poster: apiIssue.Poster,
  51. Title: apiIssue.Title,
  52. Body: apiIssue.Body,
  53. Labels: apiIssue.Labels,
  54. Milestone: apiIssue.Milestone,
  55. Assignee: apiIssue.Assignee,
  56. Assignees: apiIssue.Assignees,
  57. State: apiIssue.State,
  58. Comments: apiIssue.Comments,
  59. HTMLURL: pr.Issue.HTMLURL(),
  60. DiffURL: pr.Issue.DiffURL(),
  61. PatchURL: pr.Issue.PatchURL(),
  62. HasMerged: pr.HasMerged,
  63. MergeBase: pr.MergeBase,
  64. Deadline: apiIssue.Deadline,
  65. Created: pr.Issue.CreatedUnix.AsTimePtr(),
  66. Updated: pr.Issue.UpdatedUnix.AsTimePtr(),
  67. }
  68. baseBranch, err = repo_module.GetBranch(pr.BaseRepo, pr.BaseBranch)
  69. if err != nil {
  70. if git.IsErrBranchNotExist(err) {
  71. apiPullRequest.Base = nil
  72. } else {
  73. log.Error("GetBranch[%s]: %v", pr.BaseBranch, err)
  74. return nil
  75. }
  76. } else {
  77. apiBaseBranchInfo := &api.PRBranchInfo{
  78. Name: pr.BaseBranch,
  79. Ref: pr.BaseBranch,
  80. RepoID: pr.BaseRepoID,
  81. Repository: pr.BaseRepo.APIFormat(models.AccessModeNone),
  82. }
  83. baseCommit, err = baseBranch.GetCommit()
  84. if err != nil {
  85. if git.IsErrNotExist(err) {
  86. apiBaseBranchInfo.Sha = ""
  87. } else {
  88. log.Error("GetCommit[%s]: %v", baseBranch.Name, err)
  89. return nil
  90. }
  91. } else {
  92. apiBaseBranchInfo.Sha = baseCommit.ID.String()
  93. }
  94. apiPullRequest.Base = apiBaseBranchInfo
  95. }
  96. headBranch, err = repo_module.GetBranch(pr.HeadRepo, pr.HeadBranch)
  97. if err != nil {
  98. if git.IsErrBranchNotExist(err) {
  99. apiPullRequest.Head = nil
  100. } else {
  101. log.Error("GetBranch[%s]: %v", pr.HeadBranch, err)
  102. return nil
  103. }
  104. } else {
  105. apiHeadBranchInfo := &api.PRBranchInfo{
  106. Name: pr.HeadBranch,
  107. Ref: pr.HeadBranch,
  108. RepoID: pr.HeadRepoID,
  109. Repository: pr.HeadRepo.APIFormat(models.AccessModeNone),
  110. }
  111. headCommit, err = headBranch.GetCommit()
  112. if err != nil {
  113. if git.IsErrNotExist(err) {
  114. apiHeadBranchInfo.Sha = ""
  115. } else {
  116. log.Error("GetCommit[%s]: %v", headBranch.Name, err)
  117. return nil
  118. }
  119. } else {
  120. apiHeadBranchInfo.Sha = headCommit.ID.String()
  121. }
  122. apiPullRequest.Head = apiHeadBranchInfo
  123. }
  124. if pr.Status != models.PullRequestStatusChecking {
  125. mergeable := !(pr.Status == models.PullRequestStatusConflict || pr.Status == models.PullRequestStatusError) && !pr.IsWorkInProgress()
  126. apiPullRequest.Mergeable = mergeable
  127. }
  128. if pr.HasMerged {
  129. apiPullRequest.Merged = pr.MergedUnix.AsTimePtr()
  130. apiPullRequest.MergedCommitID = &pr.MergedCommitID
  131. apiPullRequest.MergedBy = pr.Merger.APIFormat()
  132. }
  133. return apiPullRequest
  134. }