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
|
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.
|
// 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) {
|
func updateWikiPage(doer *models.User, repo *models.Repository, oldWikiName, newWikiName, content, message string, isNew bool) (err error) {
|
||||||
if err = nameAllowed(newWikiName); err != nil {
|
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 isNew {
|
|
||||||
filesInIndex, err := gitRepo.LsFiles(newWikiPath)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("%v", err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if util.IsStringInSlice(newWikiPath, filesInIndex) {
|
|
||||||
|
if isNew {
|
||||||
|
if isWikiExist {
|
||||||
return models.ErrWikiAlreadyExist{
|
return models.ErrWikiAlreadyExist{
|
||||||
Title: newWikiPath,
|
Title: newWikiPath,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
oldWikiPath := NameToFilename(oldWikiName)
|
// avoid check existence again if wiki name is not changed since gitRepo.LsFiles(...) is not free.
|
||||||
filesInIndex, err := gitRepo.LsFiles(oldWikiPath)
|
isOldWikiExist := true
|
||||||
|
oldWikiPath := newWikiPath
|
||||||
|
if oldWikiName != newWikiName {
|
||||||
|
isOldWikiExist, oldWikiPath, err = prepareWikiFileName(gitRepo, oldWikiName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("%v", err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if util.IsStringInSlice(oldWikiPath, filesInIndex) {
|
if isOldWikiExist {
|
||||||
err := gitRepo.RemoveFilesFromIndex(oldWikiPath)
|
err := gitRepo.RemoveFilesFromIndex(oldWikiPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("%v", err)
|
log.Error("%v", err)
|
||||||
|
|
Reference in a new issue