From ef7fd781f5f5f5812a8a947845afac7a1dba4886 Mon Sep 17 00:00:00 2001
From: Nick <nick.guenther@polymtl.ca>
Date: Mon, 10 Apr 2023 23:00:19 -0400
Subject: [PATCH] Avoid recursing into sub-sub-sub-docs folders when looking
 for READMEs. (#23695)

Fixes a bug introduced in https://github.com/go-gitea/gitea/pull/22177
which allows finding READMEs like
docs/docs/docs/.gitea/.github/docs/README.md

Fixes https://github.com/go-gitea/gitea/issues/23694
---
 routers/web/repo/view.go       | 8 ++++----
 tests/integration/repo_test.go | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go
index 5bf961f412..9cd5fc9e40 100644
--- a/routers/web/repo/view.go
+++ b/routers/web/repo/view.go
@@ -58,7 +58,7 @@ const (
 //	entries == ctx.Repo.Commit.SubTree(ctx.Repo.TreePath).ListEntries()
 //
 // FIXME: There has to be a more efficient way of doing this
-func findReadmeFileInEntries(ctx *context.Context, entries []*git.TreeEntry) (string, *git.TreeEntry, error) {
+func findReadmeFileInEntries(ctx *context.Context, entries []*git.TreeEntry, tryWellKnownDirs bool) (string, *git.TreeEntry, error) {
 	// Create a list of extensions in priority order
 	// 1. Markdown files - with and without localisation - e.g. README.en-us.md or README.md
 	// 2. Txt files - e.g. README.txt
@@ -69,7 +69,7 @@ func findReadmeFileInEntries(ctx *context.Context, entries []*git.TreeEntry) (st
 
 	docsEntries := make([]*git.TreeEntry, 3) // (one of docs/, .gitea/ or .github/)
 	for _, entry := range entries {
-		if entry.IsDir() {
+		if tryWellKnownDirs && entry.IsDir() {
 			// as a special case for the top-level repo introduction README,
 			// fall back to subfolders, looking for e.g. docs/README.md, .gitea/README.zh-CN.txt, .github/README.txt, ...
 			// (note that docsEntries is ignored unless we are at the root)
@@ -130,7 +130,7 @@ func findReadmeFileInEntries(ctx *context.Context, entries []*git.TreeEntry) (st
 				return "", nil, err
 			}
 
-			subfolder, readmeFile, err := findReadmeFileInEntries(ctx, childEntries)
+			subfolder, readmeFile, err := findReadmeFileInEntries(ctx, childEntries, false)
 			if err != nil && !git.IsErrNotExist(err) {
 				return "", nil, err
 			}
@@ -164,7 +164,7 @@ func renderDirectory(ctx *context.Context, treeLink string) {
 		return
 	}
 
-	subfolder, readmeFile, err := findReadmeFileInEntries(ctx, entries)
+	subfolder, readmeFile, err := findReadmeFileInEntries(ctx, entries, true)
 	if err != nil {
 		ctx.ServerError("findReadmeFileInEntries", err)
 		return
diff --git a/tests/integration/repo_test.go b/tests/integration/repo_test.go
index 5ddedfcf36..f03a3b37fd 100644
--- a/tests/integration/repo_test.go
+++ b/tests/integration/repo_test.go
@@ -361,7 +361,7 @@ func TestViewRepoDirectoryReadme(t *testing.T) {
 	}
 	missing("sp-ace", "/user2/readme-test/src/branch/sp-ace/")
 	missing("nested-special", "/user2/readme-test/src/branch/special-subdir-nested/subproject") // the special subdirs should only trigger on the repo root
-	// missing("special-subdir-nested", "/user2/readme-test/src/branch/special-subdir-nested/") // This is currently FAILING, due to a bug introduced in https://github.com/go-gitea/gitea/pull/22177
+	missing("special-subdir-nested", "/user2/readme-test/src/branch/special-subdir-nested/")
 	missing("symlink-loop", "/user2/readme-test/src/branch/symlink-loop/")
 }