diff options
author | Kim "BKC" Carlbäcker <kim.carlbacker@gmail.com> | 2016-12-02 12:10:39 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-02 12:10:39 +0100 |
commit | 0f05470cb84a4dcfd00e69e5af51b4420b74e9d4 (patch) | |
tree | 9b6296dc8cfc660090fe90220397a015725e219f /models | |
parent | d7ed78a91971260169c429f9ee47ebe8fa8f92ad (diff) | |
download | gitea-0f05470cb84a4dcfd00e69e5af51b4420b74e9d4.tar.gz gitea-0f05470cb84a4dcfd00e69e5af51b4420b74e9d4.zip |
[API] Pull Requests (#248)
Diffstat (limited to 'models')
-rw-r--r-- | models/error.go | 22 | ||||
-rw-r--r-- | models/issue.go | 16 | ||||
-rw-r--r-- | models/pull.go | 84 |
3 files changed, 122 insertions, 0 deletions
diff --git a/models/error.go b/models/error.go index 33815cdc96..d11a9eeb1f 100644 --- a/models/error.go +++ b/models/error.go @@ -584,6 +584,28 @@ func (err ErrPullRequestNotExist) Error() string { err.ID, err.IssueID, err.HeadRepoID, err.BaseRepoID, err.HeadBarcnh, err.BaseBranch) } +// ErrPullRequestAlreadyExists represents a "PullRequestAlreadyExists"-error +type ErrPullRequestAlreadyExists struct { + ID int64 + IssueID int64 + HeadRepoID int64 + BaseRepoID int64 + HeadBranch string + BaseBranch string +} + +// IsErrPullRequestAlreadyExists checks if an error is a ErrPullRequestAlreadyExists. +func IsErrPullRequestAlreadyExists(err error) bool { + _, ok := err.(ErrPullRequestAlreadyExists) + return ok +} + +// Error does pretty-printing :D +func (err ErrPullRequestAlreadyExists) Error() string { + return fmt.Sprintf("pull request already exists for these targets [id: %d, issue_id: %d, head_repo_id: %d, base_repo_id: %d, head_branch: %s, base_branch: %s]", + err.ID, err.IssueID, err.HeadRepoID, err.BaseRepoID, err.HeadBranch, err.BaseBranch) +} + // _________ __ // \_ ___ \ ____ _____ _____ ____ _____/ |_ // / \ \/ / _ \ / \ / \_/ __ \ / \ __\ diff --git a/models/issue.go b/models/issue.go index 990d4a4bc5..7ef3d00e41 100644 --- a/models/issue.go +++ b/models/issue.go @@ -170,6 +170,22 @@ func (issue *Issue) HTMLURL() string { return fmt.Sprintf("%s/%s/%d", issue.Repo.HTMLURL(), path, issue.Index) } +// DiffURL returns the absolute URL to this diff +func (issue *Issue) DiffURL() string { + if issue.IsPull { + return fmt.Sprintf("%s/pulls/%d.diff", issue.Repo.HTMLURL(), issue.Index) + } + return "" +} + +// PatchURL returns the absolute URL to this patch +func (issue *Issue) PatchURL() string { + if issue.IsPull { + return fmt.Sprintf("%s/pulls/%d.patch", issue.Repo.HTMLURL(), issue.Index) + } + return "" +} + // State returns string representation of issue status. func (issue *Issue) State() api.StateType { if issue.IsClosed { diff --git a/models/pull.go b/models/pull.go index eef9a7557b..daed84bf22 100644 --- a/models/pull.go +++ b/models/pull.go @@ -121,7 +121,26 @@ func (pr *PullRequest) LoadIssue() (err error) { // Required - Issue // Optional - Merger func (pr *PullRequest) APIFormat() *api.PullRequest { + apiIssue := pr.Issue.APIFormat() + baseBranch, _ := pr.BaseRepo.GetBranch(pr.BaseBranch) + baseCommit, _ := baseBranch.GetCommit() + headBranch, _ := pr.HeadRepo.GetBranch(pr.HeadBranch) + headCommit, _ := headBranch.GetCommit() + apiBaseBranchInfo := &api.PRBranchInfo{ + Name: pr.BaseBranch, + Ref: pr.BaseBranch, + Sha: baseCommit.ID.String(), + RepoID: pr.BaseRepoID, + Repository: pr.BaseRepo.APIFormat(nil), + } + apiHeadBranchInfo := &api.PRBranchInfo{ + Name: pr.HeadBranch, + Ref: pr.HeadBranch, + Sha: headCommit.ID.String(), + RepoID: pr.HeadRepoID, + Repository: pr.HeadRepo.APIFormat(nil), + } apiPullRequest := &api.PullRequest{ ID: pr.ID, Index: pr.Index, @@ -134,7 +153,12 @@ func (pr *PullRequest) APIFormat() *api.PullRequest { State: apiIssue.State, Comments: apiIssue.Comments, HTMLURL: pr.Issue.HTMLURL(), + DiffURL: pr.Issue.DiffURL(), + PatchURL: pr.Issue.PatchURL(), HasMerged: pr.HasMerged, + Base: apiBaseBranchInfo, + Head: apiHeadBranchInfo, + MergeBase: pr.MergeBase, } if pr.Status != PullRequestStatusChecking { @@ -472,6 +496,46 @@ func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []str return nil } +// PullRequestsOptions holds the options for PRs +type PullRequestsOptions struct { + Page int + State string + SortType string + Labels []string + MilestoneID int64 +} + +func listPullRequestStatement(baseRepoID int64, opts *PullRequestsOptions) *xorm.Session { + sess := x.Where("pull_request.base_repo_id=?", baseRepoID) + + sess.Join("INNER", "issue", "pull_request.issue_id = issue.id") + switch opts.State { + case "closed", "open": + sess.And("issue.is_closed=?", opts.State == "closed") + } + + return sess +} + +// PullRequests returns all pull requests for a base Repo by the given conditions +func PullRequests(baseRepoID int64, opts *PullRequestsOptions) ([]*PullRequest, int64, error) { + if opts.Page <= 0 { + opts.Page = 1 + } + + countSession := listPullRequestStatement(baseRepoID, opts) + maxResults, err := countSession.Count(new(PullRequest)) + if err != nil { + log.Error(4, "Count PRs", err) + return nil, maxResults, err + } + + prs := make([]*PullRequest, 0, ItemsPerPage) + findSession := listPullRequestStatement(baseRepoID, opts) + findSession.Limit(ItemsPerPage, (opts.Page-1)*ItemsPerPage) + return prs, maxResults, findSession.Find(&prs) +} + // GetUnmergedPullRequest returnss a pull request that is open and has not been merged // by given head/base and repo/branch. func GetUnmergedPullRequest(headRepoID, baseRepoID int64, headBranch, baseBranch string) (*PullRequest, error) { @@ -512,6 +576,26 @@ func GetUnmergedPullRequestsByBaseInfo(repoID int64, branch string) ([]*PullRequ Find(&prs) } +// GetPullRequestByIndex returns a pull request by the given index +func GetPullRequestByIndex(repoID int64, index int64) (*PullRequest, error) { + pr := &PullRequest{ + BaseRepoID: repoID, + Index: index, + } + + has, err := x.Get(pr) + if err != nil { + return nil, err + } else if !has { + return nil, ErrPullRequestNotExist{0, repoID, index, 0, "", ""} + } + + pr.LoadAttributes() + pr.LoadIssue() + + return pr, nil +} + func getPullRequestByID(e Engine, id int64) (*PullRequest, error) { pr := new(PullRequest) has, err := e.Id(id).Get(pr) |