aboutsummaryrefslogtreecommitdiff
path: root/internal/route/repo/wiki.go
diff options
context:
space:
mode:
authorUnknwon <u@gogs.io>2019-10-24 01:51:46 -0700
committerGitHub <noreply@github.com>2019-10-24 01:51:46 -0700
commit01c8df01ec0608f1f25b2f1444adabb98fa5ee8a (patch)
treef8a7e5dd8d2a8c51e1ce2cabb9d33571a93314dd /internal/route/repo/wiki.go
parent613139e7bef81d3573e7988a47eb6765f3de347a (diff)
internal: move packages under this directory (#5836)
* Rename pkg -> internal * Rename routes -> route * Move route -> internal/route * Rename models -> db * Move db -> internal/db * Fix route2 -> route * Move cmd -> internal/cmd * Bump version
Diffstat (limited to 'internal/route/repo/wiki.go')
-rw-r--r--internal/route/repo/wiki.go274
1 files changed, 274 insertions, 0 deletions
diff --git a/internal/route/repo/wiki.go b/internal/route/repo/wiki.go
new file mode 100644
index 00000000..8a48c319
--- /dev/null
+++ b/internal/route/repo/wiki.go
@@ -0,0 +1,274 @@
+// Copyright 2015 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package repo
+
+import (
+ "io/ioutil"
+ "strings"
+ "time"
+
+ "github.com/gogs/git-module"
+
+ "gogs.io/gogs/internal/context"
+ "gogs.io/gogs/internal/db"
+ "gogs.io/gogs/internal/form"
+ "gogs.io/gogs/internal/markup"
+)
+
+const (
+ WIKI_START = "repo/wiki/start"
+ WIKI_VIEW = "repo/wiki/view"
+ WIKI_NEW = "repo/wiki/new"
+ WIKI_PAGES = "repo/wiki/pages"
+)
+
+func MustEnableWiki(c *context.Context) {
+ if !c.Repo.Repository.EnableWiki {
+ c.Handle(404, "MustEnableWiki", nil)
+ return
+ }
+
+ if c.Repo.Repository.EnableExternalWiki {
+ c.Redirect(c.Repo.Repository.ExternalWikiURL)
+ return
+ }
+}
+
+type PageMeta struct {
+ Name string
+ URL string
+ Updated time.Time
+}
+
+func renderWikiPage(c *context.Context, isViewPage bool) (*git.Repository, string) {
+ wikiRepo, err := git.OpenRepository(c.Repo.Repository.WikiPath())
+ if err != nil {
+ c.Handle(500, "OpenRepository", err)
+ return nil, ""
+ }
+ commit, err := wikiRepo.GetBranchCommit("master")
+ if err != nil {
+ c.Handle(500, "GetBranchCommit", err)
+ return nil, ""
+ }
+
+ // Get page list.
+ if isViewPage {
+ entries, err := commit.ListEntries()
+ if err != nil {
+ c.Handle(500, "ListEntries", err)
+ return nil, ""
+ }
+ pages := make([]PageMeta, 0, len(entries))
+ for i := range entries {
+ if entries[i].Type == git.OBJECT_BLOB && strings.HasSuffix(entries[i].Name(), ".md") {
+ name := strings.TrimSuffix(entries[i].Name(), ".md")
+ pages = append(pages, PageMeta{
+ Name: name,
+ URL: db.ToWikiPageURL(name),
+ })
+ }
+ }
+ c.Data["Pages"] = pages
+ }
+
+ pageURL := c.Params(":page")
+ if len(pageURL) == 0 {
+ pageURL = "Home"
+ }
+ c.Data["PageURL"] = pageURL
+
+ pageName := db.ToWikiPageName(pageURL)
+ c.Data["old_title"] = pageName
+ c.Data["Title"] = pageName
+ c.Data["title"] = pageName
+ c.Data["RequireHighlightJS"] = true
+
+ blob, err := commit.GetBlobByPath(pageName + ".md")
+ if err != nil {
+ if git.IsErrNotExist(err) {
+ c.Redirect(c.Repo.RepoLink + "/wiki/_pages")
+ } else {
+ c.Handle(500, "GetBlobByPath", err)
+ }
+ return nil, ""
+ }
+ r, err := blob.Data()
+ if err != nil {
+ c.Handle(500, "Data", err)
+ return nil, ""
+ }
+ data, err := ioutil.ReadAll(r)
+ if err != nil {
+ c.Handle(500, "ReadAll", err)
+ return nil, ""
+ }
+ if isViewPage {
+ c.Data["content"] = string(markup.Markdown(data, c.Repo.RepoLink, c.Repo.Repository.ComposeMetas()))
+ } else {
+ c.Data["content"] = string(data)
+ }
+
+ return wikiRepo, pageName
+}
+
+func Wiki(c *context.Context) {
+ c.Data["PageIsWiki"] = true
+
+ if !c.Repo.Repository.HasWiki() {
+ c.Data["Title"] = c.Tr("repo.wiki")
+ c.HTML(200, WIKI_START)
+ return
+ }
+
+ wikiRepo, pageName := renderWikiPage(c, true)
+ if c.Written() {
+ return
+ }
+
+ // Get last change information.
+ lastCommit, err := wikiRepo.GetCommitByPath(pageName + ".md")
+ if err != nil {
+ c.Handle(500, "GetCommitByPath", err)
+ return
+ }
+ c.Data["Author"] = lastCommit.Author
+
+ c.HTML(200, WIKI_VIEW)
+}
+
+func WikiPages(c *context.Context) {
+ c.Data["Title"] = c.Tr("repo.wiki.pages")
+ c.Data["PageIsWiki"] = true
+
+ if !c.Repo.Repository.HasWiki() {
+ c.Redirect(c.Repo.RepoLink + "/wiki")
+ return
+ }
+
+ wikiRepo, err := git.OpenRepository(c.Repo.Repository.WikiPath())
+ if err != nil {
+ c.Handle(500, "OpenRepository", err)
+ return
+ }
+ commit, err := wikiRepo.GetBranchCommit("master")
+ if err != nil {
+ c.Handle(500, "GetBranchCommit", err)
+ return
+ }
+
+ entries, err := commit.ListEntries()
+ if err != nil {
+ c.Handle(500, "ListEntries", err)
+ return
+ }
+ pages := make([]PageMeta, 0, len(entries))
+ for i := range entries {
+ if entries[i].Type == git.OBJECT_BLOB && strings.HasSuffix(entries[i].Name(), ".md") {
+ commit, err := wikiRepo.GetCommitByPath(entries[i].Name())
+ if err != nil {
+ c.ServerError("GetCommitByPath", err)
+ return
+ }
+ name := strings.TrimSuffix(entries[i].Name(), ".md")
+ pages = append(pages, PageMeta{
+ Name: name,
+ URL: db.ToWikiPageURL(name),
+ Updated: commit.Author.When,
+ })
+ }
+ }
+ c.Data["Pages"] = pages
+
+ c.HTML(200, WIKI_PAGES)
+}
+
+func NewWiki(c *context.Context) {
+ c.Data["Title"] = c.Tr("repo.wiki.new_page")
+ c.Data["PageIsWiki"] = true
+ c.Data["RequireSimpleMDE"] = true
+
+ if !c.Repo.Repository.HasWiki() {
+ c.Data["title"] = "Home"
+ }
+
+ c.HTML(200, WIKI_NEW)
+}
+
+func NewWikiPost(c *context.Context, f form.NewWiki) {
+ c.Data["Title"] = c.Tr("repo.wiki.new_page")
+ c.Data["PageIsWiki"] = true
+ c.Data["RequireSimpleMDE"] = true
+
+ if c.HasError() {
+ c.HTML(200, WIKI_NEW)
+ return
+ }
+
+ if err := c.Repo.Repository.AddWikiPage(c.User, f.Title, f.Content, f.Message); err != nil {
+ if db.IsErrWikiAlreadyExist(err) {
+ c.Data["Err_Title"] = true
+ c.RenderWithErr(c.Tr("repo.wiki.page_already_exists"), WIKI_NEW, &f)
+ } else {
+ c.Handle(500, "AddWikiPage", err)
+ }
+ return
+ }
+
+ c.Redirect(c.Repo.RepoLink + "/wiki/" + db.ToWikiPageURL(db.ToWikiPageName(f.Title)))
+}
+
+func EditWiki(c *context.Context) {
+ c.Data["PageIsWiki"] = true
+ c.Data["PageIsWikiEdit"] = true
+ c.Data["RequireSimpleMDE"] = true
+
+ if !c.Repo.Repository.HasWiki() {
+ c.Redirect(c.Repo.RepoLink + "/wiki")
+ return
+ }
+
+ renderWikiPage(c, false)
+ if c.Written() {
+ return
+ }
+
+ c.HTML(200, WIKI_NEW)
+}
+
+func EditWikiPost(c *context.Context, f form.NewWiki) {
+ c.Data["Title"] = c.Tr("repo.wiki.new_page")
+ c.Data["PageIsWiki"] = true
+ c.Data["RequireSimpleMDE"] = true
+
+ if c.HasError() {
+ c.HTML(200, WIKI_NEW)
+ return
+ }
+
+ if err := c.Repo.Repository.EditWikiPage(c.User, f.OldTitle, f.Title, f.Content, f.Message); err != nil {
+ c.Handle(500, "EditWikiPage", err)
+ return
+ }
+
+ c.Redirect(c.Repo.RepoLink + "/wiki/" + db.ToWikiPageURL(db.ToWikiPageName(f.Title)))
+}
+
+func DeleteWikiPagePost(c *context.Context) {
+ pageURL := c.Params(":page")
+ if len(pageURL) == 0 {
+ pageURL = "Home"
+ }
+
+ pageName := db.ToWikiPageName(pageURL)
+ if err := c.Repo.Repository.DeleteWikiPage(c.User, pageName); err != nil {
+ c.Handle(500, "DeleteWikiPage", err)
+ return
+ }
+
+ c.JSON(200, map[string]interface{}{
+ "redirect": c.Repo.RepoLink + "/wiki/",
+ })
+}