diff options
author | Nick <nick.guenther@polymtl.ca> | 2023-02-13 15:01:09 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-13 15:01:09 -0500 |
commit | 7b5b739a2f9d9c84ec216ff629dbf0d1dd8a4322 (patch) | |
tree | 80624177b947ebdb8bc33a37bb1d9334a3acd040 /modules/util | |
parent | 51383ec0841ec2562e5c4a9dadd4fef82974dd5c (diff) | |
download | gitea-7b5b739a2f9d9c84ec216ff629dbf0d1dd8a4322.tar.gz gitea-7b5b739a2f9d9c84ec216ff629dbf0d1dd8a4322.zip |
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>
Diffstat (limited to 'modules/util')
-rw-r--r-- | modules/util/path.go | 39 | ||||
-rw-r--r-- | modules/util/path_test.go | 81 |
2 files changed, 120 insertions, 0 deletions
diff --git a/modules/util/path.go b/modules/util/path.go index e060b527f3..74acb7a85f 100644 --- a/modules/util/path.go +++ b/modules/util/path.go @@ -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 +} diff --git a/modules/util/path_test.go b/modules/util/path_test.go index 5794df1ebf..93f4f67cf6 100644 --- a/modules/util/path_test.go +++ b/modules/util/path_test.go @@ -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) + } +} |