mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Move IsReadmeFile* from modules/markup/ to modules/util (#22877)
				
					
				
			These functions don't examine contents, just filenames, so they don't fit in well in a markup module. This was originally part of https://github.com/go-gitea/gitea/pull/22177. Signed-off-by: Nick Guenther <nick.guenther@polymtl.ca>
This commit is contained in:
		@@ -317,41 +317,3 @@ func IsMarkupFile(name, markup string) bool {
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsReadmeFile reports whether name looks like a README file
 | 
			
		||||
// based on its name.
 | 
			
		||||
func IsReadmeFile(name string) bool {
 | 
			
		||||
	name = strings.ToLower(name)
 | 
			
		||||
	if len(name) < 6 {
 | 
			
		||||
		return false
 | 
			
		||||
	} else if len(name) == 6 {
 | 
			
		||||
		return name == "readme"
 | 
			
		||||
	}
 | 
			
		||||
	return name[:7] == "readme."
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsReadmeFileExtension reports whether name looks like a README file
 | 
			
		||||
// based on its name. It will look through the provided extensions and check if the file matches
 | 
			
		||||
// one of the extensions and provide the index in the extension list.
 | 
			
		||||
// If the filename is `readme.` with an unmatched extension it will match with the index equaling
 | 
			
		||||
// the length of the provided extension list.
 | 
			
		||||
// Note that the '.' should be provided in ext, e.g ".md"
 | 
			
		||||
func IsReadmeFileExtension(name string, ext ...string) (int, bool) {
 | 
			
		||||
	name = strings.ToLower(name)
 | 
			
		||||
	if len(name) < 6 || name[:6] != "readme" {
 | 
			
		||||
		return 0, false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, extension := range ext {
 | 
			
		||||
		extension = strings.ToLower(extension)
 | 
			
		||||
		if name[6:] == extension {
 | 
			
		||||
			return i, true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if name[6] == '.' {
 | 
			
		||||
		return len(ext), true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0, false
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,94 +2,3 @@
 | 
			
		||||
// SPDX-License-Identifier: MIT
 | 
			
		||||
 | 
			
		||||
package markup_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	. "code.gitea.io/gitea/modules/markup"
 | 
			
		||||
 | 
			
		||||
	_ "code.gitea.io/gitea/modules/markup/markdown"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestMisc_IsReadmeFile(t *testing.T) {
 | 
			
		||||
	trueTestCases := []string{
 | 
			
		||||
		"readme",
 | 
			
		||||
		"README",
 | 
			
		||||
		"readME.mdown",
 | 
			
		||||
		"README.md",
 | 
			
		||||
		"readme.i18n.md",
 | 
			
		||||
	}
 | 
			
		||||
	falseTestCases := []string{
 | 
			
		||||
		"test.md",
 | 
			
		||||
		"wow.MARKDOWN",
 | 
			
		||||
		"LOL.mDoWn",
 | 
			
		||||
		"test",
 | 
			
		||||
		"abcdefg",
 | 
			
		||||
		"abcdefghijklmnopqrstuvwxyz",
 | 
			
		||||
		"test.md.test",
 | 
			
		||||
		"readmf",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, testCase := range trueTestCases {
 | 
			
		||||
		assert.True(t, IsReadmeFile(testCase))
 | 
			
		||||
	}
 | 
			
		||||
	for _, testCase := range falseTestCases {
 | 
			
		||||
		assert.False(t, IsReadmeFile(testCase))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type extensionTestcase struct {
 | 
			
		||||
		name     string
 | 
			
		||||
		expected bool
 | 
			
		||||
		idx      int
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	exts := []string{".md", ".txt", ""}
 | 
			
		||||
	testCasesExtensions := []extensionTestcase{
 | 
			
		||||
		{
 | 
			
		||||
			name:     "readme",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      2,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:     "readme.md",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      0,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:     "README.md",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      0,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:     "ReAdMe.Md",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      0,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:     "readme.txt",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      1,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:     "readme.doc",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      3,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "readmee.md",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:     "readme..",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      3,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, testCase := range testCasesExtensions {
 | 
			
		||||
		idx, ok := IsReadmeFileExtension(testCase.name, exts...)
 | 
			
		||||
		assert.Equal(t, testCase.expected, ok)
 | 
			
		||||
		assert.Equal(t, testCase.idx, idx)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ import (
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// EnsureAbsolutePath ensure that a path is absolute, making it
 | 
			
		||||
@@ -201,3 +202,41 @@ func CommonSkip(name string) bool {
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsReadmeFileName reports whether name looks like a README file
 | 
			
		||||
// based on its name.
 | 
			
		||||
func IsReadmeFileName(name string) bool {
 | 
			
		||||
	name = strings.ToLower(name)
 | 
			
		||||
	if len(name) < 6 {
 | 
			
		||||
		return false
 | 
			
		||||
	} else if len(name) == 6 {
 | 
			
		||||
		return name == "readme"
 | 
			
		||||
	}
 | 
			
		||||
	return name[:7] == "readme."
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsReadmeFileExtension reports whether name looks like a README file
 | 
			
		||||
// based on its name. It will look through the provided extensions and check if the file matches
 | 
			
		||||
// one of the extensions and provide the index in the extension list.
 | 
			
		||||
// If the filename is `readme.` with an unmatched extension it will match with the index equaling
 | 
			
		||||
// the length of the provided extension list.
 | 
			
		||||
// Note that the '.' should be provided in ext, e.g ".md"
 | 
			
		||||
func IsReadmeFileExtension(name string, ext ...string) (int, bool) {
 | 
			
		||||
	name = strings.ToLower(name)
 | 
			
		||||
	if len(name) < 6 || name[:6] != "readme" {
 | 
			
		||||
		return 0, false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, extension := range ext {
 | 
			
		||||
		extension = strings.ToLower(extension)
 | 
			
		||||
		if name[6:] == extension {
 | 
			
		||||
			return i, true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if name[6] == '.' {
 | 
			
		||||
		return len(ext), true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0, false
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -55,3 +55,84 @@ func TestFileURLToPath(t *testing.T) {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMisc_IsReadmeFileName(t *testing.T) {
 | 
			
		||||
	trueTestCases := []string{
 | 
			
		||||
		"readme",
 | 
			
		||||
		"README",
 | 
			
		||||
		"readME.mdown",
 | 
			
		||||
		"README.md",
 | 
			
		||||
		"readme.i18n.md",
 | 
			
		||||
	}
 | 
			
		||||
	falseTestCases := []string{
 | 
			
		||||
		"test.md",
 | 
			
		||||
		"wow.MARKDOWN",
 | 
			
		||||
		"LOL.mDoWn",
 | 
			
		||||
		"test",
 | 
			
		||||
		"abcdefg",
 | 
			
		||||
		"abcdefghijklmnopqrstuvwxyz",
 | 
			
		||||
		"test.md.test",
 | 
			
		||||
		"readmf",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, testCase := range trueTestCases {
 | 
			
		||||
		assert.True(t, IsReadmeFileName(testCase))
 | 
			
		||||
	}
 | 
			
		||||
	for _, testCase := range falseTestCases {
 | 
			
		||||
		assert.False(t, IsReadmeFileName(testCase))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type extensionTestcase struct {
 | 
			
		||||
		name     string
 | 
			
		||||
		expected bool
 | 
			
		||||
		idx      int
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	exts := []string{".md", ".txt", ""}
 | 
			
		||||
	testCasesExtensions := []extensionTestcase{
 | 
			
		||||
		{
 | 
			
		||||
			name:     "readme",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      2,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:     "readme.md",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      0,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:     "README.md",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      0,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:     "ReAdMe.Md",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      0,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:     "readme.txt",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      1,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:     "readme.doc",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      3,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "readmee.md",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:     "readme..",
 | 
			
		||||
			expected: true,
 | 
			
		||||
			idx:      3,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, testCase := range testCasesExtensions {
 | 
			
		||||
		idx, ok := IsReadmeFileExtension(testCase.name, exts...)
 | 
			
		||||
		assert.Equal(t, testCase.expected, ok)
 | 
			
		||||
		assert.Equal(t, testCase.idx, idx)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -96,7 +96,7 @@ func findReadmeFileInEntries(ctx *context.Context, entries []*git.TreeEntry) (*n
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if i, ok := markup.IsReadmeFileExtension(entry.Name(), exts...); ok {
 | 
			
		||||
		if i, ok := util.IsReadmeFileExtension(entry.Name(), exts...); ok {
 | 
			
		||||
			log.Debug("Potential readme file: %s", entry.Name())
 | 
			
		||||
			if readmeFiles[i] == nil || base.NaturalSortLess(readmeFiles[i].name, entry.Blob().Name()) {
 | 
			
		||||
				name := entry.Name()
 | 
			
		||||
@@ -423,7 +423,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
 | 
			
		||||
		rd := charset.ToUTF8WithFallbackReader(io.MultiReader(bytes.NewReader(buf), dataRc))
 | 
			
		||||
 | 
			
		||||
		shouldRenderSource := ctx.FormString("display") == "source"
 | 
			
		||||
		readmeExist := markup.IsReadmeFile(blob.Name())
 | 
			
		||||
		readmeExist := util.IsReadmeFileName(blob.Name())
 | 
			
		||||
		ctx.Data["ReadmeExist"] = readmeExist
 | 
			
		||||
 | 
			
		||||
		markupType := markup.Type(blob.Name())
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user