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 3.9 kB

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