diff --git a/file.go b/file.go index 01ee82c3..72ce14a5 100644 --- a/file.go +++ b/file.go @@ -261,15 +261,12 @@ 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) { - i.Type = "text" - goto End - } + if isInTextExtensions(i.Name) { + i.Type = "text" + } else { + i.Type = "blob" } - i.Type = "blob" - End: // If the file type is text, save its content. if i.Type == "text" { @@ -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