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.

pull.go 4.0KB

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