From 60c4c5441925d7ec3ac5efe0c710455a1bd76a0e Mon Sep 17 00:00:00 2001 From: Sebastian Wiesner Date: Fri, 14 Oct 2022 13:53:45 +0200 Subject: [PATCH] Remove tree_magic_mini It's not exactly well-maintained, has a couple of bugs and obvious programming mistakes, requires a system-wide shared mime database and provides no way to detect the absence of said database. --- CHANGELOG.md | 5 +++++ Cargo.lock | 53 ---------------------------------------------------- Cargo.toml | 4 ---- README.md | 4 +--- src/magic.rs | 38 ++++++++++++++++++------------------- 5 files changed, 24 insertions(+), 80 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c920802..cbcb1098 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,11 @@ To publish a new release run `scripts/release` from the project directory. - Move repository back to . - Restore release binaries. +### Removed +- Support for `tree_magic_mini` for mime-type detection; mdcat now only uses the `file` tool (see [GH-204]). + +[GH-204]: https://github.com/lunaryorn/mdcat/pull/204 + ## [0.28.0] – 2022-07-31 ### Changed diff --git a/Cargo.lock b/Cargo.lock index a391eef0..585d5c56 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -86,12 +86,6 @@ version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" -[[package]] -name = "bytecount" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c" - [[package]] name = "bytemuck" version = "1.12.1" @@ -325,12 +319,6 @@ dependencies = [ "regex", ] -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - [[package]] name = "flate2" version = "1.0.24" @@ -594,7 +582,6 @@ dependencies = [ "test-generator", "tracing", "tracing-subscriber", - "tree_magic_mini", "ureq", "url", ] @@ -620,12 +607,6 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" version = "0.5.4" @@ -653,16 +634,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "nom" -version = "7.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -752,16 +723,6 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" -[[package]] -name = "petgraph" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" -dependencies = [ - "fixedbitset", - "indexmap", -] - [[package]] name = "pin-project" version = "1.0.12" @@ -1326,20 +1287,6 @@ dependencies = [ "tracing-log", ] -[[package]] -name = "tree_magic_mini" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91adfd0607cacf6e4babdb870e9bec4037c1c4b151cfd279ccefc5e0c7feaa6d" -dependencies = [ - "bytecount", - "fnv", - "lazy_static", - "nom", - "once_cell", - "petgraph", -] - [[package]] name = "unicase" version = "2.6.0" diff --git a/Cargo.toml b/Cargo.toml index 321e9c34..cf5eee20 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,9 +12,6 @@ license = "MPL-2.0" authors = ["Sebastian Wiesner "] edition = "2021" -[features] -default = ["tree_magic_mini"] - [dependencies] ansi_term = "0.12.1" anyhow = "1.0.58" @@ -30,7 +27,6 @@ tracing = { version = "0.1.35", features = ["release_max_level_warn"] } tracing-subscriber = { version = "0.3.14", features = ["env-filter"] } ureq = { version = "2.5.0", features = ["tls", "native-certs"] } url = "2.2.2" -tree_magic_mini = { version = "3.0.3", optional = true } [dependencies.syntect] version = "5.0.0" diff --git a/README.md b/README.md index 4f1ca10f..4b479092 100644 --- a/README.md +++ b/README.md @@ -74,9 +74,7 @@ Try `mdcat --help` or read the [mdcat(1)](./mdcat.1.adoc) manpage. ## Requirements -- For image type detection either: - - a system-wide [shared mime database](https://www.freedesktop.org/wiki/Specifications/shared-mime-info-spec/), or, - - if `mdcat` is built without default features, the `file` tool with support for `--brief` and `--mime-type` flags. +For image type detection either the `file` tool with support for `--brief` and `--mime-type` flags must be available in `$PATH`. [Homebrew]: https://brew.sh [MacPorts]: https://www.macports.org diff --git a/src/magic.rs b/src/magic.rs index dbc4ac61..06131458 100644 --- a/src/magic.rs +++ b/src/magic.rs @@ -6,7 +6,10 @@ //! Magic util functions for detecting image types. +use anyhow::Result; +use anyhow::{anyhow, Context}; use mime::Mime; +use tracing::{event, Level}; /// Whether the given data is SVG data. pub fn is_svg(buffer: &[u8]) -> bool { @@ -19,31 +22,26 @@ pub fn is_png(buffer: &[u8]) -> bool { } fn is_mimetype(buffer: &[u8], mime: &Mime) -> bool { - is_mimetype_impl(buffer, mime) + get_mimetype_for_buffer_with_file(buffer).map_or_else( + |error| { + event!( + Level::WARN, + ?error, + "checking for mime type {} failed: {}", + mime, + error + ); + false + }, + |detected| detected == *mime, + ) } -#[cfg(feature = "tree_magic_mini")] -fn is_mimetype_impl(buffer: &[u8], expected_type: &Mime) -> bool { - tree_magic_mini::match_u8(expected_type.as_ref(), buffer) -} - -#[cfg(not(feature = "tree_magic_mini"))] -fn is_mimetype_impl(buffer: &[u8], expected_type: &Mime) -> bool { - is_mimetype_file(buffer, mime).unwrap_or_else(|error| { - event!(Level::WARN, ?error, "checking for {} failed", mime); - false - }) -} - -#[cfg(not(feature = "tree_magic_mini"))] -fn is_mimetype_file(buffer: &[u8], expected_type: &Mime) -> Result { +fn get_mimetype_for_buffer_with_file(buffer: &[u8]) -> Result { use std::io::prelude::*; use std::io::ErrorKind; use std::process::*; - use anyhow::{anyhow, Context, Result}; - use tracing::{event, Level}; - let mut process = Command::new("file") .arg("--brief") .arg("--mime-type") @@ -79,7 +77,7 @@ fn is_mimetype_file(buffer: &[u8], expected_type: &Mime) -> Result { let detected_type = stdout .parse::() .with_context(|| format!("Failed to parse mime type from output: {}", stdout))?; - Ok(detected_type == *expected_type) + Ok(detected_type) } else { Err(anyhow!( "file --brief --mime-type failed with status {}: {}",