tft/detect/
pattern.rs

1use std::ops::Deref;
2
3use lazy_regex::regex;
4use once_cell::sync::Lazy;
5use regex::Regex;
6
7use crate::{detect, FileType, FileTypeResolver};
8
9pub(crate) struct Pattern {
10    pub(crate) resolver: FileTypeResolver,
11    pub(crate) priority: Option<isize>,
12}
13
14impl Pattern {
15    fn new(resolver: FileTypeResolver, priority: Option<isize>) -> Self {
16        Self { resolver, priority }
17    }
18
19    fn starsetf(resolver: FileTypeResolver, priority: Option<isize>) -> Self {
20        Self {
21            resolver,
22            priority: priority.or(Some(isize::MIN)),
23        }
24    }
25}
26
27#[rustfmt::skip]
28pub(crate) static PATTERN: Lazy<Vec<(bool, &'static Regex, Pattern)>> = Lazy::new(|| {
29    let mut vec = vec![
30        (true, regex!(r"^.*etc/a2ps(/.*)?\.cfg$").deref(), Pattern::new(FileTypeResolver::Static(FileType::A2ps), None)),
31        (true, regex!(r"^.*usr/share/alsa/alsa\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::AlsaConf), None)),
32        (true, regex!(r"^.*etc/asound\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::AlsaConf), None)),
33        (true, regex!(r"^.*etc/apache2/sites-.*/.*\.com$"), Pattern::new(FileTypeResolver::Static(FileType::Apache), None)),
34        (true, regex!(r"^.*etc/httpd/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Apache), None)),
35        (true, regex!(r"^.*etc/apache2/.*\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Apache), None)),
36        (true, regex!(r"^.*etc/apache2/(conf\.|mods-|sites-).*/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Apache), None)),
37        (false, regex!(r"^(access|apache2?|httpd|srm)\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Apache), None)),
38        (true, regex!(r"^.*etc/httpd/conf\..*/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Apache), None)),
39        (true, regex!(r"^.*etc/httpd/conf\.d/.*\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Apache), None)),
40        (true, regex!(r"^.*etc/httpd/(mods-|sites-).*/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Apache), None)),
41        (true, regex!(r"^.*etc/proftpd/.*\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::ApacheStyle), None)),
42        (true, regex!(r"^.*etc/proftpd/conf\..*/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::ApacheStyle), None)),
43        (false, regex!(r"^proftpd\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::ApacheStyle), None)),
44        (true, regex!(r"^.*asterisk/.*\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Asterisk), None)),
45        (true, regex!(r"^.*asterisk.*/.*voicemail\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::AsteriskVoiceMail), None)),
46        (true, regex!(r"^.*\.aptitude/config$"), Pattern::new(FileTypeResolver::Static(FileType::AptConf), None)),
47        (false, regex!(r"^.*\.[aAsS]$"), Pattern::new(FileTypeResolver::Dynamic(detect::asm), None)),
48        (false, regex!(r"^[mM]akefile\.am$"), Pattern::new(FileTypeResolver::Static(FileType::Automake), None)),
49        (true, regex!(r"^.*bind/db\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Bindzone), None)),
50        (true, regex!(r"^.*named/db\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Bindzone), None)),
51        (true, regex!(r"^.*build/conf/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Bitbake), None)),
52        (true, regex!(r"^.*meta/conf/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Bitbake), None)),
53        (true, regex!(r"^.*meta-.*/conf/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Bitbake), None)),
54        (false, regex!(r"^bzr_log\..*$"), Pattern::new(FileTypeResolver::Static(FileType::Bzr), None)),
55        (true, regex!(r"^.*enlightenment/.*\.cfg$"), Pattern::new(FileTypeResolver::Static(FileType::C), None)),
56        (true, regex!(r"^.*cabal\.config$"), Pattern::new(FileTypeResolver::Static(FileType::CabalConfig), None)),
57        (true, regex!(r"^.*\.config/cabal/config$"), Pattern::new(FileTypeResolver::Static(FileType::CabalConfig), None)),
58        (false, regex!(r"^cabal\.project\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::CabalProject), None)),
59        (true, regex!(r"^.*\.calendar/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Calendar), None)),
60        (true, regex!(r"^.*share/calendar/(.*/)?calendar\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Calendar), None)),
61        (false, regex!(r"^sgml\.catalog.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Catalog), None)),
62        (true, regex!(r"^.*etc/defaults?/cdrdao$"), Pattern::new(FileTypeResolver::Static(FileType::CdrdaoConf), None)),
63        (true, regex!(r"^.*etc/cdrdao\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::CdrdaoConf), None)),
64        (false, regex!(r"^.*hgrc$"), Pattern::new(FileTypeResolver::Static(FileType::Cfg), None)),
65        // Decrease priority to avoid conflicts with more specific patterns
66        // such as '.*/etc/a2ps/.*\.cfg', '.*enlightenment/.*\.cfg', etc.
67        (false, regex!(r"^.*\.[Cc][Ff][Gg]$"), Pattern::new(FileTypeResolver::Dynamic(detect::cfg), Some(-1))),
68        (false, regex!(r"^[cC]hange[lL]og.*$"), Pattern::starsetf(FileTypeResolver::Dynamic(detect::changelog), None)),
69        (false, regex!(r"^.*\.\.ch$"), Pattern::new(FileTypeResolver::Static(FileType::Chill), None)),
70        (false, regex!(r"^.*\.cmake\.in$"), Pattern::new(FileTypeResolver::Static(FileType::CMake), None)),
71        // */cmus/rc and */.cmus/rc
72        (true, regex!(r"^.*\.?cmus/rc$"), Pattern::new(FileTypeResolver::Static(FileType::Cmusrc), None)),
73        // */cmus/*.theme and */.cmus/*.theme
74        (true, regex!(r"^.*\.?cmus/.*\.theme$"), Pattern::new(FileTypeResolver::Static(FileType::Cmusrc), None)),
75        (true, regex!(r"^.*\.cmus/autosave$"), Pattern::new(FileTypeResolver::Static(FileType::Cmusrc), None)),
76        (true, regex!(r"^.*\.cmus/command-history$"), Pattern::new(FileTypeResolver::Static(FileType::Cmusrc), None)),
77        (true, regex!(r"^.*etc/hostname\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Config), None)),
78        (false, regex!(r"^crontab\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Crontab), None)),
79        (true, regex!(r"^.*etc/cron\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Crontab), None)),
80        (false, regex!(r"^\.cshrc.*$"), Pattern::new(FileTypeResolver::Dynamic(detect::csh), None)),
81        (false, regex!(r"^\.login.*$"), Pattern::new(FileTypeResolver::Dynamic(detect::csh), None)),
82        (false, regex!(r"^cvs\d+$"), Pattern::new(FileTypeResolver::Static(FileType::Cvs), None)),
83        (false, regex!(r"^.*\.[Dd][Aa][Tt]$"), Pattern::new(FileTypeResolver::Dynamic(detect::dat), None)),
84        (true, regex!(r"^.*debian/patches/.*$"), Pattern::new(FileTypeResolver::Dynamic(detect::dep3patch), None)),
85        (true, regex!(r"^.*etc/dnsmasq\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::DnsMasq), None)),
86        (false, regex!(r"^Containerfile\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Dockerfile), None)),
87        (false, regex!(r"^Dockerfile\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Dockerfile), None)),
88        (true, regex!(r"^.*etc/yum\.repos\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::DosIni), None)),
89        (false, regex!(r"^drac\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Dracula), None)),
90        (true, regex!(r"^.*debian/changelog$"), Pattern::new(FileTypeResolver::Static(FileType::DebChangelog), None)),
91        (true, regex!(r"^.*debian/control$"), Pattern::new(FileTypeResolver::Static(FileType::DebControl), None)),
92        (true, regex!(r"^.*debian/copyright$"), Pattern::new(FileTypeResolver::Static(FileType::DebCopyright), None)),
93        (true, regex!(r"^.*etc/apt/sources\.list\.d/.*\.list$"), Pattern::new(FileTypeResolver::Static(FileType::DebSources), None)),
94        (true, regex!(r"^.*etc/apt/sources\.list$"), Pattern::new(FileTypeResolver::Static(FileType::DebSources), None)),
95        (false, regex!(r"^.*\.directory$"), Pattern::new(FileTypeResolver::Static(FileType::Desktop), None)),
96        (false, regex!(r"^.*\.desktop$"), Pattern::new(FileTypeResolver::Static(FileType::Desktop), None)),
97        (false, regex!(r"^dictd.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::DictdConf), None)),
98        (true, regex!(r"^.*etc/DIR_COLORS$"), Pattern::new(FileTypeResolver::Static(FileType::DirColors), None)),
99        (true, regex!(r"^.*etc/dnsmasq\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::DnsMasq), None)),
100        (false, regex!(r"^php\.ini-.*$"), Pattern::new(FileTypeResolver::Static(FileType::DosIni), None)),
101        (true, regex!(r"^.*\.aws/config$"), Pattern::new(FileTypeResolver::Static(FileType::ConfIni), None)),
102        (true, regex!(r"^.*\.aws/credentials$"), Pattern::new(FileTypeResolver::Static(FileType::ConfIni), None)),
103        (true, regex!(r"^.*etc/pacman\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::ConfIni), None)),
104        (true, regex!(r"^.*etc/yum\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::DosIni), None)),
105        (false, regex!(r"^.*lvs$"), Pattern::new(FileTypeResolver::Static(FileType::Dracula), None)),
106        (false, regex!(r"^.*lpe$"), Pattern::new(FileTypeResolver::Static(FileType::Dracula), None)),
107        (true, regex!(r"^.*dtrace/.*\.d$"), Pattern::new(FileTypeResolver::Static(FileType::DTrace), None)),
108        (false, regex!(r"^.*esmtprc$"), Pattern::new(FileTypeResolver::Static(FileType::Esmtprc), None)),
109        (true, regex!(r"^.*Eterm/.*\.cfg$"), Pattern::new(FileTypeResolver::Static(FileType::Eterm), None)),
110        (false, regex!(r"^[a-zA-Z0-9].*Dict$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
111        (false, regex!(r"^[a-zA-Z0-9].*Dict\..*$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
112        (false, regex!(r"^[a-zA-Z].*Properties$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
113        (false, regex!(r"^[a-zA-Z].*Properties\..*$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
114        (false, regex!(r"^.*Transport\..*$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
115        (true, regex!(r"^.*constant/g$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
116        (true, regex!(r"^.*0(\.orig)?/.*$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
117        (true, regex!(r"^.*\.fvwm/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Fvwm), None)),
118        (false, regex!(r"^.*fvwmrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Fvwm1), None)),
119        (false, regex!(r"^.*fvwm95.*\.hook$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Fvwm1), None)),
120        (false, regex!(r"^.*fvwm2rc.*$"), Pattern::starsetf(FileTypeResolver::Dynamic(detect::fvwm), None)),
121        (true, regex!(r"^.*tmp/lltmp.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Gedcom), None)),
122        (true, regex!(r"^.*etc/gitconfig\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::GitConfig), None)),
123        (true, regex!(r"^.*gitolite-admin/conf/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::GitOlite), None)),
124        (false, regex!(r"^tmac\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Nroff), None)),
125        (true, regex!(r"^.*\.gitconfig\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::GitConfig), None)),
126        // Decrease priority to run after simple pattern checks
127        (true, regex!(r"^.*\.git/.*$"), Pattern::new(FileTypeResolver::Dynamic(detect::git), Some(-1))),
128        (true, regex!(r"^.*\.git/modules/.*/config$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
129        (true, regex!(r"^.*\.git/modules/config$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
130        (true, regex!(r"^.*\.git/config$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
131        (true, regex!(r"^.*etc/gitconfig$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
132        (true, regex!(r"^.*\.config/git/config$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
133        (true, regex!(r"^.*\.git/config\.worktree$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
134        (true, regex!(r"^.*\.git/worktrees/.*/config\.worktree$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
135        (true, regex!(r"^.*\.config/git/config$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
136        (true, regex!(r"^.*\.git/info/attributes$"), Pattern::new(FileTypeResolver::Static(FileType::GitAttributes), None)),
137        (true, regex!(r"^.*etc/gitattributes$"), Pattern::new(FileTypeResolver::Static(FileType::GitAttributes), None)),
138        (true, regex!(r"^.*\.config/git/attributes$"), Pattern::new(FileTypeResolver::Static(FileType::GitAttributes), None)),
139        (true, regex!(r"^.*\.config/git/attributes$"), Pattern::new(FileTypeResolver::Static(FileType::GitAttributes), None)),
140        (true, regex!(r"^.*\.git/info/exclude$"), Pattern::new(FileTypeResolver::Static(FileType::GitIgnore), None)),
141        (true, regex!(r"^.*\.config/git/ignore$"), Pattern::new(FileTypeResolver::Static(FileType::GitIgnore), None)),
142        (true, regex!(r"^.*\.config/git/ignore$"), Pattern::new(FileTypeResolver::Static(FileType::GitIgnore), None)),
143        (false, regex!(r"^\.gitsendemail\.msg\..{6}$"), Pattern::new(FileTypeResolver::Static(FileType::GitSendEmail), None)),
144        (false, regex!(r"^gkrellmrc_.$"), Pattern::new(FileTypeResolver::Static(FileType::Gkrellmrc), None)),
145        (true, regex!(r"^.*usr/.*/gnupg/options\.skel$"), Pattern::new(FileTypeResolver::Static(FileType::Gpg), None)),
146        (true, regex!(r"^.*\.gnupg/options$"), Pattern::new(FileTypeResolver::Static(FileType::Gpg), None)),
147        (true, regex!(r"^.*\.gnupg/gpg\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Gpg), None)),
148        (true, regex!(r"^.*\.local/share/gnupg/options$"), Pattern::new(FileTypeResolver::Static(FileType::Gpg), None)),
149        (true, regex!(r"^.*\.local/share/gnupg/gpg\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Gpg), None)),
150        (true, regex!(r"^.*etc/(group|gshadow)(\.edit|-)?$"), Pattern::new(FileTypeResolver::Static(FileType::Group), None)),
151        (true, regex!(r"^.*var/backups/(group|gshadow)\.bak$"), Pattern::new(FileTypeResolver::Static(FileType::Group), None)),
152        (true, regex!(r"^.*boot/grub/(grub\.conf|menu\.lst)$"), Pattern::new(FileTypeResolver::Static(FileType::Grub), None)),
153        (true, regex!(r"^.*etc/grub\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Grub), None)),
154        // gtkrc* and .gtkrc*
155        (false, regex!(r"^\.?gtkrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Gtkrc), None)),
156        (true, regex!(r"^.*share/n?vim/doc/.*\.txt$"), Pattern::new(FileTypeResolver::Static(FileType::VimHelp), None)),
157        (false, regex!(r"^hg-editor-.*\.txt$"), Pattern::new(FileTypeResolver::Static(FileType::Hgcommit), None)),
158        (true, regex!(r"^.*etc/host\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::HostConf), None)),
159        (true, regex!(r"^.*etc/hosts\.deny$"), Pattern::new(FileTypeResolver::Static(FileType::HostsAccess), None)),
160        (true, regex!(r"^.*etc/hosts\.allow$"), Pattern::new(FileTypeResolver::Static(FileType::HostsAccess), None)),
161        (false, regex!(r"^.*\.html\.m4$"), Pattern::new(FileTypeResolver::Static(FileType::HtmlM4), None)),
162        (true, regex!(r"^.*\.i3/config$"), Pattern::new(FileTypeResolver::Static(FileType::I3Config), None)),
163        (true, regex!(r"^.*i3/config$"), Pattern::new(FileTypeResolver::Static(FileType::I3Config), None)),
164        (true, regex!(r"^.*\.icewm/menu$"), Pattern::new(FileTypeResolver::Static(FileType::IceMenu), None)),
165        (true, regex!(r"^.*etc/initng/.*/.*\.i$"), Pattern::new(FileTypeResolver::Static(FileType::Initng), None)),
166        (false, regex!(r"^JAM.*\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Jam), None)),
167        (false, regex!(r"^Prl.*\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Jam), None)),
168        (false, regex!(r"^.*\.properties_..$"), Pattern::new(FileTypeResolver::Static(FileType::JProperties), None)),
169        (false, regex!(r"^.*\.properties_.._..$"), Pattern::new(FileTypeResolver::Static(FileType::JProperties), None)),
170        (false, regex!(r"^org\.eclipse\..*\.prefs$"), Pattern::new(FileTypeResolver::Static(FileType::JProperties), None)),
171        (false, regex!(r"^.*\.properties_.._.._.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::JProperties), None)),
172        (false, regex!(r"^[jt]sconfig.*\.json$"), Pattern::new(FileTypeResolver::Static(FileType::JsonC), None)),
173        (false, regex!(r"^Kconfig\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::KConfig), None)),
174        (false, regex!(r"^.*\.[Ss][Uu][Bb]$"), Pattern::new(FileTypeResolver::Static(FileType::Krl), None)),
175        (false, regex!(r"^lilo\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Lilo), None)),
176        (true, regex!(r"^.*etc/logcheck/.*\.d.*/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::LogCheck), None)),
177        (true, regex!(r"^.*lftp/rc$"), Pattern::new(FileTypeResolver::Static(FileType::Lftp), None)),
178        (false, regex!(r"^.*\.libao$"), Pattern::new(FileTypeResolver::Static(FileType::Libao), None)),
179        (true, regex!(r"^.*etc/libao\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Libao), None)),
180        (true, regex!(r"^.*etc/.*limits\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Limits), None)),
181        (true, regex!(r"^.*etc/limits$"), Pattern::new(FileTypeResolver::Static(FileType::Limits), None)),
182        (true, regex!(r"^.*etc/.*limits\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Limits), None)),
183        (true, regex!(r"^.*LiteStep/.*/.*\.rc$"), Pattern::new(FileTypeResolver::Static(FileType::LiteStep), None)),
184        (true, regex!(r"^.*etc/login\.access$"), Pattern::new(FileTypeResolver::Static(FileType::LoginAccess), None)),
185        (true, regex!(r"^.*etc/login\.defs$"), Pattern::new(FileTypeResolver::Static(FileType::LoginDefs), None)),
186        (false, regex!(r"^\.letter\.\d+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
187        (false, regex!(r"^\.article\.\d+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
188        (true, regex!(r"^/tmp/SLRN[0-9A-Z.]+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
189        (false, regex!(r"^ae\d+\.txt$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
190        (false, regex!(r"^pico\.\d+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
191        (false, regex!(r"^mutt-.*-[a-zA-Z0-9]+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
192        (false, regex!(r"^muttng-.*-[a-zA-Z0-9]+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
193        (false, regex!(r"^neomutt-.*-[a-zA-Z0-9]+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
194        (false, regex!(r"^mutt[\w_-]{6}$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
195        (false, regex!(r"^neomutt[\w_-]{6}$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
196        (false, regex!(r"^snd\.\d+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
197        (false, regex!(r"^reportbug-.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Mail), None)),
198        (true, regex!(r"^.*etc/mail/aliases$"), Pattern::new(FileTypeResolver::Static(FileType::MailAliases), None)),
199        (true, regex!(r"^.*etc/aliases$"), Pattern::new(FileTypeResolver::Static(FileType::MailAliases), None)),
200        (false, regex!(r"^.*[mM]akefile$"), Pattern::new(FileTypeResolver::Static(FileType::Make), None)),
201        (false, regex!(r"^[mM]akefile.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Make), None)),
202        (true, regex!(r"^.*etc/man\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::ManConf), None)),
203        (true, regex!(r"^.*log/auth$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
204        (true, regex!(r"^.*log/cron$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
205        (true, regex!(r"^.*log/daemon$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
206        (true, regex!(r"^.*log/debug$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
207        (true, regex!(r"^.*log/kern$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
208        (true, regex!(r"^.*log/lpr$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
209        (true, regex!(r"^.*log/mail$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
210        (true, regex!(r"^.*log/messages$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
211        (true, regex!(r"^.*log/news/news$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
212        (true, regex!(r"^.*log/syslog$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
213        (true, regex!(r"^.*log/user$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
214        (true, regex!(r"^.*log/auth\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
215        (true, regex!(r"^.*log/cron\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
216        (true, regex!(r"^.*log/daemon\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
217        (true, regex!(r"^.*log/debug\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
218        (true, regex!(r"^.*log/kern\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
219        (true, regex!(r"^.*log/lpr\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
220        (true, regex!(r"^.*log/mail\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
221        (true, regex!(r"^.*log/messages\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
222        (true, regex!(r"^.*log/news/news\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
223        (true, regex!(r"^.*log/syslog\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
224        (true, regex!(r"^.*log/user\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
225        (true, regex!(r"^.*log/auth\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
226        (true, regex!(r"^.*log/cron\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
227        (true, regex!(r"^.*log/daemon\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
228        (true, regex!(r"^.*log/debug\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
229        (true, regex!(r"^.*log/kern\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
230        (true, regex!(r"^.*log/lpr\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
231        (true, regex!(r"^.*log/mail\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
232        (true, regex!(r"^.*log/messages\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
233        (true, regex!(r"^.*log/news/news\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
234        (true, regex!(r"^.*log/syslog\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
235        (true, regex!(r"^.*log/user\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
236        (true, regex!(r"^.*log/auth\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
237        (true, regex!(r"^.*log/cron\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
238        (true, regex!(r"^.*log/daemon\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
239        (true, regex!(r"^.*log/debug\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
240        (true, regex!(r"^.*log/kern\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
241        (true, regex!(r"^.*log/lpr\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
242        (true, regex!(r"^.*log/mail\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
243        (true, regex!(r"^.*log/messages\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
244        (true, regex!(r"^.*log/news/news\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
245        (true, regex!(r"^.*log/syslog\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
246        (true, regex!(r"^.*log/user\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
247        (true, regex!(r"^.*log/auth\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
248        (true, regex!(r"^.*log/cron\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
249        (true, regex!(r"^.*log/daemon\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
250        (true, regex!(r"^.*log/debug\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
251        (true, regex!(r"^.*log/kern\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
252        (true, regex!(r"^.*log/lpr\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
253        (true, regex!(r"^.*log/mail\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
254        (true, regex!(r"^.*log/messages\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
255        (true, regex!(r"^.*log/news/news\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
256        (true, regex!(r"^.*log/syslog\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
257        (true, regex!(r"^.*log/user\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
258        (true, regex!(r"^.*log/auth\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
259        (true, regex!(r"^.*log/cron\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
260        (true, regex!(r"^.*log/daemon\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
261        (true, regex!(r"^.*log/debug\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
262        (true, regex!(r"^.*log/kern\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
263        (true, regex!(r"^.*log/lpr\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
264        (true, regex!(r"^.*log/mail\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
265        (true, regex!(r"^.*log/messages\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
266        (true, regex!(r"^.*log/news/news\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
267        (true, regex!(r"^.*log/syslog\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
268        (true, regex!(r"^.*log/user\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
269        (true, regex!(r"^.*log/auth\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
270        (true, regex!(r"^.*log/cron\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
271        (true, regex!(r"^.*log/daemon\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
272        (true, regex!(r"^.*log/debug\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
273        (true, regex!(r"^.*log/kern\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
274        (true, regex!(r"^.*log/lpr\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
275        (true, regex!(r"^.*log/mail\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
276        (true, regex!(r"^.*log/messages\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
277        (true, regex!(r"^.*log/news/news\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
278        (true, regex!(r"^.*log/syslog\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
279        (true, regex!(r"^.*log/user\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
280        (false, regex!(r"^.*\.[Mm][Oo][Dd]$"), Pattern::new(FileTypeResolver::Dynamic(detect::mod_), None)),
281        (true, regex!(r"^.*etc/modules\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::ModConf), None)),
282        (true, regex!(r"^.*etc/conf\.modules$"), Pattern::new(FileTypeResolver::Static(FileType::ModConf), None)),
283        (true, regex!(r"^.*etc/modules$"), Pattern::new(FileTypeResolver::Static(FileType::ModConf), None)),
284        (true, regex!(r"^.*etc/modprobe\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::ModConf), None)),
285                // TODO: only if file is not executable
286        (true, regex!(r"^.*etc/modutils/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::ModConf), None)),
287        (false, regex!(r"^.*\.[mi][3g]$"), Pattern::new(FileTypeResolver::Static(FileType::Modula3), None)),
288        (false, regex!(r"^Muttrc$"), Pattern::new(FileTypeResolver::Static(FileType::Muttrc), None)),
289        (false, regex!(r"^Muttngrc$"), Pattern::new(FileTypeResolver::Static(FileType::Muttrc), None)),
290        (true, regex!(r"^.*etc/Muttrc\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
291        (true, regex!(r"^.*\.mplayer/config$"), Pattern::new(FileTypeResolver::Static(FileType::MPlayerConf), None)),
292        (false, regex!(r"^Muttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
293        (false, regex!(r"^Muttngrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
294        // muttrc* and .muttrc*
295        (false, regex!(r"^\.?muttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
296        // muttngrc* and .muttngrc*
297        (false, regex!(r"^\.?muttngrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
298        (true, regex!(r"^.*\.mutt/muttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
299        (true, regex!(r"^.*\.muttng/muttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
300        (true, regex!(r"^.*\.muttng/muttngrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
301        (false, regex!(r"^rndc.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Named), None)),
302        (false, regex!(r"^rndc.*\.key$"), Pattern::new(FileTypeResolver::Static(FileType::Named), None)),
303        (false, regex!(r"^named.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Named), None)),
304        (true, regex!(r"^.*etc/nanorc$"), Pattern::new(FileTypeResolver::Static(FileType::Nanorc), None)),
305        (false, regex!(r"^.*\.NS[ACGLMNPS]$"), Pattern::new(FileTypeResolver::Static(FileType::Natural), None)),
306        (false, regex!(r"^Neomuttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Neomuttrc), None)),
307        // neomuttrc* and .neomuttrc*
308        (false, regex!(r"^\.?neomuttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Neomuttrc), None)),
309        (true, regex!(r"^.*\.neomutt/neomuttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Neomuttrc), None)),
310        (false, regex!(r"^nginx.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Nginx), None)),
311        (true, regex!(r"^.*etc/nginx/.*$"), Pattern::new(FileTypeResolver::Static(FileType::Nginx), None)),
312        (false, regex!(r"^.*nginx\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Nginx), None)),
313        (true, regex!(r"^.*nginx/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Nginx), None)),
314        (true, regex!(r"^.*usr/local/nginx/conf/.*$"), Pattern::new(FileTypeResolver::Static(FileType::Nginx), None)),
315        (false, regex!(r"^.*\.[1-9]$"), Pattern::new(FileTypeResolver::Dynamic(detect::nroff), None)),
316        (false, regex!(r"^.*\.ml\.cppo$"), Pattern::new(FileTypeResolver::Static(FileType::OCaml), None)),
317        (false, regex!(r"^.*\.mli\.cppo$"), Pattern::new(FileTypeResolver::Static(FileType::OCaml), None)),
318        (false, regex!(r"^.*\.opam\.template$"), Pattern::new(FileTypeResolver::Static(FileType::Opam), None)),
319        (true, regex!(r"^.*openvpn/.*/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::OpenVpn), None)),
320        (false, regex!(r"^.*\.[Oo][Pp][Ll]$"), Pattern::new(FileTypeResolver::Static(FileType::Opl), None)),
321        (true, regex!(r"^.*etc/pam\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::PamConf), None)),
322        (true, regex!(r"^.*etc/pam\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::PamConf), None)),
323        (true, regex!(r"^.*etc/passwd-$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
324        (true, regex!(r"^.*etc/shadow$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
325        (true, regex!(r"^.*etc/shadow\.edit$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
326        (true, regex!(r"^.*var/backups/shadow\.bak$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
327        (true, regex!(r"^.*var/backups/passwd\.bak$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
328        (true, regex!(r"^.*etc/passwd$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
329        (true, regex!(r"^.*etc/passwd\.edit$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
330        (true, regex!(r"^.*etc/shadow-$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
331        (false, regex!(r"^\.?gitolite\.rc$"), Pattern::new(FileTypeResolver::Static(FileType::Perl), None)),
332        (false, regex!(r"^example\.gitolite\.rc$"), Pattern::new(FileTypeResolver::Static(FileType::Perl), None)),
333        (false, regex!(r"^.*\.php\d$"), Pattern::new(FileTypeResolver::Static(FileType::Php), None)),
334        (false, regex!(r"^.*\.pinforc$"), Pattern::new(FileTypeResolver::Static(FileType::PInfo), None)),
335        (true, regex!(r"^.*etc/pinforc$"), Pattern::new(FileTypeResolver::Static(FileType::PInfo), None)),
336        (false, regex!(r"^.*\.[Pp][Rr][Gg]$"), Pattern::new(FileTypeResolver::Dynamic(detect::prg), None)),
337        (true, regex!(r"^.*etc/protocols$"), Pattern::new(FileTypeResolver::Static(FileType::Protocols), None)),
338        (false, regex!(r"^.*printcap.*$"), Pattern::new(FileTypeResolver::Static(FileType::PtcapPrint), None)),
339        (true, regex!(r"^.*baseq[2-3]/.*\.cfg$"), Pattern::new(FileTypeResolver::Static(FileType::Quake), None)),
340        (true, regex!(r"^.*quake[1-3]/.*\.cfg$"), Pattern::new(FileTypeResolver::Static(FileType::Quake), None)),
341        (true, regex!(r"^.*id1/.*\.cfg$"), Pattern::new(FileTypeResolver::Static(FileType::Quake), None)),
342        (true, regex!(r"^.*queries/.*\.scm$"), Pattern::new(FileTypeResolver::Static(FileType::TreeSitterQuery), None)),
343        (false, regex!(r"^.*,v$"), Pattern::new(FileTypeResolver::Static(FileType::Rcs), None)),
344        (false, regex!(r"^\.reminders.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Remind), None)),
345        (false, regex!(r"^[rR]akefile.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Ruby), None)),
346        (false, regex!(r"^[rR]antfile$"), Pattern::new(FileTypeResolver::Static(FileType::Ruby), None)),
347        (false, regex!(r"^[rR]akefile$"), Pattern::new(FileTypeResolver::Static(FileType::Ruby), None)),
348        (true, regex!(r"^.*etc/sensors\.d/[^.].*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Sensors), None)),
349        (true, regex!(r"^.*etc/sensors\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Sensors), None)),
350        (true, regex!(r"^.*etc/sensors3\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Sensors), None)),
351        (true, regex!(r"^.*etc/services$"), Pattern::new(FileTypeResolver::Static(FileType::Services), None)),
352        (true, regex!(r"^.*etc/serial\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::SetSerial), None)),
353        (true, regex!(r"^.*etc/udev/cdsymlinks\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Sh), None)),
354        (false, regex!(r"^\.bash[_-]aliases$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, Some(FileType::Bash))), None)),
355        (false, regex!(r"^\.bash[_-]logout$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, Some(FileType::Bash))), None)),
356        (false, regex!(r"^\.bash[_-]profile$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, Some(FileType::Bash))), None)),
357        (false, regex!(r"^\.kshrc.*$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, Some(FileType::Ksh))), None)),
358        (false, regex!(r"^\.profile.*$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, None)), None)),
359        (true, regex!(r"^.*etc/profile$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, None)), None)),
360        (false, regex!(r"^bash-fc[-\.].*$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, Some(FileType::Bash))), None)),
361        (false, regex!(r"^\.tcshrc.*$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, Some(FileType::Tcsh))), None)),
362        (true, regex!(r"^.*etc/sudoers\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Sudoers), None)),
363        (false, regex!(r"^.*\._sst\.meta$"), Pattern::new(FileTypeResolver::Static(FileType::Sisu), None)),
364        (false, regex!(r"^.*\.-sst\.meta$"), Pattern::new(FileTypeResolver::Static(FileType::Sisu), None)),
365        (false, regex!(r"^.*\.sst\.meta$"), Pattern::new(FileTypeResolver::Static(FileType::Sisu), None)),
366        (true, regex!(r"^.*etc/slp\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::SlpConf), None)),
367        (true, regex!(r"^.*etc/slp\.reg$"), Pattern::new(FileTypeResolver::Static(FileType::SlpReg), None)),
368        (true, regex!(r"^.*etc/slp\.spi$"), Pattern::new(FileTypeResolver::Static(FileType::SlpSpi), None)),
369        (true, regex!(r"^.*etc/ssh/ssh_config\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::SshConfig), None)),
370        (true, regex!(r"^.*\.ssh/config$"), Pattern::new(FileTypeResolver::Static(FileType::SshConfig), None)),
371        (true, regex!(r"^.*\.ssh/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::SshConfig), None)),
372        (true, regex!(r"^.*etc/ssh/sshd_config\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::SshdConfig), None)),
373        (false, regex!(r"^.*\.[Ss][Rr][Cc]$"), Pattern::new(FileTypeResolver::Dynamic(detect::src), None)),
374        (true, regex!(r"^.*etc/sudoers$"), Pattern::new(FileTypeResolver::Static(FileType::Sudoers), None)),
375        (false, regex!(r"^svn-commit.*\.tmp$"), Pattern::new(FileTypeResolver::Static(FileType::Svn), None)),
376        (true, regex!(r"^.*sway/config$"), Pattern::new(FileTypeResolver::Static(FileType::SwayConfig), None)),
377        (true, regex!(r"^.*\.sway/config$"), Pattern::new(FileTypeResolver::Static(FileType::SwayConfig), None)),
378        (false, regex!(r"^.*\.swift\.gyb$"), Pattern::new(FileTypeResolver::Static(FileType::SwiftGyb), None)),
379        (false, regex!(r"^.*\.[Ss][Yy][Ss]$"), Pattern::new(FileTypeResolver::Dynamic(detect::sys), None)),
380        (true, regex!(r"^.*etc/sysctl\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Sysctl), None)),
381        (true, regex!(r"^.*etc/sysctl\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Sysctl), None)),
382        (true, regex!(r"^.*systemd/.*\.automount$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
383        (true, regex!(r"^.*systemd/.*\.dnssd$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
384        (true, regex!(r"^.*systemd/.*\.link$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
385        (true, regex!(r"^.*systemd/.*\.mount$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
386        (true, regex!(r"^.*systemd/.*\.netdev$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
387        (true, regex!(r"^.*systemd/.*\.network$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
388        (true, regex!(r"^.*systemd/.*\.nspawn$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
389        (true, regex!(r"^.*systemd/.*\.path$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
390        (true, regex!(r"^.*systemd/.*\.service$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
391        (true, regex!(r"^.*systemd/.*\.slice$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
392        (true, regex!(r"^.*systemd/.*\.socket$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
393        (true, regex!(r"^.*systemd/.*\.swap$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
394        (true, regex!(r"^.*systemd/.*\.target$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
395        (true, regex!(r"^.*systemd/.*\.timer$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
396        (true, regex!(r"^.*etc/systemd/.*\.conf\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
397        (true, regex!(r"^.*\.config/systemd/user/.*\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
398        (true, regex!(r"^.*etc/systemd/system/.*\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
399        (true, regex!(r"^.*etc/systemd/system/.*\.d/\.#.*$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
400        (true, regex!(r"^.*etc/systemd/system/\.#.*$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
401        (true, regex!(r"^.*\.config/systemd/user/.*\.d/\.#.*$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
402        (true, regex!(r"^.*\.config/systemd/user/\.#.*$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
403        (false, regex!(r"^.*termcap.*$"), Pattern::new(FileTypeResolver::Static(FileType::PtcapTerm), None)),
404        (false, regex!(r"^.*\.t\.html$"), Pattern::new(FileTypeResolver::Static(FileType::Tilde), None)),
405        (false, regex!(r"^\.?tmux.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Tmux), None)),
406        (false, regex!(r"^\.?tmux.*\.conf.*$"), Pattern::new(FileTypeResolver::Static(FileType::Tmux), Some(-1))),
407        (true, regex!(r"^.*\.cargo/config$"), Pattern::new(FileTypeResolver::Static(FileType::Toml), None)),
408        (true, regex!(r"^.*\.cargo/credentials$"), Pattern::new(FileTypeResolver::Static(FileType::Toml), None)),
409        (true, regex!(r"^.*etc/udev/udev\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::UdevConf), None)),
410        (true, regex!(r"^.*etc/udev/permissions\.d/.*\.permissions$"), Pattern::new(FileTypeResolver::Static(FileType::UdevPerm), None)),
411        (true, regex!(r"^.*etc/updatedb\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::UpdateDb), None)),
412        (true, regex!(r"^.*\.init/.*\.override$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
413        (true, regex!(r"^.*usr/share/upstart/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
414        (true, regex!(r"^.*\.config/upstart/.*\.override$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
415        (true, regex!(r"^.*etc/init/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
416        (true, regex!(r"^.*etc/init/.*\.override$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
417        (true, regex!(r"^.*\.config/upstart/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
418        (true, regex!(r"^.*\.init/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
419        (true, regex!(r"^.*usr/share/upstart/.*\.override$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
420        (false, regex!(r"^.*\.[Ll][Oo][Gg]$"), Pattern::new(FileTypeResolver::Dynamic(detect::log), None)),
421        (false, regex!(r"^.*\.vhdl_[0-9].*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Vhdl), None)),
422        (false, regex!(r"^.*\.ws[fc]$"), Pattern::new(FileTypeResolver::Static(FileType::Wsh), None)),
423        (true, regex!(r"^.*Xresources/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::XDefaults), None)),
424        (true, regex!(r"^.*app-defaults/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::XDefaults), None)),
425        (true, regex!(r"^.*etc/xinetd\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Xinetd), None)),
426        (true, regex!(r"^.*etc/blkid\.tab$"), Pattern::new(FileTypeResolver::Static(FileType::Xml), None)),
427        (true, regex!(r"^.*etc/blkid\.tab\.old$"), Pattern::new(FileTypeResolver::Static(FileType::Xml), None)),
428        (false, regex!(r"^.*\.vbproj\.user$"), Pattern::new(FileTypeResolver::Static(FileType::Xml), None)),
429        (false, regex!(r"^.*\.fsproj\.user$"), Pattern::new(FileTypeResolver::Static(FileType::Xml), None)),
430        (false, regex!(r"^.*\.csproj\.user$"), Pattern::new(FileTypeResolver::Static(FileType::Xml), None)),
431        (true, regex!(r"^.*etc/xdg/menus/.*\.menu$"), Pattern::new(FileTypeResolver::Static(FileType::Xml), None)),
432        (false, regex!(r"^.*Xmodmap$"), Pattern::new(FileTypeResolver::Static(FileType::XModMap), None)),
433        (true, regex!(r"^.*etc/zprofile$"), Pattern::new(FileTypeResolver::Static(FileType::Zsh), None)),
434        (false, regex!(r"^.*vimrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Vim), None)),
435        (false, regex!(r"^Xresources.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::XDefaults), None)),
436        (true, regex!(r"^.*etc/xinetd\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Xinetd), None)),
437        (false, regex!(r"^.*xmodmap.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::XModMap), None)),
438        (true, regex!(r"^.*xorg\.conf\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::XF86Conf4), None)),
439        // Increase priority to run before the pattern below
440        (false, regex!(r"^XF86Config-4.*$"), Pattern::new(FileTypeResolver::Static(FileType::XF86Conf4), Some(isize::MIN + 1))),
441        (false, regex!(r"^XF86Config.*$"), Pattern::starsetf(FileTypeResolver::Dynamic(detect::xfree86), None)),
442        (false, regex!(r"^\.zcompdump.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Zsh), None)),
443        // .zlog* and zlog*
444        (false, regex!(r"^\.?zlog.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Zsh), None)),
445        // .zsh* and zsh*
446        (false, regex!(r"^\.?zsh.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Zsh), None)),
447        // Ignored extension
448        (false, regex!(r"^.+~$"), Pattern::new(FileTypeResolver::Dynamic(detect::tmp), None)),
449    ];
450    vec.sort_unstable_by(|(_, _, pat1), (_, _, pat2)| pat2.priority.unwrap_or(0).cmp(&pat1.priority.unwrap_or(0)));
451    vec
452});