mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 20:36:07 +01:00 
			
		
		
		
	finish PR UI
This commit is contained in:
		@@ -528,6 +528,11 @@ func runWeb(ctx *cli.Context) {
 | 
				
			|||||||
		m.Get("/archive/*", repo.Download)
 | 
							m.Get("/archive/*", repo.Download)
 | 
				
			||||||
		m.Get("/pulls2/", repo.PullRequest2)
 | 
							m.Get("/pulls2/", repo.PullRequest2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m.Group("/pulls/:index", func() {
 | 
				
			||||||
 | 
								m.Get("/commits", repo.ViewPullCommits)
 | 
				
			||||||
 | 
								m.Get("/files", repo.ViewPullFiles)
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		m.Group("", func() {
 | 
							m.Group("", func() {
 | 
				
			||||||
			m.Get("/src/*", repo.Home)
 | 
								m.Get("/src/*", repo.Home)
 | 
				
			||||||
			m.Get("/raw/*", repo.SingleDownload)
 | 
								m.Get("/raw/*", repo.SingleDownload)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -462,12 +462,20 @@ issues.label_deletion_success = Label has been deleted successfully!
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
pulls.compare_changes = Compare Changes
 | 
					pulls.compare_changes = Compare Changes
 | 
				
			||||||
pulls.compare_changes_desc = Compare two branches and make a pull request for changes.
 | 
					pulls.compare_changes_desc = Compare two branches and make a pull request for changes.
 | 
				
			||||||
 | 
					pulls.compare_base = base
 | 
				
			||||||
 | 
					pulls.compare_compare = compare
 | 
				
			||||||
 | 
					pulls.filter_branch = Filter branch
 | 
				
			||||||
pulls.no_results = No results found.
 | 
					pulls.no_results = No results found.
 | 
				
			||||||
pulls.create = Create Pull Request
 | 
					pulls.create = Create Pull Request
 | 
				
			||||||
pulls.title_desc = wants to merge %[1]d commits from <code>%[2]s</code> into <code>%[3]s</code>
 | 
					pulls.title_desc = wants to merge %[1]d commits from <code>%[2]s</code> into <code>%[3]s</code>
 | 
				
			||||||
pulls.tab_conversation = Conversation
 | 
					pulls.tab_conversation = Conversation
 | 
				
			||||||
pulls.tab_commits = Commits
 | 
					pulls.tab_commits = Commits
 | 
				
			||||||
pulls.tab_files = Files changed
 | 
					pulls.tab_files = Files changed
 | 
				
			||||||
 | 
					pulls.reopen_to_merge = Please reopen this pull request to perform merge operation.
 | 
				
			||||||
 | 
					pulls.can_auto_merge_desc = You can perform auto-merge operation on this pull request.
 | 
				
			||||||
 | 
					pulls.cannot_auto_merge_desc = You can't perform auto-merge operation because there are conflicts between commits.
 | 
				
			||||||
 | 
					pulls.cannot_auto_merge_helper = Please use commond line tool to solve it.
 | 
				
			||||||
 | 
					pulls.merge_pull_request = Merge Pull Request
 | 
				
			||||||
 | 
					
 | 
				
			||||||
milestones.new = New Milestone
 | 
					milestones.new = New Milestone
 | 
				
			||||||
milestones.open_tab = %d Open
 | 
					milestones.open_tab = %d Open
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -857,6 +857,7 @@ type PullRepo struct {
 | 
				
			|||||||
	MergeBase    string `xorm:"VARCHAR(40)"`
 | 
						MergeBase    string `xorm:"VARCHAR(40)"`
 | 
				
			||||||
	Type         PullRequestType
 | 
						Type         PullRequestType
 | 
				
			||||||
	CanAutoMerge bool
 | 
						CanAutoMerge bool
 | 
				
			||||||
 | 
						HasMerged    bool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (pr *PullRepo) AfterSet(colName string, _ xorm.Cell) {
 | 
					func (pr *PullRepo) AfterSet(colName string, _ xorm.Cell) {
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -7,6 +7,7 @@ package git
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"bufio"
 | 
						"bufio"
 | 
				
			||||||
	"container/list"
 | 
						"container/list"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -132,3 +133,30 @@ func (c *Commit) GetSubModules() (map[string]*SubModule, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return c.submodules, nil
 | 
						return c.submodules, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func isImageFile(data []byte) (string, bool) {
 | 
				
			||||||
 | 
						contentType := http.DetectContentType(data)
 | 
				
			||||||
 | 
						if strings.Index(contentType, "image/") != -1 {
 | 
				
			||||||
 | 
							return contentType, true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return contentType, false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *Commit) IsImageFile(name string) bool {
 | 
				
			||||||
 | 
						blob, err := c.GetBlobByPath(name)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dataRc, err := blob.Data()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						buf := make([]byte, 1024)
 | 
				
			||||||
 | 
						n, _ := dataRc.Read(buf)
 | 
				
			||||||
 | 
						if n > 0 {
 | 
				
			||||||
 | 
							buf = buf[:n]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, isImage := isImageFile(buf)
 | 
				
			||||||
 | 
						return isImage
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								public/css/gogs.min.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								public/css/gogs.min.css
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -171,6 +171,12 @@
 | 
				
			|||||||
		    box-shadow: none;
 | 
							    box-shadow: none;
 | 
				
			||||||
		    background-color: inherit;
 | 
							    background-color: inherit;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								.merge.box {
 | 
				
			||||||
 | 
									.avatar {
 | 
				
			||||||
 | 
										margin-left: 10px;
 | 
				
			||||||
 | 
										margin-top: 10px;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		.comment-list {
 | 
							.comment-list {
 | 
				
			||||||
			&:before {
 | 
								&:before {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -204,25 +204,6 @@ func Diff(ctx *middleware.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	isImageFile := func(name string) bool {
 | 
					 | 
				
			||||||
		blob, err := ctx.Repo.Commit.GetBlobByPath(name)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return false
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dataRc, err := blob.Data()
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return false
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		buf := make([]byte, 1024)
 | 
					 | 
				
			||||||
		n, _ := dataRc.Read(buf)
 | 
					 | 
				
			||||||
		if n > 0 {
 | 
					 | 
				
			||||||
			buf = buf[:n]
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, isImage := base.IsImageFile(buf)
 | 
					 | 
				
			||||||
		return isImage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	parents := make([]string, commit.ParentCount())
 | 
						parents := make([]string, commit.ParentCount())
 | 
				
			||||||
	for i := 0; i < commit.ParentCount(); i++ {
 | 
						for i := 0; i < commit.ParentCount(); i++ {
 | 
				
			||||||
		sha, err := commit.ParentId(i)
 | 
							sha, err := commit.ParentId(i)
 | 
				
			||||||
@@ -235,7 +216,7 @@ func Diff(ctx *middleware.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	ctx.Data["Username"] = userName
 | 
						ctx.Data["Username"] = userName
 | 
				
			||||||
	ctx.Data["Reponame"] = repoName
 | 
						ctx.Data["Reponame"] = repoName
 | 
				
			||||||
	ctx.Data["IsImageFile"] = isImageFile
 | 
						ctx.Data["IsImageFile"] = commit.IsImageFile
 | 
				
			||||||
	ctx.Data["Title"] = commit.Summary() + " · " + base.ShortSha(commitID)
 | 
						ctx.Data["Title"] = commit.Summary() + " · " + base.ShortSha(commitID)
 | 
				
			||||||
	ctx.Data["Commit"] = commit
 | 
						ctx.Data["Commit"] = commit
 | 
				
			||||||
	ctx.Data["Author"] = models.ValidateCommitWithEmail(commit)
 | 
						ctx.Data["Author"] = models.ValidateCommitWithEmail(commit)
 | 
				
			||||||
@@ -271,25 +252,6 @@ func CompareDiff(ctx *middleware.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	isImageFile := func(name string) bool {
 | 
					 | 
				
			||||||
		blob, err := commit.GetBlobByPath(name)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return false
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dataRc, err := blob.Data()
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return false
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		buf := make([]byte, 1024)
 | 
					 | 
				
			||||||
		n, _ := dataRc.Read(buf)
 | 
					 | 
				
			||||||
		if n > 0 {
 | 
					 | 
				
			||||||
			buf = buf[:n]
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, isImage := base.IsImageFile(buf)
 | 
					 | 
				
			||||||
		return isImage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	commits, err := commit.CommitsBeforeUntil(beforeCommitID)
 | 
						commits, err := commit.CommitsBeforeUntil(beforeCommitID)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		ctx.Handle(500, "CommitsBeforeUntil", err)
 | 
							ctx.Handle(500, "CommitsBeforeUntil", err)
 | 
				
			||||||
@@ -304,7 +266,7 @@ func CompareDiff(ctx *middleware.Context) {
 | 
				
			|||||||
	ctx.Data["AfterCommitID"] = afterCommitID
 | 
						ctx.Data["AfterCommitID"] = afterCommitID
 | 
				
			||||||
	ctx.Data["Username"] = userName
 | 
						ctx.Data["Username"] = userName
 | 
				
			||||||
	ctx.Data["Reponame"] = repoName
 | 
						ctx.Data["Reponame"] = repoName
 | 
				
			||||||
	ctx.Data["IsImageFile"] = isImageFile
 | 
						ctx.Data["IsImageFile"] = commit.IsImageFile
 | 
				
			||||||
	ctx.Data["Title"] = "Comparing " + base.ShortSha(beforeCommitID) + "..." + base.ShortSha(afterCommitID) + " · " + userName + "/" + repoName
 | 
						ctx.Data["Title"] = "Comparing " + base.ShortSha(beforeCommitID) + "..." + base.ShortSha(afterCommitID) + " · " + userName + "/" + repoName
 | 
				
			||||||
	ctx.Data["Commit"] = commit
 | 
						ctx.Data["Commit"] = commit
 | 
				
			||||||
	ctx.Data["Diff"] = diff
 | 
						ctx.Data["Diff"] = diff
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,6 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/auth"
 | 
						"github.com/gogits/gogs/modules/auth"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/base"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/git"
 | 
					 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/mailer"
 | 
						"github.com/gogits/gogs/modules/mailer"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware"
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
@@ -427,7 +426,6 @@ func UploadIssueAttachment(ctx *middleware.Context) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ViewIssue(ctx *middleware.Context) {
 | 
					func ViewIssue(ctx *middleware.Context) {
 | 
				
			||||||
	ctx.Data["PageIsIssueList"] = true
 | 
					 | 
				
			||||||
	ctx.Data["RequireDropzone"] = true
 | 
						ctx.Data["RequireDropzone"] = true
 | 
				
			||||||
	renderAttachmentSettings(ctx)
 | 
						renderAttachmentSettings(ctx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -451,6 +449,13 @@ func ViewIssue(ctx *middleware.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if issue.IsPull {
 | 
				
			||||||
 | 
							ctx.Data["PageIsPullList"] = true
 | 
				
			||||||
 | 
							ctx.Data["PageIsPullConversation"] = true
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							ctx.Data["PageIsIssueList"] = true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err = issue.GetPoster(); err != nil {
 | 
						if err = issue.GetPoster(); err != nil {
 | 
				
			||||||
		ctx.Handle(500, "GetPoster", err)
 | 
							ctx.Handle(500, "GetPoster", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -461,29 +466,10 @@ func ViewIssue(ctx *middleware.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Get more information if it's a pull request.
 | 
						// Get more information if it's a pull request.
 | 
				
			||||||
	if issue.IsPull {
 | 
						if issue.IsPull {
 | 
				
			||||||
		ctx.Data["HeadTarget"] = issue.PullRepo.HeadUserName + "/" + issue.PullRepo.HeadBarcnh
 | 
							PrepareViewPullInfo(ctx, issue)
 | 
				
			||||||
		ctx.Data["BaseTarget"] = ctx.Repo.Owner.Name + "/" + issue.PullRepo.BaseBranch
 | 
							if ctx.Written() {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		headRepoPath, err := issue.PullRepo.HeadRepo.RepoPath()
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			ctx.Handle(500, "PullRepo.HeadRepo.RepoPath", err)
 | 
					 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					 | 
				
			||||||
		headGitRepo, err := git.OpenRepository(headRepoPath)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			ctx.Handle(500, "OpenRepository", err)
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		prInfo, err := headGitRepo.GetPullRequestInfo(models.RepoPath(repo.Owner.Name, repo.Name),
 | 
					 | 
				
			||||||
			issue.PullRepo.BaseBranch, issue.PullRepo.HeadBarcnh)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			ctx.Handle(500, "GetPullRequestInfo", err)
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx.Data["NumCommits"] = prInfo.Commits.Len()
 | 
					 | 
				
			||||||
		ctx.Data["NumFiles"] = prInfo.NumFiles
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Metas.
 | 
						// Metas.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,6 +23,8 @@ const (
 | 
				
			|||||||
	FORK         base.TplName = "repo/pulls/fork"
 | 
						FORK         base.TplName = "repo/pulls/fork"
 | 
				
			||||||
	COMPARE_PULL base.TplName = "repo/pulls/compare"
 | 
						COMPARE_PULL base.TplName = "repo/pulls/compare"
 | 
				
			||||||
	PULLS        base.TplName = "repo/pulls"
 | 
						PULLS        base.TplName = "repo/pulls"
 | 
				
			||||||
 | 
						PULL_COMMITS base.TplName = "repo/pulls/commits"
 | 
				
			||||||
 | 
						PULL_FILES   base.TplName = "repo/pulls/files"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getForkRepository(ctx *middleware.Context) *models.Repository {
 | 
					func getForkRepository(ctx *middleware.Context) *models.Repository {
 | 
				
			||||||
@@ -131,7 +133,140 @@ func Pulls(ctx *middleware.Context) {
 | 
				
			|||||||
	ctx.HTML(200, PULLS)
 | 
						ctx.HTML(200, PULLS)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// func ViewPull
 | 
					func checkPullInfo(ctx *middleware.Context) *models.Issue {
 | 
				
			||||||
 | 
						pull, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							if models.IsErrIssueNotExist(err) {
 | 
				
			||||||
 | 
								ctx.Handle(404, "GetIssueByIndex", err)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								ctx.Handle(500, "GetIssueByIndex", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ctx.Data["Title"] = pull.Name
 | 
				
			||||||
 | 
						ctx.Data["Issue"] = pull
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if !pull.IsPull {
 | 
				
			||||||
 | 
							ctx.Handle(404, "ViewPullCommits", nil)
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err = pull.GetPoster(); err != nil {
 | 
				
			||||||
 | 
							ctx.Handle(500, "GetPoster", err)
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ctx.IsSigned {
 | 
				
			||||||
 | 
							// Update issue-user.
 | 
				
			||||||
 | 
							if err = pull.ReadBy(ctx.User.Id); err != nil {
 | 
				
			||||||
 | 
								ctx.Handle(500, "ReadBy", err)
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return pull
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func PrepareViewPullInfo(ctx *middleware.Context, pull *models.Issue) *git.PullRequestInfo {
 | 
				
			||||||
 | 
						repo := ctx.Repo.Repository
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.Data["HeadTarget"] = pull.PullRepo.HeadUserName + "/" + pull.PullRepo.HeadBarcnh
 | 
				
			||||||
 | 
						ctx.Data["BaseTarget"] = ctx.Repo.Owner.Name + "/" + pull.PullRepo.BaseBranch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						headRepoPath, err := pull.PullRepo.HeadRepo.RepoPath()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							ctx.Handle(500, "PullRepo.HeadRepo.RepoPath", err)
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						headGitRepo, err := git.OpenRepository(headRepoPath)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							ctx.Handle(500, "OpenRepository", err)
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						prInfo, err := headGitRepo.GetPullRequestInfo(models.RepoPath(repo.Owner.Name, repo.Name),
 | 
				
			||||||
 | 
							pull.PullRepo.BaseBranch, pull.PullRepo.HeadBarcnh)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							ctx.Handle(500, "GetPullRequestInfo", err)
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ctx.Data["NumCommits"] = prInfo.Commits.Len()
 | 
				
			||||||
 | 
						ctx.Data["NumFiles"] = prInfo.NumFiles
 | 
				
			||||||
 | 
						return prInfo
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ViewPullCommits(ctx *middleware.Context) {
 | 
				
			||||||
 | 
						ctx.Data["PageIsPullCommits"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pull := checkPullInfo(ctx)
 | 
				
			||||||
 | 
						if ctx.Written() {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						prInfo := PrepareViewPullInfo(ctx, pull)
 | 
				
			||||||
 | 
						if ctx.Written() {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						prInfo.Commits = models.ValidateCommitsWithEmails(prInfo.Commits)
 | 
				
			||||||
 | 
						ctx.Data["Commits"] = prInfo.Commits
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.HTML(200, PULL_COMMITS)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ViewPullFiles(ctx *middleware.Context) {
 | 
				
			||||||
 | 
						ctx.Data["PageIsPullFiles"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pull := checkPullInfo(ctx)
 | 
				
			||||||
 | 
						if ctx.Written() {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						prInfo := PrepareViewPullInfo(ctx, pull)
 | 
				
			||||||
 | 
						if ctx.Written() {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_ = prInfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						headRepoPath := models.RepoPath(pull.PullRepo.HeadUserName, pull.PullRepo.HeadRepo.Name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						headGitRepo, err := git.OpenRepository(headRepoPath)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							ctx.Handle(500, "OpenRepository", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						headCommitID, err := headGitRepo.GetCommitIdOfBranch(pull.PullRepo.HeadBarcnh)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							ctx.Handle(500, "GetCommitIdOfBranch", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						diff, err := models.GetDiffRange(headRepoPath,
 | 
				
			||||||
 | 
							prInfo.MergeBase, headCommitID, setting.Git.MaxGitDiffLines)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							ctx.Handle(500, "GetDiffRange", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ctx.Data["Diff"] = diff
 | 
				
			||||||
 | 
						ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						headCommit, err := headGitRepo.GetCommit(headCommitID)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							ctx.Handle(500, "GetCommit", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						headTarget := path.Join(pull.PullRepo.HeadUserName, pull.PullRepo.HeadRepo.Name)
 | 
				
			||||||
 | 
						ctx.Data["Username"] = pull.PullRepo.HeadUserName
 | 
				
			||||||
 | 
						ctx.Data["Reponame"] = pull.PullRepo.HeadRepo.Name
 | 
				
			||||||
 | 
						ctx.Data["IsImageFile"] = headCommit.IsImageFile
 | 
				
			||||||
 | 
						ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", headCommitID)
 | 
				
			||||||
 | 
						ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", prInfo.MergeBase)
 | 
				
			||||||
 | 
						ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "raw", headCommitID)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.HTML(200, PULL_FILES)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ParseCompareInfo(ctx *middleware.Context) (*models.User, *models.Repository, *git.Repository, *git.PullRequestInfo, string, string) {
 | 
					func ParseCompareInfo(ctx *middleware.Context) (*models.User, *models.Repository, *git.Repository, *git.PullRequestInfo, string, string) {
 | 
				
			||||||
	// Get compare branch information.
 | 
						// Get compare branch information.
 | 
				
			||||||
@@ -248,34 +383,18 @@ func PrepareCompareDiff(
 | 
				
			|||||||
		ctx.Handle(500, "GetCommit", err)
 | 
							ctx.Handle(500, "GetCommit", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	isImageFile := func(name string) bool {
 | 
					 | 
				
			||||||
		blob, err := headCommit.GetBlobByPath(name)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return false
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dataRc, err := blob.Data()
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return false
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		buf := make([]byte, 1024)
 | 
					 | 
				
			||||||
		n, _ := dataRc.Read(buf)
 | 
					 | 
				
			||||||
		if n > 0 {
 | 
					 | 
				
			||||||
			buf = buf[:n]
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, isImage := base.IsImageFile(buf)
 | 
					 | 
				
			||||||
		return isImage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	prInfo.Commits = models.ValidateCommitsWithEmails(prInfo.Commits)
 | 
						prInfo.Commits = models.ValidateCommitsWithEmails(prInfo.Commits)
 | 
				
			||||||
	ctx.Data["Commits"] = prInfo.Commits
 | 
						ctx.Data["Commits"] = prInfo.Commits
 | 
				
			||||||
	ctx.Data["CommitCount"] = prInfo.Commits.Len()
 | 
						ctx.Data["CommitCount"] = prInfo.Commits.Len()
 | 
				
			||||||
	ctx.Data["Username"] = headUser.Name
 | 
						ctx.Data["Username"] = headUser.Name
 | 
				
			||||||
	ctx.Data["Reponame"] = headRepo.Name
 | 
						ctx.Data["Reponame"] = headRepo.Name
 | 
				
			||||||
	ctx.Data["IsImageFile"] = isImageFile
 | 
						ctx.Data["IsImageFile"] = headCommit.IsImageFile
 | 
				
			||||||
	ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(headUser.Name, repo.Name, "src", headCommitID)
 | 
					
 | 
				
			||||||
	ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(headUser.Name, repo.Name, "src", prInfo.MergeBase)
 | 
						headTarget := path.Join(headUser.Name, repo.Name)
 | 
				
			||||||
	ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(headUser.Name, repo.Name, "raw", headCommitID)
 | 
						ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", headCommitID)
 | 
				
			||||||
 | 
						ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", prInfo.MergeBase)
 | 
				
			||||||
 | 
						ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "raw", headCommitID)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func CompareAndPullRequest(ctx *middleware.Context) {
 | 
					func CompareAndPullRequest(ctx *middleware.Context) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,23 +11,7 @@
 | 
				
			|||||||
		<div class="ui divider"></div>
 | 
							<div class="ui divider"></div>
 | 
				
			||||||
		{{if .Issue.IsPull}}
 | 
							{{if .Issue.IsPull}}
 | 
				
			||||||
		{{template "repo/issue/view_title" .}}
 | 
							{{template "repo/issue/view_title" .}}
 | 
				
			||||||
		<div class="ui top attached pull tabular menu">
 | 
							{{template "repo/pulls/tab_menu" .}}
 | 
				
			||||||
		  <a class="item active" href="{{.RepoLink}}/pulls/{{.Issue.Index}}">
 | 
					 | 
				
			||||||
		  	<span class="octicon octicon-comment-discussion"></span>
 | 
					 | 
				
			||||||
		  	{{$.i18n.Tr "repo.pulls.tab_conversation"}}
 | 
					 | 
				
			||||||
		  	<span class="ui label">{{.Issue.NumComments}}</span>
 | 
					 | 
				
			||||||
		  </a>
 | 
					 | 
				
			||||||
		  <a class="item" href="{{.RepoLink}}/pulls/{{.Issue.Index}}/commits">
 | 
					 | 
				
			||||||
		  	<span class="octicon octicon-git-commit"></span>
 | 
					 | 
				
			||||||
		  	{{$.i18n.Tr "repo.pulls.tab_commits"}}
 | 
					 | 
				
			||||||
		  	<span class="ui label">{{.NumCommits}}</span>
 | 
					 | 
				
			||||||
		  </a>
 | 
					 | 
				
			||||||
		  <a class="item" href="{{.RepoLink}}/pulls/{{.Issue.Index}}/files">
 | 
					 | 
				
			||||||
		  	<span class="octicon octicon-diff"></span>
 | 
					 | 
				
			||||||
		  	{{$.i18n.Tr "repo.pulls.tab_files"}}
 | 
					 | 
				
			||||||
		  	<span class="ui label">{{.NumFiles}}</span>
 | 
					 | 
				
			||||||
		  </a>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
	  <div class="ui bottom attached tab pull segment active" data-tab="request-{{.ID}}">
 | 
						  <div class="ui bottom attached tab pull segment active" data-tab="request-{{.ID}}">
 | 
				
			||||||
	  	{{template "repo/issue/view_content" .}}
 | 
						  	{{template "repo/issue/view_content" .}}
 | 
				
			||||||
	  </div>
 | 
						  </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -129,6 +129,43 @@
 | 
				
			|||||||
  		</div>
 | 
					  		</div>
 | 
				
			||||||
			{{end}}
 | 
								{{end}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  		{{end}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  		{{if .Issue.IsPull}}
 | 
				
			||||||
 | 
					  		<div class="comment merge box">
 | 
				
			||||||
 | 
							    <a class="avatar text {{if .Issue.IsClosed}}grey{{else if .Issue.PullRepo.CanAutoMerge}}green{{else}}red{{end}}">
 | 
				
			||||||
 | 
							      <span class="mega-octicon octicon-git-merge"></span>
 | 
				
			||||||
 | 
							    </a>
 | 
				
			||||||
 | 
							    <div class="content">
 | 
				
			||||||
 | 
							    	<div class="ui merge segment">
 | 
				
			||||||
 | 
							    		{{if .Issue.IsClosed}}
 | 
				
			||||||
 | 
							    		<div class="item text grey">
 | 
				
			||||||
 | 
							    			{{$.i18n.Tr "repo.pulls.reopen_to_merge"}}
 | 
				
			||||||
 | 
							    		</div>
 | 
				
			||||||
 | 
							    		{{else if .Issue.PullRepo.CanAutoMerge}}
 | 
				
			||||||
 | 
							    		<div class="item text green">
 | 
				
			||||||
 | 
							    			<span class="octicon octicon-check"></span>
 | 
				
			||||||
 | 
							    			{{$.i18n.Tr "repo.pulls.can_auto_merge_desc"}}
 | 
				
			||||||
 | 
							    		</div>
 | 
				
			||||||
 | 
							    		<div class="ui divider"></div>
 | 
				
			||||||
 | 
							    		<div>
 | 
				
			||||||
 | 
							    			<button class="ui green button">
 | 
				
			||||||
 | 
							    				<span class="octicon octicon-git-merge"></span> {{$.i18n.Tr "repo.pulls.merge_pull_request"}}
 | 
				
			||||||
 | 
							    			</button>
 | 
				
			||||||
 | 
							    		</div>
 | 
				
			||||||
 | 
							    		{{else}}
 | 
				
			||||||
 | 
							    		<div class="item text red">
 | 
				
			||||||
 | 
							    			<span class="octicon octicon-x"></span>
 | 
				
			||||||
 | 
							    			{{$.i18n.Tr "repo.pulls.cannot_auto_merge_desc"}}
 | 
				
			||||||
 | 
							    		</div>
 | 
				
			||||||
 | 
							    		<div class="item text grey">
 | 
				
			||||||
 | 
							    			<span class="octicon octicon-info"></span>
 | 
				
			||||||
 | 
							    			{{$.i18n.Tr "repo.pulls.cannot_auto_merge_helper"}}
 | 
				
			||||||
 | 
							    		</div>
 | 
				
			||||||
 | 
							    		{{end}}
 | 
				
			||||||
 | 
							    	</div>
 | 
				
			||||||
 | 
							    </div>
 | 
				
			||||||
 | 
					  		</div>
 | 
				
			||||||
  		{{end}}
 | 
					  		{{end}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			{{if .IsSigned}}
 | 
								{{if .IsSigned}}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								templates/repo/pulls/commits.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								templates/repo/pulls/commits.tmpl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					{{template "base/head" .}}
 | 
				
			||||||
 | 
					<div class="repository view issue pull commits">
 | 
				
			||||||
 | 
						{{template "repo/header" .}}
 | 
				
			||||||
 | 
						<div class="ui container">
 | 
				
			||||||
 | 
							<div class="navbar">
 | 
				
			||||||
 | 
								{{template "repo/issue/navbar" .}}
 | 
				
			||||||
 | 
								<div class="ui right">
 | 
				
			||||||
 | 
									<a class="ui green button" href="{{$.RepoLink}}/issues/new">{{.i18n.Tr "repo.issues.new"}}</a>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<div class="ui divider"></div>
 | 
				
			||||||
 | 
							{{template "repo/issue/view_title" .}}
 | 
				
			||||||
 | 
							{{template "repo/pulls/tab_menu" .}}
 | 
				
			||||||
 | 
						  <div class="ui bottom attached tab pull segment active">
 | 
				
			||||||
 | 
								{{template "repo/commits_table" .}}
 | 
				
			||||||
 | 
						  </div>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					{{template "base/footer" .}}
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
{{template "base/head" .}}
 | 
					{{template "base/head" .}}
 | 
				
			||||||
<div class="repository compare pull">
 | 
					<div class="repository compare pull diff">
 | 
				
			||||||
	{{template "repo/header" .}}
 | 
						{{template "repo/header" .}}
 | 
				
			||||||
	<div class="ui container">
 | 
						<div class="ui container">
 | 
				
			||||||
		<div class="sixteen wide column page grid">
 | 
							<div class="sixteen wide column page grid">
 | 
				
			||||||
@@ -11,13 +11,13 @@
 | 
				
			|||||||
				<span class="octicon octicon-git-compare"></span>
 | 
									<span class="octicon octicon-git-compare"></span>
 | 
				
			||||||
				<div class="ui floating filter dropdown" data-no-results="{{.i18n.Tr "repo.pulls.no_results"}}">
 | 
									<div class="ui floating filter dropdown" data-no-results="{{.i18n.Tr "repo.pulls.no_results"}}">
 | 
				
			||||||
					<div class="ui basic small button">
 | 
										<div class="ui basic small button">
 | 
				
			||||||
				    <span class="text">base: {{$.BaseBranch}}</span>
 | 
									    <span class="text">{{.i18n.Tr "repo.pulls.compare_base"}}: {{$.BaseBranch}}</span>
 | 
				
			||||||
					  <i class="dropdown icon"></i>
 | 
										  <i class="dropdown icon"></i>
 | 
				
			||||||
					</div>
 | 
										</div>
 | 
				
			||||||
	        <div class="menu">
 | 
						        <div class="menu">
 | 
				
			||||||
		        <div class="ui icon search input">
 | 
							        <div class="ui icon search input">
 | 
				
			||||||
	            <i class="filter icon"></i>
 | 
						            <i class="filter icon"></i>
 | 
				
			||||||
	            <input name="search" placeholder="Filter branch...">
 | 
						            <input name="search" placeholder="{{.i18n.Tr "repo.pulls.filter_branch"}}...">
 | 
				
			||||||
	          </div>
 | 
						          </div>
 | 
				
			||||||
	          <div class="scrolling menu">
 | 
						          <div class="scrolling menu">
 | 
				
			||||||
		        	{{range .Branches}}
 | 
							        	{{range .Branches}}
 | 
				
			||||||
@@ -29,13 +29,13 @@
 | 
				
			|||||||
			 	...
 | 
								 	...
 | 
				
			||||||
				<div class="ui floating filter dropdown">
 | 
									<div class="ui floating filter dropdown">
 | 
				
			||||||
					<div class="ui basic small button">
 | 
										<div class="ui basic small button">
 | 
				
			||||||
				    <span class="text">compare: {{$.HeadBranch}}</span>
 | 
									    <span class="text">{{.i18n.Tr "repo.pulls.compare_compare"}}: {{$.HeadBranch}}</span>
 | 
				
			||||||
					  <i class="dropdown icon"></i>
 | 
										  <i class="dropdown icon"></i>
 | 
				
			||||||
					</div>
 | 
										</div>
 | 
				
			||||||
	        <div class="menu">
 | 
						        <div class="menu">
 | 
				
			||||||
		        <div class="ui icon search input">
 | 
							        <div class="ui icon search input">
 | 
				
			||||||
	            <i class="filter icon"></i>
 | 
						            <i class="filter icon"></i>
 | 
				
			||||||
	            <input name="search" placeholder="Filter branch...">
 | 
						            <input name="search" placeholder="{{.i18n.Tr "repo.pulls.filter_branch"}}...">
 | 
				
			||||||
	          </div>
 | 
						          </div>
 | 
				
			||||||
	          <div class="scrolling menu">
 | 
						          <div class="scrolling menu">
 | 
				
			||||||
		        	{{range .HeadBranches}}
 | 
							        	{{range .HeadBranches}}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								templates/repo/pulls/files.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								templates/repo/pulls/files.tmpl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					{{template "base/head" .}}
 | 
				
			||||||
 | 
					<div class="repository view issue pull files diff">
 | 
				
			||||||
 | 
						{{template "repo/header" .}}
 | 
				
			||||||
 | 
						<div class="ui container">
 | 
				
			||||||
 | 
							<div class="navbar">
 | 
				
			||||||
 | 
								{{template "repo/issue/navbar" .}}
 | 
				
			||||||
 | 
								<div class="ui right">
 | 
				
			||||||
 | 
									<a class="ui green button" href="{{$.RepoLink}}/issues/new">{{.i18n.Tr "repo.issues.new"}}</a>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<div class="ui divider"></div>
 | 
				
			||||||
 | 
							{{template "repo/issue/view_title" .}}
 | 
				
			||||||
 | 
							{{template "repo/pulls/tab_menu" .}}
 | 
				
			||||||
 | 
						  <div class="ui bottom attached tab pull segment active">
 | 
				
			||||||
 | 
								{{template "repo/diff_box" .}}
 | 
				
			||||||
 | 
						  </div>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					{{template "base/footer" .}}
 | 
				
			||||||
							
								
								
									
										17
									
								
								templates/repo/pulls/tab_menu.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								templates/repo/pulls/tab_menu.tmpl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					<div class="ui top attached pull tabular menu">
 | 
				
			||||||
 | 
					  <a class="item {{if .PageIsPullConversation}}active{{end}}" href="{{.RepoLink}}/pulls/{{.Issue.Index}}">
 | 
				
			||||||
 | 
					  	<span class="octicon octicon-comment-discussion"></span>
 | 
				
			||||||
 | 
					  	{{$.i18n.Tr "repo.pulls.tab_conversation"}}
 | 
				
			||||||
 | 
					  	<span class="ui label">{{.Issue.NumComments}}</span>
 | 
				
			||||||
 | 
					  </a>
 | 
				
			||||||
 | 
					  <a class="item {{if .PageIsPullCommits}}active{{end}}" href="{{.RepoLink}}/pulls/{{.Issue.Index}}/commits">
 | 
				
			||||||
 | 
					  	<span class="octicon octicon-git-commit"></span>
 | 
				
			||||||
 | 
					  	{{$.i18n.Tr "repo.pulls.tab_commits"}}
 | 
				
			||||||
 | 
					  	<span class="ui label">{{.NumCommits}}</span>
 | 
				
			||||||
 | 
					  </a>
 | 
				
			||||||
 | 
					  <a class="item {{if .PageIsPullFiles}}active{{end}}" href="{{.RepoLink}}/pulls/{{.Issue.Index}}/files">
 | 
				
			||||||
 | 
					  	<span class="octicon octicon-diff"></span>
 | 
				
			||||||
 | 
					  	{{$.i18n.Tr "repo.pulls.tab_files"}}
 | 
				
			||||||
 | 
					  	<span class="ui label">{{.NumFiles}}</span>
 | 
				
			||||||
 | 
					  </a>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
		Reference in New Issue
	
	Block a user