From bd759652965078c0cd5b948c94345ce5b73fd0d1 Mon Sep 17 00:00:00 2001 From: Khaled Hamed Date: Mon, 14 Jan 2019 21:15:06 +0200 Subject: [PATCH] Prioritize "readme.md" (#5691) * prioritize readme.md * Improve IsReadmeFile * Add more tests --- modules/markup/markup.go | 9 +++++++-- modules/markup/markup_test.go | 22 ++++++++++++++++++++++ routers/repo/view.go | 23 ++++++++++++++++++----- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/modules/markup/markup.go b/modules/markup/markup.go index d17270fb011f..c50600772367 100644 --- a/modules/markup/markup.go +++ b/modules/markup/markup.go @@ -111,9 +111,14 @@ func IsMarkupFile(name, markup string) bool { } // IsReadmeFile reports whether name looks like a README file -// based on its name. -func IsReadmeFile(name string) bool { +// based on its name. If an extension is provided, it will strictly +// match that extension. +// Note that the '.' should be provided in ext, e.g ".md" +func IsReadmeFile(name string, ext ...string) bool { name = strings.ToLower(name) + if len(ext) > 0 { + return name == "readme"+ext[0] + } if len(name) < 6 { return false } else if len(name) == 6 { diff --git a/modules/markup/markup_test.go b/modules/markup/markup_test.go index b0ebfae57d72..118fa2632ba5 100644 --- a/modules/markup/markup_test.go +++ b/modules/markup/markup_test.go @@ -19,6 +19,7 @@ func TestMisc_IsReadmeFile(t *testing.T) { "README", "readME.mdown", "README.md", + "readme.i18n.md", } falseTestCases := []string{ "test.md", @@ -37,4 +38,25 @@ func TestMisc_IsReadmeFile(t *testing.T) { for _, testCase := range falseTestCases { assert.False(t, IsReadmeFile(testCase)) } + + trueTestCasesStrict := [][]string{ + {"readme", ""}, + {"readme.md", ".md"}, + {"readme.txt", ".txt"}, + } + falseTestCasesStrict := [][]string{ + {"readme", ".md"}, + {"readme.md", ""}, + {"readme.md", ".txt"}, + {"readme.md", "md"}, + {"readmee.md", ".md"}, + {"readme.i18n.md", ".md"}, + } + + for _, testCase := range trueTestCasesStrict { + assert.True(t, IsReadmeFile(testCase[0], testCase[1])) + } + for _, testCase := range falseTestCasesStrict { + assert.False(t, IsReadmeFile(testCase[0], testCase[1])) + } } diff --git a/routers/repo/view.go b/routers/repo/view.go index 78a305aa28aa..8739c139d975 100644 --- a/routers/repo/view.go +++ b/routers/repo/view.go @@ -56,18 +56,31 @@ func renderDirectory(ctx *context.Context, treeLink string) { return } - var readmeFile *git.Blob + // 3 for the extensions in exts[] in order + // the last one is for a readme that doesn't + // strictly match an extension + var readmeFiles [4]*git.Blob + var exts = []string{".md", ".txt", ""} // sorted by priority for _, entry := range entries { if entry.IsDir() { continue } - if !markup.IsReadmeFile(entry.Name()) { - continue + for i, ext := range exts { + if markup.IsReadmeFile(entry.Name(), ext) { + readmeFiles[i] = entry.Blob() + } } - readmeFile = entry.Blob() - if markup.Type(entry.Name()) != "" { + if markup.IsReadmeFile(entry.Name()) { + readmeFiles[3] = entry.Blob() + } + } + + var readmeFile *git.Blob + for _, f := range readmeFiles { + if f != nil { + readmeFile = f break } }