Display commit status on landing page of repo (#1784)
* Display commit status on landing page of repo * improve last status of commits and add link to ci * fix last commit status since the order of ids are desc
This commit is contained in:
		
							parent
							
								
									a89692d158
								
							
						
					
					
						commit
						be3319b3d5
					
				| @ -126,6 +126,26 @@ func (status *CommitStatus) APIFormat() *api.Status { | |||||||
| 	return apiStatus | 	return apiStatus | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // CalcCommitStatus returns commit status state via some status, the commit statues should order by id desc
 | ||||||
|  | func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus { | ||||||
|  | 	var lastStatus *CommitStatus | ||||||
|  | 	var state CommitStatusState | ||||||
|  | 	for _, status := range statuses { | ||||||
|  | 		if status.State.IsWorseThan(state) { | ||||||
|  | 			state = status.State | ||||||
|  | 			lastStatus = status | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if lastStatus == nil { | ||||||
|  | 		if len(statuses) > 0 { | ||||||
|  | 			lastStatus = statuses[0] | ||||||
|  | 		} else { | ||||||
|  | 			lastStatus = &CommitStatus{} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return lastStatus | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // GetCommitStatuses returns all statuses for a given commit.
 | // GetCommitStatuses returns all statuses for a given commit.
 | ||||||
| func GetCommitStatuses(repo *Repository, sha string, page int) ([]*CommitStatus, error) { | func GetCommitStatuses(repo *Repository, sha string, page int) ([]*CommitStatus, error) { | ||||||
| 	statuses := make([]*CommitStatus, 0, 10) | 	statuses := make([]*CommitStatus, 0, 10) | ||||||
| @ -255,8 +275,7 @@ func NewCommitStatus(repo *Repository, creator *User, sha string, status *Commit | |||||||
| 
 | 
 | ||||||
| // SignCommitWithStatuses represents a commit with validation of signature and status state.
 | // SignCommitWithStatuses represents a commit with validation of signature and status state.
 | ||||||
| type SignCommitWithStatuses struct { | type SignCommitWithStatuses struct { | ||||||
| 	Statuses []*CommitStatus | 	Status *CommitStatus | ||||||
| 	State    CommitStatusState |  | ||||||
| 	*SignCommit | 	*SignCommit | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -265,25 +284,18 @@ func ParseCommitsWithStatus(oldCommits *list.List, repo *Repository) *list.List | |||||||
| 	var ( | 	var ( | ||||||
| 		newCommits = list.New() | 		newCommits = list.New() | ||||||
| 		e          = oldCommits.Front() | 		e          = oldCommits.Front() | ||||||
| 		err        error |  | ||||||
| 	) | 	) | ||||||
| 
 | 
 | ||||||
| 	for e != nil { | 	for e != nil { | ||||||
| 		c := e.Value.(SignCommit) | 		c := e.Value.(SignCommit) | ||||||
| 		commit := SignCommitWithStatuses{ | 		commit := SignCommitWithStatuses{ | ||||||
| 			SignCommit: &c, | 			SignCommit: &c, | ||||||
| 			State:      "", |  | ||||||
| 			Statuses:   make([]*CommitStatus, 0), |  | ||||||
| 		} | 		} | ||||||
| 		commit.Statuses, err = GetLatestCommitStatus(repo, commit.ID.String(), 0) | 		statuses, err := GetLatestCommitStatus(repo, commit.ID.String(), 0) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			log.Error(3, "GetLatestCommitStatus: %v", err) | 			log.Error(3, "GetLatestCommitStatus: %v", err) | ||||||
| 		} else { | 		} else { | ||||||
| 			for _, status := range commit.Statuses { | 			commit.Status = CalcCommitStatus(statuses) | ||||||
| 				if status.State.IsWorseThan(commit.State) { |  | ||||||
| 					commit.State = status.State |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		newCommits.PushBack(commit) | 		newCommits.PushBack(commit) | ||||||
|  | |||||||
| @ -13,7 +13,9 @@ import ( | |||||||
| 	"code.gitea.io/gitea/models" | 	"code.gitea.io/gitea/models" | ||||||
| 	"code.gitea.io/gitea/modules/base" | 	"code.gitea.io/gitea/modules/base" | ||||||
| 	"code.gitea.io/gitea/modules/context" | 	"code.gitea.io/gitea/modules/context" | ||||||
|  | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
|  | 
 | ||||||
| 	"github.com/Unknwon/paginater" | 	"github.com/Unknwon/paginater" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| @ -208,6 +210,14 @@ func Diff(ctx *context.Context) { | |||||||
| 	if len(commitID) != 40 { | 	if len(commitID) != 40 { | ||||||
| 		commitID = commit.ID.String() | 		commitID = commit.ID.String() | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	statuses, err := models.GetLatestCommitStatus(ctx.Repo.Repository, ctx.Repo.Commit.ID.String(), 0) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(3, "GetLatestCommitStatus: %v", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	ctx.Data["CommitStatus"] = models.CalcCommitStatus(statuses) | ||||||
|  | 
 | ||||||
| 	diff, err := models.GetDiffCommit(models.RepoPath(userName, repoName), | 	diff, err := models.GetDiffCommit(models.RepoPath(userName, repoName), | ||||||
| 		commitID, setting.Git.MaxGitDiffLines, | 		commitID, setting.Git.MaxGitDiffLines, | ||||||
| 		setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles) | 		setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles) | ||||||
|  | |||||||
| @ -1,3 +1,4 @@ | |||||||
|  | // Copyright 2017 The Gitea Authors. All rights reserved.
 | ||||||
| // Copyright 2014 The Gogs Authors. All rights reserved.
 | // Copyright 2014 The Gogs Authors. All rights reserved.
 | ||||||
| // Use of this source code is governed by a MIT-style
 | // Use of this source code is governed by a MIT-style
 | ||||||
| // license that can be found in the LICENSE file.
 | // license that can be found in the LICENSE file.
 | ||||||
| @ -120,6 +121,13 @@ func renderDirectory(ctx *context.Context, treeLink string) { | |||||||
| 	ctx.Data["LatestCommitVerification"] = models.ParseCommitWithSignature(latestCommit) | 	ctx.Data["LatestCommitVerification"] = models.ParseCommitWithSignature(latestCommit) | ||||||
| 	ctx.Data["LatestCommitUser"] = models.ValidateCommitWithEmail(latestCommit) | 	ctx.Data["LatestCommitUser"] = models.ValidateCommitWithEmail(latestCommit) | ||||||
| 
 | 
 | ||||||
|  | 	statuses, err := models.GetLatestCommitStatus(ctx.Repo.Repository, ctx.Repo.Commit.ID.String(), 0) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(3, "GetLatestCommitStatus: %v", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	ctx.Data["LatestCommitStatus"] = models.CalcCommitStatus(statuses) | ||||||
|  | 
 | ||||||
| 	// Check permission to add or upload new file.
 | 	// Check permission to add or upload new file.
 | ||||||
| 	if ctx.Repo.IsWriter() && ctx.Repo.IsViewBranch { | 	if ctx.Repo.IsWriter() && ctx.Repo.IsViewBranch { | ||||||
| 		ctx.Data["CanAddFile"] = true | 		ctx.Data["CanAddFile"] = true | ||||||
|  | |||||||
							
								
								
									
										15
									
								
								templates/repo/commit_status.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								templates/repo/commit_status.tmpl
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | |||||||
|  | {{if eq .State "pending"}} | ||||||
|  |     <a href="{{.TargetURL}}" target=_blank><i class="commit-status circle icon yellow"></i></a> | ||||||
|  | {{end}} | ||||||
|  | {{if eq .State "success"}} | ||||||
|  |     <a href="{{.TargetURL}}" target=_blank><i class="commit-status check icon green"></i></a> | ||||||
|  | {{end}} | ||||||
|  | {{if eq .State "error"}} | ||||||
|  |     <a href="{{.TargetURL}}" target=_blank><i class="commit-status warning icon red"></i></a> | ||||||
|  | {{end}} | ||||||
|  | {{if eq .State "failure"}} | ||||||
|  |     <a href="{{.TargetURL}}" target=_blank><i class="commit-status remove icon red"></i></a> | ||||||
|  | {{end}} | ||||||
|  | {{if eq .State "warning"}} | ||||||
|  |     <a href="{{.TargetURL}}" target=_blank><i class="commit-status warning sign icon yellow"></i></a> | ||||||
|  | {{end}} | ||||||
| @ -61,21 +61,7 @@ | |||||||
| 						</td> | 						</td> | ||||||
| 						<td class="message collapsing"> | 						<td class="message collapsing"> | ||||||
| 							<span class="has-emoji{{if gt .ParentCount 1}} grey text{{end}}">{{RenderCommitMessage false .Summary $.RepoLink $.Repository.ComposeMetas}}</span> | 							<span class="has-emoji{{if gt .ParentCount 1}} grey text{{end}}">{{RenderCommitMessage false .Summary $.RepoLink $.Repository.ComposeMetas}}</span> | ||||||
| 							{{if eq .State "pending"}} | 							{{template "repo/commit_status" .Status}} | ||||||
| 							<i class="commit-status circle icon yellow"></i> |  | ||||||
| 							{{end}} |  | ||||||
| 							{{if eq .State "success"}} |  | ||||||
| 							<i class="commit-status check icon green"></i> |  | ||||||
| 							{{end}} |  | ||||||
| 							{{if eq .State "error"}} |  | ||||||
| 							<i class="commit-status warning icon red"></i> |  | ||||||
| 							{{end}} |  | ||||||
| 							{{if eq .State "failure"}} |  | ||||||
| 							<i class="commit-status remove icon red"></i> |  | ||||||
| 							{{end}} |  | ||||||
| 							{{if eq .State "warning"}} |  | ||||||
| 							<i class="commit-status warning sign icon yellow"></i> |  | ||||||
| 							{{end}} |  | ||||||
| 						</td> | 						</td> | ||||||
| 						<td class="grey text right aligned">{{TimeSince .Author.When $.Lang}}</td> | 						<td class="grey text right aligned">{{TimeSince .Author.When $.Lang}}</td> | ||||||
| 					</tr> | 					</tr> | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ | |||||||
| 				<a class="ui floated right blue tiny button" href="{{EscapePound .SourcePath}}"> | 				<a class="ui floated right blue tiny button" href="{{EscapePound .SourcePath}}"> | ||||||
| 					{{.i18n.Tr "repo.diff.browse_source"}} | 					{{.i18n.Tr "repo.diff.browse_source"}} | ||||||
| 				</a> | 				</a> | ||||||
| 				{{RenderCommitMessage true .Commit.Message $.RepoLink $.Repository.ComposeMetas}} | 				<h3>{{RenderCommitMessage false .Commit.Message $.RepoLink $.Repository.ComposeMetas}}{{template "repo/commit_status" .CommitStatus}}</h3> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div class="ui attached info segment {{if .Commit.Signature}} isSigned {{if .Verification.Verified }} isVerified {{end}}{{end}}"> | 			<div class="ui attached info segment {{if .Commit.Signature}} isSigned {{if .Verification.Verified }} isVerified {{end}}{{end}}"> | ||||||
| 				{{if .Author}} | 				{{if .Author}} | ||||||
|  | |||||||
| @ -25,7 +25,8 @@ | |||||||
| 							</div> | 							</div> | ||||||
| 						{{end}} | 						{{end}} | ||||||
| 				</a> | 				</a> | ||||||
| 				<span class="grey has-emoji">{{RenderCommitMessage false .LatestCommit.Summary .RepoLink $.Repository.ComposeMetas}}</span> | 				<span class="grey has-emoji">{{RenderCommitMessage false .LatestCommit.Summary .RepoLink $.Repository.ComposeMetas}} | ||||||
|  | 				{{template "repo/commit_status" .LatestCommitStatus}}</span> | ||||||
| 			</th> | 			</th> | ||||||
| 			<th class="nine wide"> | 			<th class="nine wide"> | ||||||
| 			</th> | 			</th> | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user