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 {
}
}
- 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)