diff --git a/Cargo.lock b/Cargo.lock index be882cb4..370929af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -669,9 +669,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.19" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" +checksum = "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4" dependencies = [ "serde", ] diff --git a/cargo-insta/Cargo.toml b/cargo-insta/Cargo.toml index f0202d92..e53be7e6 100644 --- a/cargo-insta/Cargo.toml +++ b/cargo-insta/Cargo.toml @@ -26,6 +26,7 @@ syn = { version = "2.0.8", features = ["full", "visit", "extra-traits"] } ignore = "0.4.17" uuid = { version = "1.0.0", features = ["v4"] } tempfile = "3.5.0" + # Needs pinning in Cargo.lock because of MSRV semver = {version = "1.0.7", features = ["serde"]} lazy_static = "1.4.0" diff --git a/cargo-insta/src/cli.rs b/cargo-insta/src/cli.rs index 8fc9f450..190e4ed3 100644 --- a/cargo-insta/src/cli.rs +++ b/cargo-insta/src/cli.rs @@ -5,12 +5,14 @@ use std::{collections::HashSet, fmt}; use std::{env, fs}; use std::{io, process}; +use cargo_metadata::MetadataCommand; use console::{set_colors_enabled, style, Key, Term}; use insta::Snapshot; use insta::_cargo_insta_support::{ is_ci, SnapshotPrinter, SnapshotUpdate, TestRunner, ToolConfig, UnreferencedSnapshots, }; use itertools::Itertools; +use lazy_static::lazy_static; use semver::Version; use serde::Serialize; use uuid::Uuid; @@ -1248,6 +1250,8 @@ pub(crate) fn run() -> Result<(), Box> { args.remove(1); } + check_insta_cargo_insta_compat()?; + let opts = Opts::parse_from(args); handle_color(opts.color); @@ -1270,3 +1274,42 @@ pub(crate) fn run() -> Result<(), Box> { Command::PendingSnapshots(cmd) => pending_snapshots_cmd(cmd), } } + +fn check_insta_cargo_insta_compat() -> Result<(), Box> { + let insta_version = read_insta_version()?; + if insta_version.major != CARGO_INSTA_VERSION.major { + eprintln!( + "{}: insta version mismatch: cargo-insta is {}, but insta is {}", + style("error").bold().red(), + *CARGO_INSTA_VERSION, + insta_version + ); + return Err(QuietExit(1).into()); + } + + if (insta_version.minor).abs_diff(CARGO_INSTA_VERSION.minor) > 10 { + eprintln!( + "{}: insta version {} is very different from cargo-insta version {}. This may raise an error in the future.", + style("error").bold().red(), + *CARGO_INSTA_VERSION, + insta_version + ); + } + + Ok(()) +} + +lazy_static! { + static ref CARGO_INSTA_VERSION: Version = + Version::parse(env!("CARGO_PKG_VERSION")).expect("Invalid cargo-insta version number"); +} + +fn read_insta_version() -> Result> { + MetadataCommand::new() + .exec()? + .packages + .iter() + .find(|package| package.name == "insta") + .map(|package| package.version.clone()) + .ok_or("insta not found in cargo metadata".into()) +}