func CompareDiff(ctx *middleware.Context) { ctx.Data["IsRepoToolbarCommits"] = true ctx.Data["IsDiffCompare"] = true userName := ctx.Repo.Owner.Name repoName := ctx.Repo.Repository.Name beforeCommitId := ctx.Params(":before") afterCommitId := ctx.Params(":after") commit, err := ctx.Repo.GitRepo.GetCommit(afterCommitId) if err != nil { ctx.Handle(404, "GetCommit", err) return } diff, err := models.GetDiffRange(models.RepoPath(userName, repoName), beforeCommitId, afterCommitId) if err != nil { ctx.Handle(404, "GetDiffRange", err) 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) if err != nil { ctx.Handle(500, "CommitsBeforeUntil", err) return } ctx.Data["Commits"] = commits ctx.Data["CommitCount"] = commits.Len() ctx.Data["BeforeCommitId"] = beforeCommitId ctx.Data["AfterCommitId"] = afterCommitId ctx.Data["Username"] = userName ctx.Data["Reponame"] = repoName ctx.Data["IsImageFile"] = isImageFile ctx.Data["Title"] = "Comparing " + base.ShortSha(beforeCommitId) + "..." + base.ShortSha(afterCommitId) + " · " + userName + "/" + repoName ctx.Data["Commit"] = commit ctx.Data["Diff"] = diff ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 ctx.Data["SourcePath"] = "/" + path.Join(userName, repoName, "src", afterCommitId) ctx.Data["RawPath"] = "/" + path.Join(userName, repoName, "raw", afterCommitId) ctx.HTML(200, DIFF) }
// FIXME: limit size. func UpdateAvatarSetting(ctx *middleware.Context, form auth.UploadAvatarForm, ctxUser *models.User) error { ctxUser.UseCustomAvatar = form.Enable if form.Avatar != nil { fr, err := form.Avatar.Open() if err != nil { return fmt.Errorf("Avatar.Open: %v", err) } data, err := ioutil.ReadAll(fr) if err != nil { return fmt.Errorf("ReadAll: %v", err) } if _, ok := base.IsImageFile(data); !ok { return errors.New(ctx.Tr("settings.uploaded_avatar_not_a_image")) } if err = ctxUser.UploadAvatar(data); err != nil { return fmt.Errorf("UploadAvatar: %v", err) } } else { // In case no avatar at all. if form.Enable && !com.IsFile(ctx.User.CustomAvatarPath()) { return errors.New(ctx.Tr("settings.no_custom_avatar_available")) } } if err := models.UpdateUser(ctxUser); err != nil { return fmt.Errorf("UpdateUser: %v", err) } return nil }
func SingleDownload(ctx *middleware.Context) { treename := ctx.Params("*") blob, err := ctx.Repo.Commit.GetBlobByPath(treename) if err != nil { ctx.Handle(500, "GetBlobByPath", err) return } dataRc, err := blob.Data() if err != nil { ctx.Handle(500, "repo.SingleDownload(Data)", err) return } buf := make([]byte, 1024) n, _ := dataRc.Read(buf) if n > 0 { buf = buf[:n] } contentType, isTextFile := base.IsTextFile(buf) _, 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-Transfer-Encoding", "binary") } ctx.Resp.Write(buf) io.Copy(ctx.Resp, dataRc) }
func SingleDownload(ctx *middleware.Context, params martini.Params) { // Get tree path treename := params["_1"] blob, err := ctx.Repo.Commit.GetBlobByPath(treename) if err != nil { ctx.Handle(404, "repo.SingleDownload(GetBlobByPath)", err) return } data, err := blob.Data() if err != nil { ctx.Handle(404, "repo.SingleDownload(Data)", err) return } contentType, isTextFile := base.IsTextFile(data) _, isImageFile := base.IsImageFile(data) ctx.Res.Header().Set("Content-Type", contentType) if !isTextFile && !isImageFile { ctx.Res.Header().Set("Content-Disposition", "attachment; filename="+filepath.Base(treename)) ctx.Res.Header().Set("Content-Transfer-Encoding", "binary") } ctx.Res.Write(data) }
func Diff(ctx *middleware.Context) { ctx.Data["IsRepoToolbarCommits"] = true userName := ctx.Repo.Owner.Name repoName := ctx.Repo.Repository.Name commitId := ctx.Repo.CommitId commit := ctx.Repo.Commit diff, err := models.GetDiffCommit(models.RepoPath(userName, repoName), commitId, setting.MaxGitDiffLines) if err != nil { ctx.Handle(404, "GetDiffCommit", err) 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()) for i := 0; i < commit.ParentCount(); i++ { sha, err := commit.ParentId(i) parents[i] = sha.String() if err != nil { ctx.Handle(404, "repo.Diff", err) return } } ctx.Data["Username"] = userName ctx.Data["Reponame"] = repoName ctx.Data["IsImageFile"] = isImageFile ctx.Data["Title"] = commit.Summary() + " · " + base.ShortSha(commitId) ctx.Data["Commit"] = commit ctx.Data["Author"] = models.ValidateCommitWithEmail(commit) ctx.Data["Diff"] = diff ctx.Data["Parents"] = parents ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "src", commitId) ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "raw", commitId) ctx.HTML(200, DIFF) }
func Diff(ctx *middleware.Context, params martini.Params) { userName := ctx.Repo.Owner.Name repoName := ctx.Repo.Repository.Name commitId := ctx.Repo.CommitId commit := ctx.Repo.Commit diff, err := models.GetDiff(models.RepoPath(userName, repoName), commitId) if err != nil { ctx.Handle(404, "repo.Diff", err) return } isImageFile := func(name string) bool { blob, err := ctx.Repo.Commit.GetBlobByPath(name) if err != nil { return false } data, err := blob.Data() if err != nil { return false } _, isImage := base.IsImageFile(data) return isImage } parents := make([]string, commit.ParentCount()) for i := 0; i < commit.ParentCount(); i++ { sha, err := commit.ParentId(i) parents[i] = sha.String() if err != nil { ctx.Handle(404, "repo.Diff", err) return } } ctx.Data["Username"] = userName ctx.Data["Reponame"] = repoName ctx.Data["IsImageFile"] = isImageFile ctx.Data["Title"] = commit.Summary() + " · " + base.ShortSha(commitId) ctx.Data["Commit"] = commit ctx.Data["Diff"] = diff ctx.Data["Parents"] = parents ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 ctx.Data["IsRepoToolbarCommits"] = true ctx.Data["SourcePath"] = "/" + path.Join(userName, repoName, "src", commitId) ctx.Data["RawPath"] = "/" + path.Join(userName, repoName, "raw", commitId) ctx.HTML(200, "repo/diff") }
func ServeData(ctx *context.Context, name string, reader io.Reader) error { buf := make([]byte, 1024) n, _ := reader.Read(buf) if n > 0 { buf = buf[:n] } if !base.IsTextFile(buf) { if !base.IsImageFile(buf) { ctx.Resp.Header().Set("Content-Disposition", "attachment; filename=\""+path.Base(ctx.Repo.TreePath)+"\"") ctx.Resp.Header().Set("Content-Transfer-Encoding", "binary") } } else if !ctx.QueryBool("render") { ctx.Resp.Header().Set("Content-Type", "text/plain; charset=utf-8") } ctx.Resp.Write(buf) _, err := io.Copy(ctx.Resp, reader) return err }
func ServeData(ctx *middleware.Context, name string, reader io.Reader) error { buf := make([]byte, 1024) n, _ := reader.Read(buf) if n > 0 { buf = buf[:n] } _, isTextFile := base.IsTextFile(buf) if !isTextFile { _, isImageFile := base.IsImageFile(buf) if !isImageFile { 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) _, err := io.Copy(ctx.Resp, reader) return err }
func Diff(ctx *middleware.Context, params martini.Params) { userName := ctx.Repo.Owner.Name repoName := ctx.Repo.Repository.Name branchName := ctx.Repo.BranchName commitId := ctx.Repo.CommitId commit := ctx.Repo.Commit diff, err := models.GetDiff(models.RepoPath(userName, repoName), commitId) if err != nil { ctx.Handle(404, "repo.Diff", err) return } isImageFile := func(name string) bool { repoFile, err := models.GetTargetFile(userName, repoName, branchName, commitId, name) if err != nil { return false } blob, err := repoFile.LookupBlob() if err != nil { return false } data := blob.Contents() _, isImage := base.IsImageFile(data) return isImage } ctx.Data["IsImageFile"] = isImageFile ctx.Data["Title"] = commit.Message() + " · " + base.ShortSha(commitId) ctx.Data["Commit"] = commit ctx.Data["Diff"] = diff ctx.Data["IsRepoToolbarCommits"] = true ctx.Data["SourcePath"] = "/" + path.Join(userName, repoName, "src", commitId) ctx.Data["RawPath"] = "/" + path.Join(userName, repoName, "raw", commitId) ctx.HTML(200, "repo/diff") }
// FIXME: limit size. func SettingsAvatar(ctx *middleware.Context, form auth.UploadAvatarForm) { defer ctx.Redirect(setting.AppSubUrl + "/user/settings") ctx.User.UseCustomAvatar = form.Enable if form.Avatar != nil { fr, err := form.Avatar.Open() if err != nil { ctx.Flash.Error(err.Error()) return } data, err := ioutil.ReadAll(fr) if err != nil { ctx.Flash.Error(err.Error()) return } if _, ok := base.IsImageFile(data); !ok { ctx.Flash.Error(ctx.Tr("settings.uploaded_avatar_not_a_image")) return } if err = ctx.User.UploadAvatar(data); err != nil { ctx.Flash.Error(err.Error()) return } } else { // In case no avatar at all. if form.Enable && !com.IsFile(ctx.User.CustomAvatarPath()) { ctx.Flash.Error(ctx.Tr("settings.no_custom_avatar_available")) return } } if err := models.UpdateUser(ctx.User); err != nil { ctx.Flash.Error(err.Error()) return } ctx.Flash.Success(ctx.Tr("settings.update_avatar_success")) }
// FIXME: limit size. func UpdateAvatarSetting(ctx *context.Context, form auth.AvatarForm, ctxUser *models.User) error { ctxUser.UseCustomAvatar = form.Source == auth.AVATAR_LOCAL if len(form.Gravatar) > 0 { ctxUser.Avatar = base.EncodeMD5(form.Gravatar) ctxUser.AvatarEmail = form.Gravatar } if form.Avatar != nil { fr, err := form.Avatar.Open() if err != nil { return fmt.Errorf("Avatar.Open: %v", err) } defer fr.Close() data, err := ioutil.ReadAll(fr) if err != nil { return fmt.Errorf("ioutil.ReadAll: %v", err) } if !base.IsImageFile(data) { return errors.New(ctx.Tr("settings.uploaded_avatar_not_a_image")) } if err = ctxUser.UploadAvatar(data); err != nil { return fmt.Errorf("UploadAvatar: %v", err) } } else { // No avatar is uploaded but setting has been changed to enable, // generate a random one when needed. if ctxUser.UseCustomAvatar && !com.IsFile(ctxUser.CustomAvatarPath()) { if err := ctxUser.GenerateRandomAvatar(); err != nil { log.Error(4, "GenerateRandomAvatar[%d]: %v", ctxUser.ID, err) } } } if err := models.UpdateUser(ctxUser); err != nil { return fmt.Errorf("UpdateUser: %v", err) } return nil }
func ServeBlob(ctx *middleware.Context, blob *git.Blob) error { dataRc, err := blob.Data() if err != nil { return err } buf := make([]byte, 1024) n, _ := dataRc.Read(buf) if n > 0 { buf = buf[:n] } _, isTextFile := base.IsTextFile(buf) _, isImageFile := base.IsImageFile(buf) if !isTextFile && !isImageFile { 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) _, err = io.Copy(ctx.Resp, dataRc) return err }
func SingleDownload(ctx *middleware.Context, params martini.Params) { // Get tree path treename := params["_1"] branchName := params["branchname"] userName := params["username"] repoName := params["reponame"] var commitId string if !models.IsBranchExist(userName, repoName, branchName) { commitId = branchName branchName = "" } repoFile, err := models.GetTargetFile(userName, repoName, branchName, commitId, treename) if err != nil { ctx.Handle(404, "repo.SingleDownload(GetTargetFile)", err) return } blob, err := repoFile.LookupBlob() if err != nil { ctx.Handle(404, "repo.SingleDownload(LookupBlob)", err) return } data := blob.Contents() contentType, isTextFile := base.IsTextFile(data) _, isImageFile := base.IsImageFile(data) ctx.Res.Header().Set("Content-Type", contentType) if !isTextFile && !isImageFile { ctx.Res.Header().Set("Content-Disposition", "attachment; filename="+filepath.Base(treename)) ctx.Res.Header().Set("Content-Transfer-Encoding", "binary") } ctx.Res.Write(data) }
// FIXME: limit size. func UpdateAvatarSetting(ctx *middleware.Context, form auth.UploadAvatarForm, ctxUser *models.User) error { ctxUser.UseCustomAvatar = form.Enable if form.Avatar != nil { fr, err := form.Avatar.Open() if err != nil { return fmt.Errorf("Avatar.Open: %v", err) } defer fr.Close() data, err := ioutil.ReadAll(fr) if err != nil { return fmt.Errorf("ioutil.ReadAll: %v", err) } if _, ok := base.IsImageFile(data); !ok { return errors.New(ctx.Tr("settings.uploaded_avatar_not_a_image")) } if err = ctxUser.UploadAvatar(data); err != nil { return fmt.Errorf("UploadAvatar: %v", err) } } else { // No avatar is uploaded but setting has been changed to enable, // generate a random one when needed. if form.Enable && !com.IsFile(ctxUser.CustomAvatarPath()) { if err := ctxUser.GenerateRandomAvatar(); err != nil { log.Error(4, "GenerateRandomAvatar[%d]: %v", ctxUser.Id, err) } } } if err := models.UpdateUser(ctxUser); err != nil { return fmt.Errorf("UpdateUser: %v", err) } return nil }
func Single(ctx *middleware.Context, params martini.Params) { branchName := ctx.Repo.BranchName 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 isViewBranch := ctx.Repo.IsBranch ctx.Data["IsViewBranch"] = isViewBranch treePath := treename if len(treePath) != 0 { treePath = treePath + "/" } entry, err := ctx.Repo.Commit.GetTreeEntryByPath(treename) if err != nil && err != git.ErrNotExist { ctx.Handle(404, "repo.Single(GetTreeEntryByPath)", err) return } if len(treename) != 0 && entry == nil { ctx.Handle(404, "repo.Single", nil) return } if entry != nil && !entry.IsDir() { blob := entry.Blob() if data, err := blob.Data(); err != nil { ctx.Handle(404, "repo.Single(blob.Data)", err) } else { ctx.Data["FileSize"] = blob.Size() ctx.Data["IsFile"] = true ctx.Data["FileName"] = blob.Name() ext := path.Ext(blob.Name()) if len(ext) > 0 { ext = ext[1:] } ctx.Data["FileExt"] = ext ctx.Data["FileLink"] = rawLink + "/" + treename _, isTextFile := base.IsTextFile(data) _, isImageFile := base.IsImageFile(data) ctx.Data["FileIsText"] = isTextFile if isImageFile { ctx.Data["IsImageFile"] = true } else { readmeExist := base.IsMarkdownFile(blob.Name()) || base.IsReadmeFile(blob.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. tree, err := ctx.Repo.Commit.SubTree(treename) if err != nil { ctx.Handle(404, "repo.Single(SubTree)", err) return } entries := tree.ListEntries() entries.Sort() files := make([][]interface{}, 0, len(entries)) for _, te := range entries { c, err := ctx.Repo.Commit.GetCommitOfRelPath(filepath.Join(treePath, te.Name())) if err != nil { ctx.Handle(404, "repo.Single(SubTree)", err) return } files = append(files, []interface{}{te, c}) } ctx.Data["Files"] = files var readmeFile *git.Blob for _, f := range entries { if f.IsDir() || !base.IsReadmeFile(f.Name()) { continue } else { readmeFile = f.Blob() break } } if readmeFile != nil { ctx.Data["ReadmeInSingle"] = true ctx.Data["ReadmeExist"] = true if data, err := readmeFile.Data(); err != nil { ctx.Handle(404, "repo.Single(readmeFile.LookupBlob)", err) return } else { ctx.Data["FileSize"] = readmeFile.Size ctx.Data["FileLink"] = rawLink + "/" + treename _, 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["TreePath"] = treePath ctx.Data["BranchLink"] = branchLink ctx.HTML(200, "repo/single") }
func Home(ctx *context.Context) { title := ctx.Repo.Repository.Owner.Name + "/" + ctx.Repo.Repository.Name if len(ctx.Repo.Repository.Description) > 0 { title += ": " + ctx.Repo.Repository.Description } ctx.Data["Title"] = title ctx.Data["PageIsViewCode"] = true ctx.Data["RequireHighlightJS"] = true branchName := ctx.Repo.BranchName userName := ctx.Repo.Owner.Name repoName := ctx.Repo.Repository.Name repoLink := ctx.Repo.RepoLink branchLink := ctx.Repo.RepoLink + "/src/" + branchName treeLink := branchLink rawLink := ctx.Repo.RepoLink + "/raw/" + branchName // Get tree path treename := ctx.Repo.TreeName if len(treename) > 0 { if treename[len(treename)-1] == '/' { ctx.Redirect(repoLink + "/src/" + branchName + "/" + treename[:len(treename)-1]) return } treeLink += "/" + treename } treePath := treename if len(treePath) != 0 { treePath = treePath + "/" } entry, err := ctx.Repo.Commit.GetTreeEntryByPath(treename) if err != nil && git.IsErrNotExist(err) { ctx.Handle(404, "GetTreeEntryByPath", err) return } if len(treename) != 0 && entry == nil { ctx.Handle(404, "repo.Home", nil) return } if entry != nil && !entry.IsDir() { blob := entry.Blob() if dataRc, err := blob.Data(); err != nil { ctx.Handle(404, "blob.Data", err) return } else { ctx.Data["FileSize"] = blob.Size() ctx.Data["IsFile"] = true ctx.Data["FileName"] = blob.Name() ctx.Data["HighlightClass"] = highlight.FileNameToHighlightClass(blob.Name()) ctx.Data["FileLink"] = rawLink + "/" + treename buf := make([]byte, 1024) n, _ := dataRc.Read(buf) if n > 0 { buf = buf[:n] } _, isTextFile := base.IsTextFile(buf) _, isImageFile := base.IsImageFile(buf) _, isPDFFile := base.IsPDFFile(buf) ctx.Data["IsFileText"] = isTextFile switch { case isPDFFile: ctx.Data["IsPDFFile"] = true case isImageFile: ctx.Data["IsImageFile"] = true case isTextFile: if blob.Size() >= setting.MaxDisplayFileSize { ctx.Data["IsFileTooLarge"] = true } else { ctx.Data["IsFileTooLarge"] = false d, _ := ioutil.ReadAll(dataRc) buf = append(buf, d...) readmeExist := markdown.IsMarkdownFile(blob.Name()) || markdown.IsReadmeFile(blob.Name()) ctx.Data["ReadmeExist"] = readmeExist if readmeExist { ctx.Data["FileContent"] = string(markdown.Render(buf, path.Dir(treeLink), ctx.Repo.Repository.ComposeMetas())) } else { if err, content := template.ToUtf8WithErr(buf); err != nil { if err != nil { log.Error(4, "Convert content encoding: %s", err) } ctx.Data["FileContent"] = string(buf) } else { ctx.Data["FileContent"] = content } } } } } } else { // Directory and file list. tree, err := ctx.Repo.Commit.SubTree(treename) if err != nil { ctx.Handle(404, "SubTree", err) return } entries, err := tree.ListEntries() if err != nil { ctx.Handle(500, "ListEntries", err) return } entries.Sort() ctx.Data["Files"], err = entries.GetCommitsInfo(ctx.Repo.Commit, treePath) if err != nil { ctx.Handle(500, "GetCommitsInfo", err) return } var readmeFile *git.Blob for _, f := range entries { if f.IsDir() || !markdown.IsReadmeFile(f.Name()) { continue } else { readmeFile = f.Blob() break } } if readmeFile != nil { ctx.Data["ReadmeInList"] = true ctx.Data["ReadmeExist"] = true if dataRc, err := readmeFile.Data(); err != nil { ctx.Handle(404, "repo.SinglereadmeFile.Data", err) return } else { buf := make([]byte, 1024) n, _ := dataRc.Read(buf) if n > 0 { buf = buf[:n] } ctx.Data["FileSize"] = readmeFile.Size() ctx.Data["FileLink"] = rawLink + "/" + treename _, isTextFile := base.IsTextFile(buf) ctx.Data["FileIsText"] = isTextFile ctx.Data["FileName"] = readmeFile.Name() if isTextFile { d, _ := ioutil.ReadAll(dataRc) buf = append(buf, d...) switch { case markdown.IsMarkdownFile(readmeFile.Name()): buf = markdown.Render(buf, treeLink, ctx.Repo.Repository.ComposeMetas()) default: buf = bytes.Replace(buf, []byte("\n"), []byte(`<br>`), -1) } ctx.Data["FileContent"] = string(buf) } } } lastCommit := ctx.Repo.Commit if len(treePath) > 0 { c, err := ctx.Repo.Commit.GetCommitByPath(treePath) if err != nil { ctx.Handle(500, "GetCommitByPath", err) return } lastCommit = c } ctx.Data["LastCommit"] = lastCommit ctx.Data["LastCommitUser"] = models.ValidateCommitWithEmail(lastCommit) } 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["Paths"] = Paths ctx.Data["TreeName"] = treename ctx.Data["Treenames"] = treenames ctx.Data["TreePath"] = treePath ctx.Data["BranchLink"] = branchLink ctx.HTML(200, HOME) }
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") }
func Home(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Repo.Repository.Name branchName := ctx.Repo.BranchName 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 := ctx.Params("*") if len(treename) > 0 && treename[len(treename)-1] == '/' { ctx.Redirect(repoLink + "/src/" + branchName + "/" + treename[:len(treename)-1]) return } ctx.Data["IsRepoToolbarSource"] = true isViewBranch := ctx.Repo.IsBranch ctx.Data["IsViewBranch"] = isViewBranch treePath := treename if len(treePath) != 0 { treePath = treePath + "/" } entry, err := ctx.Repo.Commit.GetTreeEntryByPath(treename) if err != nil && err != git.ErrNotExist { ctx.Handle(404, "GetTreeEntryByPath", err) return } if len(treename) != 0 && entry == nil { ctx.Handle(404, "repo.Home", nil) return } if entry != nil && !entry.IsDir() { blob := entry.Blob() if dataRc, err := blob.Data(); err != nil { ctx.Handle(404, "blob.Data", err) return } else { ctx.Data["FileSize"] = blob.Size() ctx.Data["IsFile"] = true ctx.Data["FileName"] = blob.Name() ext := path.Ext(blob.Name()) if len(ext) > 0 { ext = ext[1:] } ctx.Data["FileExt"] = ext ctx.Data["FileLink"] = rawLink + "/" + treename buf := make([]byte, 1024) n, _ := dataRc.Read(buf) if n > 0 { buf = buf[:n] } _, isTextFile := base.IsTextFile(buf) _, isImageFile := base.IsImageFile(buf) ctx.Data["IsFileText"] = isTextFile switch { case isImageFile: ctx.Data["IsImageFile"] = true case isTextFile: d, _ := ioutil.ReadAll(dataRc) buf = append(buf, d...) readmeExist := base.IsMarkdownFile(blob.Name()) || base.IsReadmeFile(blob.Name()) ctx.Data["ReadmeExist"] = readmeExist if readmeExist { ctx.Data["FileContent"] = string(base.RenderMarkdown(buf, "")) } else { if err, content := toUtf8(buf); err != nil { if err != nil { log.Error(4, "Convert content encoding: %s", err) } ctx.Data["FileContent"] = string(buf) } else { ctx.Data["FileContent"] = content } } } } } else { // Directory and file list. tree, err := ctx.Repo.Commit.SubTree(treename) if err != nil { ctx.Handle(404, "SubTree", err) return } entries, err := tree.ListEntries(treename) if err != nil { ctx.Handle(500, "ListEntries", err) return } entries.Sort() files := make([][]interface{}, 0, len(entries)) for _, te := range entries { c, err := ctx.Repo.Commit.GetCommitOfRelPath(filepath.Join(treePath, te.Name())) if err != nil { ctx.Handle(404, "GetCommitOfRelPath", err) return } files = append(files, []interface{}{te, c}) } ctx.Data["Files"] = files var readmeFile *git.Blob for _, f := range entries { if f.IsDir() || !base.IsReadmeFile(f.Name()) { continue } else { readmeFile = f.Blob() break } } if readmeFile != nil { ctx.Data["ReadmeInHome"] = true ctx.Data["ReadmeExist"] = true if dataRc, err := readmeFile.Data(); err != nil { ctx.Handle(404, "repo.SinglereadmeFile.LookupBlob", err) return } else { buf := make([]byte, 1024) n, _ := dataRc.Read(buf) if n > 0 { buf = buf[:n] } ctx.Data["FileSize"] = readmeFile.Size() ctx.Data["FileLink"] = rawLink + "/" + treename _, isTextFile := base.IsTextFile(buf) ctx.Data["FileIsText"] = isTextFile ctx.Data["FileName"] = readmeFile.Name() if isTextFile { d, _ := ioutil.ReadAll(dataRc) buf = append(buf, d...) switch { case base.IsMarkdownFile(readmeFile.Name()): buf = base.RenderMarkdown(buf, branchLink) default: buf = bytes.Replace(buf, []byte("\n"), []byte(`<br>`), -1) } ctx.Data["FileContent"] = string(buf) } } } } 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["TreeName"] = treename ctx.Data["Treenames"] = treenames ctx.Data["TreePath"] = treePath ctx.Data["BranchLink"] = branchLink ctx.HTML(200, HOME) }
func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink string) { ctx.Data["IsViewFile"] = true blob := entry.Blob() dataRc, err := blob.Data() if err != nil { ctx.Handle(500, "Data", err) return } ctx.Data["FileSize"] = blob.Size() ctx.Data["FileName"] = blob.Name() ctx.Data["HighlightClass"] = highlight.FileNameToHighlightClass(blob.Name()) ctx.Data["RawFileLink"] = rawLink + "/" + ctx.Repo.TreePath buf := make([]byte, 1024) n, _ := dataRc.Read(buf) buf = buf[:n] isTextFile := base.IsTextFile(buf) ctx.Data["IsTextFile"] = isTextFile // Assume file is not editable first. if !isTextFile { ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.cannot_edit_non_text_files") } switch { case isTextFile: if blob.Size() >= setting.UI.MaxDisplayFileSize { ctx.Data["IsFileTooLarge"] = true break } d, _ := ioutil.ReadAll(dataRc) buf = append(buf, d...) isMarkdown := markdown.IsMarkdownFile(blob.Name()) ctx.Data["IsMarkdown"] = isMarkdown readmeExist := isMarkdown || markdown.IsReadmeFile(blob.Name()) ctx.Data["ReadmeExist"] = readmeExist isYaml := yaml.IsYamlFile(blob.Name()) ctx.Data["IsYaml"] = isYaml if readmeExist { // TODO: don't need to render if it's a README but not Markdown file. yamlHtml := yaml.RenderMarkdownYaml(buf) markdownBody := markdown.Render(yaml.StripYamlFromText(buf), path.Dir(treeLink), ctx.Repo.Repository.ComposeMetas()) ctx.Data["FileContent"] = string(append(yamlHtml, markdownBody...)) } else if isYaml { ctx.Data["FileContent"] = string(yaml.RenderYaml(buf)) } else { // Building code view blocks with line number on server side. var fileContent string if err, content := template.ToUTF8WithErr(buf); err != nil { if err != nil { log.Error(4, "ToUTF8WithErr: %s", err) } fileContent = string(buf) } else { fileContent = content } var output bytes.Buffer lines := strings.Split(fileContent, "\n") for index, line := range lines { output.WriteString(fmt.Sprintf(`<li class="L%d" rel="L%d">%s</li>`, index+1, index+1, gotemplate.HTMLEscapeString(line)) + "\n") } ctx.Data["FileContent"] = gotemplate.HTML(output.String()) output.Reset() for i := 0; i < len(lines); i++ { output.WriteString(fmt.Sprintf(`<span id="L%d">%d</span>`, i+1, i+1)) } ctx.Data["LineNums"] = gotemplate.HTML(output.String()) } if ctx.Repo.CanEnableEditor() { ctx.Data["CanEditFile"] = true ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.edit_this_file") } else if !ctx.Repo.IsViewBranch { ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch") } else if !ctx.Repo.IsWriter() { ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.fork_before_edit") } case base.IsPDFFile(buf): ctx.Data["IsPDFFile"] = true case base.IsImageFile(buf): ctx.Data["IsImageFile"] = true } if ctx.Repo.CanEnableEditor() { ctx.Data["CanDeleteFile"] = true ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file") } else if !ctx.Repo.IsViewBranch { ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch") } else if !ctx.Repo.IsWriter() { ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.must_have_write_access") } }