diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e8c4ece6f0..35afe54ff5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -411,7 +411,7 @@ cargo install hyperfine To benchmark the release build: ```shell -cargo build --release && hyperfine --warmup 10 \ +cargo build --release --bin ruff && hyperfine --warmup 10 \ "./target/release/ruff check ./crates/ruff_linter/resources/test/cpython/ --no-cache -e" \ "./target/release/ruff check ./crates/ruff_linter/resources/test/cpython/ -e" diff --git a/Cargo.lock b/Cargo.lock index 7f2daed769..abda068d5d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -177,11 +177,22 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "bincode" -version = "1.3.3" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" dependencies = [ + "bincode_derive", "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", ] [[package]] @@ -4260,6 +4271,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9df2af067a7953e9c3831320f35c1cc0600c30d44d9f7a12b01db1cd88d6b47" +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + [[package]] name = "url" version = "2.5.4" @@ -4347,6 +4364,12 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + [[package]] name = "vt100" version = "0.15.2" diff --git a/Cargo.toml b/Cargo.toml index 06ac96c6f5..6f9c967b78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,7 +52,7 @@ anstyle = { version = "1.0.10" } anyhow = { version = "1.0.80" } assert_fs = { version = "1.1.0" } argfile = { version = "0.2.0" } -bincode = { version = "1.3.3" } +bincode = { version = "2.0.0" } bitflags = { version = "2.5.0" } bstr = { version = "1.9.1" } cachedir = { version = "0.3.1" } diff --git a/crates/ruff/Cargo.toml b/crates/ruff/Cargo.toml index 25f3ee7a06..777f99ebaf 100644 --- a/crates/ruff/Cargo.toml +++ b/crates/ruff/Cargo.toml @@ -31,7 +31,7 @@ ruff_workspace = { workspace = true } anyhow = { workspace = true } argfile = { workspace = true } -bincode = { workspace = true } +bincode = { workspace = true, features = ["serde"] } bitflags = { workspace = true } cachedir = { workspace = true } clap = { workspace = true, features = ["derive", "env", "wrap_help"] } diff --git a/crates/ruff/src/cache.rs b/crates/ruff/src/cache.rs index 056c7420b0..23c1767c41 100644 --- a/crates/ruff/src/cache.rs +++ b/crates/ruff/src/cache.rs @@ -15,7 +15,6 @@ use rayon::iter::ParallelIterator; use rayon::iter::{IntoParallelIterator, ParallelBridge}; use ruff_linter::{codes::Rule, registry::AsRule}; use rustc_hash::FxHashMap; -use serde::{Deserialize, Serialize}; use tempfile::NamedTempFile; use ruff_cache::{CacheKey, CacheKeyHasher}; @@ -118,13 +117,14 @@ impl Cache { } }; - let mut package: PackageCache = match bincode::deserialize_from(BufReader::new(file)) { - Ok(package) => package, - Err(err) => { - warn_user!("Failed parse cache file `{}`: {err}", path.display()); - return Cache::empty(path, package_root); - } - }; + let mut package: PackageCache = + match bincode::decode_from_reader(BufReader::new(file), bincode::config::standard()) { + Ok(package) => package, + Err(err) => { + warn_user!("Failed parse cache file `{}`: {err}", path.display()); + return Cache::empty(path, package_root); + } + }; // Sanity check. if package.package_root != package_root { @@ -176,8 +176,8 @@ impl Cache { // Serialize to in-memory buffer because hyperfine benchmark showed that it's faster than // using a `BufWriter` and our cache files are small enough that streaming isn't necessary. - let serialized = - bincode::serialize(&self.package).context("Failed to serialize cache data")?; + let serialized = bincode::encode_to_vec(&self.package, bincode::config::standard()) + .context("Failed to serialize cache data")?; temp_file .write_all(&serialized) .context("Failed to write serialized cache to temporary file.")?; @@ -312,7 +312,7 @@ impl Cache { } /// On disk representation of a cache of a package. -#[derive(Deserialize, Debug, Serialize)] +#[derive(bincode::Encode, Debug, bincode::Decode)] struct PackageCache { /// Path to the root of the package. /// @@ -324,7 +324,7 @@ struct PackageCache { } /// On disk representation of the cache per source file. -#[derive(Deserialize, Debug, Serialize)] +#[derive(bincode::Decode, Debug, bincode::Encode)] pub(crate) struct FileCache { /// Key that determines if the cached item is still valid. key: u64, @@ -371,7 +371,7 @@ impl FileCache { } } -#[derive(Debug, Default, Deserialize, Serialize)] +#[derive(Debug, Default, bincode::Decode, bincode::Encode)] struct FileCacheData { lint: Option, formatted: bool, @@ -409,7 +409,7 @@ pub(crate) fn init(path: &Path) -> Result<()> { Ok(()) } -#[derive(Deserialize, Debug, Serialize, PartialEq)] +#[derive(bincode::Decode, Debug, bincode::Encode, PartialEq)] pub(crate) struct LintCacheData { /// Imports made. // pub(super) imports: ImportMap, @@ -422,6 +422,7 @@ pub(crate) struct LintCacheData { /// This will be empty if `messages` is empty. pub(super) source: String, /// Notebook index if this file is a Jupyter Notebook. + #[bincode(with_serde)] pub(super) notebook_index: Option, } @@ -467,18 +468,23 @@ impl LintCacheData { } /// On disk representation of a diagnostic message. -#[derive(Deserialize, Debug, Serialize, PartialEq)] +#[derive(bincode::Decode, Debug, bincode::Encode, PartialEq)] pub(super) struct CacheMessage { /// The rule for the cached diagnostic. + #[bincode(with_serde)] rule: Rule, /// The message body to display to the user, to explain the diagnostic. body: String, /// The message to display to the user, to explain the suggested fix. suggestion: Option, /// Range into the message's [`FileCache::source`]. + #[bincode(with_serde)] range: TextRange, + #[bincode(with_serde)] parent: Option, + #[bincode(with_serde)] fix: Option, + #[bincode(with_serde)] noqa_offset: TextSize, }