Skip to content

Commit bf5af87

Browse files
yzzyxtechknowlogick
authored andcommitted
Show last commit status in pull request lists (#6465)
1 parent 09fb036 commit bf5af87

File tree

6 files changed

+144
-0
lines changed

6 files changed

+144
-0
lines changed

integrations/pull_status_test.go

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// Copyright 2019 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 integrations
5+
6+
import (
7+
"fmt"
8+
"net/http"
9+
"path"
10+
"testing"
11+
12+
"code.gitea.io/gitea/models"
13+
api "code.gitea.io/sdk/gitea"
14+
15+
"github.com/stretchr/testify/assert"
16+
)
17+
18+
func TestPullCreate_CommitStatus(t *testing.T) {
19+
prepareTestEnv(t)
20+
session := loginUser(t, "user1")
21+
testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
22+
testEditFileToNewBranch(t, session, "user1", "repo1", "master", "status1", "README.md", "status1")
23+
24+
url := path.Join("user1", "repo1", "compare", "master...status1")
25+
req := NewRequestWithValues(t, "POST", url,
26+
map[string]string{
27+
"_csrf": GetCSRF(t, session, url),
28+
"title": "pull request from status1",
29+
},
30+
)
31+
session.MakeRequest(t, req, http.StatusFound)
32+
33+
req = NewRequest(t, "GET", "/user1/repo1/pulls")
34+
resp := session.MakeRequest(t, req, http.StatusOK)
35+
doc := NewHTMLParser(t, resp.Body)
36+
37+
// Request repository commits page
38+
req = NewRequest(t, "GET", "/user1/repo1/pulls/1/commits")
39+
resp = session.MakeRequest(t, req, http.StatusOK)
40+
doc = NewHTMLParser(t, resp.Body)
41+
42+
// Get first commit URL
43+
commitURL, exists := doc.doc.Find("#commits-table tbody tr td.sha a").Last().Attr("href")
44+
assert.True(t, exists)
45+
assert.NotEmpty(t, commitURL)
46+
47+
commitID := path.Base(commitURL)
48+
49+
statusList := []models.CommitStatusState{
50+
models.CommitStatusPending,
51+
models.CommitStatusError,
52+
models.CommitStatusFailure,
53+
models.CommitStatusWarning,
54+
models.CommitStatusSuccess,
55+
}
56+
57+
statesIcons := map[models.CommitStatusState]string{
58+
models.CommitStatusPending: "circle icon yellow",
59+
models.CommitStatusSuccess: "check icon green",
60+
models.CommitStatusError: "warning icon red",
61+
models.CommitStatusFailure: "remove icon red",
62+
models.CommitStatusWarning: "warning sign icon yellow",
63+
}
64+
65+
// Update commit status, and check if icon is updated as well
66+
for _, status := range statusList {
67+
68+
// Call API to add status for commit
69+
token := getTokenForLoggedInUser(t, session)
70+
req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/user1/repo1/statuses/%s?token=%s", commitID, token),
71+
api.CreateStatusOption{
72+
State: api.StatusState(status),
73+
TargetURL: "http://test.ci/",
74+
Description: "",
75+
Context: "testci",
76+
},
77+
)
78+
session.MakeRequest(t, req, http.StatusCreated)
79+
80+
req = NewRequestf(t, "GET", "/user1/repo1/pulls/1/commits")
81+
resp = session.MakeRequest(t, req, http.StatusOK)
82+
doc = NewHTMLParser(t, resp.Body)
83+
84+
commitURL, exists = doc.doc.Find("#commits-table tbody tr td.sha a").Last().Attr("href")
85+
assert.True(t, exists)
86+
assert.NotEmpty(t, commitURL)
87+
assert.EqualValues(t, commitID, path.Base(commitURL))
88+
89+
cls, ok := doc.doc.Find("#commits-table tbody tr td.message i.commit-status").Last().Attr("class")
90+
assert.True(t, ok)
91+
assert.EqualValues(t, "commit-status "+statesIcons[status], cls)
92+
}
93+
}

models/pull.go

+25
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,31 @@ func (pr *PullRequest) CanAutoMerge() bool {
292292
return pr.Status == PullRequestStatusMergeable
293293
}
294294

295+
// GetLastCommitStatus returns the last commit status for this pull request.
296+
func (pr *PullRequest) GetLastCommitStatus() (status *CommitStatus, err error) {
297+
if err = pr.GetHeadRepo(); err != nil {
298+
return nil, err
299+
}
300+
301+
headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath())
302+
if err != nil {
303+
return nil, err
304+
}
305+
306+
repo := pr.HeadRepo
307+
lastCommitID, err := headGitRepo.GetBranchCommitID(pr.HeadBranch)
308+
if err != nil {
309+
return nil, err
310+
}
311+
312+
var statusList []*CommitStatus
313+
statusList, err = GetLatestCommitStatus(repo, lastCommitID, 0)
314+
if err != nil {
315+
return nil, err
316+
}
317+
return CalcCommitStatus(statusList), nil
318+
}
319+
295320
// MergeStyle represents the approach to merge commits into base branch.
296321
type MergeStyle string
297322

routers/repo/issue.go

+8
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,8 @@ func issues(ctx *context.Context, milestoneID int64, isPullOption util.OptionalB
214214
}
215215
}
216216

217+
var commitStatus = make(map[int64]*models.CommitStatus, len(issues))
218+
217219
// Get posters.
218220
for i := range issues {
219221
// Check read status
@@ -223,8 +225,14 @@ func issues(ctx *context.Context, milestoneID int64, isPullOption util.OptionalB
223225
ctx.ServerError("GetIsRead", err)
224226
return
225227
}
228+
229+
if isPullOption == util.OptionalBoolTrue {
230+
commitStatus[issues[i].PullRequest.ID], _ = issues[i].PullRequest.GetLastCommitStatus()
231+
}
226232
}
233+
227234
ctx.Data["Issues"] = issues
235+
ctx.Data["CommitStatus"] = commitStatus
228236

229237
// Get assignees.
230238
ctx.Data["Assignees"], err = repo.GetAssignees()

routers/user/home.go

+6
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,13 @@ func Issues(ctx *context.Context) {
319319
return
320320
}
321321

322+
var commitStatus = make(map[int64]*models.CommitStatus, len(issues))
322323
for _, issue := range issues {
323324
issue.Repo = showReposMap[issue.RepoID]
325+
326+
if isPullList {
327+
commitStatus[issue.PullRequest.ID], _ = issue.PullRequest.GetLastCommitStatus()
328+
}
324329
}
325330

326331
issueStats, err := models.GetUserIssueStats(models.UserIssueStatsOptions{
@@ -344,6 +349,7 @@ func Issues(ctx *context.Context) {
344349
}
345350

346351
ctx.Data["Issues"] = issues
352+
ctx.Data["CommitStatus"] = commitStatus
347353
ctx.Data["Repos"] = showRepos
348354
ctx.Data["Counts"] = counts
349355
ctx.Data["Page"] = paginater.New(total, setting.UI.IssuePagingNum, page, 5)

templates/repo/issue/list.tmpl

+6
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,12 @@
203203
<div class="ui {{if .IsRead}}black{{else}}green{{end}} label">#{{.Index}}</div>
204204
<a class="title has-emoji" href="{{$.Link}}/{{.Index}}">{{.Title}}</a>
205205

206+
{{if .IsPull }}
207+
{{if (index $.CommitStatus .ID)}}
208+
{{template "repo/commit_status" (index $.CommitStatus .ID)}}
209+
{{end}}
210+
{{end}}
211+
206212
{{if .Ref}}
207213
<a class="ui label" href="{{$.RepoLink}}/src/branch/{{.Ref}}">{{.Ref}}</a>
208214
{{end}}

templates/user/dashboard/issues.tmpl

+6
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@
6666
<div class="ui label">{{if not $.RepoID}}{{.Repo.FullName}}{{end}}#{{.Index}}</div>
6767
<a class="title has-emoji" href="{{AppSubUrl}}/{{.Repo.Owner.Name}}/{{.Repo.Name}}/issues/{{.Index}}">{{.Title}}</a>
6868

69+
{{if .IsPull }}
70+
{{if (index $.CommitStatus .ID)}}
71+
{{template "repo/commit_status" (index $.CommitStatus .ID)}}
72+
{{end}}
73+
{{end}}
74+
6975
{{with .Labels}}
7076
{{/* If we have any labels, we should show them
7177
with a 2.5 line height, this way they don't look

0 commit comments

Comments
 (0)