From b6616591d190da56ba1ce06570f38a6cca3821d6 Mon Sep 17 00:00:00 2001
From: Tekaoh <45337851+Tekaoh@users.noreply.github.com>
Date: Wed, 9 Oct 2019 13:49:37 -0500
Subject: [PATCH] Check for either escaped or unescaped wiki filenames (#8408)

* Check for either escaped or unescaped wiki filenames

+ Gitea currently saves wiki pages with escaped filenames.
+ Wikis mirrored from other places like Github use unescaped filenames.
+ We need to be checking for filenames in either format to increase compatibility.

* Better logic for escaped and unescaped wiki filenames

Co-Authored-By: null <guillep2k@users.noreply.github.com>
---
 routers/repo/wiki.go | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/routers/repo/wiki.go b/routers/repo/wiki.go
index bf8ac658ae..02fbe4a1dd 100644
--- a/routers/repo/wiki.go
+++ b/routers/repo/wiki.go
@@ -8,6 +8,7 @@ package repo
 import (
 	"fmt"
 	"io/ioutil"
+	"net/url"
 	"path/filepath"
 	"strings"
 
@@ -68,11 +69,22 @@ func findEntryForFile(commit *git.Commit, target string) (*git.TreeEntry, error)
 	if err != nil {
 		return nil, err
 	}
+	// The longest name should be checked first
 	for _, entry := range entries {
 		if entry.IsRegular() && entry.Name() == target {
 			return entry, nil
 		}
 	}
+	// Then the unescaped, shortest alternative
+	var unescapedTarget string
+	if unescapedTarget, err = url.QueryUnescape(target); err != nil {
+		return nil, err
+	}
+	for _, entry := range entries {
+		if entry.IsRegular() && entry.Name() == unescapedTarget {
+			return entry, nil
+		}
+	}
 	return nil, nil
 }