]> source.dussan.org Git - gitea.git/commitdiff
fix: not able to update local created non-urlencoded wiki pages (#16139)
authorGary Wang <wzc782970009@gmail.com>
Wed, 7 Jul 2021 23:23:09 +0000 (07:23 +0800)
committerGitHub <noreply@github.com>
Wed, 7 Jul 2021 23:23:09 +0000 (19:23 -0400)
* fix: not able to update local created non-urlencoded wiki pages

* tidy code

* as per suggestion

Signed-off-by: Andrew Thornton <art27@cantab.net>
* Don't replace space to dash for unescaped wiki filename

Co-authored-by: zeripath <art27@cantab.net>
* Remove incorrect comment

* Remove NameToUnescapedFilename()

Co-authored-by: Andrew Thornton <art27@cantab.net>
Co-authored-by: techknowlogick <techknowlogick@gitea.io>
services/wiki/wiki.go

index 75b9d1d1f574bd4b66664224618156bea016fb37..16301034da15e4a40aacd45444277f0a4067d646 100644 (file)
@@ -81,6 +81,34 @@ func InitWiki(repo *models.Repository) error {
        return nil
 }
 
+// prepareWikiFileName try to find a suitable file path with file name by the given raw wiki name.
+// return: existence, prepared file path with name, error
+func prepareWikiFileName(gitRepo *git.Repository, wikiName string) (bool, string, error) {
+       unescaped := wikiName + ".md"
+       escaped := NameToFilename(wikiName)
+
+       // Look for both files
+       filesInIndex, err := gitRepo.LsFiles(unescaped, escaped)
+       if err != nil {
+               log.Error("%v", err)
+               return false, escaped, err
+       }
+
+       foundEscaped := false
+       for _, filename := range filesInIndex {
+               switch filename {
+               case unescaped:
+                       // if we find the unescaped file return it
+                       return true, unescaped, nil
+               case escaped:
+                       foundEscaped = true
+               }
+       }
+
+       // If not return whether the escaped file exists, and the escaped filename to keep backwards compatibility.
+       return foundEscaped, escaped, nil
+}
+
 // updateWikiPage adds a new page to the repository wiki.
 func updateWikiPage(doer *models.User, repo *models.Repository, oldWikiName, newWikiName, content, message string, isNew bool) (err error) {
        if err = nameAllowed(newWikiName); err != nil {
@@ -133,27 +161,29 @@ func updateWikiPage(doer *models.User, repo *models.Repository, oldWikiName, new
                }
        }
 
-       newWikiPath := NameToFilename(newWikiName)
+       isWikiExist, newWikiPath, err := prepareWikiFileName(gitRepo, newWikiName)
+       if err != nil {
+               return err
+       }
+
        if isNew {
-               filesInIndex, err := gitRepo.LsFiles(newWikiPath)
-               if err != nil {
-                       log.Error("%v", err)
-                       return err
-               }
-               if util.IsStringInSlice(newWikiPath, filesInIndex) {
+               if isWikiExist {
                        return models.ErrWikiAlreadyExist{
                                Title: newWikiPath,
                        }
                }
        } else {
-               oldWikiPath := NameToFilename(oldWikiName)
-               filesInIndex, err := gitRepo.LsFiles(oldWikiPath)
-               if err != nil {
-                       log.Error("%v", err)
-                       return err
+               // avoid check existence again if wiki name is not changed since gitRepo.LsFiles(...) is not free.
+               isOldWikiExist := true
+               oldWikiPath := newWikiPath
+               if oldWikiName != newWikiName {
+                       isOldWikiExist, oldWikiPath, err = prepareWikiFileName(gitRepo, oldWikiName)
+                       if err != nil {
+                               return err
+                       }
                }
 
-               if util.IsStringInSlice(oldWikiPath, filesInIndex) {
+               if isOldWikiExist {
                        err := gitRepo.RemoveFilesFromIndex(oldWikiPath)
                        if err != nil {
                                log.Error("%v", err)