From c58edc7c7884a44436be7e215aed06a86e44dab8 Mon Sep 17 00:00:00 2001
From: Lunny Xiao <xiaolunwen@gmail.com>
Date: Tue, 28 Jan 2020 17:44:08 +0800
Subject: [PATCH] Fix wiki raw view on sub path (#10002)

* Fix wiki raw view on sub path

* Add test for subpath wiki raw file

* Fix bug
---
 .../42/3313fbd38093bb10d0c8387db9105409c6f196      | Bin 0 -> 830 bytes
 .../74/d5a0d73db9b9ef7aa9978eb7a099b08f54d45e      | Bin 0 -> 53 bytes
 .../c4/b38c3e1395393f75bbbc2ed10c7eeb577d3b64      | Bin 0 -> 189 bytes
 .../user2/repo1.wiki.git/refs/heads/master         |   2 +-
 routers/repo/wiki.go                               |  28 ++++++++-------------
 routers/repo/wiki_test.go                          |   1 +
 6 files changed, 12 insertions(+), 19 deletions(-)
 create mode 100644 integrations/gitea-repositories-meta/user2/repo1.wiki.git/objects/42/3313fbd38093bb10d0c8387db9105409c6f196
 create mode 100644 integrations/gitea-repositories-meta/user2/repo1.wiki.git/objects/74/d5a0d73db9b9ef7aa9978eb7a099b08f54d45e
 create mode 100644 integrations/gitea-repositories-meta/user2/repo1.wiki.git/objects/c4/b38c3e1395393f75bbbc2ed10c7eeb577d3b64

diff --git a/integrations/gitea-repositories-meta/user2/repo1.wiki.git/objects/42/3313fbd38093bb10d0c8387db9105409c6f196 b/integrations/gitea-repositories-meta/user2/repo1.wiki.git/objects/42/3313fbd38093bb10d0c8387db9105409c6f196
new file mode 100644
index 0000000000000000000000000000000000000000..bf4ae859f6d05b74726565e3269517d32a6fd1aa
GIT binary patch
literal 830
zcmV-E1Ht@w0iBb{4y#5GMYHBBdXExD8<6s%fX!qZ493{t9dtMIWCk;Q{c{p!msM(U
zRXVDYN>_DZTi5vr7+Ms68GDQY<YP{R9A-Fa$4Oiw?BY0vEJh3s1&rgJARsQ@^F$Z*
zxETQr6J`gwWWUEy<V2nqX^bSu!9*0Gge4(~V;Vz_h^8@XdvKYWW(7eWwcz*VtJT!Z
zxcM`!qrCbJw)G!?*@-kQ@w7w(lK!^Dmws;?@&8&*yL8A?@atctsJdwbM|Xf{>b89M
zZ|dKi00hWgb5mqlImj~7a#fw`m`x-|L9GbX(K2TtIq9tRfqbjU6+iiHD<9I*{g)G8
z=enUuDe>^SYAf&KIW=I`ltB|F6nu&btD;rwk`xzxChes)B41oA-cFvONDJyu1fZDX
z^$9n44<3WDj;Vdq8H(OAwTP$pedOjnHrHGpHq(`3j(=WQv`KXlC>O1DwD&}S2Z<(2
zkjX;RTaL+c&tR0+`?y79c<NS>m2QST(~azM7+#vyZUUcmrM<kWO}QW`Bmn#1No=gG
z#_-1W8Vqjt9Z%(Lsf+$&QlvsczB!gobv&vO{oGBW>P;fX%UcPy?l}^mnoh;;T<r|!
z9$NCLmT)88Ztrtp?dexqY}cnvna%n@Z1^<wBQrf7ez>{8GMZQTy66N@^7*ZP<Yncc
z7MVAd({8L@Ox>GxNq6oKw$6l8dwsB};kv2a!>es<t@kXw!qc-TBEW3&!m%xMZ{74q
z<sY&nptRGet#O0KtNIGx53+iz(%ke-KVPzRKul6oZDM)ZdA_Lx81AY)B4&@=&v6v(
zMyua}mE&Zf<Fr`H9>-nT7_NWd_p8DBR<@j-h#U-NRf1=s_XIeYx8p#C{rQ?#?>jXv
zr&r#aN&tf)z(MYnw12TtW4hyn{j?3&{7{s0dF87p@26fNfN(6r&pI0;yXh&SE%ifb
zg=EhAcA-;5jY?mgpFYi18+*2yk9@igPUm{NJ1S>kf4mbweb5%lyYIL14r|zCn2?T~
zAjfCzo5MFo({F(&P(rWzqL-DV`)Yp>;76xy2Jug3RQvc}i6J6{z%a#KG-e>LqZALs
IPp$}Hf}a<q82|tP

literal 0
HcmV?d00001

diff --git a/integrations/gitea-repositories-meta/user2/repo1.wiki.git/objects/74/d5a0d73db9b9ef7aa9978eb7a099b08f54d45e b/integrations/gitea-repositories-meta/user2/repo1.wiki.git/objects/74/d5a0d73db9b9ef7aa9978eb7a099b08f54d45e
new file mode 100644
index 0000000000000000000000000000000000000000..bcb0e0075c7f18769b25eb9bb639e743e9565f51
GIT binary patch
literal 53
zcmV-50LuS(0V^p=O;s>9V=y!@Ff%bx$SO!p*UKtMXDFN~{iQwaxP++0L3U0-#`(J$
LHvRzsDiRKo_5~D3

literal 0
HcmV?d00001

diff --git a/integrations/gitea-repositories-meta/user2/repo1.wiki.git/objects/c4/b38c3e1395393f75bbbc2ed10c7eeb577d3b64 b/integrations/gitea-repositories-meta/user2/repo1.wiki.git/objects/c4/b38c3e1395393f75bbbc2ed10c7eeb577d3b64
new file mode 100644
index 0000000000000000000000000000000000000000..6dcfc9667644d517a48b0b24e3c975afe97bb4cb
GIT binary patch
literal 189
zcmV;u07CzG0V^p=O;s>5Fk&z?FfcPQQSivmP1VayVR+T_r@efUH~XP%EAKClN_3cu
z?N&pT1SF=X>V{{QWaxV40+}GyMzKeJyfpDk%lIT}wrp;^tlw3e#TcrC3lfu4Q*`|j
zAvP5KNeVoZ(l^mZfMKqov;3mR-Ln)-41ho(6J%^LL&?<z*KK$1d|$P4df)a1GdJ{y
rT#17knpKdRu9sDi&QLf}`b&G-aS2h0gY2AwjPrLhZ2SWN<k(OJ#+zD6

literal 0
HcmV?d00001

diff --git a/integrations/gitea-repositories-meta/user2/repo1.wiki.git/refs/heads/master b/integrations/gitea-repositories-meta/user2/repo1.wiki.git/refs/heads/master
index 86de6490a2..1b1d96a1f0 100644
--- a/integrations/gitea-repositories-meta/user2/repo1.wiki.git/refs/heads/master
+++ b/integrations/gitea-repositories-meta/user2/repo1.wiki.git/refs/heads/master
@@ -1 +1 @@
-0cf15c3f66ec8384480ed9c3cf87c9e97fbb0ec3
+423313fbd38093bb10d0c8387db9105409c6f196
diff --git a/routers/repo/wiki.go b/routers/repo/wiki.go
index b0bd8047b8..f18625a599 100644
--- a/routers/repo/wiki.go
+++ b/routers/repo/wiki.go
@@ -66,27 +66,20 @@ type PageMeta struct {
 
 // findEntryForFile finds the tree entry for a target filepath.
 func findEntryForFile(commit *git.Commit, target string) (*git.TreeEntry, error) {
-	entries, err := commit.ListEntries()
-	if err != nil {
+	entry, err := commit.GetTreeEntryByPath(target)
+	if err != nil && !git.IsErrNotExist(err) {
 		return nil, err
 	}
-	// The longest name should be checked first
-	for _, entry := range entries {
-		if entry.IsRegular() && entry.Name() == target {
-			return entry, nil
-		}
+	if entry != nil {
+		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
+	return commit.GetTreeEntryByPath(unescapedTarget)
 }
 
 func findWikiRepoCommit(ctx *context.Context) (*git.Repository, *git.Commit, error) {
@@ -123,10 +116,9 @@ func wikiContentsByEntry(ctx *context.Context, entry *git.TreeEntry) []byte {
 // wikiContentsByName returns the contents of a wiki page, along with a boolean
 // indicating whether the page exists. Writes to ctx if an error occurs.
 func wikiContentsByName(ctx *context.Context, commit *git.Commit, wikiName string) ([]byte, *git.TreeEntry, string, bool) {
-	var entry *git.TreeEntry
-	var err error
 	pageFilename := wiki_service.NameToFilename(wikiName)
-	if entry, err = findEntryForFile(commit, pageFilename); err != nil {
+	entry, err := findEntryForFile(commit, pageFilename)
+	if err != nil && !git.IsErrNotExist(err) {
 		ctx.ServerError("findEntryForFile", err)
 		return nil, nil, "", false
 	} else if entry == nil {
@@ -518,7 +510,7 @@ func WikiRaw(ctx *context.Context) {
 	if commit != nil {
 		// Try to find a file with that name
 		entry, err = findEntryForFile(commit, providedPath)
-		if err != nil {
+		if err != nil && !git.IsErrNotExist(err) {
 			ctx.ServerError("findFile", err)
 			return
 		}
@@ -531,7 +523,7 @@ func WikiRaw(ctx *context.Context) {
 
 			wikiPath := wiki_service.NameToFilename(providedPath)
 			entry, err = findEntryForFile(commit, wikiPath)
-			if err != nil {
+			if err != nil && !git.IsErrNotExist(err) {
 				ctx.ServerError("findFile", err)
 				return
 			}
diff --git a/routers/repo/wiki_test.go b/routers/repo/wiki_test.go
index 843a8ddf2b..cc79c808f5 100644
--- a/routers/repo/wiki_test.go
+++ b/routers/repo/wiki_test.go
@@ -192,6 +192,7 @@ func TestDeleteWikiPagePost(t *testing.T) {
 func TestWikiRaw(t *testing.T) {
 	for filepath, filetype := range map[string]string{
 		"jpeg.jpg":                 "image/jpeg",
+		"images/jpeg.jpg":          "image/jpeg",
 		"Page With Spaced Name":    "text/plain; charset=utf-8",
 		"Page-With-Spaced-Name":    "text/plain; charset=utf-8",
 		"Page With Spaced Name.md": "text/plain; charset=utf-8",