From f8c2903484f0db71b9d2ca29f67a38cb7d738699 Mon Sep 17 00:00:00 2001
From: Lunny Xiao <xiaolunwen@gmail.com>
Date: Sat, 21 Jan 2017 20:50:51 +0800
Subject: [PATCH] fixed bugs on Wiki and resolved #667 (#674)

---
 models/wiki.go       | 30 +++++++++++++++---------------
 routers/repo/wiki.go | 24 ++++++++++++++----------
 2 files changed, 29 insertions(+), 25 deletions(-)

diff --git a/models/wiki.go b/models/wiki.go
index 1a7ad0e489..43ebc535f3 100644
--- a/models/wiki.go
+++ b/models/wiki.go
@@ -89,7 +89,7 @@ func discardLocalWikiChanges(localPath string) error {
 }
 
 // updateWikiPage adds new page to repository wiki.
-func (repo *Repository) updateWikiPage(doer *User, oldTitle, title, content, message string, isNew bool) (err error) {
+func (repo *Repository) updateWikiPage(doer *User, oldWikiPath, wikiPath, content, message string, isNew bool) (err error) {
 	wikiWorkingPool.CheckIn(com.ToStr(repo.ID))
 	defer wikiWorkingPool.CheckOut(com.ToStr(repo.ID))
 
@@ -104,8 +104,8 @@ func (repo *Repository) updateWikiPage(doer *User, oldTitle, title, content, mes
 		return fmt.Errorf("UpdateLocalWiki: %v", err)
 	}
 
-	title = ToWikiPageName(title)
-	filename := path.Join(localPath, title+".md")
+	title := ToWikiPageName(wikiPath)
+	filename := path.Join(localPath, wikiPath+".md")
 
 	// If not a new file, show perform update not create.
 	if isNew {
@@ -113,7 +113,7 @@ func (repo *Repository) updateWikiPage(doer *User, oldTitle, title, content, mes
 			return ErrWikiAlreadyExist{filename}
 		}
 	} else {
-		file := path.Join(localPath, oldTitle+".md")
+		file := path.Join(localPath, oldWikiPath+".md")
 
 		if err := os.Remove(file); err != nil {
 			return fmt.Errorf("Fail to remove %s: %v", file, err)
@@ -149,19 +149,19 @@ func (repo *Repository) updateWikiPage(doer *User, oldTitle, title, content, mes
 	return nil
 }
 
-// AddWikiPage adds a new wiki page with a given title.
-func (repo *Repository) AddWikiPage(doer *User, title, content, message string) error {
-	return repo.updateWikiPage(doer, "", title, content, message, true)
+// AddWikiPage adds a new wiki page with a given wikiPath.
+func (repo *Repository) AddWikiPage(doer *User, wikiPath, content, message string) error {
+	return repo.updateWikiPage(doer, "", wikiPath, content, message, true)
 }
 
-// EditWikiPage updates a wiki page identified by its title,
-// optionally also changing title.
-func (repo *Repository) EditWikiPage(doer *User, oldTitle, title, content, message string) error {
-	return repo.updateWikiPage(doer, oldTitle, title, content, message, false)
+// EditWikiPage updates a wiki page identified by its wikiPath,
+// optionally also changing wikiPath.
+func (repo *Repository) EditWikiPage(doer *User, oldWikiPath, wikiPath, content, message string) error {
+	return repo.updateWikiPage(doer, oldWikiPath, wikiPath, content, message, false)
 }
 
-// DeleteWikiPage deletes a wiki page identified by its title.
-func (repo *Repository) DeleteWikiPage(doer *User, title string) (err error) {
+// DeleteWikiPage deletes a wiki page identified by its wikiPath.
+func (repo *Repository) DeleteWikiPage(doer *User, wikiPath string) (err error) {
 	wikiWorkingPool.CheckIn(com.ToStr(repo.ID))
 	defer wikiWorkingPool.CheckOut(com.ToStr(repo.ID))
 
@@ -172,13 +172,13 @@ func (repo *Repository) DeleteWikiPage(doer *User, title string) (err error) {
 		return fmt.Errorf("UpdateLocalWiki: %v", err)
 	}
 
-	title = ToWikiPageName(title)
-	filename := path.Join(localPath, title+".md")
+	filename := path.Join(localPath, wikiPath+".md")
 
 	if err := os.Remove(filename); err != nil {
 		return fmt.Errorf("Fail to remove %s: %v", filename, err)
 	}
 
+	title := ToWikiPageName(wikiPath)
 	message := "Delete page '" + title + "'"
 
 	if err = git.AddChanges(localPath, true); err != nil {
diff --git a/routers/repo/wiki.go b/routers/repo/wiki.go
index 759b1b305e..ac979c1a9c 100644
--- a/routers/repo/wiki.go
+++ b/routers/repo/wiki.go
@@ -89,7 +89,7 @@ func renderWikiPage(ctx *context.Context, isViewPage bool) (*git.Repository, str
 	ctx.Data["title"] = pageName
 	ctx.Data["RequireHighlightJS"] = true
 
-	blob, err := commit.GetBlobByPath(pageName + ".md")
+	blob, err := commit.GetBlobByPath(pageURL + ".md")
 	if err != nil {
 		if git.IsErrNotExist(err) {
 			ctx.Redirect(ctx.Repo.RepoLink + "/wiki/_pages")
@@ -114,7 +114,7 @@ func renderWikiPage(ctx *context.Context, isViewPage bool) (*git.Repository, str
 		ctx.Data["content"] = string(data)
 	}
 
-	return wikiRepo, pageName
+	return wikiRepo, pageURL
 }
 
 // Wiki render wiki page
@@ -127,13 +127,13 @@ func Wiki(ctx *context.Context) {
 		return
 	}
 
-	wikiRepo, pageName := renderWikiPage(ctx, true)
+	wikiRepo, pagePath := renderWikiPage(ctx, true)
 	if ctx.Written() {
 		return
 	}
 
 	// Get last change information.
-	lastCommit, err := wikiRepo.GetCommitByPath(pageName + ".md")
+	lastCommit, err := wikiRepo.GetCommitByPath(pagePath + ".md")
 	if err != nil {
 		ctx.Handle(500, "GetCommitByPath", err)
 		return
@@ -214,7 +214,9 @@ func NewWikiPost(ctx *context.Context, form auth.NewWikiForm) {
 		return
 	}
 
-	if err := ctx.Repo.Repository.AddWikiPage(ctx.User, form.Title, form.Content, form.Message); err != nil {
+	wikiPath := models.ToWikiPageURL(form.Title)
+
+	if err := ctx.Repo.Repository.AddWikiPage(ctx.User, wikiPath, form.Content, form.Message); err != nil {
 		if models.IsErrWikiAlreadyExist(err) {
 			ctx.Data["Err_Title"] = true
 			ctx.RenderWithErr(ctx.Tr("repo.wiki.page_already_exists"), tplWikiNew, &form)
@@ -224,7 +226,7 @@ func NewWikiPost(ctx *context.Context, form auth.NewWikiForm) {
 		return
 	}
 
-	ctx.Redirect(ctx.Repo.RepoLink + "/wiki/" + models.ToWikiPageURL(form.Title))
+	ctx.Redirect(ctx.Repo.RepoLink + "/wiki/" + wikiPath)
 }
 
 // EditWiki render wiki modify page
@@ -257,12 +259,15 @@ func EditWikiPost(ctx *context.Context, form auth.NewWikiForm) {
 		return
 	}
 
-	if err := ctx.Repo.Repository.EditWikiPage(ctx.User, form.OldTitle, form.Title, form.Content, form.Message); err != nil {
+	oldWikiPath := ctx.Params(":page")
+	newWikiPath := models.ToWikiPageURL(form.Title)
+
+	if err := ctx.Repo.Repository.EditWikiPage(ctx.User, oldWikiPath, newWikiPath, form.Content, form.Message); err != nil {
 		ctx.Handle(500, "EditWikiPage", err)
 		return
 	}
 
-	ctx.Redirect(ctx.Repo.RepoLink + "/wiki/" + models.ToWikiPageURL(form.Title))
+	ctx.Redirect(ctx.Repo.RepoLink + "/wiki/" + newWikiPath)
 }
 
 // DeleteWikiPagePost delete wiki page
@@ -272,8 +277,7 @@ func DeleteWikiPagePost(ctx *context.Context) {
 		pageURL = "Home"
 	}
 
-	pageName := models.ToWikiPageName(pageURL)
-	if err := ctx.Repo.Repository.DeleteWikiPage(ctx.User, pageName); err != nil {
+	if err := ctx.Repo.Repository.DeleteWikiPage(ctx.User, pageURL); err != nil {
 		ctx.Handle(500, "DeleteWikiPage", err)
 		return
 	}