diff --git a/Cargo.lock b/Cargo.lock index 65ac0f9e..98f95640 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -430,9 +430,9 @@ dependencies = [ [[package]] name = "crossterm" -version = "0.21.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486d44227f71a1ef39554c0dc47e44b9f4139927c75043312690c3f476d1d788" +checksum = "c85525306c4291d1b73ce93c8acf9c339f9b213aef6c1d85c3830cbf1c16325c" dependencies = [ "bitflags", "crossterm_winapi", @@ -446,9 +446,9 @@ dependencies = [ [[package]] name = "crossterm_winapi" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6966607622438301997d3dac0d2f6e9a90c68bb6bc1785ea98456ab93c0507" +checksum = "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c" dependencies = [ "winapi", ] @@ -1451,24 +1451,24 @@ dependencies = [ [[package]] name = "ra_ap_la-arena" -version = "0.0.77" +version = "0.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c126bbcc504406b874293d52d0709e8b15374ad27e769927e97f350ad862d615" +checksum = "22e1d4586c3966a235f81d2612fdbf0acc4fada17a3be88d39351c5f28ae8b17" [[package]] name = "ra_ap_parser" -version = "0.0.77" +version = "0.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc14ece42a483836bd35f994a3b79314ac5243f53b51ef1e27e61fa2736cb0ec" +checksum = "a5249a5830b0639359da593d92bfcfad64f718286eaf2df5c7d71cd6c7a50620" dependencies = [ "drop_bomb", ] [[package]] name = "ra_ap_profile" -version = "0.0.77" +version = "0.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b4c9a96061967fe36356286d54fa7601c7f5e758e38b1812d4d01768cc0ea2" +checksum = "82d288ba0be31433aa2a7260670a204ab47a45b73a5e8b034122bafb900ef0db" dependencies = [ "cfg-if 1.0.0", "countme", @@ -1481,9 +1481,9 @@ dependencies = [ [[package]] name = "ra_ap_stdx" -version = "0.0.77" +version = "0.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0ca2bddaed8182a3f02d09e93529b6f8eebb226bb6962cd25ee2053c8b9d0f" +checksum = "cdddcd6e3c048ecfbaf627b31fcc7ffec323f2fa2779d1f5c92567629669f8d2" dependencies = [ "always-assert", "libc", @@ -1493,9 +1493,9 @@ dependencies = [ [[package]] name = "ra_ap_syntax" -version = "0.0.77" +version = "0.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56a5e8065271b0599fccf4f72a7f20cb2dce2cb8846a87a8446dc17f77dab56" +checksum = "087c316b0fd2a27254c4ba431c0dd1388e6cd92167254870afb0ac7cce430efb" dependencies = [ "cov-mark", "indexmap", @@ -1513,9 +1513,9 @@ dependencies = [ [[package]] name = "ra_ap_text_edit" -version = "0.0.77" +version = "0.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "724cef229171d62521a2e2794601c593c3c94baeedc3371d8f95aa658ae28404" +checksum = "8614d99397f89248b234ea96f3b775624ef5d27d2957aa8bf2644d57465a652f" dependencies = [ "text-size", ] diff --git a/Cargo.toml b/Cargo.toml index 7b50f3b6..ab73e1f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,12 +25,13 @@ nlprule-build = { version = "=0.6.4", optional = true } # compress the nlprule artifacts to be under the 10 MB limit # that cargo enforces xz2 = "0.1" +cargo_toml = "^0.10.1" [dependencies] color-eyre = "0.5" cargo_toml = "^0.10.1" console = "0.15" -crossterm = "0.21.0" +crossterm = "0.22.1" # for the config file directories = "4.0.1" docopt = "1" @@ -45,7 +46,7 @@ log = "0.4" num_cpus = "1.13" proc-macro2 = { version = "1", features = ["span-locations"] } pulldown-cmark = "0.8.0" -ra_ap_syntax = "0.0.77" +ra_ap_syntax = "0.0.78" rayon = "1.5" regex = "1.5" serde = { version = "1", features = ["derive"] } diff --git a/build.rs b/build.rs index 17d1e330..dd3f991b 100644 --- a/build.rs +++ b/build.rs @@ -3,6 +3,22 @@ use std::io::BufReader; use std::path::PathBuf; use xz2::bufread::{XzDecoder, XzEncoder}; +fn extract_version<'a>(manifest: &'a cargo_toml::Manifest, pkg_name: &str) -> Option<&'a str> { + let (_, dependency) = manifest + .dependencies + .get_key_value(pkg_name)?; + let version = dependency + .detail() + .map(|x| x.version.as_ref().map(|x| x.as_str())).flatten()?; + let version = match version { + x if x.starts_with("=") => &version[1..], + x if x.starts_with("<=") || x.starts_with(">=") => &version[2..], + x if x.starts_with("*") => panic!("Don't be silly."), + _ => version, + }; + Some(version) +} + fn main() -> std::result::Result<(), Box<(dyn std::error::Error + 'static)>> { println!("cargo:rerun-if-changed=build.rs"); println!("cargo:rerun-if-changed=Cargo.toml"); @@ -10,24 +26,46 @@ fn main() -> std::result::Result<(), Box<(dyn std::error::Error + 'static)>> { let out = env::var("OUT_DIR").expect("OUT_DIR exists in env vars. qed"); let out = PathBuf::from(out); + const MISSING: &str = "NOT COMPILED IN"; + if !cfg!(feature = "hunspell") { + println!("cargo:rustc-env=CHECKER_NLPRULE_VERSION={}", MISSING); + } + if !cfg!(feature = "nlprules") { + println!("cargo:rustc-env=CHECKER_HUNSPELL_VERSION={}", MISSING); + } + + // extract the version from the manifest. + // only accept defined versions, no git dependencies or whatever + let manifest = std::path::PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST exists in env vars. qed")).join("Cargo.toml"); + let manifest = cargo_toml::Manifest::from_path(manifest)?; + #[cfg(feature = "hunspell")] + { + let version = extract_version(&manifest, "hunspell-rs").expect("Hunspell must be present. qed"); + println!("cargo:rustc-env=CHECKER_HUNSPELL_VERSION={}", version); + } #[cfg(feature = "nlprules")] { + let nlprule_version = extract_version(&manifest, "nlprule").expect("Hunspell must be present. qed"); + println!("cargo:rustc-env=CHECKER_NLPRULE_VERSION={}", nlprule_version); + const COMPRESSION_EXTENSION: &str = "xz"; const ARTIFACTS_DIR: &str = "nlprule-data"; - println!("cargo:rerun-if-changed=nlprule-data/en_rules.bin.xz"); - println!("cargo:rerun-if-changed=nlprule-data/en_tokenizer.bin.xz"); + let cwd = env::current_dir().expect("Current dir exists. qed"); + let cache_dir = cwd.join(ARTIFACTS_DIR).join(nlprule_version).join("en"); + std::fs::create_dir_all(&cache_dir)?; + println!("cargo:rerun-if-changed={}/en_rules.bin.{}", cache_dir.display(), COMPRESSION_EXTENSION); + println!("cargo:rerun-if-changed={}/en_tokenizer.bin.{}", cache_dir.display(), COMPRESSION_EXTENSION); println!("cargo:rerun-if-changed={}/en_rules.bin", out.display()); println!("cargo:rerun-if-changed={}/en_tokenizer.bin", out.display()); - let cwd = env::current_dir().expect("Current dir must exist. qed"); - - let cache_dir = Some(cwd.join(ARTIFACTS_DIR)); - - nlprule_build::BinaryBuilder::new(&["en"], &out) + let builder = nlprule_build::BinaryBuilder::new(&["en"], &out); + builder + .version(nlprule_version) + .out_dir(out) .fallback_to_build_dir(false) - .cache_dir(cache_dir) + .cache_dir(Some(cache_dir)) .transform( |source, mut sink| { let mut encoder = XzEncoder::new(BufReader::new(source), 9); diff --git a/src/config/args.rs b/src/config/args.rs index b36d9857..450a2d08 100644 --- a/src/config/args.rs +++ b/src/config/args.rs @@ -30,7 +30,7 @@ Usage: cargo-spellcheck [(-v...|-q)] [--jobs=] config (--user|--stdout|--cfg=) [--checkers=] [--force] cargo-spellcheck [(-v...|-q)] [--jobs=] list-files [--skip-readme] [[--recursive] ... ] cargo-spellcheck [(-v...|-q)] [--jobs=] [check] [--fix] [--cfg=] [--code=] [--dev-comments] [--skip-readme] [--checkers=] [[--recursive] ... ] - cargo-spellcheck --version + cargo-spellcheck --version [-v...] cargo-spellcheck --help Options: diff --git a/src/main.rs b/src/main.rs index 599c3de2..e27873ae 100644 --- a/src/main.rs +++ b/src/main.rs @@ -107,6 +107,10 @@ fn run() -> Result { match args.action() { Action::Version => { println!("cargo-spellcheck {}", env!("CARGO_PKG_VERSION")); + if args.flag_verbose > 0 { + println!("hunspell {}", env!("CHECKER_HUNSPELL_VERSION")); + println!("nlprules {}", env!("CHECKER_NLPRULE_VERSION")); + } return Ok(ExitCode::Success); } Action::Help => {