fix: not able to update local created non-urlencoded wiki pages (#16139)
* 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>
This commit is contained in:
parent
061a8e7bb9
commit
b06342f29c
1 changed files with 43 additions and 13 deletions
|
@ -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)
|
||||
|
|
Reference in a new issue