| @@ -17,10 +17,20 @@ import ( | |||||
| "github.com/gogits/gogs/modules/base" | "github.com/gogits/gogs/modules/base" | ||||
| ) | ) | ||||
| func RepoAssignment(redirect bool) martini.Handler { | |||||
| func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||||
| return func(ctx *Context, params martini.Params) { | return func(ctx *Context, params martini.Params) { | ||||
| // assign false first | |||||
| ctx.Data["IsRepositoryValid"] = false | |||||
| // valid brachname | |||||
| var validBranch bool | |||||
| // display bare quick start if it is a bare repo | |||||
| var displayBare bool | |||||
| if len(args) >= 1 { | |||||
| validBranch = args[0] | |||||
| } | |||||
| if len(args) >= 2 { | |||||
| displayBare = args[1] | |||||
| } | |||||
| var ( | var ( | ||||
| user *models.User | user *models.User | ||||
| @@ -71,6 +81,8 @@ func RepoAssignment(redirect bool) martini.Handler { | |||||
| } | } | ||||
| ctx.Repo.Repository = repo | ctx.Repo.Repository = repo | ||||
| ctx.Data["IsBareRepo"] = ctx.Repo.Repository.IsBare | |||||
| gitRepo, err := git.OpenRepository(models.RepoPath(userName, repoName)) | gitRepo, err := git.OpenRepository(models.RepoPath(userName, repoName)) | ||||
| if err != nil { | if err != nil { | ||||
| ctx.Handle(404, "RepoAssignment Invalid repo "+models.RepoPath(userName, repoName), err) | ctx.Handle(404, "RepoAssignment Invalid repo "+models.RepoPath(userName, repoName), err) | ||||
| @@ -86,50 +98,54 @@ func RepoAssignment(redirect bool) martini.Handler { | |||||
| ctx.Data["Owner"] = user | ctx.Data["Owner"] = user | ||||
| ctx.Data["RepoLink"] = ctx.Repo.RepoLink | ctx.Data["RepoLink"] = ctx.Repo.RepoLink | ||||
| ctx.Data["IsRepositoryOwner"] = ctx.Repo.IsOwner | ctx.Data["IsRepositoryOwner"] = ctx.Repo.IsOwner | ||||
| ctx.Data["BranchName"] = "" | |||||
| ctx.Repo.CloneLink.SSH = fmt.Sprintf("%s@%s:%s/%s.git", base.RunUser, base.Domain, user.LowerName, repo.LowerName) | ctx.Repo.CloneLink.SSH = fmt.Sprintf("%s@%s:%s/%s.git", base.RunUser, base.Domain, user.LowerName, repo.LowerName) | ||||
| ctx.Repo.CloneLink.HTTPS = fmt.Sprintf("%s%s/%s.git", base.AppUrl, user.LowerName, repo.LowerName) | ctx.Repo.CloneLink.HTTPS = fmt.Sprintf("%s%s/%s.git", base.AppUrl, user.LowerName, repo.LowerName) | ||||
| ctx.Data["CloneLink"] = ctx.Repo.CloneLink | ctx.Data["CloneLink"] = ctx.Repo.CloneLink | ||||
| if repo.IsBare { | |||||
| ctx.Data["IsBareRepo"] = true | |||||
| ctx.HTML(200, "repo/single_bare") | |||||
| return | |||||
| } | |||||
| detect: | |||||
| if len(branchName) > 0 { | |||||
| // TODO check tag | |||||
| if models.IsBranchExist(user.Name, repoName, branchName) { | |||||
| ctx.Repo.IsBranch = true | |||||
| ctx.Repo.BranchName = branchName | |||||
| ctx.Repo.Commit, err = gitRepo.GetCommitOfBranch(branchName) | |||||
| if err != nil { | |||||
| ctx.Handle(404, "RepoAssignment invalid branch", nil) | |||||
| // when repo is bare, not valid branch | |||||
| if !ctx.Repo.Repository.IsBare && validBranch { | |||||
| detect: | |||||
| if len(branchName) > 0 { | |||||
| // TODO check tag | |||||
| if models.IsBranchExist(user.Name, repoName, branchName) { | |||||
| ctx.Repo.IsBranch = true | |||||
| ctx.Repo.BranchName = branchName | |||||
| ctx.Repo.Commit, err = gitRepo.GetCommitOfBranch(branchName) | |||||
| if err != nil { | |||||
| ctx.Handle(404, "RepoAssignment invalid branch", nil) | |||||
| return | |||||
| } | |||||
| ctx.Repo.CommitId = ctx.Repo.Commit.Oid.String() | |||||
| } else if len(branchName) == 40 { | |||||
| ctx.Repo.IsCommit = true | |||||
| ctx.Repo.CommitId = branchName | |||||
| ctx.Repo.BranchName = branchName | |||||
| ctx.Repo.Commit, err = gitRepo.GetCommit(branchName) | |||||
| if err != nil { | |||||
| ctx.Handle(404, "RepoAssignment invalid commit", nil) | |||||
| return | |||||
| } | |||||
| } else { | |||||
| ctx.Handle(404, "RepoAssignment invalid repo", nil) | |||||
| return | return | ||||
| } | } | ||||
| ctx.Repo.CommitId = ctx.Repo.Commit.Oid.String() | |||||
| } else if len(branchName) == 40 { | |||||
| ctx.Repo.IsCommit = true | |||||
| ctx.Repo.CommitId = branchName | |||||
| ctx.Repo.BranchName = branchName | |||||
| ctx.Repo.Commit, err = gitRepo.GetCommit(branchName) | |||||
| if err != nil { | |||||
| ctx.Handle(404, "RepoAssignment invalid commit", nil) | |||||
| return | |||||
| } | |||||
| } else { | } else { | ||||
| ctx.Handle(404, "RepoAssignment invalid repo", nil) | |||||
| return | |||||
| branchName = "master" | |||||
| goto detect | |||||
| } | } | ||||
| } | |||||
| } else { | |||||
| branchName = "master" | |||||
| goto detect | |||||
| // repo is bare and display enable | |||||
| if displayBare && ctx.Repo.Repository.IsBare { | |||||
| ctx.HTML(200, "repo/single_bare") | |||||
| return | |||||
| } | } | ||||
| if ctx.IsSigned { | if ctx.IsSigned { | ||||
| @@ -78,6 +78,7 @@ func Single(ctx *middleware.Context, params martini.Params) { | |||||
| ctx.Handle(404, "repo.Single(GetBranches)", err) | ctx.Handle(404, "repo.Single(GetBranches)", err) | ||||
| return | return | ||||
| } | } | ||||
| ctx.Data["Branches"] = brs | ctx.Data["Branches"] = brs | ||||
| isViewBranch := ctx.Repo.IsBranch | isViewBranch := ctx.Repo.IsBranch | ||||
| @@ -1,6 +1,7 @@ | |||||
| {{template "base/head" .}} | {{template "base/head" .}} | ||||
| {{template "base/navbar" .}} | {{template "base/navbar" .}} | ||||
| {{template "repo/nav" .}} | {{template "repo/nav" .}} | ||||
| {{template "repo/toolbar" .}} | |||||
| <div id="body" class="container"> | <div id="body" class="container"> | ||||
| <div id="source"> | <div id="source"> | ||||
| <div class="panel panel-default guide-box clone-group-btn"> | <div class="panel panel-default guide-box clone-group-btn"> | ||||
| @@ -23,15 +24,15 @@ | |||||
| <hr/> | <hr/> | ||||
| <h3>Create a new repository on the command line</h3> | <h3>Create a new repository on the command line</h3> | ||||
| <pre class="text-left"><code>touch README.md | <pre class="text-left"><code>touch README.md | ||||
| git init | |||||
| git add README.md | |||||
| git commit -m "first commit" | |||||
| git remote add origin <span class="clone-url"></span> | |||||
| git push -u origin master</code></pre> | |||||
| git init | |||||
| git add README.md | |||||
| git commit -m "first commit" | |||||
| git remote add origin <span class="clone-url"></span> | |||||
| git push -u origin master</code></pre> | |||||
| <hr/> | <hr/> | ||||
| <h3>Push an existing repository from the command line</h3> | <h3>Push an existing repository from the command line</h3> | ||||
| <pre class="text-left"><code>git remote add origin <span class="clone-url"></span> | <pre class="text-left"><code>git remote add origin <span class="clone-url"></span> | ||||
| git push -u origin master</code></pre> | |||||
| git push -u origin master</code></pre> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| @@ -3,7 +3,7 @@ | |||||
| <nav class="navbar navbar-toolbar navbar-default" role="navigation"> | <nav class="navbar navbar-toolbar navbar-default" role="navigation"> | ||||
| <div class="collapse navbar-collapse"> | <div class="collapse navbar-collapse"> | ||||
| <ul class="nav navbar-nav"> | <ul class="nav navbar-nav"> | ||||
| <li class="{{if .IsRepoToolbarSource}}active{{end}}"><a href="{{.RepoLink}}{{if ne .BranchName `master`}}/src/{{.BranchName}}{{end}}">Source</a></li> | |||||
| <li class="{{if .IsRepoToolbarSource}}active{{end}}"><a href="{{.RepoLink}}{{if .BranchName}}{{if ne .BranchName `master`}}/src/{{.BranchName}}{{end}}{{end}}">Source</a></li> | |||||
| {{if not .IsBareRepo}} | {{if not .IsBareRepo}} | ||||
| <li class="{{if .IsRepoToolbarCommits}}active{{end}}"><a href="{{.RepoLink}}/commits/{{.BranchName}}">Commits</a></li> | <li class="{{if .IsRepoToolbarCommits}}active{{end}}"><a href="{{.RepoLink}}/commits/{{.BranchName}}">Commits</a></li> | ||||
| <!-- <li class="{{if .IsRepoToolbarBranches}}active{{end}}"><a href="{{.RepoLink}}/branches">Branches</a></li> --> | <!-- <li class="{{if .IsRepoToolbarBranches}}active{{end}}"><a href="{{.RepoLink}}/branches">Branches</a></li> --> | ||||
| @@ -136,19 +136,20 @@ func runWeb(*cli.Context) { | |||||
| r.Get("/issues/:index", repo.ViewIssue) | r.Get("/issues/:index", repo.ViewIssue) | ||||
| r.Get("/pulls", repo.Pulls) | r.Get("/pulls", repo.Pulls) | ||||
| r.Get("/branches", repo.Branches) | r.Get("/branches", repo.Branches) | ||||
| }, ignSignIn, middleware.RepoAssignment(true)) | |||||
| m.Group("/:username/:reponame", func(r martini.Router) { | |||||
| r.Get("/src/:branchname", repo.Single) | r.Get("/src/:branchname", repo.Single) | ||||
| r.Get("/src/:branchname/**", repo.Single) | r.Get("/src/:branchname/**", repo.Single) | ||||
| r.Get("/raw/:branchname/**", repo.SingleDownload) | r.Get("/raw/:branchname/**", repo.SingleDownload) | ||||
| r.Get("/commits/:branchname", repo.Commits) | r.Get("/commits/:branchname", repo.Commits) | ||||
| }, ignSignIn, middleware.RepoAssignment(true)) | |||||
| m.Get("/:username/:reponame/commit/:branchname/**", ignSignIn, middleware.RepoAssignment(true), repo.Diff) | |||||
| m.Get("/:username/:reponame/commit/:branchname", ignSignIn, middleware.RepoAssignment(true), repo.Diff) | |||||
| r.Get("/commit/:branchname", repo.Diff) | |||||
| r.Get("/commit/:branchname/**", repo.Diff) | |||||
| }, ignSignIn, middleware.RepoAssignment(true, true)) | |||||
| m.Group("/:username", func(r martini.Router) { | m.Group("/:username", func(r martini.Router) { | ||||
| r.Get("/:reponame", middleware.RepoAssignment(true), repo.Single) | |||||
| r.Get("/:reponame", middleware.RepoAssignment(true), repo.Single) | |||||
| r.Any("/:reponame/**", repo.Http) | r.Any("/:reponame/**", repo.Http) | ||||
| r.Get("/:reponame", middleware.RepoAssignment(true, true, true), repo.Single) | |||||
| }, ignSignIn) | }, ignSignIn) | ||||
| // Not found handler. | // Not found handler. | ||||