diff options
author | Joey Hess <joey@kitenet.net> | 2010-08-09 13:18:59 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2010-08-09 13:18:59 -0400 |
commit | 51d5e546974405741e08ed27d0bf89958fa7366b (patch) | |
tree | 3279cd32767510034bfd8d2964f80b3b966a9d88 /IkiWiki | |
parent | 74d975ff4d883b7c2ed4e0517b6665abd2cfe6cc (diff) | |
download | ikiwiki-51d5e546974405741e08ed27d0bf89958fa7366b.tar ikiwiki-51d5e546974405741e08ed27d0bf89958fa7366b.tar.gz |
filecheck: Fall back to using the file command if the freedesktop magic file cannot identify a file.
Diffstat (limited to 'IkiWiki')
-rw-r--r-- | IkiWiki/Plugin/filecheck.pm | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/IkiWiki/Plugin/filecheck.pm b/IkiWiki/Plugin/filecheck.pm index d00b6dfd3..a78058ffe 100644 --- a/IkiWiki/Plugin/filecheck.pm +++ b/IkiWiki/Plugin/filecheck.pm @@ -132,15 +132,28 @@ sub match_mimetype ($$;@) { return IkiWiki::ErrorReason->new("file does not exist"); } - # Use ::magic to get the mime type, the idea is to only trust - # data obtained by examining the actual file contents. + # Get the mime type. + # + # First, try File::Mimeinfo. This is fast, but doesn't recognise + # all files. eval q{use File::MimeInfo::Magic}; - if ($@) { - return IkiWiki::ErrorReason->new("failed to load File::MimeInfo::Magic ($@); cannot check MIME type"); + my $mimeinfo_ok=! $@; + my $mimetype; + if ($mimeinfo_ok) { + my $mimetype=File::MimeInfo::Magic::magic($file); } - my $mimetype=File::MimeInfo::Magic::magic($file); + + # Fall back to using file, which has a more complete + # magic database. if (! defined $mimetype) { - $mimetype=File::MimeInfo::Magic::default($file); + open(my $file_h, "-|", "file", "-bi", $file); + $mimetype=<$file_h>; + close $file_h; + } + if (! defined $mimetype || $mimetype !~s /;.*//) { + # Fall back to default value. + $mimetype=File::MimeInfo::Magic::default($file) + if $mimeinfo_ok; if (! defined $mimetype) { $mimetype="unknown"; } |