mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	
							
								
								
									
										20
									
								
								cmd/web.go
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								cmd/web.go
									
									
									
									
									
								
							@@ -370,7 +370,7 @@ func runWeb(*cli.Context) {
 | 
			
		||||
	m.Group("/:username/:reponame", func() {
 | 
			
		||||
		m.Post("/releases/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost)
 | 
			
		||||
		m.Post("/releases/edit/:tagname", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost)
 | 
			
		||||
	}, reqSignIn, middleware.RepoAssignment(true, true))
 | 
			
		||||
	}, reqSignIn, middleware.RepoAssignment(true))
 | 
			
		||||
 | 
			
		||||
	m.Group("/:username/:reponame", func() {
 | 
			
		||||
		m.Get("/issues", repo.Issues)
 | 
			
		||||
@@ -382,20 +382,18 @@ func runWeb(*cli.Context) {
 | 
			
		||||
	}, ignSignIn, middleware.RepoAssignment(true))
 | 
			
		||||
 | 
			
		||||
	m.Group("/:username/:reponame", func() {
 | 
			
		||||
		m.Get("/src/:branchname", repo.Home)
 | 
			
		||||
		m.Get("/src/:branchname/*", repo.Home)
 | 
			
		||||
		m.Get("/raw/:branchname/*", repo.SingleDownload)
 | 
			
		||||
		m.Get("/commits/:branchname", repo.Commits)
 | 
			
		||||
		m.Get("/commits/:branchname/search", repo.SearchCommits)
 | 
			
		||||
		m.Get("/commits/:branchname/*", repo.FileHistory)
 | 
			
		||||
		m.Get("/commit/:branchname", repo.Diff)
 | 
			
		||||
		m.Get("/commit/:branchname/*", repo.Diff)
 | 
			
		||||
		m.Group("", func() {
 | 
			
		||||
			m.Get("/src/*", repo.Home)
 | 
			
		||||
			m.Get("/raw/*", repo.SingleDownload)
 | 
			
		||||
			m.Get("/commits/*", repo.RefCommits)
 | 
			
		||||
			m.Get("/commit/*", repo.Diff)
 | 
			
		||||
		}, middleware.RepoRef())
 | 
			
		||||
		m.Get("/releases", repo.Releases)
 | 
			
		||||
		m.Get("/compare/:before([a-z0-9]+)...:after([a-z0-9]+)", repo.CompareDiff)
 | 
			
		||||
	}, ignSignIn, middleware.RepoAssignment(true, true))
 | 
			
		||||
	}, ignSignIn, middleware.RepoAssignment(true))
 | 
			
		||||
 | 
			
		||||
	m.Group("/:username", func() {
 | 
			
		||||
		m.Get("/:reponame", ignSignIn, middleware.RepoAssignment(true, true, true), repo.Home)
 | 
			
		||||
		m.Get("/:reponame", ignSignIn, middleware.RepoAssignment(true, true), middleware.RepoRef(), repo.Home)
 | 
			
		||||
		m.Any("/:reponame/*", ignSignInAndCsrf, repo.Http)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -168,6 +168,8 @@ org_still_own_repo = This organization still have ownership of repository, you h
 | 
			
		||||
 | 
			
		||||
still_own_user = This authentication still has used by some users, you should move them and then delete again.
 | 
			
		||||
 | 
			
		||||
target_branch_not_exist = Target branch does not exist
 | 
			
		||||
 | 
			
		||||
[user]
 | 
			
		||||
change_avatar = Change your avatar at gravatar.com
 | 
			
		||||
join_on = Joined on
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							@@ -17,7 +17,7 @@ import (
 | 
			
		||||
	"github.com/gogits/gogs/modules/setting"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const APP_VER = "0.5.7.1105 Beta"
 | 
			
		||||
const APP_VER = "0.5.7.1106 Beta"
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	runtime.GOMAXPROCS(runtime.NumCPU())
 | 
			
		||||
 
 | 
			
		||||
@@ -53,6 +53,7 @@ type Context struct {
 | 
			
		||||
		GitRepo     *git.Repository
 | 
			
		||||
		BranchName  string
 | 
			
		||||
		TagName     string
 | 
			
		||||
		TreeName    string
 | 
			
		||||
		CommitId    string
 | 
			
		||||
		RepoLink    string
 | 
			
		||||
		CloneLink   struct {
 | 
			
		||||
@@ -176,7 +177,10 @@ func Contexter() macaron.Handler {
 | 
			
		||||
			ctx.IsSigned = true
 | 
			
		||||
			ctx.Data["IsSigned"] = ctx.IsSigned
 | 
			
		||||
			ctx.Data["SignedUser"] = ctx.User
 | 
			
		||||
			ctx.Data["SignedUserName"] = ctx.User.Name
 | 
			
		||||
			ctx.Data["IsAdmin"] = ctx.User.IsAdmin
 | 
			
		||||
		} else {
 | 
			
		||||
			ctx.Data["SignedUserName"] = ""
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// If request sends files, parse them here otherwise the Query() can't be parsed and the CsrfToken will be invalid.
 | 
			
		||||
 
 | 
			
		||||
@@ -18,17 +18,110 @@ import (
 | 
			
		||||
	"github.com/gogits/gogs/modules/setting"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RepoRef handles repository reference name including those contain `/`.
 | 
			
		||||
func RepoRef() macaron.Handler {
 | 
			
		||||
	return func(ctx *Context) {
 | 
			
		||||
		var (
 | 
			
		||||
			refName string
 | 
			
		||||
			err     error
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		// Get default branch.
 | 
			
		||||
		if len(ctx.Params("*")) == 0 {
 | 
			
		||||
			refName = ctx.Repo.Repository.DefaultBranch
 | 
			
		||||
			if !ctx.Repo.GitRepo.IsBranchExist(refName) {
 | 
			
		||||
				brs, err := ctx.Repo.GitRepo.GetBranches()
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					ctx.Handle(500, "GetBranches", err)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				refName = brs[0]
 | 
			
		||||
			}
 | 
			
		||||
			ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfBranch(refName)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				ctx.Handle(500, "GetCommitOfBranch", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
 | 
			
		||||
			ctx.Repo.IsBranch = true
 | 
			
		||||
			ctx.Repo.BranchName = refName
 | 
			
		||||
 | 
			
		||||
		} else {
 | 
			
		||||
			hasMatched := false
 | 
			
		||||
			parts := strings.Split(ctx.Params("*"), "/")
 | 
			
		||||
			for i, part := range parts {
 | 
			
		||||
				refName = strings.TrimPrefix(refName+"/"+part, "/")
 | 
			
		||||
 | 
			
		||||
				if ctx.Repo.GitRepo.IsBranchExist(refName) ||
 | 
			
		||||
					ctx.Repo.GitRepo.IsTagExist(refName) {
 | 
			
		||||
					if i < len(parts)-1 {
 | 
			
		||||
						ctx.Repo.TreeName = strings.Join(parts[i+1:], "/")
 | 
			
		||||
					}
 | 
			
		||||
					hasMatched = true
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if !hasMatched && len(parts[0]) == 40 {
 | 
			
		||||
				refName = parts[0]
 | 
			
		||||
				ctx.Repo.TreeName = strings.Join(parts[1:], "/")
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if ctx.Repo.GitRepo.IsBranchExist(refName) {
 | 
			
		||||
				ctx.Repo.IsBranch = true
 | 
			
		||||
 | 
			
		||||
				ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfBranch(refName)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					ctx.Handle(500, "GetCommitOfBranch", err)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
 | 
			
		||||
 | 
			
		||||
			} else if ctx.Repo.GitRepo.IsTagExist(refName) {
 | 
			
		||||
				ctx.Repo.IsTag = true
 | 
			
		||||
				ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfTag(refName)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					ctx.Handle(500, "GetCommitOfTag", err)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
 | 
			
		||||
			} else if len(refName) == 40 {
 | 
			
		||||
				ctx.Repo.IsCommit = true
 | 
			
		||||
				ctx.Repo.CommitId = refName
 | 
			
		||||
 | 
			
		||||
				ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(refName)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					ctx.Handle(404, "GetCommit", nil)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				ctx.Handle(404, "RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ctx.Repo.BranchName = refName
 | 
			
		||||
		ctx.Data["BranchName"] = ctx.Repo.BranchName
 | 
			
		||||
		ctx.Data["CommitId"] = ctx.Repo.CommitId
 | 
			
		||||
		ctx.Data["IsBranch"] = ctx.Repo.IsBranch
 | 
			
		||||
		ctx.Data["IsTag"] = ctx.Repo.IsTag
 | 
			
		||||
		ctx.Data["IsCommit"] = ctx.Repo.IsCommit
 | 
			
		||||
 | 
			
		||||
		ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.Handle(500, "CommitsCount", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
 | 
			
		||||
	return func(ctx *Context) {
 | 
			
		||||
		var (
 | 
			
		||||
			validBranch bool // To valid brach name.
 | 
			
		||||
			displayBare bool // To display bare page if it is a bare repo.
 | 
			
		||||
		)
 | 
			
		||||
		if len(args) >= 1 {
 | 
			
		||||
			validBranch = args[0]
 | 
			
		||||
		}
 | 
			
		||||
		if len(args) >= 2 {
 | 
			
		||||
			displayBare = args[1]
 | 
			
		||||
			displayBare = args[0]
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var (
 | 
			
		||||
@@ -201,71 +294,71 @@ func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// when repo is bare, not valid branch
 | 
			
		||||
		if !ctx.Repo.Repository.IsBare && validBranch {
 | 
			
		||||
		detect:
 | 
			
		||||
			if len(refName) > 0 {
 | 
			
		||||
				if gitRepo.IsBranchExist(refName) {
 | 
			
		||||
					ctx.Repo.IsBranch = true
 | 
			
		||||
					ctx.Repo.BranchName = refName
 | 
			
		||||
		// if !ctx.Repo.Repository.IsBare && validBranch {
 | 
			
		||||
		// detect:
 | 
			
		||||
		// 	if len(refName) > 0 {
 | 
			
		||||
		// 		if gitRepo.IsBranchExist(refName) {
 | 
			
		||||
		// 			ctx.Repo.IsBranch = true
 | 
			
		||||
		// 			ctx.Repo.BranchName = refName
 | 
			
		||||
 | 
			
		||||
					ctx.Repo.Commit, err = gitRepo.GetCommitOfBranch(refName)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						ctx.Handle(500, "RepoAssignment invalid branch", err)
 | 
			
		||||
						return
 | 
			
		||||
					}
 | 
			
		||||
					ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
 | 
			
		||||
		// 			ctx.Repo.Commit, err = gitRepo.GetCommitOfBranch(refName)
 | 
			
		||||
		// 			if err != nil {
 | 
			
		||||
		// 				ctx.Handle(500, "RepoAssignment invalid branch", err)
 | 
			
		||||
		// 				return
 | 
			
		||||
		// 			}
 | 
			
		||||
		// 			ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
 | 
			
		||||
 | 
			
		||||
				} else if gitRepo.IsTagExist(refName) {
 | 
			
		||||
					ctx.Repo.IsTag = true
 | 
			
		||||
					ctx.Repo.BranchName = refName
 | 
			
		||||
					ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfTag(refName)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						ctx.Handle(500, "Fail to get tag commit", err)
 | 
			
		||||
						return
 | 
			
		||||
					}
 | 
			
		||||
					ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
 | 
			
		||||
				} else if len(refName) == 40 {
 | 
			
		||||
					ctx.Repo.IsCommit = true
 | 
			
		||||
					ctx.Repo.CommitId = refName
 | 
			
		||||
					ctx.Repo.BranchName = refName
 | 
			
		||||
		// 		} else if gitRepo.IsTagExist(refName) {
 | 
			
		||||
		// 			ctx.Repo.IsTag = true
 | 
			
		||||
		// 			ctx.Repo.BranchName = refName
 | 
			
		||||
		// 			ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfTag(refName)
 | 
			
		||||
		// 			if err != nil {
 | 
			
		||||
		// 				ctx.Handle(500, "Fail to get tag commit", err)
 | 
			
		||||
		// 				return
 | 
			
		||||
		// 			}
 | 
			
		||||
		// 			ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
 | 
			
		||||
		// 		} else if len(refName) == 40 {
 | 
			
		||||
		// 			ctx.Repo.IsCommit = true
 | 
			
		||||
		// 			ctx.Repo.CommitId = refName
 | 
			
		||||
		// 			ctx.Repo.BranchName = refName
 | 
			
		||||
 | 
			
		||||
					ctx.Repo.Commit, err = gitRepo.GetCommit(refName)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						ctx.Handle(404, "RepoAssignment invalid commit", nil)
 | 
			
		||||
						return
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					ctx.Handle(404, "RepoAssignment invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
		// 			ctx.Repo.Commit, err = gitRepo.GetCommit(refName)
 | 
			
		||||
		// 			if err != nil {
 | 
			
		||||
		// 				ctx.Handle(404, "RepoAssignment invalid commit", nil)
 | 
			
		||||
		// 				return
 | 
			
		||||
		// 			}
 | 
			
		||||
		// 		} else {
 | 
			
		||||
		// 			ctx.Handle(404, "RepoAssignment invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
 | 
			
		||||
		// 			return
 | 
			
		||||
		// 		}
 | 
			
		||||
 | 
			
		||||
			} else {
 | 
			
		||||
				if len(refName) == 0 {
 | 
			
		||||
					if gitRepo.IsBranchExist(ctx.Repo.Repository.DefaultBranch) {
 | 
			
		||||
						refName = ctx.Repo.Repository.DefaultBranch
 | 
			
		||||
					} else {
 | 
			
		||||
						brs, err := gitRepo.GetBranches()
 | 
			
		||||
						if err != nil {
 | 
			
		||||
							ctx.Handle(500, "GetBranches", err)
 | 
			
		||||
							return
 | 
			
		||||
						}
 | 
			
		||||
						refName = brs[0]
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				goto detect
 | 
			
		||||
			}
 | 
			
		||||
		// 	} else {
 | 
			
		||||
		// 		if len(refName) == 0 {
 | 
			
		||||
		// 			if gitRepo.IsBranchExist(ctx.Repo.Repository.DefaultBranch) {
 | 
			
		||||
		// 				refName = ctx.Repo.Repository.DefaultBranch
 | 
			
		||||
		// 			} else {
 | 
			
		||||
		// 				brs, err := gitRepo.GetBranches()
 | 
			
		||||
		// 				if err != nil {
 | 
			
		||||
		// 					ctx.Handle(500, "GetBranches", err)
 | 
			
		||||
		// 					return
 | 
			
		||||
		// 				}
 | 
			
		||||
		// 				refName = brs[0]
 | 
			
		||||
		// 			}
 | 
			
		||||
		// 		}
 | 
			
		||||
		// 		goto detect
 | 
			
		||||
		// 	}
 | 
			
		||||
 | 
			
		||||
			ctx.Data["IsBranch"] = ctx.Repo.IsBranch
 | 
			
		||||
			ctx.Data["IsTag"] = ctx.Repo.IsTag
 | 
			
		||||
			ctx.Data["IsCommit"] = ctx.Repo.IsCommit
 | 
			
		||||
		// 	ctx.Data["IsBranch"] = ctx.Repo.IsBranch
 | 
			
		||||
		// 	ctx.Data["IsTag"] = ctx.Repo.IsTag
 | 
			
		||||
		// 	ctx.Data["IsCommit"] = ctx.Repo.IsCommit
 | 
			
		||||
 | 
			
		||||
			ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				ctx.Handle(500, "CommitsCount", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount
 | 
			
		||||
		}
 | 
			
		||||
		// 	ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount()
 | 
			
		||||
		// 	if err != nil {
 | 
			
		||||
		// 		ctx.Handle(500, "CommitsCount", err)
 | 
			
		||||
		// 		return
 | 
			
		||||
		// 	}
 | 
			
		||||
		// 	ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount
 | 
			
		||||
		// }
 | 
			
		||||
 | 
			
		||||
		// repo is bare and display enable
 | 
			
		||||
		if ctx.Repo.Repository.IsBare {
 | 
			
		||||
 
 | 
			
		||||
@@ -240,6 +240,9 @@ img.avatar-100 {
 | 
			
		||||
.text-black {
 | 
			
		||||
  color: #444444;
 | 
			
		||||
}
 | 
			
		||||
.text-gold {
 | 
			
		||||
  color: #a1882b;
 | 
			
		||||
}
 | 
			
		||||
.table {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  max-width: 100%;
 | 
			
		||||
 
 | 
			
		||||
@@ -259,6 +259,9 @@ clear: both;
 | 
			
		||||
.text-black {
 | 
			
		||||
    color: #444444;
 | 
			
		||||
}
 | 
			
		||||
.text-gold {
 | 
			
		||||
    color: #a1882b;
 | 
			
		||||
}
 | 
			
		||||
.table {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    max-width: 100%;
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,17 @@ const (
 | 
			
		||||
	DIFF    base.TplName = "repo/diff"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func RefCommits(ctx *middleware.Context) {
 | 
			
		||||
	switch {
 | 
			
		||||
	case len(ctx.Repo.TreeName) == 0:
 | 
			
		||||
		Commits(ctx)
 | 
			
		||||
	case ctx.Repo.TreeName == "search":
 | 
			
		||||
		SearchCommits(ctx)
 | 
			
		||||
	default:
 | 
			
		||||
		FileHistory(ctx)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Commits(ctx *middleware.Context) {
 | 
			
		||||
	ctx.Data["IsRepoToolbarCommits"] = true
 | 
			
		||||
 | 
			
		||||
@@ -109,6 +120,69 @@ func SearchCommits(ctx *middleware.Context) {
 | 
			
		||||
	ctx.HTML(200, COMMITS)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func FileHistory(ctx *middleware.Context) {
 | 
			
		||||
	ctx.Data["IsRepoToolbarCommits"] = true
 | 
			
		||||
 | 
			
		||||
	fileName := ctx.Repo.TreeName
 | 
			
		||||
	if len(fileName) == 0 {
 | 
			
		||||
		Commits(ctx)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	userName := ctx.Repo.Owner.Name
 | 
			
		||||
	repoName := ctx.Repo.Repository.Name
 | 
			
		||||
	branchName := ctx.Repo.BranchName
 | 
			
		||||
 | 
			
		||||
	brs, err := ctx.Repo.GitRepo.GetBranches()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "GetBranches", err)
 | 
			
		||||
		return
 | 
			
		||||
	} else if len(brs) == 0 {
 | 
			
		||||
		ctx.Handle(404, "GetBranches", nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(branchName, fileName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "repo.FileHistory(GetCommitsCount)", err)
 | 
			
		||||
		return
 | 
			
		||||
	} else if commitsCount == 0 {
 | 
			
		||||
		ctx.Handle(404, "repo.FileHistory", nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Calculate and validate page number.
 | 
			
		||||
	page := com.StrTo(ctx.Query("p")).MustInt()
 | 
			
		||||
	if page < 1 {
 | 
			
		||||
		page = 1
 | 
			
		||||
	}
 | 
			
		||||
	lastPage := page - 1
 | 
			
		||||
	if lastPage < 0 {
 | 
			
		||||
		lastPage = 0
 | 
			
		||||
	}
 | 
			
		||||
	nextPage := page + 1
 | 
			
		||||
	if nextPage*50 > commitsCount {
 | 
			
		||||
		nextPage = 0
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange(
 | 
			
		||||
		branchName, fileName, page)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "repo.FileHistory(CommitsByRange)", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	commits = models.ValidateCommitsWithEmails(commits)
 | 
			
		||||
 | 
			
		||||
	ctx.Data["Commits"] = commits
 | 
			
		||||
	ctx.Data["Username"] = userName
 | 
			
		||||
	ctx.Data["Reponame"] = repoName
 | 
			
		||||
	ctx.Data["FileName"] = fileName
 | 
			
		||||
	ctx.Data["CommitCount"] = commitsCount
 | 
			
		||||
	ctx.Data["LastPageNum"] = lastPage
 | 
			
		||||
	ctx.Data["NextPageNum"] = nextPage
 | 
			
		||||
	ctx.HTML(200, COMMITS)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Diff(ctx *middleware.Context) {
 | 
			
		||||
	ctx.Data["IsRepoToolbarCommits"] = true
 | 
			
		||||
 | 
			
		||||
@@ -230,66 +304,3 @@ func CompareDiff(ctx *middleware.Context) {
 | 
			
		||||
	ctx.Data["RawPath"] = "/" + path.Join(userName, repoName, "raw", afterCommitId)
 | 
			
		||||
	ctx.HTML(200, DIFF)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func FileHistory(ctx *middleware.Context) {
 | 
			
		||||
	ctx.Data["IsRepoToolbarCommits"] = true
 | 
			
		||||
 | 
			
		||||
	fileName := ctx.Params("*")
 | 
			
		||||
	if len(fileName) == 0 {
 | 
			
		||||
		Commits(ctx)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	userName := ctx.Repo.Owner.Name
 | 
			
		||||
	repoName := ctx.Repo.Repository.Name
 | 
			
		||||
	branchName := ctx.Params(":branchname")
 | 
			
		||||
 | 
			
		||||
	brs, err := ctx.Repo.GitRepo.GetBranches()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "GetBranches", err)
 | 
			
		||||
		return
 | 
			
		||||
	} else if len(brs) == 0 {
 | 
			
		||||
		ctx.Handle(404, "GetBranches", nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(branchName, fileName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "repo.FileHistory(GetCommitsCount)", err)
 | 
			
		||||
		return
 | 
			
		||||
	} else if commitsCount == 0 {
 | 
			
		||||
		ctx.Handle(404, "repo.FileHistory", nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Calculate and validate page number.
 | 
			
		||||
	page := com.StrTo(ctx.Query("p")).MustInt()
 | 
			
		||||
	if page < 1 {
 | 
			
		||||
		page = 1
 | 
			
		||||
	}
 | 
			
		||||
	lastPage := page - 1
 | 
			
		||||
	if lastPage < 0 {
 | 
			
		||||
		lastPage = 0
 | 
			
		||||
	}
 | 
			
		||||
	nextPage := page + 1
 | 
			
		||||
	if nextPage*50 > commitsCount {
 | 
			
		||||
		nextPage = 0
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange(
 | 
			
		||||
		branchName, fileName, page)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "repo.FileHistory(CommitsByRange)", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	commits = models.ValidateCommitsWithEmails(commits)
 | 
			
		||||
 | 
			
		||||
	ctx.Data["Commits"] = commits
 | 
			
		||||
	ctx.Data["Username"] = userName
 | 
			
		||||
	ctx.Data["Reponame"] = repoName
 | 
			
		||||
	ctx.Data["FileName"] = fileName
 | 
			
		||||
	ctx.Data["CommitCount"] = commitsCount
 | 
			
		||||
	ctx.Data["LastPageNum"] = lastPage
 | 
			
		||||
	ctx.Data["NextPageNum"] = nextPage
 | 
			
		||||
	ctx.HTML(200, COMMITS)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -13,9 +13,7 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func SingleDownload(ctx *middleware.Context) {
 | 
			
		||||
	treename := ctx.Params("*")
 | 
			
		||||
 | 
			
		||||
	blob, err := ctx.Repo.Commit.GetBlobByPath(treename)
 | 
			
		||||
	blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreeName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "GetBlobByPath", err)
 | 
			
		||||
		return
 | 
			
		||||
@@ -23,7 +21,7 @@ func SingleDownload(ctx *middleware.Context) {
 | 
			
		||||
 | 
			
		||||
	dataRc, err := blob.Data()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "repo.SingleDownload(Data)", err)
 | 
			
		||||
		ctx.Handle(500, "Data", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -37,7 +35,7 @@ func SingleDownload(ctx *middleware.Context) {
 | 
			
		||||
	_, isImageFile := base.IsImageFile(buf)
 | 
			
		||||
	ctx.Resp.Header().Set("Content-Type", contentType)
 | 
			
		||||
	if !isTextFile && !isImageFile {
 | 
			
		||||
		ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+path.Base(treename))
 | 
			
		||||
		ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+path.Base(ctx.Repo.TreeName))
 | 
			
		||||
		ctx.Resp.Header().Set("Content-Transfer-Encoding", "binary")
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Resp.Write(buf)
 | 
			
		||||
 
 | 
			
		||||
@@ -22,21 +22,38 @@ func Releases(ctx *middleware.Context) {
 | 
			
		||||
	ctx.Data["Title"] = "Releases"
 | 
			
		||||
	ctx.Data["IsRepoToolbarReleases"] = true
 | 
			
		||||
	ctx.Data["IsRepoReleaseNew"] = false
 | 
			
		||||
 | 
			
		||||
	rawTags, err := ctx.Repo.GitRepo.GetTags()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "release.Releases(GetTags)", err)
 | 
			
		||||
		ctx.Handle(500, "GetTags", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rels, err := models.GetReleasesByRepoId(ctx.Repo.Repository.Id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "release.Releases(GetReleasesByRepoId)", err)
 | 
			
		||||
		ctx.Handle(500, "GetReleasesByRepoId", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	commitsCount, err := ctx.Repo.Commit.CommitsCount()
 | 
			
		||||
	// Get default branch.
 | 
			
		||||
	refName := ctx.Repo.Repository.DefaultBranch
 | 
			
		||||
	if !ctx.Repo.GitRepo.IsBranchExist(refName) {
 | 
			
		||||
		brs, err := ctx.Repo.GitRepo.GetBranches()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
		ctx.Handle(500, "release.Releases(CommitsCount)", err)
 | 
			
		||||
			ctx.Handle(500, "GetBranches", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		refName = brs[0]
 | 
			
		||||
	}
 | 
			
		||||
	commit, err := ctx.Repo.GitRepo.GetCommitOfBranch(refName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "GetCommitOfBranch", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	commitsCount, err := commit.CommitsCount()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "CommitsCount", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -59,18 +76,18 @@ func Releases(ctx *middleware.Context) {
 | 
			
		||||
				if ctx.Repo.BranchName != rel.Target {
 | 
			
		||||
					// Get count if not exists.
 | 
			
		||||
					if _, ok := countCache[rel.Target]; !ok {
 | 
			
		||||
						commit, err := ctx.Repo.GitRepo.GetCommitOfTag(rel.TagName)
 | 
			
		||||
						commit, err := ctx.Repo.GitRepo.GetCommitOfBranch(ctx.Repo.BranchName)
 | 
			
		||||
						if err != nil {
 | 
			
		||||
							ctx.Handle(500, "GetCommitOfTag", err)
 | 
			
		||||
							ctx.Handle(500, "GetCommitOfBranch", err)
 | 
			
		||||
							return
 | 
			
		||||
						}
 | 
			
		||||
						countCache[rel.Target], err = commit.CommitsCount()
 | 
			
		||||
						countCache[ctx.Repo.BranchName], err = commit.CommitsCount()
 | 
			
		||||
						if err != nil {
 | 
			
		||||
							ctx.Handle(500, "CommitsCount2", err)
 | 
			
		||||
							return
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					rel.NumCommitsBehind = countCache[rel.Target] - rel.NumCommits
 | 
			
		||||
					rel.NumCommitsBehind = countCache[ctx.Repo.BranchName] - rel.NumCommits
 | 
			
		||||
				} else {
 | 
			
		||||
					rel.NumCommitsBehind = commitsCount - rel.NumCommits
 | 
			
		||||
				}
 | 
			
		||||
@@ -134,14 +151,20 @@ func NewReleasePost(ctx *middleware.Context, form auth.NewReleaseForm) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	commitsCount, err := ctx.Repo.Commit.CommitsCount()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "release.ReleasesNewPost(CommitsCount)", err)
 | 
			
		||||
	if !ctx.Repo.GitRepo.IsBranchExist(form.Target) {
 | 
			
		||||
		ctx.RenderWithErr(ctx.Tr("form.target_branch_not_exist"), RELEASE_NEW, &form)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !ctx.Repo.GitRepo.IsBranchExist(form.Target) {
 | 
			
		||||
		ctx.RenderWithErr("Target branch does not exist", "release/new", &form)
 | 
			
		||||
	commit, err := ctx.Repo.GitRepo.GetCommitOfBranch(form.Target)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "GetCommitOfBranch", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	commitsCount, err := commit.CommitsCount()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "CommitsCount", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -151,7 +174,7 @@ func NewReleasePost(ctx *middleware.Context, form auth.NewReleaseForm) {
 | 
			
		||||
		Title:        form.Title,
 | 
			
		||||
		TagName:      form.TagName,
 | 
			
		||||
		Target:       form.Target,
 | 
			
		||||
		Sha1:         ctx.Repo.Commit.Id.String(),
 | 
			
		||||
		Sha1:         commit.Id.String(),
 | 
			
		||||
		NumCommits:   commitsCount,
 | 
			
		||||
		Note:         form.Content,
 | 
			
		||||
		IsDraft:      len(form.Draft) > 0,
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ func Home(ctx *middleware.Context) {
 | 
			
		||||
	rawLink := ctx.Repo.RepoLink + "/raw/" + branchName
 | 
			
		||||
 | 
			
		||||
	// Get tree path
 | 
			
		||||
	treename := ctx.Params("*")
 | 
			
		||||
	treename := ctx.Repo.TreeName
 | 
			
		||||
 | 
			
		||||
	if len(treename) > 0 && treename[len(treename)-1] == '/' {
 | 
			
		||||
		ctx.Redirect(repoLink + "/src/" + branchName + "/" + treename[:len(treename)-1])
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
0.5.7.1105 Beta
 | 
			
		||||
0.5.7.1106 Beta
 | 
			
		||||
@@ -54,7 +54,7 @@
 | 
			
		||||
                        {{end}}
 | 
			
		||||
                    {{end}}
 | 
			
		||||
                </li>
 | 
			
		||||
                <li id="repo-commits-jump" class="repo-jump right">
 | 
			
		||||
                <!-- <li id="repo-commits-jump" class="repo-jump right">
 | 
			
		||||
                    <a href="#">
 | 
			
		||||
                        <button class="btn btn-small btn-gray btn-right-radius"><i class="octicon octicon-git-commit"></i></button>
 | 
			
		||||
                    </a>
 | 
			
		||||
@@ -63,7 +63,7 @@
 | 
			
		||||
                    <a href="#">
 | 
			
		||||
                        <button class="btn btn-small btn btn-small btn-gray btn-left-radius"><i class="octicon octicon-list-unordered"></i></button>
 | 
			
		||||
                    </a>
 | 
			
		||||
                </li>
 | 
			
		||||
                </li> -->
 | 
			
		||||
            </ul>
 | 
			
		||||
            {{if .IsFile}}
 | 
			
		||||
                {{template "repo/view_file" .}}
 | 
			
		||||
 
 | 
			
		||||
@@ -70,13 +70,18 @@
 | 
			
		||||
                    <div class="tab-pane active">
 | 
			
		||||
                        <div id="org-repo-list">
 | 
			
		||||
                            {{range .Repos}}
 | 
			
		||||
                                {{if not .IsPrivate}}
 | 
			
		||||
                                {{if or (not .IsPrivate) (.HasAccess $.SignedUserName)}}
 | 
			
		||||
                                <div class="org-repo-item">
 | 
			
		||||
                                    <ul class="org-repo-status right">
 | 
			
		||||
                                        <li><i class="octicon octicon-star"></i> {{.NumStars}}</li>
 | 
			
		||||
                                        <li><i class="octicon octicon-git-branch"></i> {{.NumForks}}</li>
 | 
			
		||||
                                    </ul>
 | 
			
		||||
                                    <h2><a href="{{AppSubUrl}}/{{$.Owner.Name}}/{{.Name}}">{{.Name}}</a></h2>
 | 
			
		||||
                                    <h2>
 | 
			
		||||
                                        <a href="{{AppSubUrl}}/{{$.Owner.Name}}/{{.Name}}">{{.Name}}</a>
 | 
			
		||||
                                        {{if .IsPrivate}}
 | 
			
		||||
                                        <span class="text-gold"><i class="octicon octicon-lock"></i></span>
 | 
			
		||||
                                        {{end}}
 | 
			
		||||
                                    </h2>
 | 
			
		||||
                                    <p class="org-repo-description">{{.Description}}</p>
 | 
			
		||||
                                    <p class="org-repo-updated">{{$.i18n.Tr "org.repo_updated"}} {{TimeSince .Updated $.i18n.Lang}}</p>
 | 
			
		||||
                                </div>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user