* Move pull request api convert to convert package * Rename ToPullRequest to ToAPIPullRequesttags/v1.10.5
@@ -13,7 +13,6 @@ import ( | |||
"code.gitea.io/gitea/modules/git" | |||
"code.gitea.io/gitea/modules/log" | |||
"code.gitea.io/gitea/modules/setting" | |||
api "code.gitea.io/gitea/modules/structs" | |||
"code.gitea.io/gitea/modules/timeutil" | |||
) | |||
@@ -397,139 +396,6 @@ func (pr *PullRequest) GetGitRefName() string { | |||
return fmt.Sprintf("refs/pull/%d/head", pr.Index) | |||
} | |||
// APIFormat assumes following fields have been assigned with valid values: | |||
// Required - Issue | |||
// Optional - Merger | |||
func (pr *PullRequest) APIFormat() *api.PullRequest { | |||
return pr.apiFormat(x) | |||
} | |||
func (pr *PullRequest) apiFormat(e Engine) *api.PullRequest { | |||
var ( | |||
baseBranch *git.Branch | |||
headBranch *git.Branch | |||
baseCommit *git.Commit | |||
headCommit *git.Commit | |||
err error | |||
) | |||
if err = pr.Issue.loadRepo(e); err != nil { | |||
log.Error("loadRepo[%d]: %v", pr.ID, err) | |||
return nil | |||
} | |||
apiIssue := pr.Issue.apiFormat(e) | |||
if pr.BaseRepo == nil { | |||
pr.BaseRepo, err = getRepositoryByID(e, pr.BaseRepoID) | |||
if err != nil { | |||
log.Error("GetRepositoryById[%d]: %v", pr.ID, err) | |||
return nil | |||
} | |||
} | |||
if pr.HeadRepo == nil { | |||
pr.HeadRepo, err = getRepositoryByID(e, pr.HeadRepoID) | |||
if err != nil { | |||
log.Error("GetRepositoryById[%d]: %v", pr.ID, err) | |||
return nil | |||
} | |||
} | |||
if err = pr.Issue.loadRepo(e); err != nil { | |||
log.Error("pr.Issue.loadRepo[%d]: %v", pr.ID, err) | |||
return nil | |||
} | |||
apiPullRequest := &api.PullRequest{ | |||
ID: pr.ID, | |||
URL: pr.Issue.HTMLURL(), | |||
Index: pr.Index, | |||
Poster: apiIssue.Poster, | |||
Title: apiIssue.Title, | |||
Body: apiIssue.Body, | |||
Labels: apiIssue.Labels, | |||
Milestone: apiIssue.Milestone, | |||
Assignee: apiIssue.Assignee, | |||
Assignees: apiIssue.Assignees, | |||
State: apiIssue.State, | |||
Comments: apiIssue.Comments, | |||
HTMLURL: pr.Issue.HTMLURL(), | |||
DiffURL: pr.Issue.DiffURL(), | |||
PatchURL: pr.Issue.PatchURL(), | |||
HasMerged: pr.HasMerged, | |||
MergeBase: pr.MergeBase, | |||
Deadline: apiIssue.Deadline, | |||
Created: pr.Issue.CreatedUnix.AsTimePtr(), | |||
Updated: pr.Issue.UpdatedUnix.AsTimePtr(), | |||
} | |||
baseBranch, err = pr.BaseRepo.GetBranch(pr.BaseBranch) | |||
if err != nil { | |||
if git.IsErrBranchNotExist(err) { | |||
apiPullRequest.Base = nil | |||
} else { | |||
log.Error("GetBranch[%s]: %v", pr.BaseBranch, err) | |||
return nil | |||
} | |||
} else { | |||
apiBaseBranchInfo := &api.PRBranchInfo{ | |||
Name: pr.BaseBranch, | |||
Ref: pr.BaseBranch, | |||
RepoID: pr.BaseRepoID, | |||
Repository: pr.BaseRepo.innerAPIFormat(e, AccessModeNone, false), | |||
} | |||
baseCommit, err = baseBranch.GetCommit() | |||
if err != nil { | |||
if git.IsErrNotExist(err) { | |||
apiBaseBranchInfo.Sha = "" | |||
} else { | |||
log.Error("GetCommit[%s]: %v", baseBranch.Name, err) | |||
return nil | |||
} | |||
} else { | |||
apiBaseBranchInfo.Sha = baseCommit.ID.String() | |||
} | |||
apiPullRequest.Base = apiBaseBranchInfo | |||
} | |||
headBranch, err = pr.HeadRepo.GetBranch(pr.HeadBranch) | |||
if err != nil { | |||
if git.IsErrBranchNotExist(err) { | |||
apiPullRequest.Head = nil | |||
} else { | |||
log.Error("GetBranch[%s]: %v", pr.HeadBranch, err) | |||
return nil | |||
} | |||
} else { | |||
apiHeadBranchInfo := &api.PRBranchInfo{ | |||
Name: pr.HeadBranch, | |||
Ref: pr.HeadBranch, | |||
RepoID: pr.HeadRepoID, | |||
Repository: pr.HeadRepo.innerAPIFormat(e, AccessModeNone, false), | |||
} | |||
headCommit, err = headBranch.GetCommit() | |||
if err != nil { | |||
if git.IsErrNotExist(err) { | |||
apiHeadBranchInfo.Sha = "" | |||
} else { | |||
log.Error("GetCommit[%s]: %v", headBranch.Name, err) | |||
return nil | |||
} | |||
} else { | |||
apiHeadBranchInfo.Sha = headCommit.ID.String() | |||
} | |||
apiPullRequest.Head = apiHeadBranchInfo | |||
} | |||
if pr.Status != PullRequestStatusChecking { | |||
mergeable := !(pr.Status == PullRequestStatusConflict || pr.Status == PullRequestStatusError) && !pr.IsWorkInProgress() | |||
apiPullRequest.Mergeable = mergeable | |||
} | |||
if pr.HasMerged { | |||
apiPullRequest.Merged = pr.MergedUnix.AsTimePtr() | |||
apiPullRequest.MergedCommitID = &pr.MergedCommitID | |||
apiPullRequest.MergedBy = pr.Merger.APIFormat() | |||
} | |||
return apiPullRequest | |||
} | |||
func (pr *PullRequest) getHeadRepo(e Engine) (err error) { | |||
pr.HeadRepo, err = getRepositoryByID(e, pr.HeadRepoID) | |||
if err != nil && !IsErrRepoNotExist(err) { |
@@ -29,16 +29,6 @@ func TestPullRequest_LoadIssue(t *testing.T) { | |||
assert.Equal(t, int64(2), pr.Issue.ID) | |||
} | |||
func TestPullRequest_APIFormat(t *testing.T) { | |||
assert.NoError(t, PrepareTestDatabase()) | |||
pr := AssertExistsAndLoadBean(t, &PullRequest{ID: 1}).(*PullRequest) | |||
assert.NoError(t, pr.LoadAttributes()) | |||
assert.NoError(t, pr.LoadIssue()) | |||
apiPullRequest := pr.APIFormat() | |||
assert.NotNil(t, apiPullRequest) | |||
assert.Nil(t, apiPullRequest.Head) | |||
} | |||
func TestPullRequest_GetBaseRepo(t *testing.T) { | |||
assert.NoError(t, PrepareTestDatabase()) | |||
pr := AssertExistsAndLoadBean(t, &PullRequest{ID: 1}).(*PullRequest) |
@@ -0,0 +1,16 @@ | |||
// Copyright 2020 The Gitea Authors. All rights reserved. | |||
// Use of this source code is governed by a MIT-style | |||
// license that can be found in the LICENSE file. | |||
package convert | |||
import ( | |||
"path/filepath" | |||
"testing" | |||
"code.gitea.io/gitea/models" | |||
) | |||
func TestMain(m *testing.M) { | |||
models.MainTest(m, filepath.Join("..", "..")) | |||
} |
@@ -0,0 +1,141 @@ | |||
// Copyright 2020 The Gitea Authors. All rights reserved. | |||
// Use of this source code is governed by a MIT-style | |||
// license that can be found in the LICENSE file. | |||
package convert | |||
import ( | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/git" | |||
"code.gitea.io/gitea/modules/log" | |||
api "code.gitea.io/gitea/modules/structs" | |||
) | |||
// ToAPIPullRequest assumes following fields have been assigned with valid values: | |||
// Required - Issue | |||
// Optional - Merger | |||
func ToAPIPullRequest(pr *models.PullRequest) *api.PullRequest { | |||
var ( | |||
baseBranch *git.Branch | |||
headBranch *git.Branch | |||
baseCommit *git.Commit | |||
headCommit *git.Commit | |||
err error | |||
) | |||
if err = pr.Issue.LoadRepo(); err != nil { | |||
log.Error("loadRepo[%d]: %v", pr.ID, err) | |||
return nil | |||
} | |||
apiIssue := pr.Issue.APIFormat() | |||
if pr.BaseRepo == nil { | |||
pr.BaseRepo, err = models.GetRepositoryByID(pr.BaseRepoID) | |||
if err != nil { | |||
log.Error("GetRepositoryById[%d]: %v", pr.ID, err) | |||
return nil | |||
} | |||
} | |||
if pr.HeadRepo == nil { | |||
pr.HeadRepo, err = models.GetRepositoryByID(pr.HeadRepoID) | |||
if err != nil { | |||
log.Error("GetRepositoryById[%d]: %v", pr.ID, err) | |||
return nil | |||
} | |||
} | |||
if err = pr.Issue.LoadRepo(); err != nil { | |||
log.Error("pr.Issue.loadRepo[%d]: %v", pr.ID, err) | |||
return nil | |||
} | |||
apiPullRequest := &api.PullRequest{ | |||
ID: pr.ID, | |||
URL: pr.Issue.HTMLURL(), | |||
Index: pr.Index, | |||
Poster: apiIssue.Poster, | |||
Title: apiIssue.Title, | |||
Body: apiIssue.Body, | |||
Labels: apiIssue.Labels, | |||
Milestone: apiIssue.Milestone, | |||
Assignee: apiIssue.Assignee, | |||
Assignees: apiIssue.Assignees, | |||
State: apiIssue.State, | |||
Comments: apiIssue.Comments, | |||
HTMLURL: pr.Issue.HTMLURL(), | |||
DiffURL: pr.Issue.DiffURL(), | |||
PatchURL: pr.Issue.PatchURL(), | |||
HasMerged: pr.HasMerged, | |||
MergeBase: pr.MergeBase, | |||
Deadline: apiIssue.Deadline, | |||
Created: pr.Issue.CreatedUnix.AsTimePtr(), | |||
Updated: pr.Issue.UpdatedUnix.AsTimePtr(), | |||
} | |||
baseBranch, err = pr.BaseRepo.GetBranch(pr.BaseBranch) | |||
if err != nil { | |||
if git.IsErrBranchNotExist(err) { | |||
apiPullRequest.Base = nil | |||
} else { | |||
log.Error("GetBranch[%s]: %v", pr.BaseBranch, err) | |||
return nil | |||
} | |||
} else { | |||
apiBaseBranchInfo := &api.PRBranchInfo{ | |||
Name: pr.BaseBranch, | |||
Ref: pr.BaseBranch, | |||
RepoID: pr.BaseRepoID, | |||
Repository: pr.BaseRepo.APIFormat(models.AccessModeNone), | |||
} | |||
baseCommit, err = baseBranch.GetCommit() | |||
if err != nil { | |||
if git.IsErrNotExist(err) { | |||
apiBaseBranchInfo.Sha = "" | |||
} else { | |||
log.Error("GetCommit[%s]: %v", baseBranch.Name, err) | |||
return nil | |||
} | |||
} else { | |||
apiBaseBranchInfo.Sha = baseCommit.ID.String() | |||
} | |||
apiPullRequest.Base = apiBaseBranchInfo | |||
} | |||
headBranch, err = pr.HeadRepo.GetBranch(pr.HeadBranch) | |||
if err != nil { | |||
if git.IsErrBranchNotExist(err) { | |||
apiPullRequest.Head = nil | |||
} else { | |||
log.Error("GetBranch[%s]: %v", pr.HeadBranch, err) | |||
return nil | |||
} | |||
} else { | |||
apiHeadBranchInfo := &api.PRBranchInfo{ | |||
Name: pr.HeadBranch, | |||
Ref: pr.HeadBranch, | |||
RepoID: pr.HeadRepoID, | |||
Repository: pr.HeadRepo.APIFormat(models.AccessModeNone), | |||
} | |||
headCommit, err = headBranch.GetCommit() | |||
if err != nil { | |||
if git.IsErrNotExist(err) { | |||
apiHeadBranchInfo.Sha = "" | |||
} else { | |||
log.Error("GetCommit[%s]: %v", headBranch.Name, err) | |||
return nil | |||
} | |||
} else { | |||
apiHeadBranchInfo.Sha = headCommit.ID.String() | |||
} | |||
apiPullRequest.Head = apiHeadBranchInfo | |||
} | |||
if pr.Status != models.PullRequestStatusChecking { | |||
mergeable := !(pr.Status == models.PullRequestStatusConflict || pr.Status == models.PullRequestStatusError) && !pr.IsWorkInProgress() | |||
apiPullRequest.Mergeable = mergeable | |||
} | |||
if pr.HasMerged { | |||
apiPullRequest.Merged = pr.MergedUnix.AsTimePtr() | |||
apiPullRequest.MergedCommitID = &pr.MergedCommitID | |||
apiPullRequest.MergedBy = pr.Merger.APIFormat() | |||
} | |||
return apiPullRequest | |||
} |
@@ -0,0 +1,23 @@ | |||
// Copyright 2020 The Gitea Authors. All rights reserved. | |||
// Use of this source code is governed by a MIT-style | |||
// license that can be found in the LICENSE file. | |||
package convert | |||
import ( | |||
"testing" | |||
"code.gitea.io/gitea/models" | |||
"github.com/stretchr/testify/assert" | |||
) | |||
func TestPullRequest_APIFormat(t *testing.T) { | |||
assert.NoError(t, models.PrepareTestDatabase()) | |||
pr := models.AssertExistsAndLoadBean(t, &models.PullRequest{ID: 1}).(*models.PullRequest) | |||
assert.NoError(t, pr.LoadAttributes()) | |||
assert.NoError(t, pr.LoadIssue()) | |||
apiPullRequest := ToAPIPullRequest(pr) | |||
assert.NotNil(t, apiPullRequest) | |||
assert.Nil(t, apiPullRequest.Head) | |||
} |
@@ -6,6 +6,7 @@ package webhook | |||
import ( | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/convert" | |||
"code.gitea.io/gitea/modules/git" | |||
"code.gitea.io/gitea/modules/log" | |||
"code.gitea.io/gitea/modules/notification/base" | |||
@@ -49,7 +50,7 @@ func (m *webhookNotifier) NotifyIssueClearLabels(doer *models.User, issue *model | |||
err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{ | |||
Action: api.HookIssueLabelCleared, | |||
Index: issue.Index, | |||
PullRequest: issue.PullRequest.APIFormat(), | |||
PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | |||
Repository: issue.Repo.APIFormat(mode), | |||
Sender: doer.APIFormat(), | |||
}) | |||
@@ -135,7 +136,7 @@ func (m *webhookNotifier) NotifyIssueChangeAssignee(doer *models.User, issue *mo | |||
issue.PullRequest.Issue = issue | |||
apiPullRequest := &api.PullRequestPayload{ | |||
Index: issue.Index, | |||
PullRequest: issue.PullRequest.APIFormat(), | |||
PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | |||
Repository: issue.Repo.APIFormat(mode), | |||
Sender: doer.APIFormat(), | |||
} | |||
@@ -187,7 +188,7 @@ func (m *webhookNotifier) NotifyIssueChangeTitle(doer *models.User, issue *model | |||
From: oldTitle, | |||
}, | |||
}, | |||
PullRequest: issue.PullRequest.APIFormat(), | |||
PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | |||
Repository: issue.Repo.APIFormat(mode), | |||
Sender: doer.APIFormat(), | |||
}) | |||
@@ -222,7 +223,7 @@ func (m *webhookNotifier) NotifyIssueChangeStatus(doer *models.User, issue *mode | |||
// Merge pull request calls issue.changeStatus so we need to handle separately. | |||
apiPullRequest := &api.PullRequestPayload{ | |||
Index: issue.Index, | |||
PullRequest: issue.PullRequest.APIFormat(), | |||
PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | |||
Repository: issue.Repo.APIFormat(mode), | |||
Sender: doer.APIFormat(), | |||
} | |||
@@ -291,7 +292,7 @@ func (m *webhookNotifier) NotifyNewPullRequest(pull *models.PullRequest) { | |||
if err := webhook_module.PrepareWebhooks(pull.Issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{ | |||
Action: api.HookIssueOpened, | |||
Index: pull.Issue.Index, | |||
PullRequest: pull.APIFormat(), | |||
PullRequest: convert.ToAPIPullRequest(pull), | |||
Repository: pull.Issue.Repo.APIFormat(mode), | |||
Sender: pull.Issue.Poster.APIFormat(), | |||
}); err != nil { | |||
@@ -312,7 +313,7 @@ func (m *webhookNotifier) NotifyIssueChangeContent(doer *models.User, issue *mod | |||
From: oldContent, | |||
}, | |||
}, | |||
PullRequest: issue.PullRequest.APIFormat(), | |||
PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | |||
Repository: issue.Repo.APIFormat(mode), | |||
Sender: doer.APIFormat(), | |||
}) | |||
@@ -439,7 +440,7 @@ func (m *webhookNotifier) NotifyIssueChangeLabels(doer *models.User, issue *mode | |||
err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{ | |||
Action: api.HookIssueLabelUpdated, | |||
Index: issue.Index, | |||
PullRequest: issue.PullRequest.APIFormat(), | |||
PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | |||
Repository: issue.Repo.APIFormat(models.AccessModeNone), | |||
Sender: doer.APIFormat(), | |||
}) | |||
@@ -481,7 +482,7 @@ func (m *webhookNotifier) NotifyIssueChangeMilestone(doer *models.User, issue *m | |||
err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{ | |||
Action: hookAction, | |||
Index: issue.Index, | |||
PullRequest: issue.PullRequest.APIFormat(), | |||
PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | |||
Repository: issue.Repo.APIFormat(mode), | |||
Sender: doer.APIFormat(), | |||
}) | |||
@@ -547,7 +548,7 @@ func (*webhookNotifier) NotifyMergePullRequest(pr *models.PullRequest, doer *mod | |||
// Merge pull request calls issue.changeStatus so we need to handle separately. | |||
apiPullRequest := &api.PullRequestPayload{ | |||
Index: pr.Issue.Index, | |||
PullRequest: pr.APIFormat(), | |||
PullRequest: convert.ToAPIPullRequest(pr), | |||
Repository: pr.Issue.Repo.APIFormat(mode), | |||
Sender: doer.APIFormat(), | |||
Action: api.HookIssueClosed, | |||
@@ -580,7 +581,7 @@ func (m *webhookNotifier) NotifyPullRequestChangeTargetBranch(doer *models.User, | |||
From: oldBranch, | |||
}, | |||
}, | |||
PullRequest: issue.PullRequest.APIFormat(), | |||
PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | |||
Repository: issue.Repo.APIFormat(mode), | |||
Sender: doer.APIFormat(), | |||
}) | |||
@@ -619,7 +620,7 @@ func (m *webhookNotifier) NotifyPullRequestReview(pr *models.PullRequest, review | |||
if err := webhook_module.PrepareWebhooks(review.Issue.Repo, reviewHookType, &api.PullRequestPayload{ | |||
Action: api.HookIssueSynchronized, | |||
Index: review.Issue.Index, | |||
PullRequest: pr.APIFormat(), | |||
PullRequest: convert.ToAPIPullRequest(pr), | |||
Repository: review.Issue.Repo.APIFormat(mode), | |||
Sender: review.Reviewer.APIFormat(), | |||
Review: &api.ReviewPayload{ | |||
@@ -674,7 +675,7 @@ func (m *webhookNotifier) NotifyPullRequestSynchronized(doer *models.User, pr *m | |||
if err := webhook_module.PrepareWebhooks(pr.Issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{ | |||
Action: api.HookIssueSynchronized, | |||
Index: pr.Issue.Index, | |||
PullRequest: pr.Issue.PullRequest.APIFormat(), | |||
PullRequest: convert.ToAPIPullRequest(pr), | |||
Repository: pr.Issue.Repo.APIFormat(models.AccessModeNone), | |||
Sender: doer.APIFormat(), | |||
}); err != nil { |
@@ -13,6 +13,7 @@ import ( | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/auth" | |||
"code.gitea.io/gitea/modules/context" | |||
"code.gitea.io/gitea/modules/convert" | |||
"code.gitea.io/gitea/modules/git" | |||
"code.gitea.io/gitea/modules/log" | |||
"code.gitea.io/gitea/modules/notification" | |||
@@ -102,7 +103,7 @@ func ListPullRequests(ctx *context.APIContext, form api.ListPullRequestsOptions) | |||
ctx.Error(http.StatusInternalServerError, "GetHeadRepo", err) | |||
return | |||
} | |||
apiPrs[i] = prs[i].APIFormat() | |||
apiPrs[i] = convert.ToAPIPullRequest(prs[i]) | |||
} | |||
ctx.SetLinkHeader(int(maxResults), models.ItemsPerPage) | |||
@@ -157,7 +158,7 @@ func GetPullRequest(ctx *context.APIContext) { | |||
ctx.Error(http.StatusInternalServerError, "GetHeadRepo", err) | |||
return | |||
} | |||
ctx.JSON(http.StatusOK, pr.APIFormat()) | |||
ctx.JSON(http.StatusOK, convert.ToAPIPullRequest(pr)) | |||
} | |||
// CreatePullRequest does what it says | |||
@@ -321,7 +322,7 @@ func CreatePullRequest(ctx *context.APIContext, form api.CreatePullRequestOption | |||
notification.NotifyNewPullRequest(pr) | |||
log.Trace("Pull request created: %d/%d", repo.ID, prIssue.ID) | |||
ctx.JSON(http.StatusCreated, pr.APIFormat()) | |||
ctx.JSON(http.StatusCreated, convert.ToAPIPullRequest(pr)) | |||
} | |||
// EditPullRequest does what it says | |||
@@ -479,7 +480,7 @@ func EditPullRequest(ctx *context.APIContext, form api.EditPullRequestOption) { | |||
} | |||
// TODO this should be 200, not 201 | |||
ctx.JSON(http.StatusCreated, pr.APIFormat()) | |||
ctx.JSON(http.StatusCreated, convert.ToAPIPullRequest(pr)) | |||
} | |||
// IsPullRequestMerged checks if a PR exists given an index |