mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09: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 | 	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 | // SPDX-License-Identifier: MIT | ||||||
|  |  | ||||||
| package markup_test | 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" | 	"path/filepath" | ||||||
| 	"regexp" | 	"regexp" | ||||||
| 	"runtime" | 	"runtime" | ||||||
|  | 	"strings" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // EnsureAbsolutePath ensure that a path is absolute, making it | // EnsureAbsolutePath ensure that a path is absolute, making it | ||||||
| @@ -201,3 +202,41 @@ func CommonSkip(name string) bool { | |||||||
|  |  | ||||||
| 	return false | 	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 | 			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()) | 			log.Debug("Potential readme file: %s", entry.Name()) | ||||||
| 			if readmeFiles[i] == nil || base.NaturalSortLess(readmeFiles[i].name, entry.Blob().Name()) { | 			if readmeFiles[i] == nil || base.NaturalSortLess(readmeFiles[i].name, entry.Blob().Name()) { | ||||||
| 				name := entry.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)) | 		rd := charset.ToUTF8WithFallbackReader(io.MultiReader(bytes.NewReader(buf), dataRc)) | ||||||
|  |  | ||||||
| 		shouldRenderSource := ctx.FormString("display") == "source" | 		shouldRenderSource := ctx.FormString("display") == "source" | ||||||
| 		readmeExist := markup.IsReadmeFile(blob.Name()) | 		readmeExist := util.IsReadmeFileName(blob.Name()) | ||||||
| 		ctx.Data["ReadmeExist"] = readmeExist | 		ctx.Data["ReadmeExist"] = readmeExist | ||||||
|  |  | ||||||
| 		markupType := markup.Type(blob.Name()) | 		markupType := markup.Type(blob.Name()) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user