Skip to content

Commit 0a426cc

Browse files
qwerty2876543
andauthored
Add API to get merged PR of a commit (#29243)
Adds a new API `/repos/{owner}/{repo}/commits/{sha}/pull` that allows you to get the merged PR associated to a commit. --------- Co-authored-by: 6543 <[email protected]>
1 parent 6e59665 commit 0a426cc

File tree

6 files changed

+128
-0
lines changed

6 files changed

+128
-0
lines changed

models/fixtures/pull_request.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
head_branch: branch1
1010
base_branch: master
1111
merge_base: 4a357436d925b5c974181ff12a994538ddc5a269
12+
merged_commit_id: 1a8823cd1a9549fde083f992f6b9b87a7ab74fb3
1213
has_merged: true
1314
merger_id: 2
1415

models/issues/pull.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,3 +1093,23 @@ func InsertPullRequests(ctx context.Context, prs ...*PullRequest) error {
10931093
}
10941094
return committer.Commit()
10951095
}
1096+
1097+
// GetPullRequestByMergedCommit returns a merged pull request by the given commit
1098+
func GetPullRequestByMergedCommit(ctx context.Context, repoID int64, sha string) (*PullRequest, error) {
1099+
pr := new(PullRequest)
1100+
has, err := db.GetEngine(ctx).Where("base_repo_id = ? AND merged_commit_id = ?", repoID, sha).Get(pr)
1101+
if err != nil {
1102+
return nil, err
1103+
} else if !has {
1104+
return nil, ErrPullRequestNotExist{0, 0, 0, repoID, "", ""}
1105+
}
1106+
1107+
if err = pr.LoadAttributes(ctx); err != nil {
1108+
return nil, err
1109+
}
1110+
if err = pr.LoadIssue(ctx); err != nil {
1111+
return nil, err
1112+
}
1113+
1114+
return pr, nil
1115+
}

models/issues/pull_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,18 @@ func TestGetApprovers(t *testing.T) {
339339
assert.EqualValues(t, expected, approvers)
340340
}
341341

342+
func TestGetPullRequestByMergedCommit(t *testing.T) {
343+
assert.NoError(t, unittest.PrepareTestDatabase())
344+
pr, err := issues_model.GetPullRequestByMergedCommit(db.DefaultContext, 1, "1a8823cd1a9549fde083f992f6b9b87a7ab74fb3")
345+
assert.NoError(t, err)
346+
assert.EqualValues(t, 1, pr.ID)
347+
348+
_, err = issues_model.GetPullRequestByMergedCommit(db.DefaultContext, 0, "1a8823cd1a9549fde083f992f6b9b87a7ab74fb3")
349+
assert.ErrorAs(t, err, &issues_model.ErrPullRequestNotExist{})
350+
_, err = issues_model.GetPullRequestByMergedCommit(db.DefaultContext, 1, "")
351+
assert.ErrorAs(t, err, &issues_model.ErrPullRequestNotExist{})
352+
}
353+
342354
func TestMigrate_InsertPullRequests(t *testing.T) {
343355
assert.NoError(t, unittest.PrepareTestDatabase())
344356
reponame := "repo1"

routers/api/v1/api.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,6 +1235,7 @@ func Routes() *web.Route {
12351235
m.Group("/{ref}", func() {
12361236
m.Get("/status", repo.GetCombinedCommitStatusByRef)
12371237
m.Get("/statuses", repo.GetCommitStatusesByRef)
1238+
m.Get("/pull", repo.GetCommitPullRequest)
12381239
}, context.ReferencesGitRepo())
12391240
}, reqRepoReader(unit.TypeCode))
12401241
m.Group("/git", func() {

routers/api/v1/repo/commits.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"net/http"
1111
"strconv"
1212

13+
issues_model "code.gitea.io/gitea/models/issues"
1314
user_model "code.gitea.io/gitea/models/user"
1415
"code.gitea.io/gitea/modules/context"
1516
"code.gitea.io/gitea/modules/git"
@@ -323,3 +324,53 @@ func DownloadCommitDiffOrPatch(ctx *context.APIContext) {
323324
return
324325
}
325326
}
327+
328+
// GetCommitPullRequest returns the pull request of the commit
329+
func GetCommitPullRequest(ctx *context.APIContext) {
330+
// swagger:operation GET /repos/{owner}/{repo}/commits/{sha}/pull repository repoGetCommitPullRequest
331+
// ---
332+
// summary: Get the pull request of the commit
333+
// produces:
334+
// - application/json
335+
// parameters:
336+
// - name: owner
337+
// in: path
338+
// description: owner of the repo
339+
// type: string
340+
// required: true
341+
// - name: repo
342+
// in: path
343+
// description: name of the repo
344+
// type: string
345+
// required: true
346+
// - name: sha
347+
// in: path
348+
// description: SHA of the commit to get
349+
// type: string
350+
// required: true
351+
// responses:
352+
// "200":
353+
// "$ref": "#/responses/PullRequest"
354+
// "404":
355+
// "$ref": "#/responses/notFound"
356+
357+
pr, err := issues_model.GetPullRequestByMergedCommit(ctx, ctx.Repo.Repository.ID, ctx.Params(":sha"))
358+
if err != nil {
359+
if issues_model.IsErrPullRequestNotExist(err) {
360+
ctx.Error(http.StatusNotFound, "GetPullRequestByMergedCommit", err)
361+
} else {
362+
ctx.Error(http.StatusInternalServerError, "GetPullRequestByIndex", err)
363+
}
364+
return
365+
}
366+
367+
if err = pr.LoadBaseRepo(ctx); err != nil {
368+
ctx.Error(http.StatusInternalServerError, "LoadBaseRepo", err)
369+
return
370+
}
371+
if err = pr.LoadHeadRepo(ctx); err != nil {
372+
ctx.Error(http.StatusInternalServerError, "LoadHeadRepo", err)
373+
return
374+
}
375+
ctx.JSON(http.StatusOK, convert.ToAPIPullRequest(ctx, pr, ctx.Doer))
376+
}

templates/swagger/v1_json.tmpl

Lines changed: 43 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)