On this page
Group naming and text/binary classification: extension normalization, the ext, type and hybrid methods, sniffing on a map miss, and the empty-file rule.
#internal/classify
#internal/classify
Package classify determines a file's group name (format) and its text/binary classification, according to the selected grouping method.
#MethodExt
const MethodExt = "ext"Grouping method names.
#MethodType
const MethodType = "type"#MethodHybrid
const MethodHybrid = "hybrid"#FormatsRaw
const FormatsRaw = "raw"Format naming modes: how the group name a file lands in is spelled.
#FormatsCanonical
const FormatsCanonical = "canonical"#GroupNoExtension
const GroupNoExtension = "(no extension)"Group names for files that could not be assigned a real format.
#GroupUnknown
const GroupUnknown = "(unknown)"#Class
type Class structClass is the classification outcome for a single file.
#Classifier
type Classifier structClassifier classifies files per a fixed method and embedded lists.
#New
func New(method, formats string, textExts, textMimes map[string]struct{}, aliases map[string]string) *ClassifierNew returns a Classifier for the given method ("ext", "type", or "hybrid") and format naming mode ("raw" or "canonical"). aliases is the canonical alias table, read only in canonical mode.
#NormalizeExt
func NormalizeExt(name string) stringNormalizeExt returns the normalized extension of a file name: the suffix after the last dot, lowercased, without the dot. Following Python's Path.suffix semantics: "archive.tar.gz" -> "gz"; dotfiles like ".bashrc", bare names like "Makefile", and trailing-dot names have no extension.
#ShebangFormat
func ShebangFormat(line string) (string, bool)ShebangFormat maps a shebang line to the format name its scripts are grouped under in canonical mode. The second result is false when the line is not a shebang, names no interpreter, or names one with no unambiguous format.
The interpreter is found by stripping an env wrapper (its flags, its -S/--split-string forms, and any NAME=value assignments), then unwrapping the uv run X and uvx X runner forms. A trailing version suffix on the interpreter's base name is dropped, so python3.12 reads as python.
#Classifier.ExtIsText
func (c *Classifier) ExtIsText(ext string) boolExtIsText reports whether a normalized extension classifies as text.
#Classifier.MimeIsText
func (c *Classifier) MimeIsText(mime string) boolMimeIsText reports whether a MIME type classifies as text: it starts with "text/" or is in the embedded text-mimetypes list.
#Classifier.File
func (c *Classifier) File(absPath, name string, size int64) (Class, error)File classifies the file at absPath whose base name is name and whose size in bytes is size. A non-nil error means the file could not be read during sniffing; the caller must treat it as unreadable. Class.Sniffed is valid even when err is non-nil.