Skip to content

Commit 8d43563

Browse files
authored
[BugFix] [API] Pull.API.Convert: Only try to get HeadBranch if HeadRepo exist (#10029)
* only try to get HeadBranch if HeadRepo exist * impruve * no nil error * add TEST * correct error msg
1 parent 13bc820 commit 8d43563

File tree

3 files changed

+53
-29
lines changed

3 files changed

+53
-29
lines changed

models/user.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,9 @@ func (u *User) GetEmail() string {
234234

235235
// APIFormat converts a User to api.User
236236
func (u *User) APIFormat() *api.User {
237+
if u == nil {
238+
return nil
239+
}
237240
return &api.User{
238241
ID: u.ID,
239242
UserName: u.Name,

modules/convert/pull.go

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
package convert
66

77
import (
8+
"fmt"
9+
810
"code.gitea.io/gitea/models"
911
"code.gitea.io/gitea/modules/git"
1012
"code.gitea.io/gitea/modules/log"
@@ -23,10 +25,12 @@ func ToAPIPullRequest(pr *models.PullRequest) *api.PullRequest {
2325
headCommit *git.Commit
2426
err error
2527
)
28+
2629
if err = pr.Issue.LoadRepo(); err != nil {
27-
log.Error("loadRepo[%d]: %v", pr.ID, err)
30+
log.Error("pr.Issue.LoadRepo[%d]: %v", pr.ID, err)
2831
return nil
2932
}
33+
3034
apiIssue := pr.Issue.APIFormat()
3135
if pr.BaseRepo == nil {
3236
pr.BaseRepo, err = models.GetRepositoryByID(pr.BaseRepoID)
@@ -35,17 +39,13 @@ func ToAPIPullRequest(pr *models.PullRequest) *api.PullRequest {
3539
return nil
3640
}
3741
}
38-
if pr.HeadRepo == nil {
42+
if pr.HeadRepoID != 0 && pr.HeadRepo == nil {
3943
pr.HeadRepo, err = models.GetRepositoryByID(pr.HeadRepoID)
40-
if err != nil {
44+
if err != nil && !models.IsErrRepoNotExist(err) {
4145
log.Error("GetRepositoryById[%d]: %v", pr.ID, err)
4246
return nil
43-
}
44-
}
4547

46-
if err = pr.Issue.LoadRepo(); err != nil {
47-
log.Error("pr.Issue.loadRepo[%d]: %v", pr.ID, err)
48-
return nil
48+
}
4949
}
5050

5151
apiPullRequest := &api.PullRequest{
@@ -99,33 +99,41 @@ func ToAPIPullRequest(pr *models.PullRequest) *api.PullRequest {
9999
apiPullRequest.Base = apiBaseBranchInfo
100100
}
101101

102-
headBranch, err = repo_module.GetBranch(pr.HeadRepo, pr.HeadBranch)
103-
if err != nil {
104-
if git.IsErrBranchNotExist(err) {
105-
apiPullRequest.Head = nil
106-
} else {
107-
log.Error("GetBranch[%s]: %v", pr.HeadBranch, err)
108-
return nil
109-
}
110-
} else {
111-
apiHeadBranchInfo := &api.PRBranchInfo{
112-
Name: pr.HeadBranch,
113-
Ref: pr.HeadBranch,
114-
RepoID: pr.HeadRepoID,
115-
Repository: pr.HeadRepo.APIFormat(models.AccessModeNone),
116-
}
117-
headCommit, err = headBranch.GetCommit()
102+
if pr.HeadRepo != nil {
103+
headBranch, err = repo_module.GetBranch(pr.HeadRepo, pr.HeadBranch)
118104
if err != nil {
119-
if git.IsErrNotExist(err) {
120-
apiHeadBranchInfo.Sha = ""
105+
if git.IsErrBranchNotExist(err) {
106+
apiPullRequest.Head = nil
121107
} else {
122-
log.Error("GetCommit[%s]: %v", headBranch.Name, err)
108+
log.Error("GetBranch[%s]: %v", pr.HeadBranch, err)
123109
return nil
124110
}
125111
} else {
126-
apiHeadBranchInfo.Sha = headCommit.ID.String()
112+
apiHeadBranchInfo := &api.PRBranchInfo{
113+
Name: pr.HeadBranch,
114+
Ref: pr.HeadBranch,
115+
RepoID: pr.HeadRepoID,
116+
Repository: pr.HeadRepo.APIFormat(models.AccessModeNone),
117+
}
118+
headCommit, err = headBranch.GetCommit()
119+
if err != nil {
120+
if git.IsErrNotExist(err) {
121+
apiHeadBranchInfo.Sha = ""
122+
} else {
123+
log.Error("GetCommit[%s]: %v", headBranch.Name, err)
124+
return nil
125+
}
126+
} else {
127+
apiHeadBranchInfo.Sha = headCommit.ID.String()
128+
}
129+
apiPullRequest.Head = apiHeadBranchInfo
130+
}
131+
} else {
132+
apiPullRequest.Head = &api.PRBranchInfo{
133+
Name: pr.HeadBranch,
134+
Ref: fmt.Sprintf("refs/pull/%d/head", pr.Index),
135+
RepoID: -1,
127136
}
128-
apiPullRequest.Head = apiHeadBranchInfo
129137
}
130138

131139
if pr.Status != models.PullRequestStatusChecking {

modules/convert/pull_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,24 @@ import (
1313
)
1414

1515
func TestPullRequest_APIFormat(t *testing.T) {
16+
//with HeadRepo
1617
assert.NoError(t, models.PrepareTestDatabase())
1718
pr := models.AssertExistsAndLoadBean(t, &models.PullRequest{ID: 1}).(*models.PullRequest)
1819
assert.NoError(t, pr.LoadAttributes())
1920
assert.NoError(t, pr.LoadIssue())
2021
apiPullRequest := ToAPIPullRequest(pr)
2122
assert.NotNil(t, apiPullRequest)
2223
assert.Nil(t, apiPullRequest.Head)
24+
25+
//withOut HeadRepo
26+
pr = models.AssertExistsAndLoadBean(t, &models.PullRequest{ID: 1}).(*models.PullRequest)
27+
assert.NoError(t, pr.LoadIssue())
28+
assert.NoError(t, pr.LoadAttributes())
29+
// simulate fork deletion
30+
pr.HeadRepo = nil
31+
pr.HeadRepoID = 100000
32+
apiPullRequest = ToAPIPullRequest(pr)
33+
assert.NotNil(t, apiPullRequest)
34+
assert.Nil(t, apiPullRequest.Head.Repository)
35+
assert.EqualValues(t, -1, apiPullRequest.Head.RepoID)
2336
}

0 commit comments

Comments
 (0)