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
 | 
						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