filecheck: Fall back to using the file command if the freedesktop magic file cannot...
authorJoey Hess <joey@kitenet.net>
Mon, 9 Aug 2010 17:18:59 +0000 (13:18 -0400)
committerJoey Hess <joey@kitenet.net>
Mon, 9 Aug 2010 17:18:59 +0000 (13:18 -0400)
IkiWiki/Plugin/filecheck.pm
debian/changelog
doc/plugins/filecheck.mdwn

index d00b6dfd3e0445fe243502929cfa92589e15a77c..a78058ffed7b15b46e1c1352c88ce70eebc4b00a 100644 (file)
@@ -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";
                }
index 8223074f32d93d6a35ed254436a9765e63067e6a..440bee34f6c0c2bd7b211a867126ee5ea82f6a7e 100644 (file)
@@ -1,3 +1,10 @@
+ikiwiki (3.20100805) UNRELEASED; urgency=low
+
+  * filecheck: Fall back to using the file command if the freedesktop
+    magic file cannot identify a file.
+
+ -- Joey Hess <joeyh@debian.org>  Mon, 09 Aug 2010 13:18:28 -0400
+
 ikiwiki (3.20100804) unstable; urgency=low
 
   * template: Fix dependency tracking. Broken in version 3.20100427.
index e5f68b29c317d1ae854bc0a28661be3b953446db..b038bc433c7c3dbdbb0da64334c41b954f843099 100644 (file)
@@ -7,7 +7,8 @@ status. These tests are mostly useful for the [[attachment]] plugin, and
 are documented [[here|ikiwiki/pagespec/attachment]].
 
 This plugin will use the [[!cpan File::MimeInfo::Magic]] perl module, if
-available, for mimetype checking.
+available, for mimetype checking. It falls back to using the `file` command
+if necessary for hard to detect files.
 
 The `virusfree` [[PageSpec|ikiwiki/pagespec/attachment]] requires that
 ikiwiki be configured with a virus scanner program via the `virus_checker`