diff options
Diffstat (limited to 'modules/middleware/repo.go')
-rw-r--r-- | modules/middleware/repo.go | 96 |
1 files changed, 79 insertions, 17 deletions
diff --git a/modules/middleware/repo.go b/modules/middleware/repo.go index 2139742c..34144fe3 100644 --- a/modules/middleware/repo.go +++ b/modules/middleware/repo.go @@ -15,6 +15,7 @@ import ( "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/base" + "github.com/gogits/gogs/modules/log" ) func RepoAssignment(redirect bool, args ...bool) martini.Handler { @@ -39,7 +40,7 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { userName := params["username"] repoName := params["reponame"] - branchName := params["branchname"] + refName := params["branchname"] // get repository owner ctx.Repo.IsOwner = ctx.IsSigned && ctx.User.LowerName == strings.ToLower(userName) @@ -66,34 +67,69 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { ctx.Handle(200, "RepoAssignment", errors.New("invliad user account for single repository")) return } + ctx.Repo.Owner = user // get repository repo, err := models.GetRepositoryByName(user.Id, repoName) if err != nil { if err == models.ErrRepoNotExist { ctx.Handle(404, "RepoAssignment", err) + return } else if redirect { ctx.Redirect("/") return } - ctx.Handle(404, "RepoAssignment", err) + ctx.Handle(500, "RepoAssignment", err) return } + + // Check access. + if repo.IsPrivate { + if ctx.User == nil { + ctx.Handle(404, "RepoAssignment(HasAccess)", nil) + return + } + + hasAccess, err := models.HasAccess(ctx.User.Name, ctx.Repo.Owner.Name+"/"+repo.Name, models.AU_READABLE) + if err != nil { + ctx.Handle(500, "RepoAssignment(HasAccess)", err) + return + } else if !hasAccess { + ctx.Handle(404, "RepoAssignment(HasAccess)", nil) + return + } + } + ctx.Repo.HasAccess = true + ctx.Data["HasAccess"] = true + + if repo.IsMirror { + ctx.Repo.Mirror, err = models.GetMirror(repo.Id) + if err != nil { + ctx.Handle(500, "RepoAssignment(GetMirror)", err) + return + } + ctx.Data["MirrorInterval"] = ctx.Repo.Mirror.Interval + } + repo.NumOpenIssues = repo.NumIssues - repo.NumClosedIssues ctx.Repo.Repository = repo - ctx.Data["IsBareRepo"] = ctx.Repo.Repository.IsBare gitRepo, err := git.OpenRepository(models.RepoPath(userName, repoName)) if err != nil { - ctx.Handle(404, "RepoAssignment Invalid repo "+models.RepoPath(userName, repoName), err) + ctx.Handle(500, "RepoAssignment Invalid repo "+models.RepoPath(userName, repoName), err) return } ctx.Repo.GitRepo = gitRepo - - ctx.Repo.Owner = user ctx.Repo.RepoLink = "/" + user.Name + "/" + repo.Name + tags, err := ctx.Repo.GitRepo.GetTags() + if err != nil { + ctx.Handle(500, "RepoAssignment(GetTags))", err) + return + } + ctx.Repo.Repository.NumTags = len(tags) + ctx.Data["Title"] = user.Name + "/" + repo.Name ctx.Data["Repository"] = repo ctx.Data["Owner"] = user @@ -105,29 +141,43 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { ctx.Repo.CloneLink.HTTPS = fmt.Sprintf("%s%s/%s.git", base.AppUrl, user.LowerName, repo.LowerName) ctx.Data["CloneLink"] = ctx.Repo.CloneLink + if ctx.Repo.Repository.IsGoget { + ctx.Data["GoGetLink"] = fmt.Sprintf("%s%s/%s", base.AppUrl, user.LowerName, repo.LowerName) + ctx.Data["GoGetImport"] = fmt.Sprintf("%s/%s/%s", base.Domain, user.LowerName, repo.LowerName) + } + // 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) { + if len(refName) > 0 { + if gitRepo.IsBranchExist(refName) { ctx.Repo.IsBranch = true - ctx.Repo.BranchName = branchName + ctx.Repo.BranchName = refName - ctx.Repo.Commit, err = gitRepo.GetCommitOfBranch(branchName) + ctx.Repo.Commit, err = gitRepo.GetCommitOfBranch(refName) if err != nil { ctx.Handle(404, "RepoAssignment invalid branch", nil) return } + ctx.Repo.CommitId = ctx.Repo.Commit.Id.String() - ctx.Repo.CommitId = ctx.Repo.Commit.Oid.String() + } else if gitRepo.IsTagExist(refName) { + ctx.Repo.IsBranch = true + ctx.Repo.BranchName = refName - } else if len(branchName) == 40 { + ctx.Repo.Commit, err = gitRepo.GetCommitOfTag(refName) + if err != nil { + ctx.Handle(404, "RepoAssignment invalid tag", nil) + return + } + ctx.Repo.CommitId = ctx.Repo.Commit.Id.String() + + } else if len(refName) == 40 { ctx.Repo.IsCommit = true - ctx.Repo.CommitId = branchName - ctx.Repo.BranchName = branchName + ctx.Repo.CommitId = refName + ctx.Repo.BranchName = refName - ctx.Repo.Commit, err = gitRepo.GetCommit(branchName) + ctx.Repo.Commit, err = gitRepo.GetCommit(refName) if err != nil { ctx.Handle(404, "RepoAssignment invalid commit", nil) return @@ -138,16 +188,23 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { } } else { - branchName = "master" + refName = ctx.Repo.Repository.DefaultBranch + if len(refName) == 0 { + refName = "master" + } goto detect } ctx.Data["IsBranch"] = ctx.Repo.IsBranch ctx.Data["IsCommit"] = ctx.Repo.IsCommit + log.Debug("Repo.Commit: %v", ctx.Repo.Commit) } + log.Debug("displayBare: %v; IsBare: %v", displayBare, ctx.Repo.Repository.IsBare) + // repo is bare and display enable if displayBare && ctx.Repo.Repository.IsBare { + log.Debug("Bare repository: %s", ctx.Repo.RepoLink) ctx.HTML(200, "repo/single_bare") return } @@ -157,6 +214,11 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { } ctx.Data["BranchName"] = ctx.Repo.BranchName + brs, err := ctx.Repo.GitRepo.GetBranches() + if err != nil { + log.Error("RepoAssignment(GetBranches): %v", err) + } + ctx.Data["Branches"] = brs ctx.Data["CommitId"] = ctx.Repo.CommitId ctx.Data["IsRepositoryWatching"] = ctx.Repo.IsWatching } |