From 0fc3c73bbcffd15edbf434d725c40d78c5a25ab0 Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Sun, 16 Jun 2024 23:11:23 -0700 Subject: [PATCH 1/3] Raise an error on sufficiently different `insta` vs `cargo-insta` versions This has two purposes: - By raising an error if major versions differ, it allows eventually upgrading to insta 2 without confusing breaks (we want to add this sufficiently before releasing v2) - It potentially allows for making some changes before a big break, by warning when minor versions differ sufficiently. This could be upgraded to an error. Currently we have a few deprecated items; and I was thinking of trying to unify some of the pending / named snapshot handling, but it becomes burdensome if we need to support the existing approach forever. WDYT? --- cargo-insta/Cargo.toml | 2 ++ cargo-insta/src/cli.rs | 65 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/cargo-insta/Cargo.toml b/cargo-insta/Cargo.toml index 5ffa1f67..768e0d44 100644 --- a/cargo-insta/Cargo.toml +++ b/cargo-insta/Cargo.toml @@ -24,6 +24,8 @@ syn = { version = "1.0.50", features = ["full", "visit", "extra-traits"] } ignore = "0.4.17" uuid = { version = "1.0.0", features = ["v4"] } tempfile = "3.5.0" +semver = {version = "1.0.23", features = ["serde"]} +lazy_static = "1.4.0" [dev-dependencies] walkdir = "2.3.1" diff --git a/cargo-insta/src/cli.rs b/cargo-insta/src/cli.rs index c9e36f56..150ecb4b 100644 --- a/cargo-insta/src/cli.rs +++ b/cargo-insta/src/cli.rs @@ -11,7 +11,10 @@ use insta::Snapshot; use insta::_cargo_insta_support::{ is_ci, SnapshotPrinter, SnapshotUpdate, TestRunner, ToolConfig, UnreferencedSnapshots, }; +use lazy_static::lazy_static; +use semver::Version; use serde::Serialize; +use serde_json::Value; use structopt::clap::AppSettings; use structopt::StructOpt; use uuid::Uuid; @@ -1094,6 +1097,8 @@ pub(crate) fn run() -> Result<(), Box> { args.remove(1); } + check_insta_cargo_insta_compat()?; + let opts = Opts::from_iter(args); let color = handle_color(opts.color.as_deref())?; @@ -1116,3 +1121,63 @@ 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 run_cargo_metadata() -> Result> { + let output = std::process::Command::new("cargo") + .arg("metadata") + .arg("--format-version") + .arg("1") + .arg("--locked") + .output()?; + + Ok(String::from_utf8(output.stdout)?) +} + +fn read_insta_version() -> Result> { + let json_output = run_cargo_metadata()?; + let json_value: Value = serde_json::from_str(&json_output)?; + + let packages = json_value["packages"] + .as_array() + .ok_or("Couldn't read packages array")?; + + let insta_package = packages + .iter() + .find(|package| package["name"].as_str().unwrap() == "insta") + .ok_or("insta dependency not found")?; + + let version_str = insta_package["version"] + .as_str() + .ok_or("Invalid insta version")?; + + Ok(Version::parse(version_str)?) +} From d60b62bebebef1a3910b1d1de79bea1ce09c53d5 Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Thu, 1 Aug 2024 13:17:35 -0700 Subject: [PATCH 2/3] --- Cargo.lock | 6 ++++-- cargo-insta/Cargo.toml | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a187639b..9aa40d16 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -61,7 +61,9 @@ dependencies = [ "console", "ignore", "insta", + "lazy_static", "proc-macro2", + "semver", "serde", "serde_json", "structopt", @@ -567,9 +569,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 fd6e67f5..15183b3c 100644 --- a/cargo-insta/Cargo.toml +++ b/cargo-insta/Cargo.toml @@ -26,7 +26,8 @@ syn = { version = "=2.0.0", features = ["full", "visit", "extra-traits"] } ignore = "0.4.17" uuid = { version = "1.0.0", features = ["v4"] } tempfile = "3.5.0" -semver = {version = "1.0.23", features = ["serde"]} +# Pinned because of MSRV; wait for MSRV bump or msrv-resolver +semver = {version = "=1.0.7", features = ["serde"]} lazy_static = "1.4.0" [dev-dependencies] From 606b5930a3df43904205ad3f8ac3b2d5224f0345 Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Fri, 2 Aug 2024 16:29:52 -0700 Subject: [PATCH 3/3] --- cargo-insta/src/cli.rs | 35 +++++++---------------------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/cargo-insta/src/cli.rs b/cargo-insta/src/cli.rs index 205d1c68..cbfbe5a4 100644 --- a/cargo-insta/src/cli.rs +++ b/cargo-insta/src/cli.rs @@ -6,6 +6,7 @@ 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::{ @@ -14,7 +15,6 @@ use insta::_cargo_insta_support::{ use lazy_static::lazy_static; use semver::Version; use serde::Serialize; -use serde_json::Value; use uuid::Uuid; use crate::cargo::{find_snapshot_roots, get_metadata, Metadata, Package}; @@ -1159,33 +1159,12 @@ lazy_static! { Version::parse(env!("CARGO_PKG_VERSION")).expect("Invalid cargo-insta version number"); } -fn run_cargo_metadata() -> Result> { - let output = std::process::Command::new("cargo") - .arg("metadata") - .arg("--format-version") - .arg("1") - .arg("--locked") - .output()?; - - Ok(String::from_utf8(output.stdout)?) -} - fn read_insta_version() -> Result> { - let json_output = run_cargo_metadata()?; - let json_value: Value = serde_json::from_str(&json_output)?; - - let packages = json_value["packages"] - .as_array() - .ok_or("Couldn't read packages array")?; - - let insta_package = packages + MetadataCommand::new() + .exec()? + .packages .iter() - .find(|package| package["name"].as_str().unwrap() == "insta") - .ok_or("insta dependency not found")?; - - let version_str = insta_package["version"] - .as_str() - .ok_or("Invalid insta version")?; - - Ok(Version::parse(version_str)?) + .find(|package| package.name == "insta") + .map(|package| package.version.clone()) + .ok_or("insta not found in cargo metadata".into()) }