Improve file extension checking performance
@@ -261,14 +261,11 @@ func (i *File) GetFileType(checkContent bool) error {
// If the type isn't text (and is blob for example), it will check some
// common types that are mistaken not to be text.
- for _, extension := range textExtensions {
- if strings.HasSuffix(i.Name, extension) {
+ if isInTextExtensions(i.Name) {
i.Type = "text"
- goto End
- }
- }
-
+ } else {
i.Type = "blob"
+ }
End:
// If the file type is text, save its content.
@@ -415,23 +412,38 @@ func (l byModified) Less(i, j int) bool {
return iModified.Sub(jModified) < 0
}
-var textExtensions = [...]string{
- ".md", ".markdown", ".mdown", ".mmark",
- ".asciidoc", ".adoc", ".ad",
- ".rst",
- ".tml", ".yml",
- ".json", ".toml", ".yaml", ".csv", ".xml", ".rss", ".conf", ".ini",
- ".tex", ".sty",
- ".css", ".sass", ".scss",
- ".js",
- ".html",
- ".txt", ".rtf",
- ".sh", ".bash", ".ps1", ".bat", ".cmd",
- ".php", ".pl", ".py",
+// textExtensions is the sorted list of text extensions which
+// can be edited.
+var textExtensions = []string{
+ ".ad", ".ada", ".adoc", ".asciidoc",
+ ".bas", ".bash", ".bat",
+ ".c", ".cc", ".cmd", ".conf", ".cpp", ".cr", ".cs", ".css", ".csv",
+ ".d",
+ ".f", ".f90",
+ ".h", ".hh", ".hpp", ".htaccess", ".html",
+ ".ini",
+ ".java", ".js", ".json",
+ ".markdown", ".md", ".mdown", ".mmark",
+ ".nim",
+ ".php", ".pl", ".ps1", ".py",
+ ".rss", ".rst", ".rtf",
+ ".sass", ".scss", ".sh", ".sty",
+ ".tex", ".tml", ".toml", ".txt",
+ ".vala", ".vapi",
+ ".xml",
+ ".yaml", ".yml",
"Caddyfile",
- ".htaccess",
- ".c", ".cc", ".h", ".hh", ".cpp", ".hpp", ".f90",
- ".f", ".bas", ".d", ".ada", ".nim", ".cr", ".java", ".cs", ".vala", ".vapi",
+}
+
+// isInTextExtensions checks if a file can be edited by its extensions.
+func isInTextExtensions(name string) bool {
+ search := filepath.Ext(name)
+ if search == "" {
+ search = name
+ }
+
+ i := sort.SearchStrings(textExtensions, search)
+ return i < len(textExtensions) && textExtensions[i] == search
}
// hasRune checks if the file has the frontmatter rune
