func Single(ctx *middleware.Context, params martini.Params) { if !ctx.Repo.IsValid { return } if len(params["branchname"]) == 0 { params["branchname"] = "master" } // Get tree path treename := params["_1"] if len(treename) > 0 && treename[len(treename)-1] == '/' { ctx.Redirect("/" + ctx.Repo.Owner.LowerName + "/" + ctx.Repo.Repository.Name + "/src/" + params["branchname"] + "/" + treename[:len(treename)-1]) return } ctx.Data["IsRepoToolbarSource"] = true // Branches. brs, err := models.GetBranches(params["username"], params["reponame"]) if err != nil { //log.Error("repo.Single(GetBranches): %v", err) ctx.Handle(404, "repo.Single(GetBranches)", err) return } else if ctx.Repo.Repository.IsBare { ctx.Data["IsBareRepo"] = true ctx.HTML(200, "repo/single") return } ctx.Data["Branches"] = brs repoFile, err := models.GetTargetFile(params["username"], params["reponame"], params["branchname"], params["commitid"], treename) if err != nil && err != models.ErrRepoFileNotExist { //log.Error("repo.Single(GetTargetFile): %v", err) ctx.Handle(404, "repo.Single(GetTargetFile)", err) return } branchLink := "/" + ctx.Repo.Owner.LowerName + "/" + ctx.Repo.Repository.Name + "/src/" + params["branchname"] if len(treename) != 0 && repoFile == nil { ctx.Handle(404, "repo.Single", nil) return } if repoFile != nil && repoFile.IsFile() { if repoFile.Size > 1024*1024 || repoFile.Filemode != git.FileModeBlob { ctx.Data["FileIsLarge"] = true } else if blob, err := repoFile.LookupBlob(); err != nil { //log.Error("repo.Single(repoFile.LookupBlob): %v", err) ctx.Handle(404, "repo.Single(repoFile.LookupBlob)", err) } else { ctx.Data["IsFile"] = true ctx.Data["FileName"] = repoFile.Name ext := path.Ext(repoFile.Name) if len(ext) > 0 { ext = ext[1:] } ctx.Data["FileExt"] = ext readmeExist := base.IsMarkdownFile(repoFile.Name) || base.IsReadmeFile(repoFile.Name) ctx.Data["ReadmeExist"] = readmeExist if readmeExist { ctx.Data["FileContent"] = string(base.RenderMarkdown(blob.Contents(), "")) } else { ctx.Data["FileContent"] = string(blob.Contents()) } } } else { // Directory and file list. files, err := models.GetReposFiles(params["username"], params["reponame"], params["branchname"], params["commitid"], treename) if err != nil { //log.Error("repo.Single(GetReposFiles): %v", err) ctx.Handle(404, "repo.Single(GetReposFiles)", err) return } ctx.Data["Files"] = files var readmeFile *models.RepoFile for _, f := range files { if !f.IsFile() || !base.IsReadmeFile(f.Name) { continue } else { readmeFile = f break } } if readmeFile != nil { ctx.Data["ReadmeExist"] = true // if file large than 1M not show it if readmeFile.Size > 1024*1024 || readmeFile.Filemode != git.FileModeBlob { ctx.Data["FileIsLarge"] = true } else if blob, err := readmeFile.LookupBlob(); err != nil { ctx.Handle(404, "repo.Single(readmeFile.LookupBlob)", err) return } else { // current repo branch link ctx.Data["FileName"] = readmeFile.Name ctx.Data["FileContent"] = string(base.RenderMarkdown(blob.Contents(), branchLink)) } } } ctx.Data["Username"] = params["username"] ctx.Data["Reponame"] = params["reponame"] ctx.Data["Branchname"] = params["branchname"] var treenames []string Paths := make([]string, 0) if len(treename) > 0 { treenames = strings.Split(treename, "/") for i, _ := range treenames { Paths = append(Paths, strings.Join(treenames[0:i+1], "/")) } ctx.Data["HasParentPath"] = true if len(Paths)-2 >= 0 { ctx.Data["ParentPath"] = "/" + Paths[len(Paths)-2] } } // Get latest commit according username and repo name commit, err := models.GetCommit(params["username"], params["reponame"], params["branchname"], params["commitid"]) if err != nil { log.Error("repo.Single(GetCommit): %v", err) ctx.Handle(404, "repo.Single(GetCommit)", err) return } ctx.Data["LastCommit"] = commit ctx.Data["Paths"] = Paths ctx.Data["Treenames"] = treenames ctx.Data["BranchLink"] = branchLink ctx.HTML(200, "repo/single") }
func Single(ctx *middleware.Context, params martini.Params) { branchName := ctx.Repo.BranchName commitId := ctx.Repo.CommitId userName := ctx.Repo.Owner.Name repoName := ctx.Repo.Repository.Name repoLink := ctx.Repo.RepoLink branchLink := ctx.Repo.RepoLink + "/src/" + branchName rawLink := ctx.Repo.RepoLink + "/raw/" + branchName // Get tree path treename := params["_1"] if len(treename) > 0 && treename[len(treename)-1] == '/' { ctx.Redirect(repoLink + "/src/" + branchName + "/" + treename[:len(treename)-1]) return } ctx.Data["IsRepoToolbarSource"] = true // Branches. brs, err := models.GetBranches(userName, repoName) if err != nil { ctx.Handle(404, "repo.Single(GetBranches)", err) return } ctx.Data["Branches"] = brs isViewBranch := ctx.Repo.IsBranch ctx.Data["IsViewBranch"] = isViewBranch repoFile, err := models.GetTargetFile(userName, repoName, branchName, commitId, treename) if err != nil && err != models.ErrRepoFileNotExist { ctx.Handle(404, "repo.Single(GetTargetFile)", err) return } if len(treename) != 0 && repoFile == nil { ctx.Handle(404, "repo.Single", nil) return } if repoFile != nil && repoFile.IsFile() { if blob, err := repoFile.LookupBlob(); err != nil { ctx.Handle(404, "repo.Single(repoFile.LookupBlob)", err) } else { ctx.Data["FileSize"] = repoFile.Size ctx.Data["IsFile"] = true ctx.Data["FileName"] = repoFile.Name ext := path.Ext(repoFile.Name) if len(ext) > 0 { ext = ext[1:] } ctx.Data["FileExt"] = ext ctx.Data["FileLink"] = rawLink + "/" + treename data := blob.Contents() _, isTextFile := base.IsTextFile(data) _, isImageFile := base.IsImageFile(data) ctx.Data["FileIsText"] = isTextFile if isImageFile { ctx.Data["IsImageFile"] = true } else { readmeExist := base.IsMarkdownFile(repoFile.Name) || base.IsReadmeFile(repoFile.Name) ctx.Data["ReadmeExist"] = readmeExist if readmeExist { ctx.Data["FileContent"] = string(base.RenderMarkdown(data, "")) } else { if isTextFile { ctx.Data["FileContent"] = string(data) } } } } } else { // Directory and file list. files, err := models.GetReposFiles(userName, repoName, ctx.Repo.CommitId, treename) if err != nil { ctx.Handle(404, "repo.Single(GetReposFiles)", err) return } ctx.Data["Files"] = files var readmeFile *models.RepoFile for _, f := range files { if !f.IsFile() || !base.IsReadmeFile(f.Name) { continue } else { readmeFile = f break } } if readmeFile != nil { ctx.Data["ReadmeInSingle"] = true ctx.Data["ReadmeExist"] = true if blob, err := readmeFile.LookupBlob(); err != nil { ctx.Handle(404, "repo.Single(readmeFile.LookupBlob)", err) return } else { ctx.Data["FileSize"] = readmeFile.Size ctx.Data["FileLink"] = rawLink + "/" + treename data := blob.Contents() _, isTextFile := base.IsTextFile(data) ctx.Data["FileIsText"] = isTextFile ctx.Data["FileName"] = readmeFile.Name if isTextFile { ctx.Data["FileContent"] = string(base.RenderMarkdown(data, branchLink)) } } } } ctx.Data["Username"] = userName ctx.Data["Reponame"] = repoName var treenames []string Paths := make([]string, 0) if len(treename) > 0 { treenames = strings.Split(treename, "/") for i, _ := range treenames { Paths = append(Paths, strings.Join(treenames[0:i+1], "/")) } ctx.Data["HasParentPath"] = true if len(Paths)-2 >= 0 { ctx.Data["ParentPath"] = "/" + Paths[len(Paths)-2] } } ctx.Data["LastCommit"] = ctx.Repo.Commit ctx.Data["Paths"] = Paths ctx.Data["Treenames"] = treenames ctx.Data["BranchLink"] = branchLink ctx.HTML(200, "repo/single") }