From 1e73dd2446ba32fa072c22b933ed641cdf83faee Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 28 Jan 2020 23:10:25 +0800 Subject: [PATCH] Fix wiki raw view on sub path (#10002) (#10040) * 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 zcmb-)c7j*UitgtNMl9q$hk@)NnRMn&;S!2eKvRpHtY3YyK7srA`mcDh#z+ zHOVWyG%@=6PY#JFk$TDM9>yohel0R-7MaIAW0c-JvS`zBy)7W>W>^~mx#ATj%W{=8=gDxTqT2vJ~lck*dI+ht`R~O8jmB#8QxAnpIr>n1C zIkV%Z@!G|Ee(`SmD&KIk(?s{<78mA8|F#{OUY9TP@qd)x?vfM1A6~~VU9l^Z*}c3W z{nfUb@A{8yY3ln?O6W3_Q^9_v+FT(W|yZX_tnQmZ1F4= z)DT}=y5+k|1AC{M_k@#9m!tbm7M)L+a_#pH*OZD^VH2n3wb@?oeN!Y6H|uI1)BMt< zd-tsJ-Kn6d!tncnXU>|n$37hUCdHHYUDp3;?#k|e$w5n;oc38x^DDJkCHVJ_@1j?} zO262le^b@!OLxBb z+Q)AyaqtNW&P}SkS-Ec|i^RKCwn}OJcg`1zymecBzj5m0lm(BsM4Xa49(z+_UHyaa zs}KGP+csxzhYU|zXjA&a?<^KGwm)`g{rhuP_#=zuV zk6Zq3;l2JRU`lc2)72X9m&YkK6zCi}ZzZj~`=#b0-LKA>ttsbzmn{r->Gg`AJKyeX zsC4zVnf*1p`23z%?Y7oRPpsb~>`;3_?9}e}+duJT-$K}D@$|Q|51YGP&TrHR za9aOs(e$ZHerMGSJaAv0!}ifXE#&u)_)bNomIDSyV@=W&)-M*}KjOcRBcTZZpBJSW 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 zcmbCIJBU1r$gC 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 zcmb6T3IN8NT1fx^ 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",