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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. err error
  22. )
  23. if err = pr.Issue.LoadRepo(); err != nil {
  24. log.Error("pr.Issue.LoadRepo[%d]: %v", pr.ID, err)
  25. return nil
  26. }
  27. apiIssue := ToAPIIssue(pr.Issue)
  28. if err := pr.LoadBaseRepo(); err != nil {
  29. log.Error("GetRepositoryById[%d]: %v", pr.ID, err)
  30. return nil
  31. }
  32. if err := pr.LoadHeadRepo(); err != nil {
  33. log.Error("GetRepositoryById[%d]: %v", pr.ID, err)
  34. return nil
  35. }
  36. apiPullRequest := &api.PullRequest{
  37. ID: pr.ID,
  38. URL: pr.Issue.HTMLURL(),
  39. Index: pr.Index,
  40. Poster: apiIssue.Poster,
  41. Title: apiIssue.Title,
  42. Body: apiIssue.Body,
  43. Labels: apiIssue.Labels,
  44. Milestone: apiIssue.Milestone,
  45. Assignee: apiIssue.Assignee,
  46. Assignees: apiIssue.Assignees,
  47. State: apiIssue.State,
  48. Comments: apiIssue.Comments,
  49. HTMLURL: pr.Issue.HTMLURL(),
  50. DiffURL: pr.Issue.DiffURL(),
  51. PatchURL: pr.Issue.PatchURL(),
  52. HasMerged: pr.HasMerged,
  53. MergeBase: pr.MergeBase,
  54. Deadline: apiIssue.Deadline,
  55. Created: pr.Issue.CreatedUnix.AsTimePtr(),
  56. Updated: pr.Issue.UpdatedUnix.AsTimePtr(),
  57. Base: &api.PRBranchInfo{
  58. Name: pr.BaseBranch,
  59. Ref: pr.BaseBranch,
  60. RepoID: pr.BaseRepoID,
  61. Repository: pr.BaseRepo.APIFormat(models.AccessModeNone),
  62. },
  63. Head: &api.PRBranchInfo{
  64. Name: pr.HeadBranch,
  65. Ref: fmt.Sprintf("refs/pull/%d/head", pr.Index),
  66. RepoID: -1,
  67. },
  68. }
  69. baseBranch, err = repo_module.GetBranch(pr.BaseRepo, pr.BaseBranch)
  70. if err != nil && !git.IsErrBranchNotExist(err) {
  71. log.Error("GetBranch[%s]: %v", pr.BaseBranch, err)
  72. return nil
  73. }
  74. if err == nil {
  75. baseCommit, err = baseBranch.GetCommit()
  76. if err != nil && !git.IsErrNotExist(err) {
  77. log.Error("GetCommit[%s]: %v", baseBranch.Name, err)
  78. return nil
  79. }
  80. if err == nil {
  81. apiPullRequest.Base.Sha = baseCommit.ID.String()
  82. }
  83. }
  84. if pr.HeadRepo != nil {
  85. apiPullRequest.Head.RepoID = pr.HeadRepo.ID
  86. apiPullRequest.Head.Repository = pr.HeadRepo.APIFormat(models.AccessModeNone)
  87. headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath())
  88. if err != nil {
  89. log.Error("OpenRepository[%s]: %v", pr.HeadRepo.RepoPath(), err)
  90. return nil
  91. }
  92. defer headGitRepo.Close()
  93. headBranch, err = headGitRepo.GetBranch(pr.HeadBranch)
  94. if err != nil && !git.IsErrBranchNotExist(err) {
  95. log.Error("GetBranch[%s]: %v", pr.HeadBranch, err)
  96. return nil
  97. }
  98. if git.IsErrBranchNotExist(err) {
  99. headCommitID, err := headGitRepo.GetRefCommitID(apiPullRequest.Head.Ref)
  100. if err != nil && !git.IsErrNotExist(err) {
  101. log.Error("GetCommit[%s]: %v", headBranch.Name, err)
  102. return nil
  103. }
  104. if err == nil {
  105. apiPullRequest.Head.Sha = headCommitID
  106. }
  107. } else {
  108. commit, err := headBranch.GetCommit()
  109. if err != nil && !git.IsErrNotExist(err) {
  110. log.Error("GetCommit[%s]: %v", headBranch.Name, err)
  111. return nil
  112. }
  113. if err == nil {
  114. apiPullRequest.Head.Ref = pr.HeadBranch
  115. apiPullRequest.Head.Sha = commit.ID.String()
  116. }
  117. }
  118. }
  119. if pr.Status != models.PullRequestStatusChecking {
  120. mergeable := !(pr.Status == models.PullRequestStatusConflict || pr.Status == models.PullRequestStatusError) && !pr.IsWorkInProgress()
  121. apiPullRequest.Mergeable = mergeable
  122. }
  123. if pr.HasMerged {
  124. apiPullRequest.Merged = pr.MergedUnix.AsTimePtr()
  125. apiPullRequest.MergedCommitID = &pr.MergedCommitID
  126. apiPullRequest.MergedBy = pr.Merger.APIFormat()
  127. }
  128. return apiPullRequest
  129. }