Repository: mozilla/cargo-vet
Pull request #371 (2023-01-13 21:32:14)

Filter diffs to allow ignoring certain generated files
This will be more important once we support git revisions, as we won't be able to generate these files for git revisions, leading to unnecessarily large diffs.

As we want to re-generate diffstats to use the new format, this also updates the diffstat version number, and takes the opportunity to change the format to a more flexible one. This unfortunately leads to large test output changes, including JSON output, making it a breaking change.


Patch:
diff --git a/src/errors.rs b/src/errors.rs
index e8ebb85..8942068 100644
--- a/src/errors.rs
+++ b/src/errors.rs
@@ -1,7 +1,7 @@
 use std::{
     ffi::OsString,
     fmt::{Debug, Display},
-    path::PathBuf,
+    path::{PathBuf, StripPrefixError},
     string::FromUtf8Error,
     sync::Arc,
 };
@@ -463,6 +463,10 @@ pub enum DiffError {
         #[source]
         CommandError,
     ),
+    #[error("Diff command produced an unexpected path")]
+    UnexpectedPath(#[source] StripPrefixError),
+    #[error("Diff command produced invalid output")]
+    InvalidOutput,
 }
 
 //////////////////////////////////////////////////////////
diff --git a/src/format.rs b/src/format.rs
index 069cd09..ea537fb 100644
--- a/src/format.rs
+++ b/src/format.rs
@@ -502,15 +502,15 @@ pub struct ImportsFile {
 #[derive(Serialize, Deserialize, Clone)]
 #[serde(tag = "version")]
 pub enum DiffCache {
-    #[serde(rename = "1")]
-    V1 {
+    #[serde(rename = "2")]
+    V2 {
         diffs: SortedMap<PackageName, SortedMap<Delta, DiffStat>>,
     },
 }
 
 impl Default for DiffCache {
     fn default() -> Self {
-        DiffCache::V1 {
+        DiffCache::V2 {
             diffs: SortedMap::new(),
         }
     }
@@ -518,8 +518,28 @@ impl Default for DiffCache {
 
 #[derive(Serialize, Deserialize, Debug, Clone)]
 pub struct DiffStat {
-    pub raw: String,
-    pub count: u64,
+    pub insertions: u64,
+    pub deletions: u64,
+    pub files_changed: u64,
+}
+
+impl DiffStat {
+    pub fn count(&self) -> u64 {
+        self.insertions + self.deletions
+    }
+}
+
+impl fmt::Display for DiffStat {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{} files changed", self.files_changed)?;
+        if self.insertions > 0 {
+            write!(f, ", {} insertions(+)", self.insertions)?;
+        }
+        if self.deletions > 0 {
+            write!(f, ", {} deletions(-)", self.deletions)?;
+        }
+        Ok(())
+    }
 }
 
 ////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main.rs b/src/main.rs
index f5974d0..3709006 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -26,11 +26,14 @@ use out::{progress_bar, IncProgressOnDrop};
 use reqwest::Url;
 use serde::de::Deserialize;
 use serialization::spanned::Spanned;
+use tempfile::NamedTempFile;
 use thiserror::Error;
 use tracing::{error, info, trace, warn};
 
 use crate::cli::*;
-use crate::errors::{CommandError, DownloadError, RegenerateExemptionsError, SourceFile};
+use crate::errors::{
+    CommandError, DownloadError, FetchAndDiffError, RegenerateExemptionsError, SourceFile,
+};
 use crate::format::{
     AuditEntry, AuditKind, AuditsFile, ConfigFile, CriteriaEntry, DependencyCriteria,
     ExemptedDependency, FetchCommand, ImportsFile, MetaConfig, MetaConfigInstance, PackageStr,
@@ -1404,7 +1407,7 @@ fn cmd_diff(out: &Arc<dyn Out>, cfg: &Config, sub_args: &DiffArgs) -> Result<(),
     let version2 = &sub_args.version2;
     let package = &*sub_args.package;
 
-    let (fetched1, fetched2) = {
+    let (fetched1, fetched2, filter_config) = {
         let network = Network::acquire(cfg);
         let store = Store::acquire(cfg, network.as_ref(), false)?;
         let cache = Cache::acquire(cfg)?;
@@ -1448,10 +1451,12 @@ fn cmd_diff(out: &Arc<dyn Out>, cfg: &Config, sub_args: &DiffArgs) -> Result<(),
             // that could be disorienting.
             let (pkgs, eulas) = tokio::join!(
                 async {
-                    tokio::try_join!(
+                    let (pkg1, pkg2) = tokio::try_join!(
                         cache.fetch_package(network.as_ref(), package, version1),
                         cache.fetch_package(network.as_ref(), package, version2)
-                    )
+                    )?;
+                    let (_, filter_config) = cache.diffstat_package(&pkg1, &pkg2).await?;
+                    Ok::<_, FetchAndDiffError>((pkg1, pkg2, filter_config))
                 },
                 prompt_criteria_eulas(
                     out,
@@ -1471,11 +1476,23 @@ fn cmd_diff(out: &Arc<dyn Out>, cfg: &Config, sub_args: &DiffArgs) -> Result<(),
 
     writeln!(out);
 
-    // FIXME: mask out .cargo_vcs_info.json
+    // Create a temporary orderfile with the computed values in order to skip
+    // diffs which we want to ignore using --skip-to.
+    let mut orderfile = NamedTempFile::new().into_diagnostic()?;
+    filter_config
+        .write_order_file(&mut orderfile)
+        .into_diagnostic()?;
 
     std::process::Command::new("git")
+        .arg("-c")
+        .arg("core.safecrlf=false")
         .arg("diff")
         .arg("--no-index")
+        .arg("--ignore-cr-at-eol")
+        .arg("-O")
+        .arg(orderfile.path())
+        .arg("--skip-to")
+        .arg(filter_config.skip_to())
         .arg(&fetched1)
         .arg(&fetched2)
         .status()
diff --git a/src/resolver.rs b/src/resolver.rs
index dfe6382..3984b9a 100644
--- a/src/resolver.rs
+++ b/src/resolver.rs
@@ -2688,7 +2688,7 @@ impl<'a> ResolveReport<'a> {
                         suggested_diff: diffstats
                             .into_iter()
                             .flatten()
-                            .min_by_key(|diff| diff.diffstat.count)?,
+                            .min_by_key(|diff| diff.diffstat.count())?,
                         suggested_criteria: audit_failure.criteria_failures.clone(),
                         notable_parents,
                     })
@@ -2700,12 +2700,12 @@ impl<'a> ResolveReport<'a> {
 
         let total_lines = suggestions
             .iter()
-            .map(|s| s.suggested_diff.diffstat.count)
+            .map(|s| s.suggested_diff.diffstat.count())
             .sum();
 
         suggestions.sort_by_key(|item| self.graph.nodes[item.package].version);
         suggestions.sort_by_key(|item| self.graph.nodes[item.package].name);
-        suggestions.sort_by_key(|item| item.suggested_diff.diffstat.count);
+        suggestions.sort_by_key(|item| item.suggested_diff.diffstat.count());
         suggestions.sort_by_key(|item| item.suggested_criteria.is_fully_unconfident());
 
         let mut suggestions_by_criteria = SortedMap::<CriteriaName, Vec<SuggestItem>>::new();
@@ -2994,8 +2994,8 @@ impl Suggest {
                     };
                     let parents = format!("(used by {})", item.notable_parents);
                     let diffstat = match &item.suggested_diff.from {
-                        Some(_) => format!("({})", item.suggested_diff.diffstat.raw.trim()),
-                        None => format!("({} lines)", item.suggested_diff.diffstat.count),
+                        Some(_) => format!("({})", item.suggested_diff.diffstat),
+                        None => format!("({} lines)", item.suggested_diff.diffstat.count()),
                     };
                     let style = if item.suggested_criteria.is_fully_unconfident() {
                         out.style().dim()
diff --git a/src/serialization.rs b/src/serialization.rs
index 2a41131..c94b5c3 100644
--- a/src/serialization.rs
+++ b/src/serialization.rs
@@ -152,7 +152,8 @@ pub mod string_or_vec_or_none {
     }
 }
 
-/// Allows the Vec<String> map value in dependency-criteria to support string_or_vec semantics.
+/// Allows the `Vec<String>` map value in dependency-criteria to support
+/// `string_or_vec` semantics.
 pub mod dependency_criteria {
     use crate::format::{CriteriaName, PackageName};
 
diff --git a/src/storage.rs b/src/storage.rs
index ee8ed9c..ca078a4 100644
--- a/src/storage.rs
+++ b/src/storage.rs
@@ -79,6 +79,9 @@ const AUDITS_TOML: &str = "audits.toml";
 const CONFIG_TOML: &str = "config.toml";
 const IMPORTS_LOCK: &str = "imports.lock";
 
+// Files which are skipped when counting changes for diffs.
+const DIFF_SKIP_PATHS: &[&str] = &["Cargo.lock", ".cargo_vcs_info.json", ".cargo-ok"];
+
 // FIXME: This is a completely arbitrary number, and may be too high or too low.
 const MAX_CONCURRENT_DIFFS: usize = 40;
 
@@ -431,8 +434,8 @@ impl Store {
         let valid_criteria = Arc::new(
             self.audits
                 .criteria
-                .iter()
-                .map(|(c, _)| &**c)
+                .keys()
+                .map(|c| &**c)
                 .chain([SAFE_TO_RUN, SAFE_TO_DEPLOY])
                 .map(|name| name.to_string())
                 .collect::<Vec<_>>(),
@@ -1043,6 +1046,39 @@ fn parse_imported_audit(valid_criteria: &[CriteriaName], value: toml::Value) ->
     Some(audit)
 }
 
+/// Helper type used to track information required to filter `git diff` output
+/// to match the filtering we do with diffstat.
+///
+/// This is done by using the `-O` (orderfile) and `--skip-to` arguments to `git
+/// diff` to place the paths we want to ignore first in the diff output, then
+/// specify `--skip-to` to skip past them.
+pub struct DiffFilterConfig {
+    paths: Vec<String>,
+    skip_to: Option<String>,
+}
+
+impl DiffFilterConfig {
+    /// Write out the contents of the orderfile which must be passed to the `-O`
+    /// flag for `git diff` to perform filtering.
+    pub fn write_order_file(&self, order_file: &mut impl io::Write) -> io::Result<()> {
+        for file in self.paths.iter().chain(&self.skip_to) {
+            order_file.write_all(file.as_bytes())?;
+        }
+        Ok(())
+    }
+
+    /// Get the path which should be passed to the `--skip-to` flag for `git
+    /// diff` to perform filtering.
+    pub fn skip_to(&self) -> &str {
+        // If we have no `skip_to`, it means that files were only removed, so
+        // skip to the first removed file.
+        match &self.skip_to {
+            Some(skip_to) => skip_to,
+            None => "/dev/null",
+        }
+    }
+}
+
 /// A Registry in CARGO_HOME (usually the crates.io one)
 pub struct CargoRegistry {
     /// The queryable index
@@ -1173,7 +1209,7 @@ impl Cache {
 
         let packages_src = root.join(CACHE_REGISTRY_SRC);
         fs::create_dir_all(&packages_src).map_err(|error| CacheAcquireError::Src {
-            target: empty.clone(),
+            target: packages_src.clone(),
             error,
         })?;
 
@@ -1347,7 +1383,7 @@ impl Cache {
                         network.download_and_persist(url, &fetched_package).await?;
 
                         let fetched_package_ = fetched_package.clone();
-                        tokio::task::spawn_blocking(move || File::open(&fetched_package_))
+                        tokio::task::spawn_blocking(move || File::open(fetched_package_))
                             .await
                             .expect("failed to join")
                             .map_err(|error| FetchError::OpenCached {
@@ -1388,11 +1424,11 @@ impl Cache {
     }
 
     #[tracing::instrument(skip_all, err)]
-    async fn diffstat_package(
+    pub async fn diffstat_package(
         &self,
         version1: &Path,
         version2: &Path,
-    ) -> Result<DiffStat, DiffError> {
+    ) -> Result<(DiffStat, DiffFilterConfig), DiffError> {
         let _permit = self
             .diff_semaphore
             .acquire()
@@ -1402,13 +1438,13 @@ impl Cache {
         // ERRORS: all of this is properly fallible internal workings, we can fail
         // to diffstat some packages and still produce some useful output
         trace!("diffstating {version1:#?} {version2:#?}");
-        // FIXME: mask out .cargo_vcs_info.json
-        // FIXME: look into libgit2 vs just calling git
 
         let out = tokio::process::Command::new("git")
             .arg("diff")
+            .arg("--ignore-cr-at-eol")
             .arg("--no-index")
-            .arg("--shortstat")
+            .arg("--numstat")
+            .arg("-z")
             .arg(version1)
             .arg(version2)
             .output()
@@ -1422,39 +1458,57 @@ impl Cache {
             return Err(CommandError::BadStatus(status).into());
         }
 
-        let diffstat = String::from_utf8(out.stdout).map_err(CommandError::BadOutput)?;
-
-        let count = if diffstat.is_empty() {
-            0
-        } else {
-            // 3 files changed, 9 insertions(+), 3 deletions(-)
-            let mut parts = diffstat.split(',');
-            parts.next().unwrap(); // Discard files
+        let mut diffstat = DiffStat {
+            files_changed: 0,
+            insertions: 0,
+            deletions: 0,
+        };
+        let mut filter_config = DiffFilterConfig {
+            paths: Vec::new(),
+            skip_to: None,
+        };
 
-            fn parse_diffnum(part: Option<&str>) -> Option<u64> {
-                part?.trim().split_once(' ')?.0.parse().ok()
+        // Thanks to the `-z` flag the output takes the rough format of:
+        // "{INSERTED}\t{DELETED}\t\0{FROM_PATH}\0{TO_PATH}\0" for each file
+        // being diffed. If the file was added or removed one of the sides will
+        // be "/dev/null", even on Windows. Binary files use "-" for the
+        // inserted & deleted counts.
+        let output = String::from_utf8(out.stdout).map_err(CommandError::BadOutput)?;
+        let mut chunks = output.split('\0');
+        while let (Some(changes_s), Some(_from_s), Some(to_s)) =
+            (chunks.next(), chunks.next(), chunks.next())
+        {
+            // Check if the 'to' path is one of the files which is ignored. We
+            // can only filter on 'to' paths, so don't bother checking 'from'.
+            if to_s != "/dev/null" {
+                let to_path = Path::new(to_s)
+                    .strip_prefix(version2)
+                    .map_err(DiffError::UnexpectedPath)?;
+                if DIFF_SKIP_PATHS.iter().any(|p| Path::new(p) == to_path) {
+                    filter_config.paths.push(to_s.to_owned());
+                    continue;
+                }
+                if filter_config.skip_to.is_none() {
+                    filter_config.skip_to = Some(to_s.to_owned());
+                }
             }
 
-            let added: u64 = parse_diffnum(parts.next()).unwrap_or(0);
-            let removed: u64 = parse_diffnum(parts.next()).unwrap_or(0);
-
-            // ERRORS: Arguably this should just be an error but it's more of a
-            // "have I completely misunderstood this format, if so let me know"
-            // panic, so the assert *is* what I want..?
-            assert_eq!(
-                parts.next(),
-                None,
-                "diffstat had more parts than expected? {}",
-                diffstat
-            );
-
-            added + removed
-        };
-
-        Ok(DiffStat {
-            raw: diffstat,
-            count,
-        })
+            diffstat.files_changed += 1;
+
+            match changes_s.trim().split_once('\t') {
+                Some(("-", "-")) => {} // binary diff
+                Some((insertions_s, deletions_s)) => {
+                    diffstat.insertions += insertions_s
+                        .parse::<u64>()
+                        .map_err(|_| DiffError::InvalidOutput)?;
+                    diffstat.deletions += deletions_s
+                        .parse::<u64>()
+                        .map_err(|_| DiffError::InvalidOutput)?;
+                }
+                None => Err(DiffError::InvalidOutput)?,
+            };
+        }
+        Ok((diffstat, filter_config))
     }
 
     #[tracing::instrument(skip(self, network), err)]
@@ -1475,7 +1529,7 @@ impl Cache {
             let mut guard = self.state.lock().unwrap();
 
             // Check if the value has already been cached.
-            let DiffCache::V1 { diffs } = &guard.diff_cache;
+            let DiffCache::V2 { diffs } = &guard.diff_cache;
             if let Some(cached) = diffs
                 .get(package)
                 .and_then(|cache| cache.get(delta))
@@ -1496,12 +1550,11 @@ impl Cache {
                 let to_len: u64 = delta.to.major * delta.to.major;
                 let diff = to_len as i64 - from_len as i64;
                 let count = diff.unsigned_abs();
-                let raw = if diff < 0 {
-                    format!("-{}", count)
-                } else {
-                    format!("+{}", count)
-                };
-                return Ok(DiffStat { raw, count });
+                return Ok(DiffStat {
+                    files_changed: 1,
+                    insertions: if diff > 0 { count } else { 0 },
+                    deletions: if diff < 0 { count } else { 0 },
+                });
             }
 
             guard
@@ -1520,12 +1573,12 @@ impl Cache {
                 let to = self.fetch_package(network, package, &delta.to).await?;
 
                 // Have fetches, do a real diffstat
-                let diffstat = self.diffstat_package(&from, &to).await?;
+                let (diffstat, _) = self.diffstat_package(&from, &to).await?;
 
                 // Record the cache result in the diffcache
                 {
                     let mut guard = self.state.lock().unwrap();
-                    let DiffCache::V1 { diffs } = &mut guard.diff_cache;
+                    let DiffCache::V2 { diffs } = &mut guard.diff_cache;
                     diffs
                         .entry(package.to_string())
                         .or_default()


Test patch:
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-complex-no-unaudited.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-complex-no-unaudited.json.snap
index 680fc5c..cc91350 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-complex-no-unaudited.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-complex-no-unaudited.json.snap
@@ -46,8 +46,9 @@ expression: json
           "from": null,
           "to": "5.0.0",
           "diffstat": {
-            "raw": "+25",
-            "count": 25
+            "insertions": 25,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -61,8 +62,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -76,8 +78,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -91,8 +94,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -109,8 +113,9 @@ expression: json
             "from": null,
             "to": "5.0.0",
             "diffstat": {
-              "raw": "+25",
-              "count": 25
+              "insertions": 25,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -124,8 +129,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -139,8 +145,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -154,8 +161,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-cycle-unaudited.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-cycle-unaudited.json.snap
index c8d7e87..6b20202 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-cycle-unaudited.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-cycle-unaudited.json.snap
@@ -32,8 +32,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -47,8 +48,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -65,8 +67,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
@@ -82,8 +85,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-dev-detection-empty-deeper.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-dev-detection-empty-deeper.json.snap
index a4e74ae..298c760 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-dev-detection-empty-deeper.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-dev-detection-empty-deeper.json.snap
@@ -60,8 +60,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -75,8 +76,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -90,8 +92,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -105,8 +108,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -120,8 +124,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -135,8 +140,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -153,8 +159,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -168,8 +175,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
@@ -185,8 +193,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -200,8 +209,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -215,8 +225,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -230,8 +241,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-dev-detection-empty.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-dev-detection-empty.json.snap
index fc83f0d..c631d15 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-dev-detection-empty.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-dev-detection-empty.json.snap
@@ -46,8 +46,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -61,8 +62,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -76,8 +78,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -91,8 +94,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -109,8 +113,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -124,8 +129,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
@@ -141,8 +147,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -156,8 +163,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-haunted-no-unaudited-deeper.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-haunted-no-unaudited-deeper.json.snap
index 45ad77e..dbb3283 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-haunted-no-unaudited-deeper.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-haunted-no-unaudited-deeper.json.snap
@@ -32,8 +32,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -47,8 +48,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -65,8 +67,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
@@ -82,8 +85,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-haunted-no-unaudited.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-haunted-no-unaudited.json.snap
index 45ad77e..dbb3283 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-haunted-no-unaudited.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-haunted-no-unaudited.json.snap
@@ -32,8 +32,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -47,8 +48,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -65,8 +67,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
@@ -82,8 +85,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-audit-as-default-root-no-audit.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-audit-as-default-root-no-audit.json.snap
index 4c7298e..d7210cf 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-audit-as-default-root-no-audit.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-audit-as-default-root-no-audit.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-audit-as-default-root-too-weak.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-audit-as-default-root-too-weak.json.snap
index 4c7298e..d7210cf 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-audit-as-default-root-too-weak.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-audit-as-default-root-too-weak.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-cycle.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-cycle.json.snap
index 71e5156..d2eb61e 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-cycle.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-cycle.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "7.0.0",
           "to": "8.0.0",
           "diffstat": {
-            "raw": "+15",
-            "count": 15
+            "insertions": 15,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "7.0.0",
             "to": "8.0.0",
             "diffstat": {
-              "raw": "+15",
-              "count": 15
+              "insertions": 15,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-cycle.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-cycle.snap
index 58cec54..82e2cd8 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-cycle.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-cycle.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-party1:10.0.0 missing ["safe-to-deploy"]
 
 recommended audits for safe-to-deploy:
-    cargo vet diff third-party1 7.0.0 8.0.0  (used by first-party)  (+15)
+    cargo vet diff third-party1 7.0.0 8.0.0  (used by first-party)  (1 files changed, 15 insertions(+))
 
 estimated audit backlog: 15 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-double-cycle.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-double-cycle.json.snap
index 5eba3d1..99f2832 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-double-cycle.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-double-cycle.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "4.0.0",
           "to": "5.0.0",
           "diffstat": {
-            "raw": "+9",
-            "count": 9
+            "insertions": 9,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "4.0.0",
             "to": "5.0.0",
             "diffstat": {
-              "raw": "+9",
-              "count": 9
+              "insertions": 9,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-double-cycle.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-double-cycle.snap
index 75c7950..e5986f5 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-double-cycle.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-delta-broken-double-cycle.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-party1:10.0.0 missing ["safe-to-deploy"]
 
 recommended audits for safe-to-deploy:
-    cargo vet diff third-party1 4.0.0 5.0.0  (used by first-party)  (+9)
+    cargo vet diff third-party1 4.0.0 5.0.0  (used by first-party)  (1 files changed, 9 insertions(+))
 
 estimated audit backlog: 9 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-deps-no-unaudited.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-deps-no-unaudited.json.snap
index c40005b..702c412 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-deps-no-unaudited.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-deps-no-unaudited.json.snap
@@ -60,8 +60,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -75,8 +76,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -90,8 +92,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -105,8 +108,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -120,8 +124,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -135,8 +140,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -153,8 +159,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -168,8 +175,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -183,8 +191,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -198,8 +207,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
@@ -215,8 +225,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -230,8 +241,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-no-unaudited.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-no-unaudited.json.snap
index b7745fd..b9dc567 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-no-unaudited.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-no-unaudited.json.snap
@@ -32,8 +32,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -47,8 +48,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -65,8 +67,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -80,8 +83,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-unaudited-nested-weaker-req-needs-dep-criteria.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-unaudited-nested-weaker-req-needs-dep-criteria.json.snap
index 039e35c..b01144e 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-unaudited-nested-weaker-req-needs-dep-criteria.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin-simple-unaudited-nested-weaker-req-needs-dep-criteria.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__builtin_simple_foreign_dep_criteria_fail.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__builtin_simple_foreign_dep_criteria_fail.json.snap
index a40e6e2..18dc4c2 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__builtin_simple_foreign_dep_criteria_fail.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__builtin_simple_foreign_dep_criteria_fail.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak-via-strong-delta.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak-via-strong-delta.json.snap
index 5679970..a9180f4 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak-via-strong-delta.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak-via-strong-delta.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "5.0.0",
           "diffstat": {
-            "raw": "+25",
-            "count": 25
+            "insertions": 25,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "5.0.0",
             "diffstat": {
-              "raw": "+25",
-              "count": 25
+              "insertions": 25,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak-via-weak-delta.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak-via-weak-delta.json.snap
index 0c9d734..881e796 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak-via-weak-delta.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak-via-weak-delta.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "5.0.0",
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+75",
-            "count": 75
+            "insertions": 75,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "5.0.0",
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+75",
-              "count": 75
+              "insertions": 75,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak-via-weak-delta.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak-via-weak-delta.snap
index 1b3b4d5..be99c89 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak-via-weak-delta.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak-via-weak-delta.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-core:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-core 5.0.0 10.0.0  (used by firstB, thirdA, thirdAB)  (+75)
+    cargo vet diff third-core 5.0.0 10.0.0  (used by firstB, thirdA, thirdAB)  (1 files changed, 75 insertions(+))
 
 estimated audit backlog: 75 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak.json.snap
index 0c9d734..881e796 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "5.0.0",
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+75",
-            "count": 75
+            "insertions": 75,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "5.0.0",
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+75",
-              "count": 75
+              "insertions": 75,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak.snap
index 1b3b4d5..be99c89 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-partially-too-weak.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-core:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-core 5.0.0 10.0.0  (used by firstB, thirdA, thirdAB)  (+75)
+    cargo vet diff third-core 5.0.0 10.0.0  (used by firstB, thirdA, thirdAB)  (1 files changed, 75 insertions(+))
 
 estimated audit backlog: 75 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-too-weak.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-too-weak.json.snap
index 0c9d734..881e796 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-too-weak.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-too-weak.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "5.0.0",
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+75",
-            "count": 75
+            "insertions": 75,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "5.0.0",
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+75",
-              "count": 75
+              "insertions": 75,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-too-weak.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-too-weak.snap
index 1b3b4d5..be99c89 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-too-weak.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-core10-too-weak.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-core:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-core 5.0.0 10.0.0  (used by firstB, thirdA, thirdAB)  (+75)
+    cargo vet diff third-core 5.0.0 10.0.0  (used by firstB, thirdA, thirdAB)  (1 files changed, 75 insertions(+))
 
 estimated audit backlog: 75 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-missing-core10.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-missing-core10.json.snap
index 0c9d734..881e796 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-missing-core10.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-missing-core10.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "5.0.0",
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+75",
-            "count": 75
+            "insertions": 75,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "5.0.0",
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+75",
-              "count": 75
+              "insertions": 75,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-missing-core10.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-missing-core10.snap
index 1b3b4d5..be99c89 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-missing-core10.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-missing-core10.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-core:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-core 5.0.0 10.0.0  (used by firstB, thirdA, thirdAB)  (+75)
+    cargo vet diff third-core 5.0.0 10.0.0  (used by firstB, thirdA, thirdAB)  (1 files changed, 75 insertions(+))
 
 estimated audit backlog: 75 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-missing-core5.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-missing-core5.json.snap
index 3e28940..c480117 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-missing-core5.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-missing-core5.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "5.0.0",
           "diffstat": {
-            "raw": "+25",
-            "count": 25
+            "insertions": 25,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "5.0.0",
             "diffstat": {
-              "raw": "+25",
-              "count": 25
+              "insertions": 25,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-no-unaudited.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-no-unaudited.json.snap
index 8fec5dd..e2d0dca 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-no-unaudited.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-complex-no-unaudited.json.snap
@@ -46,8 +46,9 @@ expression: json
           "from": null,
           "to": "5.0.0",
           "diffstat": {
-            "raw": "+25",
-            "count": 25
+            "insertions": 25,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -61,8 +62,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -76,8 +78,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -91,8 +94,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -109,8 +113,9 @@ expression: json
             "from": null,
             "to": "5.0.0",
             "diffstat": {
-              "raw": "+25",
-              "count": 25
+              "insertions": 25,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -124,8 +129,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -139,8 +145,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -154,8 +161,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-overshoot.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-overshoot.json.snap
index f58ac92..8b594ee 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-overshoot.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-overshoot.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "5.0.0",
           "to": "4.0.0",
           "diffstat": {
-            "raw": "-9",
-            "count": 9
+            "insertions": 0,
+            "deletions": 9,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "5.0.0",
             "to": "4.0.0",
             "diffstat": {
-              "raw": "-9",
-              "count": 9
+              "insertions": 0,
+              "deletions": 9,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-overshoot.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-overshoot.snap
index 235894b..6e5285b 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-overshoot.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-overshoot.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-party1:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-party1 5.0.0 4.0.0  (used by first-party)  (-9)
+    cargo vet diff third-party1 5.0.0 4.0.0  (used by first-party)  (1 files changed, 9 deletions(-))
 
 estimated audit backlog: 9 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-too-weak.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-too-weak.json.snap
index 984118c..864db30 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-too-weak.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-too-weak.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "5.0.0",
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+75",
-            "count": 75
+            "insertions": 75,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "5.0.0",
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+75",
-              "count": 75
+              "insertions": 75,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-too-weak.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-too-weak.snap
index 7f034a4..62da3c7 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-too-weak.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-too-weak.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-party1:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-party1 5.0.0 10.0.0  (used by first-party)  (+75)
+    cargo vet diff third-party1 5.0.0 10.0.0  (used by first-party)  (1 files changed, 75 insertions(+))
 
 estimated audit backlog: 75 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-undershoot.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-undershoot.json.snap
index abf06c6..43af8d4 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-undershoot.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-undershoot.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "5.0.0",
           "to": "7.0.0",
           "diffstat": {
-            "raw": "+24",
-            "count": 24
+            "insertions": 24,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "5.0.0",
             "to": "7.0.0",
             "diffstat": {
-              "raw": "+24",
-              "count": 24
+              "insertions": 24,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-undershoot.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-undershoot.snap
index dbb1866..3c86733 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-undershoot.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-full-audit-undershoot.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-party1:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-party1 5.0.0 7.0.0  (used by first-party)  (+24)
+    cargo vet diff third-party1 5.0.0 7.0.0  (used by first-party)  (1 files changed, 24 insertions(+))
 
 estimated audit backlog: 24 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-too-weak-full-audit.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-too-weak-full-audit.json.snap
index b0c0f3f..20ff1ef 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-too-weak-full-audit.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-too-weak-full-audit.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "5.0.0",
           "diffstat": {
-            "raw": "+25",
-            "count": 25
+            "insertions": 25,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "5.0.0",
             "diffstat": {
-              "raw": "+25",
-              "count": 25
+              "insertions": 25,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-overshoot.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-overshoot.json.snap
index f58ac92..8b594ee 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-overshoot.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-overshoot.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "5.0.0",
           "to": "4.0.0",
           "diffstat": {
-            "raw": "-9",
-            "count": 9
+            "insertions": 0,
+            "deletions": 9,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "5.0.0",
             "to": "4.0.0",
             "diffstat": {
-              "raw": "-9",
-              "count": 9
+              "insertions": 0,
+              "deletions": 9,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-overshoot.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-overshoot.snap
index 235894b..6e5285b 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-overshoot.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-overshoot.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-party1:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-party1 5.0.0 4.0.0  (used by first-party)  (-9)
+    cargo vet diff third-party1 5.0.0 4.0.0  (used by first-party)  (1 files changed, 9 deletions(-))
 
 estimated audit backlog: 9 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-too-weak.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-too-weak.json.snap
index 984118c..864db30 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-too-weak.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-too-weak.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "5.0.0",
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+75",
-            "count": 75
+            "insertions": 75,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "5.0.0",
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+75",
-              "count": 75
+              "insertions": 75,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-too-weak.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-too-weak.snap
index 7f034a4..62da3c7 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-too-weak.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-too-weak.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-party1:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-party1 5.0.0 10.0.0  (used by first-party)  (+75)
+    cargo vet diff third-party1 5.0.0 10.0.0  (used by first-party)  (1 files changed, 75 insertions(+))
 
 estimated audit backlog: 75 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-undershoot.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-undershoot.json.snap
index abf06c6..43af8d4 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-undershoot.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-undershoot.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "5.0.0",
           "to": "7.0.0",
           "diffstat": {
-            "raw": "+24",
-            "count": 24
+            "insertions": 24,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "5.0.0",
             "to": "7.0.0",
             "diffstat": {
-              "raw": "+24",
-              "count": 24
+              "insertions": 24,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-undershoot.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-undershoot.snap
index dbb1866..3c86733 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-undershoot.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-delta-to-unaudited-undershoot.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-party1:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-party1 5.0.0 7.0.0  (used by first-party)  (+24)
+    cargo vet diff third-party1 5.0.0 7.0.0  (used by first-party)  (1 files changed, 24 insertions(+))
 
 estimated audit backlog: 24 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-and-lower-version-review.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-and-lower-version-review.json.snap
index 539249b..b7919e8 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-and-lower-version-review.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-and-lower-version-review.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "9.0.0",
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+19",
-            "count": 19
+            "insertions": 19,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "9.0.0",
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+19",
-              "count": 19
+              "insertions": 19,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-and-lower-version-review.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-and-lower-version-review.snap
index 0dbea35..90aa49f 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-and-lower-version-review.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-and-lower-version-review.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-party1:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-party1 9.0.0 10.0.0  (used by first-party)  (+19)
+    cargo vet diff third-party1 9.0.0 10.0.0  (used by first-party)  (1 files changed, 19 insertions(+))
 
 estimated audit backlog: 19 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-version-review.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-version-review.json.snap
index 2029c04..4c04f6d 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-version-review.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-version-review.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "11.0.0",
           "to": "10.0.0",
           "diffstat": {
-            "raw": "-21",
-            "count": 21
+            "insertions": 0,
+            "deletions": 21,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "11.0.0",
             "to": "10.0.0",
             "diffstat": {
-              "raw": "-21",
-              "count": 21
+              "insertions": 0,
+              "deletions": 21,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-version-review.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-version-review.snap
index 7418459..cce36d2 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-version-review.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-higher-version-review.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-party1:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-party1 11.0.0 10.0.0  (used by first-party)  (-21)
+    cargo vet diff third-party1 11.0.0 10.0.0  (used by first-party)  (1 files changed, 21 deletions(-))
 
 estimated audit backlog: 21 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-lower-version-review.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-lower-version-review.json.snap
index 539249b..b7919e8 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-lower-version-review.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-lower-version-review.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "9.0.0",
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+19",
-            "count": 19
+            "insertions": 19,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "9.0.0",
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+19",
-              "count": 19
+              "insertions": 19,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-lower-version-review.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-lower-version-review.snap
index 0dbea35..90aa49f 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-lower-version-review.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-lower-version-review.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-party1:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-party1 9.0.0 10.0.0  (used by first-party)  (+19)
+    cargo vet diff third-party1 9.0.0 10.0.0  (used by first-party)  (1 files changed, 19 insertions(+))
 
 estimated audit backlog: 19 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-direct-internal.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-direct-internal.json.snap
index 8617ea3..f999ff2 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-direct-internal.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-direct-internal.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-direct-leaf.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-direct-leaf.json.snap
index 50ecccf..683c732 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-direct-leaf.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-direct-leaf.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-leaves.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-leaves.json.snap
index da910c0..b812b0e 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-leaves.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-leaves.json.snap
@@ -32,8 +32,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -47,8 +48,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -65,8 +67,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -80,8 +83,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-transitive.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-transitive.json.snap
index c23d69c..6c6255b 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-transitive.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-missing-transitive.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-needed-reversed-delta-to-unaudited.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-needed-reversed-delta-to-unaudited.json.snap
index 8617ea3..f999ff2 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-needed-reversed-delta-to-unaudited.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-needed-reversed-delta-to-unaudited.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-no-unaudited.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-no-unaudited.json.snap
index fbd3c6b..6b2249f 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-no-unaudited.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-no-unaudited.json.snap
@@ -32,8 +32,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -47,8 +48,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -65,8 +67,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -80,8 +83,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-reviewed-too-weakly.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-reviewed-too-weakly.json.snap
index c23d69c..6c6255b 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-reviewed-too-weakly.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-reviewed-too-weakly.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-full-audit.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-full-audit.json.snap
index 984118c..864db30 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-full-audit.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-full-audit.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "5.0.0",
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+75",
-            "count": 75
+            "insertions": 75,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "5.0.0",
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+75",
-              "count": 75
+              "insertions": 75,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-full-audit.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-full-audit.snap
index 7f034a4..62da3c7 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-full-audit.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-full-audit.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-party1:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-party1 5.0.0 10.0.0  (used by first-party)  (+75)
+    cargo vet diff third-party1 5.0.0 10.0.0  (used by first-party)  (1 files changed, 75 insertions(+))
 
 estimated audit backlog: 75 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-unaudited.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-unaudited.json.snap
index 984118c..864db30 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-unaudited.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-unaudited.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": "5.0.0",
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+75",
-            "count": 75
+            "insertions": 75,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": "5.0.0",
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+75",
-              "count": 75
+              "insertions": 75,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-unaudited.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-unaudited.snap
index 7f034a4..62da3c7 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-unaudited.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock-simple-wrongly-reversed-delta-to-unaudited.snap
@@ -1,6 +1,6 @@
 ---
 source: src/tests/vet.rs
-expression: output
+expression: human
 ---
 Vetting Failed!
 
@@ -8,7 +8,7 @@ Vetting Failed!
   third-party1:10.0.0 missing ["reviewed"]
 
 recommended audits for reviewed:
-    cargo vet diff third-party1 5.0.0 10.0.0  (used by first-party)  (+75)
+    cargo vet diff third-party1 5.0.0 10.0.0  (used by first-party)  (1 files changed, 75 insertions(+))
 
 estimated audit backlog: 75 lines
 
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock_simple_foreign_audited_pun_no_mapping.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock_simple_foreign_audited_pun_no_mapping.json.snap
index fbd3c6b..6b2249f 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock_simple_foreign_audited_pun_no_mapping.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock_simple_foreign_audited_pun_no_mapping.json.snap
@@ -32,8 +32,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -47,8 +48,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -65,8 +67,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -80,8 +83,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__mock_simple_foreign_audited_pun_wrong_mapped.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__mock_simple_foreign_audited_pun_wrong_mapped.json.snap
index fbd3c6b..6b2249f 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__mock_simple_foreign_audited_pun_wrong_mapped.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__mock_simple_foreign_audited_pun_wrong_mapped.json.snap
@@ -32,8 +32,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -47,8 +48,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -65,8 +67,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -80,8 +83,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-dep-extra-missing.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-dep-extra-missing.json.snap
index 86e5520..bfdecbb 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-dep-extra-missing.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-dep-extra-missing.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-dep-too-strong.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-dep-too-strong.json.snap
index 302e61e..c6fdf07 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-dep-too-strong.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-dep-too-strong.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-extra-partially-missing.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-extra-partially-missing.json.snap
index 65a64b1..209d146 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-extra-partially-missing.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-extra-partially-missing.json.snap
@@ -25,8 +25,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -43,8 +44,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-too-strong.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-too-strong.json.snap
index 72b1201..a5650b4 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-too-strong.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-first-too-strong.json.snap
@@ -32,8 +32,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -47,8 +48,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -65,8 +67,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -80,8 +83,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-root-dep-too-strong.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-root-dep-too-strong.json.snap
index 72b1201..a5650b4 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-root-dep-too-strong.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-root-dep-too-strong.json.snap
@@ -32,8 +32,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -47,8 +48,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -65,8 +67,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -80,8 +83,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-root-too-strong.json.snap b/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-root-too-strong.json.snap
index 72b1201..a5650b4 100644
--- a/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-root-too-strong.json.snap
+++ b/src/tests/snapshots/cargo_vet__tests__vet__simple-policy-root-too-strong.json.snap
@@ -32,8 +32,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       },
@@ -47,8 +48,9 @@ expression: json
           "from": null,
           "to": "10.0.0",
           "diffstat": {
-            "raw": "+100",
-            "count": 100
+            "insertions": 100,
+            "deletions": 0,
+            "files_changed": 1
           }
         }
       }
@@ -65,8 +67,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         },
@@ -80,8 +83,9 @@ expression: json
             "from": null,
             "to": "10.0.0",
             "diffstat": {
-              "raw": "+100",
-              "count": 100
+              "insertions": 100,
+              "deletions": 0,
+              "files_changed": 1
             }
           }
         }
diff --git a/tests/diff-cache.toml b/tests/diff-cache.toml
index 4a51564..a9b462d 100644
--- a/tests/diff-cache.toml
+++ b/tests/diff-cache.toml
@@ -1,1759 +1,496 @@
-version = "1"
-
-[diffs.alsa."0.4.3"]
-raw = """
- 23 files changed, 12197 insertions(+)
-"""
-count = 12197
-
-[diffs.anyhow."1.0.52"]
-raw = """
- 49 files changed, 6219 insertions(+)
-"""
-count = 6219
-
-[diffs.app_units."0.7.1"]
-raw = """
- 8 files changed, 507 insertions(+)
-"""
-count = 507
-
-[diffs.arbitrary."1.0.3"]
-raw = """
- 19 files changed, 3159 insertions(+)
-"""
-count = 3159
-
-[diffs.arrayref."0.3.6"]
-raw = """
- 13 files changed, 986 insertions(+)
-"""
-count = 986
-
-[diffs.arrayvec."0.5.2"]
-raw = """
- 22 files changed, 3776 insertions(+)
-"""
-count = 3776
-
-[diffs.arrayvec."0.7.2"]
-raw = """
- 22 files changed, 3998 insertions(+)
-"""
-count = 3998
-
-[diffs.ash."0.37.0+1.3.209"]
-raw = """
- 91 files changed, 112995 insertions(+)
-"""
-count = 112995
-
-[diffs.async-trait."0.1.52"]
-raw = """
- 42 files changed, 3626 insertions(+)
-"""
-count = 3626
-
-[diffs.atomic_refcell."0.1.8"]
-raw = """
- 9 files changed, 720 insertions(+)
-"""
-count = 720
-
-[diffs.atty."0.2.14"]
-raw = """
- 12 files changed, 508 insertions(+)
-"""
-count = 508
-
-[diffs.audio_thread_priority."0.26.1"]
-raw = """
- 17 files changed, 2069 insertions(+)
-"""
-count = 2069
-
-[diffs.authenticator."0.3.1"]
-raw = """
- 86 files changed, 10263 insertions(+)
-"""
-count = 10263
-
-[diffs.base64."0.10.1"]
-raw = """
- 27 files changed, 5450 insertions(+)
-"""
-count = 5450
-
-[diffs.base64."0.12.3"]
-raw = """
- 31 files changed, 7929 insertions(+)
-"""
-count = 7929
-
-[diffs.bincode."1.3.3"]
-raw = """
- 24 files changed, 5153 insertions(+)
-"""
-count = 5153
-
-[diffs.bindgen."0.56.0"]
-raw = """
- 56 files changed, 27831 insertions(+)
-"""
-count = 27831
-
-[diffs.bit-set."0.5.2"]
-raw = """
- 11 files changed, 1786 insertions(+)
-"""
-count = 1786
-
-[diffs.bitflags."1.3.2"]
-raw = """
- 39 files changed, 3004 insertions(+)
-"""
-count = 3004
-
-[diffs.bitflags_serde_shim."0.2.2"]
-raw = """
- 4 files changed, 174 insertions(+)
-"""
-count = 174
-
-[diffs.bitreader."0.3.5"]
-raw = """
- 11 files changed, 1106 insertions(+)
-"""
-count = 1106
-
-[diffs.block."0.1.6"]
-raw = """
- 5 files changed, 493 insertions(+)
-"""
-count = 493
-
-[diffs.build-parallel."0.1.2"]
-raw = """
- 6 files changed, 284 insertions(+)
-"""
-count = 284
+version = "2"
 
 [diffs.bumpalo."3.9.1"]
-raw = """
- 19 files changed, 10106 insertions(+)
-"""
-count = 10106
-
-[diffs.byteorder."1.4.3"]
-raw = """
- 15 files changed, 6460 insertions(+)
-"""
-count = 6460
-
-[diffs.bytes."0.5.6"]
-raw = """
- 44 files changed, 8795 insertions(+)
-"""
-count = 8795
+insertions = 10099
+deletions = 0
+files_changed = 17
 
 [diffs.bytes."1.1.0"]
-raw = """
- 45 files changed, 9213 insertions(+)
-"""
-count = 9213
-
-[diffs.cc."1.0.72"]
-raw = """
- 22 files changed, 6650 insertions(+)
-"""
-count = 6650
+insertions = 9207
+deletions = 0
+files_changed = 43
 
 [diffs.cc."1.0.73"]
-raw = """
- 22 files changed, 6671 insertions(+)
-"""
-count = 6671
-
-[diffs.cfg-if."0.1.10"]
-raw = """
- 11 files changed, 585 insertions(+)
-"""
-count = 585
+insertions = 6554
+deletions = 0
+files_changed = 19
 
 [diffs.cfg-if."1.0.0"]
-raw = """
- 11 files changed, 588 insertions(+)
-"""
-count = 588
-
-[diffs.cfg_aliases."0.1.1"]
-raw = """
- 9 files changed, 572 insertions(+)
-"""
-count = 572
-
-[diffs.chrono."0.4.19"]
-raw = """
- 43 files changed, 21364 insertions(+)
-"""
-count = 21364
-
-[diffs.clap."3.0.10"]
-raw = """
- 112 files changed, 30563 insertions(+)
-"""
-count = 30563
-
-[diffs.codespan-reporting."0.11.1"]
-raw = """
- 112 files changed, 7370 insertions(+)
-"""
-count = 7370
-
-[diffs.comedy."0.2.0"]
-raw = """
- 11 files changed, 1258 insertions(+)
-"""
-count = 1258
-
-[diffs.cookie."0.12.0"]
-raw = """
- 20 files changed, 3581 insertions(+)
-"""
-count = 3581
-
-[diffs.copyless."0.1.5"]
-raw = """
- 15 files changed, 498 insertions(+)
-"""
-count = 498
-
-[diffs.core-foundation."0.9.2"]
-raw = """
- 28 files changed, 3950 insertions(+)
-"""
-count = 3950
+insertions = 582
+deletions = 0
+files_changed = 9
 
 [diffs.core-foundation."0.9.3"]
-raw = """
- 28 files changed, 3960 insertions(+)
-"""
-count = 3960
+insertions = 3953
+deletions = 0
+files_changed = 26
 
 [diffs.core-foundation-sys."0.8.3"]
-raw = """
- 28 files changed, 1971 insertions(+)
-"""
-count = 1971
-
-[diffs.core-graphics."0.22.3"]
-raw = """
- 27 files changed, 3893 insertions(+)
-"""
-count = 3893
-
-[diffs.core-graphics-types."0.1.1"]
-raw = """
- 7 files changed, 297 insertions(+)
-"""
-count = 297
-
-[diffs.core-text."19.2.0"]
-raw = """
- 20 files changed, 2175 insertions(+)
-"""
-count = 2175
-
-[diffs.coremidi-sys."3.0.1"]
-raw = """
- 12 files changed, 1144 insertions(+)
-"""
-count = 1144
-
-[diffs.cose-c."0.1.5"]
-raw = """
- 7 files changed, 541 insertions(+)
-"""
-count = 541
-
-[diffs.cranelift-codegen."0.74.0"]
-raw = """
- 197 files changed, 122486 insertions(+)
-"""
-count = 122486
-
-[diffs.cranelift-wasm."0.74.0"]
-raw = """
- 72 files changed, 75262 insertions(+)
-"""
-count = 75262
-
-[diffs.crossbeam-channel."0.5.4"]
-raw = """
- 44 files changed, 20248 insertions(+)
-"""
-count = 20248
-
-[diffs.cssparser."0.29.2"]
-raw = """
- 26 files changed, 7500 insertions(+)
-"""
-count = 7500
-
-[diffs.cstr."0.2.9"]
-raw = """
- 25 files changed, 605 insertions(+)
-"""
-count = 605
-
-[diffs.darling."0.13.1"]
-raw = """
- 39 files changed, 2356 insertions(+)
-"""
-count = 2356
-
-[diffs.derive_more."0.99.11"]
-raw = """
- 67 files changed, 10748 insertions(+)
-"""
-count = 10748
-
-[diffs.dirs."2.0.2"]
-raw = """
- 15 files changed, 888 insertions(+)
-"""
-count = 888
-
-[diffs.dns-parser."0.8.0"]
-raw = """
- 44 files changed, 3006 insertions(+)
-"""
-count = 3006
-
-[diffs.dogear."0.4.0"]
-raw = """
- 16 files changed, 8372 insertions(+)
-"""
-count = 8372
-
-[diffs.dwrote."0.11.0"]
-raw = """
- 28 files changed, 3177 insertions(+)
-"""
-count = 3177
-
-[diffs.encoding_c."0.9.8"]
-raw = """
- 16 files changed, 3963 insertions(+)
-"""
-count = 3963
-
-[diffs.encoding_c_mem."0.2.6"]
-raw = """
- 14 files changed, 2495 insertions(+)
-"""
-count = 2495
-
-[diffs.encoding_rs."0.8.22"]
-raw = """
- 102 files changed, 506887 insertions(+)
-"""
-count = 506887
+insertions = 1965
+deletions = 0
+files_changed = 26
 
 [diffs.encoding_rs."0.8.31"]
-raw = """
- 104 files changed, 507252 insertions(+)
-"""
-count = 507252
-
-[diffs.enumset."1.0.8"]
-raw = """
- 16 files changed, 1979 insertions(+)
-"""
-count = 1979
-
-[diffs.env_logger."0.8.4"]
-raw = """
- 26 files changed, 4661 insertions(+)
-"""
-count = 4661
-
-[diffs.etagere."0.2.6"]
-raw = """
- 10 files changed, 2347 insertions(+)
-"""
-count = 2347
-
-[diffs.euclid."0.22.6"]
-raw = """
- 32 files changed, 16357 insertions(+)
-"""
-count = 16357
-
-[diffs.fallible_collections."0.4.2"]
-raw = """
- 21 files changed, 7560 insertions(+)
-"""
-count = 7560
+insertions = 507245
+deletions = 0
+files_changed = 102
 
 [diffs.fastrand."1.7.0"]
-raw = """
- 12 files changed, 1375 insertions(+)
-"""
-count = 1375
-
-[diffs.ffi-support."0.4.4"]
-raw = """
- 18 files changed, 3952 insertions(+)
-"""
-count = 3952
-
-[diffs.filetime_win."0.2.0"]
-raw = """
- 8 files changed, 564 insertions(+)
-"""
-count = 564
-
-[diffs.fluent."0.16.0"]
-raw = """
- 8 files changed, 519 insertions(+)
-"""
-count = 519
-
-[diffs.fluent-bundle."0.15.2"]
-raw = """
- 29 files changed, 4238 insertions(+)
-"""
-count = 4238
-
-[diffs.fluent-fallback."0.6.0"]
-raw = """
- 29 files changed, 3102 insertions(+)
-"""
-count = 3102
-
-[diffs.fluent-langneg."0.13.0"]
-raw = """
- 11 files changed, 1329 insertions(+)
-"""
-count = 1329
-
-[diffs.fluent-pseudo."0.3.1"]
-raw = """
- 8 files changed, 464 insertions(+)
-"""
-count = 464
+insertions = 1368
+deletions = 0
+files_changed = 10
 
 [diffs.fnv."1.0.7"]
-raw = """
- 10 files changed, 736 insertions(+)
-"""
-count = 736
+insertions = 730
+deletions = 0
+files_changed = 8
 
 [diffs.foreign-types."0.3.2"]
-raw = """
- 7 files changed, 584 insertions(+)
-"""
-count = 584
+insertions = 583
+deletions = 0
+files_changed = 6
 
 [diffs.foreign-types-shared."0.1.1"]
-raw = """
- 6 files changed, 303 insertions(+)
-"""
-count = 303
+insertions = 302
+deletions = 0
+files_changed = 5
 
 [diffs.form_urlencoded."1.0.1"]
-raw = """
- 7 files changed, 695 insertions(+)
-"""
-count = 695
-
-[diffs.freetype."0.7.0"]
-raw = """
- 17 files changed, 3042 insertions(+)
-"""
-count = 3042
-
-[diffs.fuchsia-zircon."0.3.3"]
-raw = """
- 26 files changed, 2871 insertions(+)
-"""
-count = 2871
-
-[diffs.fuchsia-zircon-sys."0.3.3"]
-raw = """
- 7 files changed, 1427 insertions(+)
-"""
-count = 1427
-
-[diffs.futures."0.3.19"]
-raw = """
- 65 files changed, 8382 insertions(+)
-"""
-count = 8382
-
-[diffs.futures-channel."0.3.19"]
-raw = """
- 20 files changed, 3958 insertions(+)
-"""
-count = 3958
+insertions = 689
+deletions = 0
+files_changed = 5
 
 [diffs.futures-channel."0.3.21"]
-raw = """
- 20 files changed, 3999 insertions(+)
-"""
-count = 3999
+insertions = 3992
+deletions = 0
+files_changed = 18
 
 [diffs.futures-core."0.3.21"]
-raw = """
- 16 files changed, 1182 insertions(+)
-"""
-count = 1182
+insertions = 1175
+deletions = 0
+files_changed = 14
 
 [diffs.futures-sink."0.3.21"]
-raw = """
- 8 files changed, 551 insertions(+)
-"""
-count = 551
-
-[diffs.futures-task."0.3.19"]
-raw = """
- 16 files changed, 1188 insertions(+)
-"""
-count = 1188
+insertions = 544
+deletions = 0
+files_changed = 6
 
 [diffs.futures-task."0.3.21"]
-raw = """
- 16 files changed, 1187 insertions(+)
-"""
-count = 1187
+insertions = 1180
+deletions = 0
+files_changed = 14
 
 [diffs.futures-util."0.3.21"]
-raw = """
- 187 files changed, 25074 insertions(+)
-"""
-count = 25074
-
-[diffs.fxhash."0.2.1"]
-raw = """
- 7 files changed, 539 insertions(+)
-"""
-count = 539
-
-[diffs.gleam."0.13.1"]
-raw = """
- 16 files changed, 5765 insertions(+)
-"""
-count = 5765
-
-[diffs.glean."44.0.0"]
-raw = """
- 48 files changed, 7386 insertions(+)
-"""
-count = 7386
-
-[diffs.glean-ffi."44.0.0"]
-raw = """
- 33 files changed, 4131 insertions(+)
-"""
-count = 4131
-
-[diffs.glow."0.11.2"]
-raw = """
- 18 files changed, 47092 insertions(+)
-"""
-count = 47092
-
-[diffs.glsl."4.1.1"]
-raw = """
- 22 files changed, 10218 insertions(+)
-"""
-count = 10218
-
-[diffs.glslopt."0.1.9"]
-raw = """
- 309 files changed, 184134 insertions(+)
-"""
-count = 184134
-
-[diffs.goblin."0.1.3"]
-raw = """
- 61 files changed, 17285 insertions(+)
-"""
-count = 17285
-
-[diffs.gpu-alloc."0.5.2"]
-raw = """
- 15 files changed, 2557 insertions(+)
-"""
-count = 2557
-
-[diffs.gpu-descriptor."0.2.1"]
-raw = """
- 6 files changed, 708 insertions(+)
-"""
-count = 708
-
-[diffs.guid_win."0.2.0"]
-raw = """
- 8 files changed, 481 insertions(+)
-"""
-count = 481
+insertions = 25067
+deletions = 0
+files_changed = 185
 
 [diffs.h2."0.3.13"]
-raw = """
- 66 files changed, 26066 insertions(+)
-"""
-count = 26066
+insertions = 25417
+deletions = 0
+files_changed = 63
 
 [diffs.hashbrown."0.11.2"]
-raw = """
- 33 files changed, 14609 insertions(+)
-"""
-count = 14609
+insertions = 14603
+deletions = 0
+files_changed = 31
 
 [diffs.hermit-abi."0.1.19"]
-raw = """
- 11 files changed, 938 insertions(+)
-"""
-count = 938
-
-[diffs.hexf-parse."0.2.1"]
-raw = """
- 5 files changed, 572 insertions(+)
-"""
-count = 572
-
-[diffs.http."0.2.5"]
-raw = """
- 41 files changed, 16823 insertions(+)
-"""
-count = 16823
+insertions = 932
+deletions = 0
+files_changed = 9
 
 [diffs.http."0.2.6"]
-raw = """
- 41 files changed, 16826 insertions(+)
-"""
-count = 16826
+insertions = 16819
+deletions = 0
+files_changed = 39
 
 [diffs.http-body."0.4.4"]
-raw = """
- 19 files changed, 1262 insertions(+)
-"""
-count = 1262
+insertions = 1256
+deletions = 0
+files_changed = 17
 
 [diffs.httparse."1.7.0"]
-raw = """
- 20 files changed, 7265 insertions(+)
-"""
-count = 7265
+insertions = 7258
+deletions = 0
+files_changed = 18
 
 [diffs.httpdate."1.0.2"]
-raw = """
- 12 files changed, 1001 insertions(+)
-"""
-count = 1001
-
-[diffs.hyper."0.13.6"]
-raw = """
- 59 files changed, 19743 insertions(+)
-"""
-count = 19743
+insertions = 995
+deletions = 0
+files_changed = 10
 
 [diffs.hyper."0.14.18"]
-raw = """
- 72 files changed, 25617 insertions(+)
-"""
-count = 25617
+insertions = 24841
+deletions = 0
+files_changed = 69
 
 [diffs.hyper-tls."0.5.0"]
-raw = """
- 14 files changed, 1301 insertions(+)
-"""
-count = 1301
+insertions = 673
+deletions = 0
+files_changed = 11
 
 [diffs.idna."0.2.3"]
-raw = """
- 19 files changed, 32538 insertions(+)
-"""
-count = 32538
-
-[diffs.indexmap."1.6.2"]
-raw = """
- 31 files changed, 8568 insertions(+)
-"""
-count = 8568
+insertions = 32532
+deletions = 0
+files_changed = 17
 
 [diffs.indexmap."1.8.1"]
-raw = """
- 33 files changed, 9452 insertions(+)
-"""
-count = 9452
-
-[diffs.inherent."0.1.6"]
-raw = """
- 24 files changed, 924 insertions(+)
-"""
-count = 924
-
-[diffs.inplace_it."0.3.3"]
-raw = """
- 26 files changed, 1269 insertions(+)
-"""
-count = 1269
+insertions = 9445
+deletions = 0
+files_changed = 31
 
 [diffs.instant."0.1.12"]
-raw = """
- 14 files changed, 678 insertions(+)
-"""
-count = 678
-
-[diffs.intl-memoizer."0.5.1"]
-raw = """
- 10 files changed, 608 insertions(+)
-"""
-count = 608
-
-[diffs.iovec."0.1.4"]
-raw = """
- 18 files changed, 804 insertions(+)
-"""
-count = 804
+insertions = 672
+deletions = 0
+files_changed = 12
 
 [diffs.ipnet."2.4.0"]
-raw = """
- 15 files changed, 3980 insertions(+)
-"""
-count = 3980
-
-[diffs.itertools."0.8.2"]
-raw = """
- 66 files changed, 13607 insertions(+)
-"""
-count = 13607
-
-[diffs.itoa."0.4.8"]
-raw = """
- 15 files changed, 964 insertions(+)
-"""
-count = 964
+insertions = 3973
+deletions = 0
+files_changed = 13
 
 [diffs.itoa."1.0.1"]
-raw = """
- 15 files changed, 796 insertions(+)
-"""
-count = 796
+insertions = 789
+deletions = 0
+files_changed = 13
 
 [diffs.js-sys."0.3.57"]
-raw = """
- 63 files changed, 12875 insertions(+)
-"""
-count = 12875
-
-[diffs.khronos-egl."4.1.0"]
-raw = """
- 19 files changed, 4036 insertions(+)
-"""
-count = 4036
+insertions = 12874
+deletions = 0
+files_changed = 62
 
 [diffs.lazy_static."1.4.0"]
-raw = """
- 13 files changed, 882 insertions(+)
-"""
-count = 882
-
-[diffs.libc."0.2.112"]
-raw = """
- 205 files changed, 91329 insertions(+)
-"""
-count = 91329
+insertions = 876
+deletions = 0
+files_changed = 11
 
 [diffs.libc."0.2.123"]
-raw = """
- 217 files changed, 94067 insertions(+)
-"""
-count = 94067
-
-[diffs.libloading."0.5.2"]
-raw = """
- 23 files changed, 1679 insertions(+)
-"""
-count = 1679
-
-[diffs.libloading."0.7.2"]
-raw = """
- 25 files changed, 2835 insertions(+)
-"""
-count = 2835
-
-[diffs.lmdb-rkv-sys."0.11.2"]
-raw = """
- 43 files changed, 18970 insertions(+)
-"""
-count = 18970
-
-[diffs.log."0.4.14"]
-raw = """
- 21 files changed, 4965 insertions(+)
-"""
-count = 4965
+insertions = 94060
+deletions = 0
+files_changed = 215
 
 [diffs.log."0.4.16"]
-raw = """
- 21 files changed, 5632 insertions(+)
-"""
-count = 5632
-
-[diffs.malloc_size_of_derive."0.1.2"]
-raw = """
- 8 files changed, 426 insertions(+)
-"""
-count = 426
+insertions = 5625
+deletions = 0
+files_changed = 19
 
 [diffs.matches."0.1.9"]
-raw = """
- 7 files changed, 211 insertions(+)
-"""
-count = 211
-
-[diffs.memalloc."0.1.0"]
-raw = """
- 6 files changed, 233 insertions(+)
-"""
-count = 233
+insertions = 210
+deletions = 0
+files_changed = 6
 
 [diffs.memchr."2.4.1"]
-raw = """
- 48 files changed, 8718 insertions(+)
-"""
-count = 8718
-
-[diffs.memmap2."0.2.3"]
-raw = """
- 16 files changed, 2571 insertions(+)
-"""
-count = 2571
-
-[diffs.memmap2."0.3.1"]
-raw = """
- 16 files changed, 2748 insertions(+)
-"""
-count = 2748
-
-[diffs.memoffset."0.5.6"]
-raw = """
- 14 files changed, 889 insertions(+)
-"""
-count = 889
+insertions = 8712
+deletions = 0
+files_changed = 46
 
 [diffs.mime."0.3.16"]
-raw = """
- 15 files changed, 1721 insertions(+)
-"""
-count = 1721
+insertions = 1715
+deletions = 0
+files_changed = 13
 
 [diffs.mio."0.8.2"]
-raw = """
- 65 files changed, 11882 insertions(+)
-"""
-count = 11882
-
-[diffs.mio-extras."2.0.6"]
-raw = """
- 15 files changed, 2311 insertions(+)
-"""
-count = 2311
+insertions = 11719
+deletions = 0
+files_changed = 62
 
 [diffs.miow."0.3.7"]
-raw = """
- 16 files changed, 3135 insertions(+)
-"""
-count = 3135
+insertions = 3129
+deletions = 0
+files_changed = 14
 
 [diffs.native-tls."0.2.10"]
-raw = """
- 21 files changed, 4089 insertions(+)
-"""
-count = 4089
-
-[diffs.net2."0.2.37"]
-raw = """
- 22 files changed, 3296 insertions(+)
-"""
-count = 3296
-
-[diffs.new_debug_unreachable."1.0.4"]
-raw = """
- 12 files changed, 193 insertions(+)
-"""
-count = 193
-
-[diffs.nix."0.15.0"]
-raw = """
- 97 files changed, 26548 insertions(+)
-"""
-count = 26548
+insertions = 3715
+deletions = 0
+files_changed = 18
 
 [diffs.ntapi."0.3.7"]
-raw = """
- 44 files changed, 21234 insertions(+)
-"""
-count = 21234
-
-[diffs.num-derive."0.3.3"]
-raw = """
- 20 files changed, 1799 insertions(+)
-"""
-count = 1799
-
-[diffs.num-integer."0.1.44"]
-raw = """
- 18 files changed, 3420 insertions(+)
-"""
-count = 3420
-
-[diffs.num-traits."0.2.14"]
-raw = """
- 28 files changed, 7965 insertions(+)
-"""
-count = 7965
-
-[diffs.num_cpus."1.13.1"]
-raw = """
- 26 files changed, 1577 insertions(+)
-"""
-count = 1577
-
-[diffs.objc."0.2.7"]
-raw = """
- 28 files changed, 2906 insertions(+)
-"""
-count = 2906
-
-[diffs.once_cell."1.9.0"]
-raw = """
- 24 files changed, 4126 insertions(+)
-"""
-count = 4126
+insertions = 21227
+deletions = 0
+files_changed = 42
 
 [diffs.once_cell."1.10.0"]
-raw = """
- 24 files changed, 4140 insertions(+)
-"""
-count = 4140
+insertions = 3766
+deletions = 0
+files_changed = 21
 
 [diffs.openssl."0.10.38"]
-raw = """
- 85 files changed, 28634 insertions(+)
-"""
-count = 28634
+insertions = 28435
+deletions = 0
+files_changed = 82
 
 [diffs.openssl-probe."0.1.5"]
-raw = """
- 12 files changed, 456 insertions(+)
-"""
-count = 456
+insertions = 442
+deletions = 0
+files_changed = 9
 
 [diffs.openssl-sys."0.9.72"]
-raw = """
- 48 files changed, 9484 insertions(+)
-"""
-count = 9484
-
-[diffs.origin-trial-token."0.1.0"]
-raw = """
- 7 files changed, 429 insertions(+)
-"""
-count = 429
+insertions = 9477
+deletions = 0
+files_changed = 46
 
 [diffs.os_str_bytes."6.0.0"]
-raw = """
- 23 files changed, 2918 insertions(+)
-"""
-count = 2918
-
-[diffs.owning_ref."0.4.1"]
-raw = """
- 10 files changed, 2177 insertions(+)
-"""
-count = 2177
-
-[diffs.parking_lot."0.11.1"]
-raw = """
- 25 files changed, 5561 insertions(+)
-"""
-count = 5561
+insertions = 2911
+deletions = 0
+files_changed = 21
 
 [diffs.percent-encoding."2.1.0"]
-raw = """
- 7 files changed, 708 insertions(+)
-"""
-count = 708
-
-[diffs.phf."0.8.0"]
-raw = """
- 7 files changed, 517 insertions(+)
-"""
-count = 517
-
-[diffs.phf_codegen."0.8.0"]
-raw = """
- 5 files changed, 356 insertions(+)
-"""
-count = 356
-
-[diffs.pin-project-lite."0.2.7"]
-raw = """
- 72 files changed, 6247 insertions(+)
-"""
-count = 6247
+insertions = 702
+deletions = 0
+files_changed = 5
 
 [diffs.pin-project-lite."0.2.8"]
-raw = """
- 72 files changed, 6107 insertions(+)
-"""
-count = 6107
+insertions = 6100
+deletions = 0
+files_changed = 70
 
 [diffs.pin-utils."0.1.0"]
-raw = """
- 15 files changed, 544 insertions(+)
-"""
-count = 544
-
-[diffs.pkcs11."0.4.2"]
-raw = """
- 15 files changed, 6743 insertions(+)
-"""
-count = 6743
+insertions = 538
+deletions = 0
+files_changed = 13
 
 [diffs.pkg-config."0.3.25"]
-raw = """
- 16 files changed, 1754 insertions(+)
-"""
-count = 1754
-
-[diffs.plane-split."0.17.1"]
-raw = """
- 17 files changed, 2300 insertions(+)
-"""
-count = 2300
-
-[diffs.plist."0.5.5"]
-raw = """
- 34 files changed, 6231 insertions(+)
-"""
-count = 6231
-
-[diffs.precomputed-hash."0.1.1"]
-raw = """
- 6 files changed, 77 insertions(+)
-"""
-count = 77
-
-[diffs.proc-macro2."1.0.36"]
-raw = """
- 22 files changed, 5685 insertions(+)
-"""
-count = 5685
+insertions = 1747
+deletions = 0
+files_changed = 14
 
 [diffs.proc-macro2."1.0.37"]
-raw = """
- 22 files changed, 5702 insertions(+)
-"""
-count = 5702
-
-[diffs.profiling."1.0.5"]
-raw = """
- 52 files changed, 4679 insertions(+)
-"""
-count = 4679
-
-[diffs.prost."0.8.0"]
-raw = """
- 19 files changed, 3723 insertions(+)
-"""
-count = 3723
-
-[diffs.prost-derive."0.8.0"]
-raw = """
- 12 files changed, 2492 insertions(+)
-"""
-count = 2492
-
-[diffs.qlog."0.4.0"]
-raw = """
- 7 files changed, 4321 insertions(+)
-"""
-count = 4321
-
-[diffs.quote."1.0.14"]
-raw = """
- 35 files changed, 3698 insertions(+)
-"""
-count = 3698
+insertions = 5695
+deletions = 0
+files_changed = 20
 
 [diffs.quote."1.0.18"]
-raw = """
- 35 files changed, 3845 insertions(+)
-"""
-count = 3845
-
-[diffs.rand."0.7.3"]
-raw = """
- 56 files changed, 11946 insertions(+)
-"""
-count = 11946
-
-[diffs.range-alloc."0.1.2"]
-raw = """
- 5 files changed, 358 insertions(+)
-"""
-count = 358
-
-[diffs.raw-window-handle."0.4.2"]
-raw = """
- 21 files changed, 843 insertions(+)
-"""
-count = 843
-
-[diffs.rayon."1.5.1"]
-raw = """
- 118 files changed, 26830 insertions(+)
-"""
-count = 26830
+insertions = 3838
+deletions = 0
+files_changed = 33
 
 [diffs.redox_syscall."0.2.13"]
-raw = """
- 32 files changed, 3897 insertions(+)
-"""
-count = 3897
-
-[diffs.regex."1.5.5"]
-raw = """
- 85 files changed, 26202 insertions(+)
-"""
-count = 26202
+insertions = 3890
+deletions = 0
+files_changed = 30
 
 [diffs.remove_dir_all."0.5.3"]
-raw = """
- 9 files changed, 598 insertions(+)
-"""
-count = 598
-
-[diffs.renderdoc-sys."0.7.1"]
-raw = """
- 7 files changed, 791 insertions(+)
-"""
-count = 791
-
-[diffs.rental."0.5.6"]
-raw = """
- 26 files changed, 1963 insertions(+)
-"""
-count = 1963
-
-[diffs.replace_with."0.1.7"]
-raw = """
- 12 files changed, 1093 insertions(+)
-"""
-count = 1093
+insertions = 592
+deletions = 0
+files_changed = 7
 
 [diffs.reqwest."0.11.10"]
-raw = """
- 63 files changed, 21663 insertions(+)
-"""
-count = 21663
-
-[diffs.rkv."0.17.0"]
-raw = """
- 68 files changed, 11545 insertions(+)
-"""
-count = 11545
-
-[diffs.ron."0.7.0"]
-raw = """
- 58 files changed, 7507 insertions(+)
-"""
-count = 7507
-
-[diffs.rusqlite."0.24.2"]
-raw = """
- 63 files changed, 16529 insertions(+)
-"""
-count = 16529
-
-[diffs.rust-ini."0.10.3"]
-raw = """
- 9 files changed, 1412 insertions(+)
-"""
-count = 1412
-
-[diffs.rust_cascade."1.2.0"]
-raw = """
- 18 files changed, 1050 insertions(+)
-"""
-count = 1050
-
-[diffs.rustc-demangle."0.1.21"]
-raw = """
- 14 files changed, 2829 insertions(+)
-"""
-count = 2829
-
-[diffs.rustc-hash."1.1.0"]
-raw = """
- 10 files changed, 497 insertions(+)
-"""
-count = 497
-
-[diffs.rustc_version."0.2.3"]
-raw = """
- 10 files changed, 795 insertions(+)
-"""
-count = 795
+insertions = 19797
+deletions = 0
+files_changed = 60
 
 [diffs.ryu."1.0.9"]
-raw = """
- 37 files changed, 4531 insertions(+)
-"""
-count = 4531
+insertions = 4362
+deletions = 0
+files_changed = 34
 
 [diffs.schannel."0.1.19"]
-raw = """
- 34 files changed, 4607 insertions(+)
-"""
-count = 4607
+insertions = 4601
+deletions = 0
+files_changed = 32
 
 [diffs.security-framework."2.6.1"]
-raw = """
- 45 files changed, 9776 insertions(+)
-"""
-count = 9776
+insertions = 9316
+deletions = 0
+files_changed = 42
 
 [diffs.security-framework-sys."2.6.1"]
-raw = """
- 29 files changed, 2023 insertions(+)
-"""
-count = 2023
-
-[diffs.semver."0.9.0"]
-raw = """
- 14 files changed, 2401 insertions(+)
-"""
-count = 2401
-
-[diffs.serde."1.0.133"]
-raw = """
- 28 files changed, 16043 insertions(+)
-"""
-count = 16043
+insertions = 2016
+deletions = 0
+files_changed = 27
 
 [diffs.serde."1.0.136"]
-raw = """
- 29 files changed, 16148 insertions(+)
-"""
-count = 16148
-
-[diffs.serde."1.0.0 -> 1.0.136"]
-raw = """
- 29 files changed, 6610 insertions(+), 2168 deletions(-)
-"""
-count = 8778
-
-[diffs.serde_bytes."0.11.5"]
-raw = """
- 17 files changed, 1483 insertions(+)
-"""
-count = 1483
-
-[diffs.serde_derive."1.0.133"]
-raw = """
- 26 files changed, 9082 insertions(+)
-"""
-count = 9082
-
-[diffs.serde_json."1.0.72"]
-raw = """
- 47 files changed, 18059 insertions(+)
-"""
-count = 18059
+insertions = 16141
+deletions = 0
+files_changed = 27
 
 [diffs.serde_json."1.0.79"]
-raw = """
- 88 files changed, 22855 insertions(+)
-"""
-count = 22855
-
-[diffs.serde_repr."0.1.7"]
-raw = """
- 24 files changed, 828 insertions(+)
-"""
-count = 828
+insertions = 22848
+deletions = 0
+files_changed = 86
 
 [diffs.serde_urlencoded."0.7.1"]
-raw = """
- 19 files changed, 2127 insertions(+)
-"""
-count = 2127
-
-[diffs.serde_yaml."0.8.23"]
-raw = """
- 27 files changed, 7510 insertions(+)
-"""
-count = 7510
-
-[diffs.serial_test."0.5.1"]
-raw = """
- 8 files changed, 219 insertions(+)
-"""
-count = 219
-
-[diffs.sfv."0.9.1"]
-raw = """
- 17 files changed, 3477 insertions(+)
-"""
-count = 3477
-
-[diffs.sha2."0.8.2"]
-raw = """
- 28 files changed, 1947 insertions(+)
-"""
-count = 1947
-
-[diffs.slab."0.4.5"]
-raw = """
- 11 files changed, 2584 insertions(+)
-"""
-count = 2584
+insertions = 2120
+deletions = 0
+files_changed = 17
 
 [diffs.slab."0.4.6"]
-raw = """
- 11 files changed, 2622 insertions(+)
-"""
-count = 2622
-
-[diffs.smallbitvec."2.5.1"]
-raw = """
- 12 files changed, 1994 insertions(+)
-"""
-count = 1994
-
-[diffs.smallvec."1.8.0"]
-raw = """
- 16 files changed, 3885 insertions(+)
-"""
-count = 3885
-
-[diffs.socket2."0.3.19"]
-raw = """
- 19 files changed, 4797 insertions(+)
-"""
-count = 4797
+insertions = 2615
+deletions = 0
+files_changed = 9
 
 [diffs.socket2."0.4.4"]
-raw = """
- 13 files changed, 6018 insertions(+)
-"""
-count = 6018
-
-[diffs.spirv."0.2.0+1.5.4"]
-raw = """
- 8 files changed, 4476 insertions(+)
-"""
-count = 4476
-
-[diffs.stable_deref_trait."1.2.0"]
-raw = """
- 9 files changed, 490 insertions(+)
-"""
-count = 490
-
-[diffs.static_assertions."1.1.0"]
-raw = """
- 18 files changed, 1792 insertions(+)
-"""
-count = 1792
-
-[diffs.strsim."0.10.0"]
-raw = """
- 15 files changed, 1574 insertions(+)
-"""
-count = 1574
-
-[diffs.svg_fmt."0.4.1"]
-raw = """
- 8 files changed, 742 insertions(+)
-"""
-count = 742
-
-[diffs.syn."1.0.85"]
-raw = """
- 98 files changed, 56943 insertions(+)
-"""
-count = 56943
-
-[diffs.syn."1.0.91"]
-raw = """
- 98 files changed, 57175 insertions(+)
-"""
-count = 57175
+insertions = 6011
+deletions = 0
+files_changed = 11
 
 [diffs.syn."1.0.0 -> 1.0.91"]
-raw = """
- 93 files changed, 21776 insertions(+), 6701 deletions(-)
-"""
-count = 28477
-
-[diffs.synstructure."0.12.6"]
-raw = """
- 8 files changed, 2991 insertions(+)
-"""
-count = 2991
-
-[diffs.tempfile."3.1.0"]
-raw = """
- 23 files changed, 3841 insertions(+)
-"""
-count = 3841
+insertions = 21772
+deletions = 6698
+files_changed = 92
 
 [diffs.tempfile."3.3.0"]
-raw = """
- 24 files changed, 4066 insertions(+)
-"""
-count = 4066
+insertions = 4059
+deletions = 0
+files_changed = 22
 
 [diffs.termcolor."1.1.3"]
-raw = """
- 12 files changed, 2585 insertions(+)
-"""
-count = 2585
+insertions = 2578
+deletions = 0
+files_changed = 10
 
 [diffs.textwrap."0.15.0"]
-raw = """
- 18 files changed, 6165 insertions(+)
-"""
-count = 6165
-
-[diffs.thin-vec."0.2.5"]
-raw = """
- 8 files changed, 2895 insertions(+)
-"""
-count = 2895
-
-[diffs.thiserror."1.0.30"]
-raw = """
- 66 files changed, 2448 insertions(+)
-"""
-count = 2448
-
-[diffs.threadbound."0.1.2"]
-raw = """
- 10 files changed, 535 insertions(+)
-"""
-count = 535
-
-[diffs.time."0.1.43"]
-raw = """
- 13 files changed, 3836 insertions(+)
-"""
-count = 3836
+insertions = 5196
+deletions = 0
+files_changed = 15
 
 [diffs.tinyvec."1.5.1"]
-raw = """
- 27 files changed, 16758 insertions(+)
-"""
-count = 16758
+insertions = 16751
+deletions = 0
+files_changed = 25
 
 [diffs.tinyvec_macros."0.1.0"]
-raw = """
- 7 files changed, 87 insertions(+)
-"""
-count = 87
-
-[diffs.tokio."0.2.25"]
-raw = """
- 396 files changed, 67418 insertions(+)
-"""
-count = 67418
+insertions = 81
+deletions = 0
+files_changed = 5
 
 [diffs.tokio."1.17.0"]
-raw = """
- 405 files changed, 91278 insertions(+)
-"""
-count = 91278
+insertions = 91271
+deletions = 0
+files_changed = 403
 
 [diffs.tokio-native-tls."0.3.0"]
-raw = """
- 19 files changed, 1804 insertions(+)
-"""
-count = 1804
+insertions = 1089
+deletions = 0
+files_changed = 16
 
 [diffs.tokio-util."0.7.1"]
-raw = """
- 67 files changed, 13877 insertions(+)
-"""
-count = 13877
-
-[diffs.toml."0.4.10"]
-raw = """
- 21 files changed, 7314 insertions(+)
-"""
-count = 7314
+insertions = 13870
+deletions = 0
+files_changed = 65
 
 [diffs.tower-service."0.3.1"]
-raw = """
- 8 files changed, 507 insertions(+)
-"""
-count = 507
+insertions = 501
+deletions = 0
+files_changed = 6
 
 [diffs.tracing."0.1.33"]
-raw = """
- 34 files changed, 10957 insertions(+)
-"""
-count = 10957
+insertions = 10950
+deletions = 0
+files_changed = 32
 
 [diffs.tracing-attributes."0.1.20"]
-raw = """
- 20 files changed, 3964 insertions(+)
-"""
-count = 3964
+insertions = 3957
+deletions = 0
+files_changed = 18
 
 [diffs.tracing-core."0.1.25"]
-raw = """
- 28 files changed, 6163 insertions(+)
-"""
-count = 6163
-
-[diffs.tracy-rs."0.1.2"]
-raw = """
- 10 files changed, 682 insertions(+)
-"""
-count = 682
+insertions = 6156
+deletions = 0
+files_changed = 26
 
 [diffs.try-lock."0.2.3"]
-raw = """
- 8 files changed, 386 insertions(+)
-"""
-count = 386
-
-[diffs.uluru."1.1.1"]
-raw = """
- 10 files changed, 1016 insertions(+)
-"""
-count = 1016
-
-[diffs.unic-langid."0.9.0"]
-raw = """
- 7 files changed, 363 insertions(+)
-"""
-count = 363
+insertions = 380
+deletions = 0
+files_changed = 6
 
 [diffs.unicode-bidi."0.2.0"]
-raw = """
- 14 files changed, 595897 insertions(+)
-"""
-count = 595897
+insertions = 595896
+deletions = 0
+files_changed = 13
 
 [diffs.unicode-bidi."0.3.7"]
-raw = """
- 23 files changed, 3398 insertions(+)
-"""
-count = 3398
+insertions = 3217
+deletions = 0
+files_changed = 20
 
 [diffs.unicode-normalization."0.1.19"]
-raw = """
- 26 files changed, 28628 insertions(+)
-"""
-count = 28628
-
-[diffs.unicode-segmentation."1.8.0"]
-raw = """
- 23 files changed, 8336 insertions(+)
-"""
-count = 8336
+insertions = 28622
+deletions = 0
+files_changed = 24
 
 [diffs.unicode-xid."0.2.2"]
-raw = """
- 14 files changed, 2050 insertions(+)
-"""
-count = 2050
-
-[diffs.unix_path."1.0.1"]
-raw = """
- 10 files changed, 3413 insertions(+)
-"""
-count = 3413
-
-[diffs.url."2.1.0"]
-raw = """
- 25 files changed, 14675 insertions(+)
-"""
-count = 14675
+insertions = 2044
+deletions = 0
+files_changed = 12
 
 [diffs.url."2.2.2"]
-raw = """
- 17 files changed, 16350 insertions(+)
-"""
-count = 16350
-
-[diffs.uuid."0.8.1"]
-raw = """
- 39 files changed, 5404 insertions(+)
-"""
-count = 5404
+insertions = 16344
+deletions = 0
+files_changed = 15
 
 [diffs.vcpkg."0.2.15"]
-raw = """
- 834 files changed, 42648 insertions(+)
-"""
-count = 42648
-
-[diffs.void."1.0.2"]
-raw = """
- 6 files changed, 221 insertions(+)
-"""
-count = 221
-
-[diffs.walkdir."2.3.2"]
-raw = """
- 20 files changed, 3509 insertions(+)
-"""
-count = 3509
+insertions = 42642
+deletions = 0
+files_changed = 832
 
 [diffs.want."0.3.0"]
-raw = """
- 9 files changed, 703 insertions(+)
-"""
-count = 703
-
-[diffs.warp."0.2.3"]
-raw = """
- 94 files changed, 15525 insertions(+)
-"""
-count = 15525
+insertions = 697
+deletions = 0
+files_changed = 7
 
 [diffs.wasi."0.11.0+wasi-snapshot-preview1"]
-raw = """
- 17 files changed, 3309 insertions(+)
-"""
-count = 3309
+insertions = 3302
+deletions = 0
+files_changed = 15
 
 [diffs.wasm-bindgen."0.2.80"]
-raw = """
- 243 files changed, 20978 insertions(+)
-"""
-count = 20978
+insertions = 20977
+deletions = 0
+files_changed = 242
 
 [diffs.wasm-bindgen-backend."0.2.80"]
-raw = """
- 11 files changed, 3019 insertions(+)
-"""
-count = 3019
+insertions = 3018
+deletions = 0
+files_changed = 10
 
 [diffs.wasm-bindgen-futures."0.4.30"]
-raw = """
- 13 files changed, 1304 insertions(+)
-"""
-count = 1304
+insertions = 1303
+deletions = 0
+files_changed = 12
 
 [diffs.wasm-bindgen-macro."0.2.80"]
-raw = """
- 46 files changed, 1275 insertions(+)
-"""
-count = 1275
+insertions = 1274
+deletions = 0
+files_changed = 45
 
 [diffs.wasm-bindgen-macro-support."0.2.80"]
-raw = """
- 7 files changed, 1966 insertions(+)
-"""
-count = 1966
+insertions = 1965
+deletions = 0
+files_changed = 6
 
 [diffs.wasm-bindgen-shared."0.2.80"]
-raw = """
- 8 files changed, 516 insertions(+)
-"""
-count = 516
-
-[diffs.wasm-smith."0.8.0"]
-raw = """
- 13 files changed, 8951 insertions(+)
-"""
-count = 8951
-
-[diffs.wasmparser."0.78.2"]
-raw = """
- 42 files changed, 13591 insertions(+)
-"""
-count = 13591
-
-[diffs.wat."1.0.41"]
-raw = """
- 7 files changed, 674 insertions(+)
-"""
-count = 674
+insertions = 515
+deletions = 0
+files_changed = 7
 
 [diffs.web-sys."0.3.57"]
-raw = """
- 2203 files changed, 197014 insertions(+)
-"""
-count = 197014
-
-[diffs.webrtc-sdp."0.3.9"]
-raw = """
- 69 files changed, 10569 insertions(+)
-"""
-count = 10569
+insertions = 197013
+deletions = 0
+files_changed = 2202
 
 [diffs.winapi."0.3.9"]
-raw = """
- 412 files changed, 181329 insertions(+)
-"""
-count = 181329
+insertions = 181323
+deletions = 0
+files_changed = 410
 
 [diffs.winapi-i686-pc-windows-gnu."0.4.0"]
-raw = """
- 1392 files changed, 1133 insertions(+)
-"""
-count = 1133
+insertions = 1132
+deletions = 0
+files_changed = 1391
 
 [diffs.winapi-util."0.1.5"]
-raw = """
- 15 files changed, 1101 insertions(+)
-"""
-count = 1101
+insertions = 1095
+deletions = 0
+files_changed = 13
 
 [diffs.winapi-x86_64-pc-windows-gnu."0.4.0"]
-raw = """
- 1421 files changed, 1168 insertions(+)
-"""
-count = 1168
-
-[diffs.winreg."0.5.1"]
-raw = """
- 22 files changed, 2894 insertions(+)
-"""
-count = 2894
+insertions = 1167
+deletions = 0
+files_changed = 1420
 
 [diffs.winreg."0.10.1"]
-raw = """
- 29 files changed, 4276 insertions(+)
-"""
-count = 4276
-
-[diffs.wio."0.2.2"]
-raw = """
- 18 files changed, 938 insertions(+)
-"""
-count = 938
-
-[diffs.xmldecl."0.2.0"]
-raw = """
- 11 files changed, 711 insertions(+)
-"""
-count = 711
-
-[diffs.zip."0.4.2"]
-raw = """
- 27 files changed, 2704 insertions(+)
-"""
-count = 2704
+insertions = 3920
+deletions = 0
+files_changed = 26
diff --git a/tests/snapshots/test_cli__test-project-diff-output.snap b/tests/snapshots/test_cli__test-project-diff-output.snap
new file mode 100644
index 0000000..efbf66c
--- /dev/null
+++ b/tests/snapshots/test_cli__test-project-diff-output.snap
@@ -0,0 +1,220 @@
+---
+source: tests/test-cli.rs
+expression: formatted
+---
+stdout:
+You are about to diff versions 1.0.90 and 1.0.91 of 'syn'
+Other software projects may rely on this audit. Ask for help if you're not sure.
+
+(press ENTER to inspect locally)
+index d6d7b5c..5dda6e6 100644
+--- a/Cargo.toml
++++ b/Cargo.toml
+@@ -13,7 +13,7 @@
+ edition = "2018"
+ rust-version = "1.31"
+ name = "syn"
+-version = "1.0.90"
++version = "1.0.91"
+ authors = ["David Tolnay <dtolnay@gmail.com>"]
+ include = [
+     "/benches/**",
+index 3ae869d..baa1f4e 100644
+--- a/Cargo.toml.orig
++++ b/Cargo.toml.orig
+@@ -1,6 +1,6 @@
+ [package]
+ name = "syn"
+-version = "1.0.90" # don't forget to update html_root_url and syn.json
++version = "1.0.91" # don't forget to update html_root_url and syn.json
+ authors = ["David Tolnay <dtolnay@gmail.com>"]
+ license = "MIT OR Apache-2.0"
+ description = "Parser for Rust source code"
+index b6d0616..276c016 100644
+--- a/expr.rs
++++ b/expr.rs
+@@ -1603,27 +1603,7 @@ pub(crate) mod parsing {
+ 
+                 let member: Member = input.parse()?;
+                 let turbofish = if member.is_named() && input.peek(Token![::]) {
+-                    Some(MethodTurbofish {
+-                        colon2_token: input.parse()?,
+-                        lt_token: input.parse()?,
+-                        args: {
+-                            let mut args = Punctuated::new();
+-                            loop {
+-                                if input.peek(Token![>]) {
+-                                    break;
+-                                }
+-                                let value = input.call(generic_method_argument)?;
+-                                args.push_value(value);
+-                                if input.peek(Token![>]) {
+-                                    break;
+-                                }
+-                                let punct = input.parse()?;
+-                                args.push_punct(punct);
+-                            }
+-                            args
+-                        },
+-                        gt_token: input.parse()?,
+-                    })
++                    Some(input.parse::<MethodTurbofish>()?)
+                 } else {
+                     None
+                 };
+@@ -2099,18 +2079,49 @@ pub(crate) mod parsing {
+     }
+ 
+     #[cfg(feature = "full")]
+-    fn generic_method_argument(input: ParseStream) -> Result<GenericMethodArgument> {
+-        if input.peek(Lit) {
+-            let lit = input.parse()?;
+-            return Ok(GenericMethodArgument::Const(Expr::Lit(lit)));
+-        }
++    #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))]
++    impl Parse for GenericMethodArgument {
++        fn parse(input: ParseStream) -> Result<Self> {
++            if input.peek(Lit) {
++                let lit = input.parse()?;
++                return Ok(GenericMethodArgument::Const(Expr::Lit(lit)));
++            }
++
++            if input.peek(token::Brace) {
++                let block: ExprBlock = input.parse()?;
++                return Ok(GenericMethodArgument::Const(Expr::Block(block)));
++            }
+ 
+-        if input.peek(token::Brace) {
+-            let block: ExprBlock = input.parse()?;
+-            return Ok(GenericMethodArgument::Const(Expr::Block(block)));
++            input.parse().map(GenericMethodArgument::Type)
+         }
++    }
+ 
+-        input.parse().map(GenericMethodArgument::Type)
++    #[cfg(feature = "full")]
++    #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))]
++    impl Parse for MethodTurbofish {
++        fn parse(input: ParseStream) -> Result<Self> {
++            Ok(MethodTurbofish {
++                colon2_token: input.parse()?,
++                lt_token: input.parse()?,
++                args: {
++                    let mut args = Punctuated::new();
++                    loop {
++                        if input.peek(Token![>]) {
++                            break;
++                        }
++                        let value: GenericMethodArgument = input.parse()?;
++                        args.push_value(value);
++                        if input.peek(Token![>]) {
++                            break;
++                        }
++                        let punct = input.parse()?;
++                        args.push_punct(punct);
++                    }
++                    args
++                },
++                gt_token: input.parse()?,
++            })
++        }
+     }
+ 
+     #[cfg(feature = "full")]
+@@ -2277,18 +2288,19 @@ pub(crate) mod parsing {
+     }
+ 
+     impl_by_parsing_expr! {
+-        ExprCall, Call, "expected function call expression",
+-        ExprMethodCall, MethodCall, "expected method call expression",
+-        ExprTuple, Tuple, "expected tuple expression",
+-        ExprBinary, Binary, "expected binary operation",
+-        ExprCast, Cast, "expected cast expression",
+-        ExprType, Type, "expected type ascription expression",
+         ExprAssign, Assign, "expected assignment expression",
+         ExprAssignOp, AssignOp, "expected compound assignment expression",
++        ExprAwait, Await, "expected await expression",
++        ExprBinary, Binary, "expected binary operation",
++        ExprCall, Call, "expected function call expression",
++        ExprCast, Cast, "expected cast expression",
+         ExprField, Field, "expected struct field access",
+         ExprIndex, Index, "expected indexing expression",
++        ExprMethodCall, MethodCall, "expected method call expression",
+         ExprRange, Range, "expected range expression",
+         ExprTry, Try, "expected try expression",
++        ExprTuple, Tuple, "expected tuple expression",
++        ExprType, Type, "expected type ascription expression",
+     }
+ 
+     #[cfg(feature = "full")]
+@@ -3346,14 +3358,22 @@ pub(crate) mod printing {
+ 
+     #[cfg(feature = "full")]
+     #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))]
+-    impl ToTokens for ExprRange {
++    impl ToTokens for RangeLimits {
+         fn to_tokens(&self, tokens: &mut TokenStream) {
+-            outer_attrs_to_tokens(&self.attrs, tokens);
+-            self.from.to_tokens(tokens);
+-            match &self.limits {
++            match self {
+                 RangeLimits::HalfOpen(t) => t.to_tokens(tokens),
+                 RangeLimits::Closed(t) => t.to_tokens(tokens),
+             }
++        }
++    }
++
++    #[cfg(feature = "full")]
++    #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))]
++    impl ToTokens for ExprRange {
++        fn to_tokens(&self, tokens: &mut TokenStream) {
++            outer_attrs_to_tokens(&self.attrs, tokens);
++            self.from.to_tokens(tokens);
++            self.limits.to_tokens(tokens);
+             self.to.to_tokens(tokens);
+         }
+     }
+index a7d750b..b59a8df 100644
+--- a/lib.rs
++++ b/lib.rs
+@@ -250,7 +250,7 @@
+ //!   dynamic library libproc_macro from rustc toolchain.
+ 
+ // Syn types in rustdoc of other crates get linked to here.
+-#![doc(html_root_url = "https://docs.rs/syn/1.0.90")]
++#![doc(html_root_url = "https://docs.rs/syn/1.0.91")]
+ #![cfg_attr(doc_cfg, feature(doc_cfg))]
+ #![allow(non_camel_case_types)]
+ // Ignored clippy lints.
+index f0ed628..0cf5cf5 100644
+--- a/lookahead.rs
++++ b/lookahead.rs
+@@ -18,6 +18,9 @@ use std::cell::RefCell;
+ /// [`ParseStream::peek`]: crate::parse::ParseBuffer::peek
+ /// [`ParseStream::lookahead1`]: crate::parse::ParseBuffer::lookahead1
+ ///
++/// Consuming tokens from the source stream after constructing a lookahead
++/// object does not also advance the lookahead object.
++///
+ /// # Example
+ ///
+ /// ```
+index 630bf9d..fa0818c 100644
+--- a/pat.rs
++++ b/pat.rs
+@@ -878,10 +878,7 @@ mod printing {
+         fn to_tokens(&self, tokens: &mut TokenStream) {
+             tokens.append_all(self.attrs.outer());
+             self.lo.to_tokens(tokens);
+-            match &self.limits {
+-                RangeLimits::HalfOpen(t) => t.to_tokens(tokens),
+-                RangeLimits::Closed(t) => t.to_tokens(tokens),
+-            }
++            self.limits.to_tokens(tokens);
+             self.hi.to_tokens(tokens);
+         }
+     }
+
+Use |cargo vet certify| to record your audit.
+stderr:
+ WARN unable to determine likely criteria, this may not be a relevant audit for this project.
diff --git a/tests/snapshots/test_cli__test-project-suggest-json.snap b/tests/snapshots/test_cli__test-project-suggest-json.snap
index 29382ce..9b91c55 100644
--- a/tests/snapshots/test_cli__test-project-suggest-json.snap
+++ b/tests/snapshots/test_cli__test-project-suggest-json.snap
@@ -705,8 +705,9 @@ stdout:
           "from": null,
           "to": "0.1.19",
           "diffstat": {
-            "raw": " 11 files changed, 938 insertions(+)\n",
-            "count": 938
+            "insertions": 932,
+            "deletions": 0,
+            "files_changed": 9
           }
         }
       },
@@ -720,8 +721,9 @@ stdout:
           "from": null,
           "to": "1.1.3",
           "diffstat": {
-            "raw": " 12 files changed, 2585 insertions(+)\n",
-            "count": 2585
+            "insertions": 2578,
+            "deletions": 0,
+            "files_changed": 10
           }
         }
       },
@@ -735,8 +737,9 @@ stdout:
           "from": null,
           "to": "6.0.0",
           "diffstat": {
-            "raw": " 23 files changed, 2918 insertions(+)\n",
-            "count": 2918
+            "insertions": 2911,
+            "deletions": 0,
+            "files_changed": 21
           }
         }
       },
@@ -750,8 +753,9 @@ stdout:
           "from": null,
           "to": "0.15.0",
           "diffstat": {
-            "raw": " 18 files changed, 6165 insertions(+)\n",
-            "count": 6165
+            "insertions": 5196,
+            "deletions": 0,
+            "files_changed": 15
           }
         }
       },
@@ -765,8 +769,9 @@ stdout:
           "from": null,
           "to": "1.8.1",
           "diffstat": {
-            "raw": " 33 files changed, 9452 insertions(+)\n",
-            "count": 9452
+            "insertions": 9445,
+            "deletions": 0,
+            "files_changed": 31
           }
         }
       },
@@ -780,8 +785,9 @@ stdout:
           "from": null,
           "to": "0.11.10",
           "diffstat": {
-            "raw": " 63 files changed, 21663 insertions(+)\n",
-            "count": 21663
+            "insertions": 19797,
+            "deletions": 0,
+            "files_changed": 60
           }
         }
       },
@@ -795,8 +801,9 @@ stdout:
           "from": null,
           "to": "1.0.79",
           "diffstat": {
-            "raw": " 88 files changed, 22855 insertions(+)\n",
-            "count": 22855
+            "insertions": 22848,
+            "deletions": 0,
+            "files_changed": 86
           }
         }
       },
@@ -810,8 +817,9 @@ stdout:
           "from": null,
           "to": "1.17.0",
           "diffstat": {
-            "raw": " 405 files changed, 91278 insertions(+)\n",
-            "count": 91278
+            "insertions": 91271,
+            "deletions": 0,
+            "files_changed": 403
           }
         }
       },
@@ -825,8 +833,9 @@ stdout:
           "from": null,
           "to": "0.2.123",
           "diffstat": {
-            "raw": " 217 files changed, 94067 insertions(+)\n",
-            "count": 94067
+            "insertions": 94060,
+            "deletions": 0,
+            "files_changed": 215
           }
         }
       },
@@ -840,8 +849,9 @@ stdout:
           "from": null,
           "to": "0.3.9",
           "diffstat": {
-            "raw": " 412 files changed, 181329 insertions(+)\n",
-            "count": 181329
+            "insertions": 181323,
+            "deletions": 0,
+            "files_changed": 410
           }
         }
       },
@@ -855,8 +865,9 @@ stdout:
           "from": null,
           "to": "0.1.0",
           "diffstat": {
-            "raw": " 7 files changed, 87 insertions(+)\n",
-            "count": 87
+            "insertions": 81,
+            "deletions": 0,
+            "files_changed": 5
           }
         }
       },
@@ -870,8 +881,9 @@ stdout:
           "from": null,
           "to": "0.1.9",
           "diffstat": {
-            "raw": " 7 files changed, 211 insertions(+)\n",
-            "count": 211
+            "insertions": 210,
+            "deletions": 0,
+            "files_changed": 6
           }
         }
       },
@@ -885,8 +897,9 @@ stdout:
           "from": null,
           "to": "0.1.1",
           "diffstat": {
-            "raw": " 6 files changed, 303 insertions(+)\n",
-            "count": 303
+            "insertions": 302,
+            "deletions": 0,
+            "files_changed": 5
           }
         }
       },
@@ -900,8 +913,9 @@ stdout:
           "from": null,
           "to": "0.2.3",
           "diffstat": {
-            "raw": " 8 files changed, 386 insertions(+)\n",
-            "count": 386
+            "insertions": 380,
+            "deletions": 0,
+            "files_changed": 6
           }
         }
       },
@@ -915,8 +929,9 @@ stdout:
           "from": null,
           "to": "0.1.5",
           "diffstat": {
-            "raw": " 12 files changed, 456 insertions(+)\n",
-            "count": 456
+            "insertions": 442,
+            "deletions": 0,
+            "files_changed": 9
           }
         }
       },
@@ -930,8 +945,9 @@ stdout:
           "from": null,
           "to": "0.3.1",
           "diffstat": {
-            "raw": " 8 files changed, 507 insertions(+)\n",
-            "count": 507
+            "insertions": 501,
+            "deletions": 0,
+            "files_changed": 6
           }
         }
       },
@@ -945,8 +961,9 @@ stdout:
           "from": null,
           "to": "0.2.80",
           "diffstat": {
-            "raw": " 8 files changed, 516 insertions(+)\n",
-            "count": 516
+            "insertions": 515,
+            "deletions": 0,
+            "files_changed": 7
           }
         }
       },
@@ -960,8 +977,9 @@ stdout:
           "from": null,
           "to": "0.1.0",
           "diffstat": {
-            "raw": " 15 files changed, 544 insertions(+)\n",
-            "count": 544
+            "insertions": 538,
+            "deletions": 0,
+            "files_changed": 13
           }
         }
       },
@@ -975,38 +993,41 @@ stdout:
           "from": null,
           "to": "0.3.21",
           "diffstat": {
-            "raw": " 8 files changed, 551 insertions(+)\n",
-            "count": 551
+            "insertions": 544,
+            "deletions": 0,
+            "files_changed": 6
           }
         }
       },
       {
-        "name": "foreign-types",
-        "notable_parents": "openssl",
+        "name": "cfg-if",
+        "notable_parents": "log, instant, openssl, and 5 others",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.3.2",
+          "to": "1.0.0",
           "diffstat": {
-            "raw": " 7 files changed, 584 insertions(+)\n",
-            "count": 584
+            "insertions": 582,
+            "deletions": 0,
+            "files_changed": 9
           }
         }
       },
       {
-        "name": "cfg-if",
-        "notable_parents": "log, instant, openssl, and 5 others",
+        "name": "foreign-types",
+        "notable_parents": "openssl",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "1.0.0",
+          "to": "0.3.2",
           "diffstat": {
-            "raw": " 11 files changed, 588 insertions(+)\n",
-            "count": 588
+            "insertions": 583,
+            "deletions": 0,
+            "files_changed": 6
           }
         }
       },
@@ -1020,8 +1041,9 @@ stdout:
           "from": null,
           "to": "0.5.3",
           "diffstat": {
-            "raw": " 9 files changed, 598 insertions(+)\n",
-            "count": 598
+            "insertions": 592,
+            "deletions": 0,
+            "files_changed": 7
           }
         }
       },
@@ -1035,8 +1057,25 @@ stdout:
           "from": null,
           "to": "0.1.12",
           "diffstat": {
-            "raw": " 14 files changed, 678 insertions(+)\n",
-            "count": 678
+            "insertions": 672,
+            "deletions": 0,
+            "files_changed": 12
+          }
+        }
+      },
+      {
+        "name": "hyper-tls",
+        "notable_parents": "reqwest",
+        "suggested_criteria": [
+          "safe-to-deploy"
+        ],
+        "suggested_diff": {
+          "from": null,
+          "to": "0.5.0",
+          "diffstat": {
+            "insertions": 673,
+            "deletions": 0,
+            "files_changed": 11
           }
         }
       },
@@ -1050,8 +1089,9 @@ stdout:
           "from": null,
           "to": "1.0.1",
           "diffstat": {
-            "raw": " 7 files changed, 695 insertions(+)\n",
-            "count": 695
+            "insertions": 689,
+            "deletions": 0,
+            "files_changed": 5
           }
         }
       },
@@ -1065,8 +1105,9 @@ stdout:
           "from": null,
           "to": "0.3.0",
           "diffstat": {
-            "raw": " 9 files changed, 703 insertions(+)\n",
-            "count": 703
+            "insertions": 697,
+            "deletions": 0,
+            "files_changed": 7
           }
         }
       },
@@ -1080,8 +1121,9 @@ stdout:
           "from": null,
           "to": "2.1.0",
           "diffstat": {
-            "raw": " 7 files changed, 708 insertions(+)\n",
-            "count": 708
+            "insertions": 702,
+            "deletions": 0,
+            "files_changed": 5
           }
         }
       },
@@ -1095,8 +1137,9 @@ stdout:
           "from": null,
           "to": "1.0.7",
           "diffstat": {
-            "raw": " 10 files changed, 736 insertions(+)\n",
-            "count": 736
+            "insertions": 730,
+            "deletions": 0,
+            "files_changed": 8
           }
         }
       },
@@ -1110,8 +1153,9 @@ stdout:
           "from": null,
           "to": "1.0.1",
           "diffstat": {
-            "raw": " 15 files changed, 796 insertions(+)\n",
-            "count": 796
+            "insertions": 789,
+            "deletions": 0,
+            "files_changed": 13
           }
         }
       },
@@ -1125,8 +1169,9 @@ stdout:
           "from": null,
           "to": "1.4.0",
           "diffstat": {
-            "raw": " 13 files changed, 882 insertions(+)\n",
-            "count": 882
+            "insertions": 876,
+            "deletions": 0,
+            "files_changed": 11
           }
         }
       },
@@ -1140,8 +1185,25 @@ stdout:
           "from": null,
           "to": "1.0.2",
           "diffstat": {
-            "raw": " 12 files changed, 1001 insertions(+)\n",
-            "count": 1001
+            "insertions": 995,
+            "deletions": 0,
+            "files_changed": 10
+          }
+        }
+      },
+      {
+        "name": "tokio-native-tls",
+        "notable_parents": "reqwest, hyper-tls",
+        "suggested_criteria": [
+          "safe-to-deploy"
+        ],
+        "suggested_diff": {
+          "from": null,
+          "to": "0.3.0",
+          "diffstat": {
+            "insertions": 1089,
+            "deletions": 0,
+            "files_changed": 16
           }
         }
       },
@@ -1155,8 +1217,9 @@ stdout:
           "from": null,
           "to": "0.1.5",
           "diffstat": {
-            "raw": " 15 files changed, 1101 insertions(+)\n",
-            "count": 1101
+            "insertions": 1095,
+            "deletions": 0,
+            "files_changed": 13
           }
         }
       },
@@ -1170,8 +1233,9 @@ stdout:
           "from": null,
           "to": "0.4.0",
           "diffstat": {
-            "raw": " 1392 files changed, 1133 insertions(+)\n",
-            "count": 1133
+            "insertions": 1132,
+            "deletions": 0,
+            "files_changed": 1391
           }
         }
       },
@@ -1185,8 +1249,9 @@ stdout:
           "from": null,
           "to": "0.4.0",
           "diffstat": {
-            "raw": " 1421 files changed, 1168 insertions(+)\n",
-            "count": 1168
+            "insertions": 1167,
+            "deletions": 0,
+            "files_changed": 1420
           }
         }
       },
@@ -1200,8 +1265,9 @@ stdout:
           "from": null,
           "to": "0.3.21",
           "diffstat": {
-            "raw": " 16 files changed, 1182 insertions(+)\n",
-            "count": 1182
+            "insertions": 1175,
+            "deletions": 0,
+            "files_changed": 14
           }
         }
       },
@@ -1215,8 +1281,9 @@ stdout:
           "from": null,
           "to": "0.3.21",
           "diffstat": {
-            "raw": " 16 files changed, 1187 insertions(+)\n",
-            "count": 1187
+            "insertions": 1180,
+            "deletions": 0,
+            "files_changed": 14
           }
         }
       },
@@ -1230,8 +1297,9 @@ stdout:
           "from": null,
           "to": "0.4.4",
           "diffstat": {
-            "raw": " 19 files changed, 1262 insertions(+)\n",
-            "count": 1262
+            "insertions": 1256,
+            "deletions": 0,
+            "files_changed": 17
           }
         }
       },
@@ -1245,23 +1313,9 @@ stdout:
           "from": null,
           "to": "0.2.80",
           "diffstat": {
-            "raw": " 46 files changed, 1275 insertions(+)\n",
-            "count": 1275
-          }
-        }
-      },
-      {
-        "name": "hyper-tls",
-        "notable_parents": "reqwest",
-        "suggested_criteria": [
-          "safe-to-deploy"
-        ],
-        "suggested_diff": {
-          "from": null,
-          "to": "0.5.0",
-          "diffstat": {
-            "raw": " 14 files changed, 1301 insertions(+)\n",
-            "count": 1301
+            "insertions": 1274,
+            "deletions": 0,
+            "files_changed": 45
           }
         }
       },
@@ -1275,8 +1329,9 @@ stdout:
           "from": null,
           "to": "0.4.30",
           "diffstat": {
-            "raw": " 13 files changed, 1304 insertions(+)\n",
-            "count": 1304
+            "insertions": 1303,
+            "deletions": 0,
+            "files_changed": 12
           }
         }
       },
@@ -1290,8 +1345,9 @@ stdout:
           "from": null,
           "to": "1.7.0",
           "diffstat": {
-            "raw": " 12 files changed, 1375 insertions(+)\n",
-            "count": 1375
+            "insertions": 1368,
+            "deletions": 0,
+            "files_changed": 10
           }
         }
       },
@@ -1305,8 +1361,9 @@ stdout:
           "from": null,
           "to": "0.3.16",
           "diffstat": {
-            "raw": " 15 files changed, 1721 insertions(+)\n",
-            "count": 1721
+            "insertions": 1715,
+            "deletions": 0,
+            "files_changed": 13
           }
         }
       },
@@ -1320,23 +1377,25 @@ stdout:
           "from": null,
           "to": "0.3.25",
           "diffstat": {
-            "raw": " 16 files changed, 1754 insertions(+)\n",
-            "count": 1754
+            "insertions": 1747,
+            "deletions": 0,
+            "files_changed": 14
           }
         }
       },
       {
-        "name": "tokio-native-tls",
-        "notable_parents": "reqwest, hyper-tls",
+        "name": "core-foundation-sys",
+        "notable_parents": "core-foundation, and 2 others",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.3.0",
+          "to": "0.8.3",
           "diffstat": {
-            "raw": " 19 files changed, 1804 insertions(+)\n",
-            "count": 1804
+            "insertions": 1965,
+            "deletions": 0,
+            "files_changed": 26
           }
         }
       },
@@ -1350,23 +1409,9 @@ stdout:
           "from": null,
           "to": "0.2.80",
           "diffstat": {
-            "raw": " 7 files changed, 1966 insertions(+)\n",
-            "count": 1966
-          }
-        }
-      },
-      {
-        "name": "core-foundation-sys",
-        "notable_parents": "core-foundation, and 2 others",
-        "suggested_criteria": [
-          "safe-to-deploy"
-        ],
-        "suggested_diff": {
-          "from": null,
-          "to": "0.8.3",
-          "diffstat": {
-            "raw": " 28 files changed, 1971 insertions(+)\n",
-            "count": 1971
+            "insertions": 1965,
+            "deletions": 0,
+            "files_changed": 6
           }
         }
       },
@@ -1380,8 +1425,9 @@ stdout:
           "from": null,
           "to": "2.6.1",
           "diffstat": {
-            "raw": " 29 files changed, 2023 insertions(+)\n",
-            "count": 2023
+            "insertions": 2016,
+            "deletions": 0,
+            "files_changed": 27
           }
         }
       },
@@ -1395,8 +1441,9 @@ stdout:
           "from": null,
           "to": "0.2.2",
           "diffstat": {
-            "raw": " 14 files changed, 2050 insertions(+)\n",
-            "count": 2050
+            "insertions": 2044,
+            "deletions": 0,
+            "files_changed": 12
           }
         }
       },
@@ -1410,8 +1457,9 @@ stdout:
           "from": null,
           "to": "0.7.1",
           "diffstat": {
-            "raw": " 19 files changed, 2127 insertions(+)\n",
-            "count": 2127
+            "insertions": 2120,
+            "deletions": 0,
+            "files_changed": 17
           }
         }
       },
@@ -1425,8 +1473,9 @@ stdout:
           "from": null,
           "to": "0.4.6",
           "diffstat": {
-            "raw": " 11 files changed, 2622 insertions(+)\n",
-            "count": 2622
+            "insertions": 2615,
+            "deletions": 0,
+            "files_changed": 9
           }
         }
       },
@@ -1440,8 +1489,9 @@ stdout:
           "from": null,
           "to": "0.2.80",
           "diffstat": {
-            "raw": " 11 files changed, 3019 insertions(+)\n",
-            "count": 3019
+            "insertions": 3018,
+            "deletions": 0,
+            "files_changed": 10
           }
         }
       },
@@ -1455,188 +1505,201 @@ stdout:
           "from": null,
           "to": "0.3.7",
           "diffstat": {
-            "raw": " 16 files changed, 3135 insertions(+)\n",
-            "count": 3135
+            "insertions": 3129,
+            "deletions": 0,
+            "files_changed": 14
           }
         }
       },
       {
-        "name": "wasi",
-        "notable_parents": "mio",
+        "name": "unicode-bidi",
+        "notable_parents": "idna",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.11.0+wasi-snapshot-preview1",
+          "to": "0.3.7",
           "diffstat": {
-            "raw": " 17 files changed, 3309 insertions(+)\n",
-            "count": 3309
+            "insertions": 3217,
+            "deletions": 0,
+            "files_changed": 20
           }
         }
       },
       {
-        "name": "unicode-bidi",
-        "notable_parents": "idna",
+        "name": "wasi",
+        "notable_parents": "mio",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.3.7",
+          "to": "0.11.0+wasi-snapshot-preview1",
           "diffstat": {
-            "raw": " 23 files changed, 3398 insertions(+)\n",
-            "count": 3398
+            "insertions": 3302,
+            "deletions": 0,
+            "files_changed": 15
           }
         }
       },
       {
-        "name": "quote",
-        "notable_parents": "syn, and 4 others",
+        "name": "native-tls",
+        "notable_parents": "reqwest, hyper-tls, tokio-native-tls",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "1.0.18",
+          "to": "0.2.10",
           "diffstat": {
-            "raw": " 35 files changed, 3845 insertions(+)\n",
-            "count": 3845
+            "insertions": 3715,
+            "deletions": 0,
+            "files_changed": 18
           }
         }
       },
       {
-        "name": "redox_syscall",
-        "notable_parents": "tempfile",
+        "name": "once_cell",
+        "notable_parents": "openssl",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.2.13",
+          "to": "1.10.0",
           "diffstat": {
-            "raw": " 32 files changed, 3897 insertions(+)\n",
-            "count": 3897
+            "insertions": 3766,
+            "deletions": 0,
+            "files_changed": 21
           }
         }
       },
       {
-        "name": "core-foundation",
-        "notable_parents": "security-framework",
+        "name": "quote",
+        "notable_parents": "syn, and 4 others",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.9.3",
+          "to": "1.0.18",
           "diffstat": {
-            "raw": " 28 files changed, 3960 insertions(+)\n",
-            "count": 3960
+            "insertions": 3838,
+            "deletions": 0,
+            "files_changed": 33
           }
         }
       },
       {
-        "name": "tracing-attributes",
-        "notable_parents": "tracing",
+        "name": "redox_syscall",
+        "notable_parents": "tempfile",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.1.20",
+          "to": "0.2.13",
           "diffstat": {
-            "raw": " 20 files changed, 3964 insertions(+)\n",
-            "count": 3964
+            "insertions": 3890,
+            "deletions": 0,
+            "files_changed": 30
           }
         }
       },
       {
-        "name": "ipnet",
+        "name": "winreg",
         "notable_parents": "reqwest",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "2.4.0",
+          "to": "0.10.1",
           "diffstat": {
-            "raw": " 15 files changed, 3980 insertions(+)\n",
-            "count": 3980
+            "insertions": 3920,
+            "deletions": 0,
+            "files_changed": 26
           }
         }
       },
       {
-        "name": "futures-channel",
-        "notable_parents": "hyper",
+        "name": "core-foundation",
+        "notable_parents": "security-framework",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.3.21",
+          "to": "0.9.3",
           "diffstat": {
-            "raw": " 20 files changed, 3999 insertions(+)\n",
-            "count": 3999
+            "insertions": 3953,
+            "deletions": 0,
+            "files_changed": 26
           }
         }
       },
       {
-        "name": "tempfile",
-        "notable_parents": "native-tls",
+        "name": "tracing-attributes",
+        "notable_parents": "tracing",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "3.3.0",
+          "to": "0.1.20",
           "diffstat": {
-            "raw": " 24 files changed, 4066 insertions(+)\n",
-            "count": 4066
+            "insertions": 3957,
+            "deletions": 0,
+            "files_changed": 18
           }
         }
       },
       {
-        "name": "native-tls",
-        "notable_parents": "reqwest, hyper-tls, tokio-native-tls",
+        "name": "ipnet",
+        "notable_parents": "reqwest",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.2.10",
+          "to": "2.4.0",
           "diffstat": {
-            "raw": " 21 files changed, 4089 insertions(+)\n",
-            "count": 4089
+            "insertions": 3973,
+            "deletions": 0,
+            "files_changed": 13
           }
         }
       },
       {
-        "name": "once_cell",
-        "notable_parents": "openssl",
+        "name": "futures-channel",
+        "notable_parents": "hyper",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "1.10.0",
+          "to": "0.3.21",
           "diffstat": {
-            "raw": " 24 files changed, 4140 insertions(+)\n",
-            "count": 4140
+            "insertions": 3992,
+            "deletions": 0,
+            "files_changed": 18
           }
         }
       },
       {
-        "name": "winreg",
-        "notable_parents": "reqwest",
+        "name": "tempfile",
+        "notable_parents": "native-tls",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.10.1",
+          "to": "3.3.0",
           "diffstat": {
-            "raw": " 29 files changed, 4276 insertions(+)\n",
-            "count": 4276
+            "insertions": 4059,
+            "deletions": 0,
+            "files_changed": 22
           }
         }
       },
@@ -1650,8 +1713,9 @@ stdout:
           "from": null,
           "to": "1.0.9",
           "diffstat": {
-            "raw": " 37 files changed, 4531 insertions(+)\n",
-            "count": 4531
+            "insertions": 4362,
+            "deletions": 0,
+            "files_changed": 34
           }
         }
       },
@@ -1665,8 +1729,9 @@ stdout:
           "from": null,
           "to": "0.1.19",
           "diffstat": {
-            "raw": " 34 files changed, 4607 insertions(+)\n",
-            "count": 4607
+            "insertions": 4601,
+            "deletions": 0,
+            "files_changed": 32
           }
         }
       },
@@ -1680,8 +1745,9 @@ stdout:
           "from": null,
           "to": "0.4.16",
           "diffstat": {
-            "raw": " 21 files changed, 5632 insertions(+)\n",
-            "count": 5632
+            "insertions": 5625,
+            "deletions": 0,
+            "files_changed": 19
           }
         }
       },
@@ -1695,8 +1761,9 @@ stdout:
           "from": null,
           "to": "1.0.37",
           "diffstat": {
-            "raw": " 22 files changed, 5702 insertions(+)\n",
-            "count": 5702
+            "insertions": 5695,
+            "deletions": 0,
+            "files_changed": 20
           }
         }
       },
@@ -1710,8 +1777,9 @@ stdout:
           "from": null,
           "to": "0.4.4",
           "diffstat": {
-            "raw": " 13 files changed, 6018 insertions(+)\n",
-            "count": 6018
+            "insertions": 6011,
+            "deletions": 0,
+            "files_changed": 11
           }
         }
       },
@@ -1725,8 +1793,9 @@ stdout:
           "from": null,
           "to": "0.2.8",
           "diffstat": {
-            "raw": " 72 files changed, 6107 insertions(+)\n",
-            "count": 6107
+            "insertions": 6100,
+            "deletions": 0,
+            "files_changed": 70
           }
         }
       },
@@ -1740,8 +1809,9 @@ stdout:
           "from": null,
           "to": "0.1.25",
           "diffstat": {
-            "raw": " 28 files changed, 6163 insertions(+)\n",
-            "count": 6163
+            "insertions": 6156,
+            "deletions": 0,
+            "files_changed": 26
           }
         }
       },
@@ -1755,8 +1825,9 @@ stdout:
           "from": null,
           "to": "1.0.73",
           "diffstat": {
-            "raw": " 22 files changed, 6671 insertions(+)\n",
-            "count": 6671
+            "insertions": 6554,
+            "deletions": 0,
+            "files_changed": 19
           }
         }
       },
@@ -1770,8 +1841,9 @@ stdout:
           "from": null,
           "to": "1.7.0",
           "diffstat": {
-            "raw": " 20 files changed, 7265 insertions(+)\n",
-            "count": 7265
+            "insertions": 7258,
+            "deletions": 0,
+            "files_changed": 18
           }
         }
       },
@@ -1785,8 +1857,9 @@ stdout:
           "from": null,
           "to": "2.4.1",
           "diffstat": {
-            "raw": " 48 files changed, 8718 insertions(+)\n",
-            "count": 8718
+            "insertions": 8712,
+            "deletions": 0,
+            "files_changed": 46
           }
         }
       },
@@ -1800,38 +1873,41 @@ stdout:
           "from": null,
           "to": "1.1.0",
           "diffstat": {
-            "raw": " 45 files changed, 9213 insertions(+)\n",
-            "count": 9213
+            "insertions": 9207,
+            "deletions": 0,
+            "files_changed": 43
           }
         }
       },
       {
-        "name": "openssl-sys",
-        "notable_parents": "openssl, native-tls",
+        "name": "security-framework",
+        "notable_parents": "native-tls",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.9.72",
+          "to": "2.6.1",
           "diffstat": {
-            "raw": " 48 files changed, 9484 insertions(+)\n",
-            "count": 9484
+            "insertions": 9316,
+            "deletions": 0,
+            "files_changed": 42
           }
         }
       },
       {
-        "name": "security-framework",
-        "notable_parents": "native-tls",
+        "name": "openssl-sys",
+        "notable_parents": "openssl, native-tls",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "2.6.1",
+          "to": "0.9.72",
           "diffstat": {
-            "raw": " 45 files changed, 9776 insertions(+)\n",
-            "count": 9776
+            "insertions": 9477,
+            "deletions": 0,
+            "files_changed": 46
           }
         }
       },
@@ -1845,8 +1921,9 @@ stdout:
           "from": null,
           "to": "3.9.1",
           "diffstat": {
-            "raw": " 19 files changed, 10106 insertions(+)\n",
-            "count": 10106
+            "insertions": 10099,
+            "deletions": 0,
+            "files_changed": 17
           }
         }
       },
@@ -1860,8 +1937,9 @@ stdout:
           "from": null,
           "to": "0.1.33",
           "diffstat": {
-            "raw": " 34 files changed, 10957 insertions(+)\n",
-            "count": 10957
+            "insertions": 10950,
+            "deletions": 0,
+            "files_changed": 32
           }
         }
       },
@@ -1875,8 +1953,9 @@ stdout:
           "from": null,
           "to": "0.8.2",
           "diffstat": {
-            "raw": " 65 files changed, 11882 insertions(+)\n",
-            "count": 11882
+            "insertions": 11719,
+            "deletions": 0,
+            "files_changed": 62
           }
         }
       },
@@ -1890,8 +1969,9 @@ stdout:
           "from": null,
           "to": "0.3.57",
           "diffstat": {
-            "raw": " 63 files changed, 12875 insertions(+)\n",
-            "count": 12875
+            "insertions": 12874,
+            "deletions": 0,
+            "files_changed": 62
           }
         }
       },
@@ -1905,8 +1985,9 @@ stdout:
           "from": null,
           "to": "0.7.1",
           "diffstat": {
-            "raw": " 67 files changed, 13877 insertions(+)\n",
-            "count": 13877
+            "insertions": 13870,
+            "deletions": 0,
+            "files_changed": 65
           }
         }
       },
@@ -1920,8 +2001,9 @@ stdout:
           "from": null,
           "to": "0.11.2",
           "diffstat": {
-            "raw": " 33 files changed, 14609 insertions(+)\n",
-            "count": 14609
+            "insertions": 14603,
+            "deletions": 0,
+            "files_changed": 31
           }
         }
       },
@@ -1935,8 +2017,9 @@ stdout:
           "from": null,
           "to": "1.0.136",
           "diffstat": {
-            "raw": " 29 files changed, 16148 insertions(+)\n",
-            "count": 16148
+            "insertions": 16141,
+            "deletions": 0,
+            "files_changed": 27
           }
         }
       },
@@ -1950,8 +2033,9 @@ stdout:
           "from": null,
           "to": "2.2.2",
           "diffstat": {
-            "raw": " 17 files changed, 16350 insertions(+)\n",
-            "count": 16350
+            "insertions": 16344,
+            "deletions": 0,
+            "files_changed": 15
           }
         }
       },
@@ -1965,8 +2049,9 @@ stdout:
           "from": null,
           "to": "1.5.1",
           "diffstat": {
-            "raw": " 27 files changed, 16758 insertions(+)\n",
-            "count": 16758
+            "insertions": 16751,
+            "deletions": 0,
+            "files_changed": 25
           }
         }
       },
@@ -1980,8 +2065,9 @@ stdout:
           "from": null,
           "to": "0.2.6",
           "diffstat": {
-            "raw": " 41 files changed, 16826 insertions(+)\n",
-            "count": 16826
+            "insertions": 16819,
+            "deletions": 0,
+            "files_changed": 39
           }
         }
       },
@@ -1995,8 +2081,9 @@ stdout:
           "from": null,
           "to": "0.2.80",
           "diffstat": {
-            "raw": " 243 files changed, 20978 insertions(+)\n",
-            "count": 20978
+            "insertions": 20977,
+            "deletions": 0,
+            "files_changed": 242
           }
         }
       },
@@ -2010,38 +2097,41 @@ stdout:
           "from": null,
           "to": "0.3.7",
           "diffstat": {
-            "raw": " 44 files changed, 21234 insertions(+)\n",
-            "count": 21234
+            "insertions": 21227,
+            "deletions": 0,
+            "files_changed": 42
           }
         }
       },
       {
-        "name": "futures-util",
-        "notable_parents": "h2, hyper, reqwest",
+        "name": "hyper",
+        "notable_parents": "reqwest, hyper-tls",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.3.21",
+          "to": "0.14.18",
           "diffstat": {
-            "raw": " 187 files changed, 25074 insertions(+)\n",
-            "count": 25074
+            "insertions": 24841,
+            "deletions": 0,
+            "files_changed": 69
           }
         }
       },
       {
-        "name": "hyper",
-        "notable_parents": "reqwest, hyper-tls",
+        "name": "futures-util",
+        "notable_parents": "h2, hyper, reqwest",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.14.18",
+          "to": "0.3.21",
           "diffstat": {
-            "raw": " 72 files changed, 25617 insertions(+)\n",
-            "count": 25617
+            "insertions": 25067,
+            "deletions": 0,
+            "files_changed": 185
           }
         }
       },
@@ -2055,53 +2145,57 @@ stdout:
           "from": null,
           "to": "0.3.13",
           "diffstat": {
-            "raw": " 66 files changed, 26066 insertions(+)\n",
-            "count": 26066
+            "insertions": 25417,
+            "deletions": 0,
+            "files_changed": 63
           }
         }
       },
       {
-        "name": "syn",
-        "notable_parents": "tracing-attributes, and 2 others",
+        "name": "openssl",
+        "notable_parents": "native-tls",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
-          "from": "1.0.0",
-          "to": "1.0.91",
+          "from": null,
+          "to": "0.10.38",
           "diffstat": {
-            "raw": " 93 files changed, 21776 insertions(+), 6701 deletions(-)\n",
-            "count": 28477
+            "insertions": 28435,
+            "deletions": 0,
+            "files_changed": 82
           }
         }
       },
       {
-        "name": "unicode-normalization",
-        "notable_parents": "idna",
+        "name": "syn",
+        "notable_parents": "tracing-attributes, and 2 others",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
-          "from": null,
-          "to": "0.1.19",
+          "from": "1.0.0",
+          "to": "1.0.91",
           "diffstat": {
-            "raw": " 26 files changed, 28628 insertions(+)\n",
-            "count": 28628
+            "insertions": 21772,
+            "deletions": 6698,
+            "files_changed": 92
           }
         }
       },
       {
-        "name": "openssl",
-        "notable_parents": "native-tls",
+        "name": "unicode-normalization",
+        "notable_parents": "idna",
         "suggested_criteria": [
           "safe-to-deploy"
         ],
         "suggested_diff": {
           "from": null,
-          "to": "0.10.38",
+          "to": "0.1.19",
           "diffstat": {
-            "raw": " 85 files changed, 28634 insertions(+)\n",
-            "count": 28634
+            "insertions": 28622,
+            "deletions": 0,
+            "files_changed": 24
           }
         }
       },
@@ -2115,8 +2209,9 @@ stdout:
           "from": null,
           "to": "0.2.3",
           "diffstat": {
-            "raw": " 19 files changed, 32538 insertions(+)\n",
-            "count": 32538
+            "insertions": 32532,
+            "deletions": 0,
+            "files_changed": 17
           }
         }
       },
@@ -2130,8 +2225,9 @@ stdout:
           "from": null,
           "to": "0.2.15",
           "diffstat": {
-            "raw": " 834 files changed, 42648 insertions(+)\n",
-            "count": 42648
+            "insertions": 42642,
+            "deletions": 0,
+            "files_changed": 832
           }
         }
       },
@@ -2145,8 +2241,9 @@ stdout:
           "from": null,
           "to": "0.3.57",
           "diffstat": {
-            "raw": " 2203 files changed, 197014 insertions(+)\n",
-            "count": 197014
+            "insertions": 197013,
+            "deletions": 0,
+            "files_changed": 2202
           }
         }
       },
@@ -2160,8 +2257,9 @@ stdout:
           "from": null,
           "to": "0.8.31",
           "diffstat": {
-            "raw": " 104 files changed, 507252 insertions(+)\n",
-            "count": 507252
+            "insertions": 507245,
+            "deletions": 0,
+            "files_changed": 102
           }
         }
       }
@@ -2178,8 +2276,9 @@ stdout:
             "from": null,
             "to": "1.1.3",
             "diffstat": {
-              "raw": " 12 files changed, 2585 insertions(+)\n",
-              "count": 2585
+              "insertions": 2578,
+              "deletions": 0,
+              "files_changed": 10
             }
           }
         },
@@ -2193,8 +2292,9 @@ stdout:
             "from": null,
             "to": "6.0.0",
             "diffstat": {
-              "raw": " 23 files changed, 2918 insertions(+)\n",
-              "count": 2918
+              "insertions": 2911,
+              "deletions": 0,
+              "files_changed": 21
             }
           }
         },
@@ -2208,8 +2308,9 @@ stdout:
             "from": null,
             "to": "0.15.0",
             "diffstat": {
-              "raw": " 18 files changed, 6165 insertions(+)\n",
-              "count": 6165
+              "insertions": 5196,
+              "deletions": 0,
+              "files_changed": 15
             }
           }
         },
@@ -2223,8 +2324,9 @@ stdout:
             "from": null,
             "to": "1.8.1",
             "diffstat": {
-              "raw": " 33 files changed, 9452 insertions(+)\n",
-              "count": 9452
+              "insertions": 9445,
+              "deletions": 0,
+              "files_changed": 31
             }
           }
         },
@@ -2238,8 +2340,9 @@ stdout:
             "from": null,
             "to": "0.11.10",
             "diffstat": {
-              "raw": " 63 files changed, 21663 insertions(+)\n",
-              "count": 21663
+              "insertions": 19797,
+              "deletions": 0,
+              "files_changed": 60
             }
           }
         },
@@ -2253,8 +2356,9 @@ stdout:
             "from": null,
             "to": "1.0.79",
             "diffstat": {
-              "raw": " 88 files changed, 22855 insertions(+)\n",
-              "count": 22855
+              "insertions": 22848,
+              "deletions": 0,
+              "files_changed": 86
             }
           }
         },
@@ -2268,8 +2372,9 @@ stdout:
             "from": null,
             "to": "1.17.0",
             "diffstat": {
-              "raw": " 405 files changed, 91278 insertions(+)\n",
-              "count": 91278
+              "insertions": 91271,
+              "deletions": 0,
+              "files_changed": 403
             }
           }
         },
@@ -2283,8 +2388,9 @@ stdout:
             "from": null,
             "to": "0.2.123",
             "diffstat": {
-              "raw": " 217 files changed, 94067 insertions(+)\n",
-              "count": 94067
+              "insertions": 94060,
+              "deletions": 0,
+              "files_changed": 215
             }
           }
         },
@@ -2298,8 +2404,9 @@ stdout:
             "from": null,
             "to": "0.3.9",
             "diffstat": {
-              "raw": " 412 files changed, 181329 insertions(+)\n",
-              "count": 181329
+              "insertions": 181323,
+              "deletions": 0,
+              "files_changed": 410
             }
           }
         },
@@ -2313,8 +2420,9 @@ stdout:
             "from": null,
             "to": "0.1.0",
             "diffstat": {
-              "raw": " 7 files changed, 87 insertions(+)\n",
-              "count": 87
+              "insertions": 81,
+              "deletions": 0,
+              "files_changed": 5
             }
           }
         },
@@ -2328,8 +2436,9 @@ stdout:
             "from": null,
             "to": "0.1.9",
             "diffstat": {
-              "raw": " 7 files changed, 211 insertions(+)\n",
-              "count": 211
+              "insertions": 210,
+              "deletions": 0,
+              "files_changed": 6
             }
           }
         },
@@ -2343,8 +2452,9 @@ stdout:
             "from": null,
             "to": "0.1.1",
             "diffstat": {
-              "raw": " 6 files changed, 303 insertions(+)\n",
-              "count": 303
+              "insertions": 302,
+              "deletions": 0,
+              "files_changed": 5
             }
           }
         },
@@ -2358,8 +2468,9 @@ stdout:
             "from": null,
             "to": "0.2.3",
             "diffstat": {
-              "raw": " 8 files changed, 386 insertions(+)\n",
-              "count": 386
+              "insertions": 380,
+              "deletions": 0,
+              "files_changed": 6
             }
           }
         },
@@ -2373,8 +2484,9 @@ stdout:
             "from": null,
             "to": "0.1.5",
             "diffstat": {
-              "raw": " 12 files changed, 456 insertions(+)\n",
-              "count": 456
+              "insertions": 442,
+              "deletions": 0,
+              "files_changed": 9
             }
           }
         },
@@ -2388,8 +2500,9 @@ stdout:
             "from": null,
             "to": "0.3.1",
             "diffstat": {
-              "raw": " 8 files changed, 507 insertions(+)\n",
-              "count": 507
+              "insertions": 501,
+              "deletions": 0,
+              "files_changed": 6
             }
           }
         },
@@ -2403,8 +2516,9 @@ stdout:
             "from": null,
             "to": "0.2.80",
             "diffstat": {
-              "raw": " 8 files changed, 516 insertions(+)\n",
-              "count": 516
+              "insertions": 515,
+              "deletions": 0,
+              "files_changed": 7
             }
           }
         },
@@ -2418,8 +2532,9 @@ stdout:
             "from": null,
             "to": "0.1.0",
             "diffstat": {
-              "raw": " 15 files changed, 544 insertions(+)\n",
-              "count": 544
+              "insertions": 538,
+              "deletions": 0,
+              "files_changed": 13
             }
           }
         },
@@ -2433,38 +2548,41 @@ stdout:
             "from": null,
             "to": "0.3.21",
             "diffstat": {
-              "raw": " 8 files changed, 551 insertions(+)\n",
-              "count": 551
+              "insertions": 544,
+              "deletions": 0,
+              "files_changed": 6
             }
           }
         },
         {
-          "name": "foreign-types",
-          "notable_parents": "openssl",
+          "name": "cfg-if",
+          "notable_parents": "log, instant, openssl, and 5 others",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.3.2",
+            "to": "1.0.0",
             "diffstat": {
-              "raw": " 7 files changed, 584 insertions(+)\n",
-              "count": 584
+              "insertions": 582,
+              "deletions": 0,
+              "files_changed": 9
             }
           }
         },
         {
-          "name": "cfg-if",
-          "notable_parents": "log, instant, openssl, and 5 others",
+          "name": "foreign-types",
+          "notable_parents": "openssl",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "1.0.0",
+            "to": "0.3.2",
             "diffstat": {
-              "raw": " 11 files changed, 588 insertions(+)\n",
-              "count": 588
+              "insertions": 583,
+              "deletions": 0,
+              "files_changed": 6
             }
           }
         },
@@ -2478,8 +2596,9 @@ stdout:
             "from": null,
             "to": "0.5.3",
             "diffstat": {
-              "raw": " 9 files changed, 598 insertions(+)\n",
-              "count": 598
+              "insertions": 592,
+              "deletions": 0,
+              "files_changed": 7
             }
           }
         },
@@ -2493,8 +2612,25 @@ stdout:
             "from": null,
             "to": "0.1.12",
             "diffstat": {
-              "raw": " 14 files changed, 678 insertions(+)\n",
-              "count": 678
+              "insertions": 672,
+              "deletions": 0,
+              "files_changed": 12
+            }
+          }
+        },
+        {
+          "name": "hyper-tls",
+          "notable_parents": "reqwest",
+          "suggested_criteria": [
+            "safe-to-deploy"
+          ],
+          "suggested_diff": {
+            "from": null,
+            "to": "0.5.0",
+            "diffstat": {
+              "insertions": 673,
+              "deletions": 0,
+              "files_changed": 11
             }
           }
         },
@@ -2508,8 +2644,9 @@ stdout:
             "from": null,
             "to": "1.0.1",
             "diffstat": {
-              "raw": " 7 files changed, 695 insertions(+)\n",
-              "count": 695
+              "insertions": 689,
+              "deletions": 0,
+              "files_changed": 5
             }
           }
         },
@@ -2523,8 +2660,9 @@ stdout:
             "from": null,
             "to": "0.3.0",
             "diffstat": {
-              "raw": " 9 files changed, 703 insertions(+)\n",
-              "count": 703
+              "insertions": 697,
+              "deletions": 0,
+              "files_changed": 7
             }
           }
         },
@@ -2538,8 +2676,9 @@ stdout:
             "from": null,
             "to": "2.1.0",
             "diffstat": {
-              "raw": " 7 files changed, 708 insertions(+)\n",
-              "count": 708
+              "insertions": 702,
+              "deletions": 0,
+              "files_changed": 5
             }
           }
         },
@@ -2553,8 +2692,9 @@ stdout:
             "from": null,
             "to": "1.0.7",
             "diffstat": {
-              "raw": " 10 files changed, 736 insertions(+)\n",
-              "count": 736
+              "insertions": 730,
+              "deletions": 0,
+              "files_changed": 8
             }
           }
         },
@@ -2568,8 +2708,9 @@ stdout:
             "from": null,
             "to": "1.0.1",
             "diffstat": {
-              "raw": " 15 files changed, 796 insertions(+)\n",
-              "count": 796
+              "insertions": 789,
+              "deletions": 0,
+              "files_changed": 13
             }
           }
         },
@@ -2583,8 +2724,9 @@ stdout:
             "from": null,
             "to": "1.4.0",
             "diffstat": {
-              "raw": " 13 files changed, 882 insertions(+)\n",
-              "count": 882
+              "insertions": 876,
+              "deletions": 0,
+              "files_changed": 11
             }
           }
         },
@@ -2598,8 +2740,25 @@ stdout:
             "from": null,
             "to": "1.0.2",
             "diffstat": {
-              "raw": " 12 files changed, 1001 insertions(+)\n",
-              "count": 1001
+              "insertions": 995,
+              "deletions": 0,
+              "files_changed": 10
+            }
+          }
+        },
+        {
+          "name": "tokio-native-tls",
+          "notable_parents": "reqwest, hyper-tls",
+          "suggested_criteria": [
+            "safe-to-deploy"
+          ],
+          "suggested_diff": {
+            "from": null,
+            "to": "0.3.0",
+            "diffstat": {
+              "insertions": 1089,
+              "deletions": 0,
+              "files_changed": 16
             }
           }
         },
@@ -2613,8 +2772,9 @@ stdout:
             "from": null,
             "to": "0.1.5",
             "diffstat": {
-              "raw": " 15 files changed, 1101 insertions(+)\n",
-              "count": 1101
+              "insertions": 1095,
+              "deletions": 0,
+              "files_changed": 13
             }
           }
         },
@@ -2628,8 +2788,9 @@ stdout:
             "from": null,
             "to": "0.4.0",
             "diffstat": {
-              "raw": " 1392 files changed, 1133 insertions(+)\n",
-              "count": 1133
+              "insertions": 1132,
+              "deletions": 0,
+              "files_changed": 1391
             }
           }
         },
@@ -2643,8 +2804,9 @@ stdout:
             "from": null,
             "to": "0.4.0",
             "diffstat": {
-              "raw": " 1421 files changed, 1168 insertions(+)\n",
-              "count": 1168
+              "insertions": 1167,
+              "deletions": 0,
+              "files_changed": 1420
             }
           }
         },
@@ -2658,8 +2820,9 @@ stdout:
             "from": null,
             "to": "0.3.21",
             "diffstat": {
-              "raw": " 16 files changed, 1182 insertions(+)\n",
-              "count": 1182
+              "insertions": 1175,
+              "deletions": 0,
+              "files_changed": 14
             }
           }
         },
@@ -2673,8 +2836,9 @@ stdout:
             "from": null,
             "to": "0.3.21",
             "diffstat": {
-              "raw": " 16 files changed, 1187 insertions(+)\n",
-              "count": 1187
+              "insertions": 1180,
+              "deletions": 0,
+              "files_changed": 14
             }
           }
         },
@@ -2688,8 +2852,9 @@ stdout:
             "from": null,
             "to": "0.4.4",
             "diffstat": {
-              "raw": " 19 files changed, 1262 insertions(+)\n",
-              "count": 1262
+              "insertions": 1256,
+              "deletions": 0,
+              "files_changed": 17
             }
           }
         },
@@ -2703,23 +2868,9 @@ stdout:
             "from": null,
             "to": "0.2.80",
             "diffstat": {
-              "raw": " 46 files changed, 1275 insertions(+)\n",
-              "count": 1275
-            }
-          }
-        },
-        {
-          "name": "hyper-tls",
-          "notable_parents": "reqwest",
-          "suggested_criteria": [
-            "safe-to-deploy"
-          ],
-          "suggested_diff": {
-            "from": null,
-            "to": "0.5.0",
-            "diffstat": {
-              "raw": " 14 files changed, 1301 insertions(+)\n",
-              "count": 1301
+              "insertions": 1274,
+              "deletions": 0,
+              "files_changed": 45
             }
           }
         },
@@ -2733,8 +2884,9 @@ stdout:
             "from": null,
             "to": "0.4.30",
             "diffstat": {
-              "raw": " 13 files changed, 1304 insertions(+)\n",
-              "count": 1304
+              "insertions": 1303,
+              "deletions": 0,
+              "files_changed": 12
             }
           }
         },
@@ -2748,8 +2900,9 @@ stdout:
             "from": null,
             "to": "1.7.0",
             "diffstat": {
-              "raw": " 12 files changed, 1375 insertions(+)\n",
-              "count": 1375
+              "insertions": 1368,
+              "deletions": 0,
+              "files_changed": 10
             }
           }
         },
@@ -2763,8 +2916,9 @@ stdout:
             "from": null,
             "to": "0.3.16",
             "diffstat": {
-              "raw": " 15 files changed, 1721 insertions(+)\n",
-              "count": 1721
+              "insertions": 1715,
+              "deletions": 0,
+              "files_changed": 13
             }
           }
         },
@@ -2778,23 +2932,25 @@ stdout:
             "from": null,
             "to": "0.3.25",
             "diffstat": {
-              "raw": " 16 files changed, 1754 insertions(+)\n",
-              "count": 1754
+              "insertions": 1747,
+              "deletions": 0,
+              "files_changed": 14
             }
           }
         },
         {
-          "name": "tokio-native-tls",
-          "notable_parents": "reqwest, hyper-tls",
+          "name": "core-foundation-sys",
+          "notable_parents": "core-foundation, and 2 others",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.3.0",
+            "to": "0.8.3",
             "diffstat": {
-              "raw": " 19 files changed, 1804 insertions(+)\n",
-              "count": 1804
+              "insertions": 1965,
+              "deletions": 0,
+              "files_changed": 26
             }
           }
         },
@@ -2808,23 +2964,9 @@ stdout:
             "from": null,
             "to": "0.2.80",
             "diffstat": {
-              "raw": " 7 files changed, 1966 insertions(+)\n",
-              "count": 1966
-            }
-          }
-        },
-        {
-          "name": "core-foundation-sys",
-          "notable_parents": "core-foundation, and 2 others",
-          "suggested_criteria": [
-            "safe-to-deploy"
-          ],
-          "suggested_diff": {
-            "from": null,
-            "to": "0.8.3",
-            "diffstat": {
-              "raw": " 28 files changed, 1971 insertions(+)\n",
-              "count": 1971
+              "insertions": 1965,
+              "deletions": 0,
+              "files_changed": 6
             }
           }
         },
@@ -2838,8 +2980,9 @@ stdout:
             "from": null,
             "to": "2.6.1",
             "diffstat": {
-              "raw": " 29 files changed, 2023 insertions(+)\n",
-              "count": 2023
+              "insertions": 2016,
+              "deletions": 0,
+              "files_changed": 27
             }
           }
         },
@@ -2853,8 +2996,9 @@ stdout:
             "from": null,
             "to": "0.2.2",
             "diffstat": {
-              "raw": " 14 files changed, 2050 insertions(+)\n",
-              "count": 2050
+              "insertions": 2044,
+              "deletions": 0,
+              "files_changed": 12
             }
           }
         },
@@ -2868,8 +3012,9 @@ stdout:
             "from": null,
             "to": "0.7.1",
             "diffstat": {
-              "raw": " 19 files changed, 2127 insertions(+)\n",
-              "count": 2127
+              "insertions": 2120,
+              "deletions": 0,
+              "files_changed": 17
             }
           }
         },
@@ -2883,8 +3028,9 @@ stdout:
             "from": null,
             "to": "0.4.6",
             "diffstat": {
-              "raw": " 11 files changed, 2622 insertions(+)\n",
-              "count": 2622
+              "insertions": 2615,
+              "deletions": 0,
+              "files_changed": 9
             }
           }
         },
@@ -2898,8 +3044,9 @@ stdout:
             "from": null,
             "to": "0.2.80",
             "diffstat": {
-              "raw": " 11 files changed, 3019 insertions(+)\n",
-              "count": 3019
+              "insertions": 3018,
+              "deletions": 0,
+              "files_changed": 10
             }
           }
         },
@@ -2913,188 +3060,201 @@ stdout:
             "from": null,
             "to": "0.3.7",
             "diffstat": {
-              "raw": " 16 files changed, 3135 insertions(+)\n",
-              "count": 3135
+              "insertions": 3129,
+              "deletions": 0,
+              "files_changed": 14
             }
           }
         },
         {
-          "name": "wasi",
-          "notable_parents": "mio",
+          "name": "unicode-bidi",
+          "notable_parents": "idna",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.11.0+wasi-snapshot-preview1",
+            "to": "0.3.7",
             "diffstat": {
-              "raw": " 17 files changed, 3309 insertions(+)\n",
-              "count": 3309
+              "insertions": 3217,
+              "deletions": 0,
+              "files_changed": 20
             }
           }
         },
         {
-          "name": "unicode-bidi",
-          "notable_parents": "idna",
+          "name": "wasi",
+          "notable_parents": "mio",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.3.7",
+            "to": "0.11.0+wasi-snapshot-preview1",
             "diffstat": {
-              "raw": " 23 files changed, 3398 insertions(+)\n",
-              "count": 3398
+              "insertions": 3302,
+              "deletions": 0,
+              "files_changed": 15
             }
           }
         },
         {
-          "name": "quote",
-          "notable_parents": "syn, and 4 others",
+          "name": "native-tls",
+          "notable_parents": "reqwest, hyper-tls, tokio-native-tls",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "1.0.18",
+            "to": "0.2.10",
             "diffstat": {
-              "raw": " 35 files changed, 3845 insertions(+)\n",
-              "count": 3845
+              "insertions": 3715,
+              "deletions": 0,
+              "files_changed": 18
             }
           }
         },
         {
-          "name": "redox_syscall",
-          "notable_parents": "tempfile",
+          "name": "once_cell",
+          "notable_parents": "openssl",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.2.13",
+            "to": "1.10.0",
             "diffstat": {
-              "raw": " 32 files changed, 3897 insertions(+)\n",
-              "count": 3897
+              "insertions": 3766,
+              "deletions": 0,
+              "files_changed": 21
             }
           }
         },
         {
-          "name": "core-foundation",
-          "notable_parents": "security-framework",
+          "name": "quote",
+          "notable_parents": "syn, and 4 others",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.9.3",
+            "to": "1.0.18",
             "diffstat": {
-              "raw": " 28 files changed, 3960 insertions(+)\n",
-              "count": 3960
+              "insertions": 3838,
+              "deletions": 0,
+              "files_changed": 33
             }
           }
         },
         {
-          "name": "tracing-attributes",
-          "notable_parents": "tracing",
+          "name": "redox_syscall",
+          "notable_parents": "tempfile",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.1.20",
+            "to": "0.2.13",
             "diffstat": {
-              "raw": " 20 files changed, 3964 insertions(+)\n",
-              "count": 3964
+              "insertions": 3890,
+              "deletions": 0,
+              "files_changed": 30
             }
           }
         },
         {
-          "name": "ipnet",
+          "name": "winreg",
           "notable_parents": "reqwest",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "2.4.0",
+            "to": "0.10.1",
             "diffstat": {
-              "raw": " 15 files changed, 3980 insertions(+)\n",
-              "count": 3980
+              "insertions": 3920,
+              "deletions": 0,
+              "files_changed": 26
             }
           }
         },
         {
-          "name": "futures-channel",
-          "notable_parents": "hyper",
+          "name": "core-foundation",
+          "notable_parents": "security-framework",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.3.21",
+            "to": "0.9.3",
             "diffstat": {
-              "raw": " 20 files changed, 3999 insertions(+)\n",
-              "count": 3999
+              "insertions": 3953,
+              "deletions": 0,
+              "files_changed": 26
             }
           }
         },
         {
-          "name": "tempfile",
-          "notable_parents": "native-tls",
+          "name": "tracing-attributes",
+          "notable_parents": "tracing",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "3.3.0",
+            "to": "0.1.20",
             "diffstat": {
-              "raw": " 24 files changed, 4066 insertions(+)\n",
-              "count": 4066
+              "insertions": 3957,
+              "deletions": 0,
+              "files_changed": 18
             }
           }
         },
         {
-          "name": "native-tls",
-          "notable_parents": "reqwest, hyper-tls, tokio-native-tls",
+          "name": "ipnet",
+          "notable_parents": "reqwest",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.2.10",
+            "to": "2.4.0",
             "diffstat": {
-              "raw": " 21 files changed, 4089 insertions(+)\n",
-              "count": 4089
+              "insertions": 3973,
+              "deletions": 0,
+              "files_changed": 13
             }
           }
         },
         {
-          "name": "once_cell",
-          "notable_parents": "openssl",
+          "name": "futures-channel",
+          "notable_parents": "hyper",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "1.10.0",
+            "to": "0.3.21",
             "diffstat": {
-              "raw": " 24 files changed, 4140 insertions(+)\n",
-              "count": 4140
+              "insertions": 3992,
+              "deletions": 0,
+              "files_changed": 18
             }
           }
         },
         {
-          "name": "winreg",
-          "notable_parents": "reqwest",
+          "name": "tempfile",
+          "notable_parents": "native-tls",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.10.1",
+            "to": "3.3.0",
             "diffstat": {
-              "raw": " 29 files changed, 4276 insertions(+)\n",
-              "count": 4276
+              "insertions": 4059,
+              "deletions": 0,
+              "files_changed": 22
             }
           }
         },
@@ -3108,8 +3268,9 @@ stdout:
             "from": null,
             "to": "1.0.9",
             "diffstat": {
-              "raw": " 37 files changed, 4531 insertions(+)\n",
-              "count": 4531
+              "insertions": 4362,
+              "deletions": 0,
+              "files_changed": 34
             }
           }
         },
@@ -3123,8 +3284,9 @@ stdout:
             "from": null,
             "to": "0.1.19",
             "diffstat": {
-              "raw": " 34 files changed, 4607 insertions(+)\n",
-              "count": 4607
+              "insertions": 4601,
+              "deletions": 0,
+              "files_changed": 32
             }
           }
         },
@@ -3138,8 +3300,9 @@ stdout:
             "from": null,
             "to": "0.4.16",
             "diffstat": {
-              "raw": " 21 files changed, 5632 insertions(+)\n",
-              "count": 5632
+              "insertions": 5625,
+              "deletions": 0,
+              "files_changed": 19
             }
           }
         },
@@ -3153,8 +3316,9 @@ stdout:
             "from": null,
             "to": "1.0.37",
             "diffstat": {
-              "raw": " 22 files changed, 5702 insertions(+)\n",
-              "count": 5702
+              "insertions": 5695,
+              "deletions": 0,
+              "files_changed": 20
             }
           }
         },
@@ -3168,8 +3332,9 @@ stdout:
             "from": null,
             "to": "0.4.4",
             "diffstat": {
-              "raw": " 13 files changed, 6018 insertions(+)\n",
-              "count": 6018
+              "insertions": 6011,
+              "deletions": 0,
+              "files_changed": 11
             }
           }
         },
@@ -3183,8 +3348,9 @@ stdout:
             "from": null,
             "to": "0.2.8",
             "diffstat": {
-              "raw": " 72 files changed, 6107 insertions(+)\n",
-              "count": 6107
+              "insertions": 6100,
+              "deletions": 0,
+              "files_changed": 70
             }
           }
         },
@@ -3198,8 +3364,9 @@ stdout:
             "from": null,
             "to": "0.1.25",
             "diffstat": {
-              "raw": " 28 files changed, 6163 insertions(+)\n",
-              "count": 6163
+              "insertions": 6156,
+              "deletions": 0,
+              "files_changed": 26
             }
           }
         },
@@ -3213,8 +3380,9 @@ stdout:
             "from": null,
             "to": "1.0.73",
             "diffstat": {
-              "raw": " 22 files changed, 6671 insertions(+)\n",
-              "count": 6671
+              "insertions": 6554,
+              "deletions": 0,
+              "files_changed": 19
             }
           }
         },
@@ -3228,8 +3396,9 @@ stdout:
             "from": null,
             "to": "1.7.0",
             "diffstat": {
-              "raw": " 20 files changed, 7265 insertions(+)\n",
-              "count": 7265
+              "insertions": 7258,
+              "deletions": 0,
+              "files_changed": 18
             }
           }
         },
@@ -3243,8 +3412,9 @@ stdout:
             "from": null,
             "to": "2.4.1",
             "diffstat": {
-              "raw": " 48 files changed, 8718 insertions(+)\n",
-              "count": 8718
+              "insertions": 8712,
+              "deletions": 0,
+              "files_changed": 46
             }
           }
         },
@@ -3258,38 +3428,41 @@ stdout:
             "from": null,
             "to": "1.1.0",
             "diffstat": {
-              "raw": " 45 files changed, 9213 insertions(+)\n",
-              "count": 9213
+              "insertions": 9207,
+              "deletions": 0,
+              "files_changed": 43
             }
           }
         },
         {
-          "name": "openssl-sys",
-          "notable_parents": "openssl, native-tls",
+          "name": "security-framework",
+          "notable_parents": "native-tls",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.9.72",
+            "to": "2.6.1",
             "diffstat": {
-              "raw": " 48 files changed, 9484 insertions(+)\n",
-              "count": 9484
+              "insertions": 9316,
+              "deletions": 0,
+              "files_changed": 42
             }
           }
         },
         {
-          "name": "security-framework",
-          "notable_parents": "native-tls",
+          "name": "openssl-sys",
+          "notable_parents": "openssl, native-tls",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "2.6.1",
+            "to": "0.9.72",
             "diffstat": {
-              "raw": " 45 files changed, 9776 insertions(+)\n",
-              "count": 9776
+              "insertions": 9477,
+              "deletions": 0,
+              "files_changed": 46
             }
           }
         },
@@ -3303,8 +3476,9 @@ stdout:
             "from": null,
             "to": "3.9.1",
             "diffstat": {
-              "raw": " 19 files changed, 10106 insertions(+)\n",
-              "count": 10106
+              "insertions": 10099,
+              "deletions": 0,
+              "files_changed": 17
             }
           }
         },
@@ -3318,8 +3492,9 @@ stdout:
             "from": null,
             "to": "0.1.33",
             "diffstat": {
-              "raw": " 34 files changed, 10957 insertions(+)\n",
-              "count": 10957
+              "insertions": 10950,
+              "deletions": 0,
+              "files_changed": 32
             }
           }
         },
@@ -3333,8 +3508,9 @@ stdout:
             "from": null,
             "to": "0.8.2",
             "diffstat": {
-              "raw": " 65 files changed, 11882 insertions(+)\n",
-              "count": 11882
+              "insertions": 11719,
+              "deletions": 0,
+              "files_changed": 62
             }
           }
         },
@@ -3348,8 +3524,9 @@ stdout:
             "from": null,
             "to": "0.3.57",
             "diffstat": {
-              "raw": " 63 files changed, 12875 insertions(+)\n",
-              "count": 12875
+              "insertions": 12874,
+              "deletions": 0,
+              "files_changed": 62
             }
           }
         },
@@ -3363,8 +3540,9 @@ stdout:
             "from": null,
             "to": "0.7.1",
             "diffstat": {
-              "raw": " 67 files changed, 13877 insertions(+)\n",
-              "count": 13877
+              "insertions": 13870,
+              "deletions": 0,
+              "files_changed": 65
             }
           }
         },
@@ -3378,8 +3556,9 @@ stdout:
             "from": null,
             "to": "0.11.2",
             "diffstat": {
-              "raw": " 33 files changed, 14609 insertions(+)\n",
-              "count": 14609
+              "insertions": 14603,
+              "deletions": 0,
+              "files_changed": 31
             }
           }
         },
@@ -3393,8 +3572,9 @@ stdout:
             "from": null,
             "to": "1.0.136",
             "diffstat": {
-              "raw": " 29 files changed, 16148 insertions(+)\n",
-              "count": 16148
+              "insertions": 16141,
+              "deletions": 0,
+              "files_changed": 27
             }
           }
         },
@@ -3408,8 +3588,9 @@ stdout:
             "from": null,
             "to": "2.2.2",
             "diffstat": {
-              "raw": " 17 files changed, 16350 insertions(+)\n",
-              "count": 16350
+              "insertions": 16344,
+              "deletions": 0,
+              "files_changed": 15
             }
           }
         },
@@ -3423,8 +3604,9 @@ stdout:
             "from": null,
             "to": "1.5.1",
             "diffstat": {
-              "raw": " 27 files changed, 16758 insertions(+)\n",
-              "count": 16758
+              "insertions": 16751,
+              "deletions": 0,
+              "files_changed": 25
             }
           }
         },
@@ -3438,8 +3620,9 @@ stdout:
             "from": null,
             "to": "0.2.6",
             "diffstat": {
-              "raw": " 41 files changed, 16826 insertions(+)\n",
-              "count": 16826
+              "insertions": 16819,
+              "deletions": 0,
+              "files_changed": 39
             }
           }
         },
@@ -3453,8 +3636,9 @@ stdout:
             "from": null,
             "to": "0.2.80",
             "diffstat": {
-              "raw": " 243 files changed, 20978 insertions(+)\n",
-              "count": 20978
+              "insertions": 20977,
+              "deletions": 0,
+              "files_changed": 242
             }
           }
         },
@@ -3468,38 +3652,41 @@ stdout:
             "from": null,
             "to": "0.3.7",
             "diffstat": {
-              "raw": " 44 files changed, 21234 insertions(+)\n",
-              "count": 21234
+              "insertions": 21227,
+              "deletions": 0,
+              "files_changed": 42
             }
           }
         },
         {
-          "name": "futures-util",
-          "notable_parents": "h2, hyper, reqwest",
+          "name": "hyper",
+          "notable_parents": "reqwest, hyper-tls",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.3.21",
+            "to": "0.14.18",
             "diffstat": {
-              "raw": " 187 files changed, 25074 insertions(+)\n",
-              "count": 25074
+              "insertions": 24841,
+              "deletions": 0,
+              "files_changed": 69
             }
           }
         },
         {
-          "name": "hyper",
-          "notable_parents": "reqwest, hyper-tls",
+          "name": "futures-util",
+          "notable_parents": "h2, hyper, reqwest",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.14.18",
+            "to": "0.3.21",
             "diffstat": {
-              "raw": " 72 files changed, 25617 insertions(+)\n",
-              "count": 25617
+              "insertions": 25067,
+              "deletions": 0,
+              "files_changed": 185
             }
           }
         },
@@ -3513,53 +3700,57 @@ stdout:
             "from": null,
             "to": "0.3.13",
             "diffstat": {
-              "raw": " 66 files changed, 26066 insertions(+)\n",
-              "count": 26066
+              "insertions": 25417,
+              "deletions": 0,
+              "files_changed": 63
             }
           }
         },
         {
-          "name": "syn",
-          "notable_parents": "tracing-attributes, and 2 others",
+          "name": "openssl",
+          "notable_parents": "native-tls",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
-            "from": "1.0.0",
-            "to": "1.0.91",
+            "from": null,
+            "to": "0.10.38",
             "diffstat": {
-              "raw": " 93 files changed, 21776 insertions(+), 6701 deletions(-)\n",
-              "count": 28477
+              "insertions": 28435,
+              "deletions": 0,
+              "files_changed": 82
             }
           }
         },
         {
-          "name": "unicode-normalization",
-          "notable_parents": "idna",
+          "name": "syn",
+          "notable_parents": "tracing-attributes, and 2 others",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
-            "from": null,
-            "to": "0.1.19",
+            "from": "1.0.0",
+            "to": "1.0.91",
             "diffstat": {
-              "raw": " 26 files changed, 28628 insertions(+)\n",
-              "count": 28628
+              "insertions": 21772,
+              "deletions": 6698,
+              "files_changed": 92
             }
           }
         },
         {
-          "name": "openssl",
-          "notable_parents": "native-tls",
+          "name": "unicode-normalization",
+          "notable_parents": "idna",
           "suggested_criteria": [
             "safe-to-deploy"
           ],
           "suggested_diff": {
             "from": null,
-            "to": "0.10.38",
+            "to": "0.1.19",
             "diffstat": {
-              "raw": " 85 files changed, 28634 insertions(+)\n",
-              "count": 28634
+              "insertions": 28622,
+              "deletions": 0,
+              "files_changed": 24
             }
           }
         },
@@ -3573,8 +3764,9 @@ stdout:
             "from": null,
             "to": "0.2.3",
             "diffstat": {
-              "raw": " 19 files changed, 32538 insertions(+)\n",
-              "count": 32538
+              "insertions": 32532,
+              "deletions": 0,
+              "files_changed": 17
             }
           }
         },
@@ -3588,8 +3780,9 @@ stdout:
             "from": null,
             "to": "0.2.15",
             "diffstat": {
-              "raw": " 834 files changed, 42648 insertions(+)\n",
-              "count": 42648
+              "insertions": 42642,
+              "deletions": 0,
+              "files_changed": 832
             }
           }
         },
@@ -3603,8 +3796,9 @@ stdout:
             "from": null,
             "to": "0.3.57",
             "diffstat": {
-              "raw": " 2203 files changed, 197014 insertions(+)\n",
-              "count": 197014
+              "insertions": 197013,
+              "deletions": 0,
+              "files_changed": 2202
             }
           }
         },
@@ -3618,8 +3812,9 @@ stdout:
             "from": null,
             "to": "0.8.31",
             "diffstat": {
-              "raw": " 104 files changed, 507252 insertions(+)\n",
-              "count": 507252
+              "insertions": 507245,
+              "deletions": 0,
+              "files_changed": 102
             }
           }
         }
@@ -3635,14 +3830,15 @@ stdout:
             "from": null,
             "to": "0.1.19",
             "diffstat": {
-              "raw": " 11 files changed, 938 insertions(+)\n",
-              "count": 938
+              "insertions": 932,
+              "deletions": 0,
+              "files_changed": 9
             }
           }
         }
       ]
     },
-    "total_lines": 1742618
+    "total_lines": 1734141
   }
 }
 stderr:
diff --git a/tests/snapshots/test_cli__test-project-suggest-shallow-json.snap b/tests/snapshots/test_cli__test-project-suggest-shallow-json.snap
index 3a2ac51..6e42e1b 100644
--- a/tests/snapshots/test_cli__test-project-suggest-shallow-json.snap
+++ b/tests/snapshots/test_cli__test-project-suggest-shallow-json.snap
@@ -89,8 +89,9 @@ stdout:
           "from": null,
           "to": "0.1.19",
           "diffstat": {
-            "raw": " 11 files changed, 938 insertions(+)\n",
-            "count": 938
+            "insertions": 932,
+            "deletions": 0,
+            "files_changed": 9
           }
         }
       },
@@ -104,8 +105,9 @@ stdout:
           "from": null,
           "to": "1.1.3",
           "diffstat": {
-            "raw": " 12 files changed, 2585 insertions(+)\n",
-            "count": 2585
+            "insertions": 2578,
+            "deletions": 0,
+            "files_changed": 10
           }
         }
       },
@@ -119,8 +121,9 @@ stdout:
           "from": null,
           "to": "6.0.0",
           "diffstat": {
-            "raw": " 23 files changed, 2918 insertions(+)\n",
-            "count": 2918
+            "insertions": 2911,
+            "deletions": 0,
+            "files_changed": 21
           }
         }
       },
@@ -134,8 +137,9 @@ stdout:
           "from": null,
           "to": "0.15.0",
           "diffstat": {
-            "raw": " 18 files changed, 6165 insertions(+)\n",
-            "count": 6165
+            "insertions": 5196,
+            "deletions": 0,
+            "files_changed": 15
           }
         }
       },
@@ -149,8 +153,9 @@ stdout:
           "from": null,
           "to": "1.8.1",
           "diffstat": {
-            "raw": " 33 files changed, 9452 insertions(+)\n",
-            "count": 9452
+            "insertions": 9445,
+            "deletions": 0,
+            "files_changed": 31
           }
         }
       },
@@ -164,8 +169,9 @@ stdout:
           "from": null,
           "to": "0.11.10",
           "diffstat": {
-            "raw": " 63 files changed, 21663 insertions(+)\n",
-            "count": 21663
+            "insertions": 19797,
+            "deletions": 0,
+            "files_changed": 60
           }
         }
       },
@@ -179,8 +185,9 @@ stdout:
           "from": null,
           "to": "1.0.79",
           "diffstat": {
-            "raw": " 88 files changed, 22855 insertions(+)\n",
-            "count": 22855
+            "insertions": 22848,
+            "deletions": 0,
+            "files_changed": 86
           }
         }
       },
@@ -194,8 +201,9 @@ stdout:
           "from": null,
           "to": "1.17.0",
           "diffstat": {
-            "raw": " 405 files changed, 91278 insertions(+)\n",
-            "count": 91278
+            "insertions": 91271,
+            "deletions": 0,
+            "files_changed": 403
           }
         }
       },
@@ -209,8 +217,9 @@ stdout:
           "from": null,
           "to": "0.2.123",
           "diffstat": {
-            "raw": " 217 files changed, 94067 insertions(+)\n",
-            "count": 94067
+            "insertions": 94060,
+            "deletions": 0,
+            "files_changed": 215
           }
         }
       },
@@ -224,8 +233,9 @@ stdout:
           "from": null,
           "to": "0.3.9",
           "diffstat": {
-            "raw": " 412 files changed, 181329 insertions(+)\n",
-            "count": 181329
+            "insertions": 181323,
+            "deletions": 0,
+            "files_changed": 410
           }
         }
       }
@@ -242,8 +252,9 @@ stdout:
             "from": null,
             "to": "1.1.3",
             "diffstat": {
-              "raw": " 12 files changed, 2585 insertions(+)\n",
-              "count": 2585
+              "insertions": 2578,
+              "deletions": 0,
+              "files_changed": 10
             }
           }
         },
@@ -257,8 +268,9 @@ stdout:
             "from": null,
             "to": "6.0.0",
             "diffstat": {
-              "raw": " 23 files changed, 2918 insertions(+)\n",
-              "count": 2918
+              "insertions": 2911,
+              "deletions": 0,
+              "files_changed": 21
             }
           }
         },
@@ -272,8 +284,9 @@ stdout:
             "from": null,
             "to": "0.15.0",
             "diffstat": {
-              "raw": " 18 files changed, 6165 insertions(+)\n",
-              "count": 6165
+              "insertions": 5196,
+              "deletions": 0,
+              "files_changed": 15
             }
           }
         },
@@ -287,8 +300,9 @@ stdout:
             "from": null,
             "to": "1.8.1",
             "diffstat": {
-              "raw": " 33 files changed, 9452 insertions(+)\n",
-              "count": 9452
+              "insertions": 9445,
+              "deletions": 0,
+              "files_changed": 31
             }
           }
         },
@@ -302,8 +316,9 @@ stdout:
             "from": null,
             "to": "0.11.10",
             "diffstat": {
-              "raw": " 63 files changed, 21663 insertions(+)\n",
-              "count": 21663
+              "insertions": 19797,
+              "deletions": 0,
+              "files_changed": 60
             }
           }
         },
@@ -317,8 +332,9 @@ stdout:
             "from": null,
             "to": "1.0.79",
             "diffstat": {
-              "raw": " 88 files changed, 22855 insertions(+)\n",
-              "count": 22855
+              "insertions": 22848,
+              "deletions": 0,
+              "files_changed": 86
             }
           }
         },
@@ -332,8 +348,9 @@ stdout:
             "from": null,
             "to": "1.17.0",
             "diffstat": {
-              "raw": " 405 files changed, 91278 insertions(+)\n",
-              "count": 91278
+              "insertions": 91271,
+              "deletions": 0,
+              "files_changed": 403
             }
           }
         }
@@ -349,8 +366,9 @@ stdout:
             "from": null,
             "to": "0.1.19",
             "diffstat": {
-              "raw": " 11 files changed, 938 insertions(+)\n",
-              "count": 938
+              "insertions": 932,
+              "deletions": 0,
+              "files_changed": 9
             }
           }
         },
@@ -364,8 +382,9 @@ stdout:
             "from": null,
             "to": "0.2.123",
             "diffstat": {
-              "raw": " 217 files changed, 94067 insertions(+)\n",
-              "count": 94067
+              "insertions": 94060,
+              "deletions": 0,
+              "files_changed": 215
             }
           }
         },
@@ -379,14 +398,15 @@ stdout:
             "from": null,
             "to": "0.3.9",
             "diffstat": {
-              "raw": " 412 files changed, 181329 insertions(+)\n",
-              "count": 181329
+              "insertions": 181323,
+              "deletions": 0,
+              "files_changed": 410
             }
           }
         }
       ]
     },
-    "total_lines": 433250
+    "total_lines": 430361
   }
 }
 stderr:
diff --git a/tests/snapshots/test_cli__test-project-suggest-shallow.snap b/tests/snapshots/test_cli__test-project-suggest-shallow.snap
index d9f9565..51109f3 100644
--- a/tests/snapshots/test_cli__test-project-suggest-shallow.snap
+++ b/tests/snapshots/test_cli__test-project-suggest-shallow.snap
@@ -4,20 +4,20 @@ expression: format_outputs(&output)
 ---
 stdout:
 recommended audits for safe-to-deploy:
-    cargo vet inspect termcolor 1.1.3     (used by clap)                              (2585 lines)
-    cargo vet inspect os_str_bytes 6.0.0  (used by clap)                              (2918 lines)
-    cargo vet inspect textwrap 0.15.0     (used by clap)                              (6165 lines)
-    cargo vet inspect indexmap 1.8.1      (used by h2, clap)                          (9452 lines)
-    cargo vet inspect reqwest 0.11.10     (used by test-project)                      (21663 lines)
-    cargo vet inspect serde_json 1.0.79   (used by reqwest, test-project)             (22855 lines)
-    cargo vet inspect tokio 1.17.0        (used by h2, hyper, reqwest, and 4 others)  (91278 lines)
+    cargo vet inspect termcolor 1.1.3     (used by clap)                              (2578 lines)
+    cargo vet inspect os_str_bytes 6.0.0  (used by clap)                              (2911 lines)
+    cargo vet inspect textwrap 0.15.0     (used by clap)                              (5196 lines)
+    cargo vet inspect indexmap 1.8.1      (used by h2, clap)                          (9445 lines)
+    cargo vet inspect reqwest 0.11.10     (used by test-project)                      (19797 lines)
+    cargo vet inspect serde_json 1.0.79   (used by reqwest, test-project)             (22848 lines)
+    cargo vet inspect tokio 1.17.0        (used by h2, hyper, reqwest, and 4 others)  (91271 lines)
 
 recommended audits for safe-to-run:
-    cargo vet inspect hermit-abi 0.1.19  (used by atty)                                     (938 lines)
-    cargo vet inspect libc 0.2.123       (used by mio, atty, tokio, openssl, and 8 others)  (94067 lines)
-    cargo vet inspect winapi 0.3.9       (used by mio, atty, miow, ntapi, and 7 others)     (181329 lines)
+    cargo vet inspect hermit-abi 0.1.19  (used by atty)                                     (932 lines)
+    cargo vet inspect libc 0.2.123       (used by mio, atty, tokio, openssl, and 8 others)  (94060 lines)
+    cargo vet inspect winapi 0.3.9       (used by mio, atty, miow, ntapi, and 7 others)     (181323 lines)
 
-estimated audit backlog: 433250 lines
+estimated audit backlog: 430361 lines
 
 Use |cargo vet certify| to record the audits.
 
diff --git a/tests/snapshots/test_cli__test-project-suggest.snap b/tests/snapshots/test_cli__test-project-suggest.snap
index eb655c4..482e8d4 100644
--- a/tests/snapshots/test_cli__test-project-suggest.snap
+++ b/tests/snapshots/test_cli__test-project-suggest.snap
@@ -4,108 +4,108 @@ expression: format_outputs(&output)
 ---
 stdout:
 recommended audits for safe-to-deploy:
-    cargo vet inspect termcolor 1.1.3                     (used by clap)                                              (2585 lines)
-    cargo vet inspect os_str_bytes 6.0.0                  (used by clap)                                              (2918 lines)
-    cargo vet inspect textwrap 0.15.0                     (used by clap)                                              (6165 lines)
-    cargo vet inspect indexmap 1.8.1                      (used by h2, clap)                                          (9452 lines)
-    cargo vet inspect reqwest 0.11.10                     (used by test-project)                                      (21663 lines)
-    cargo vet inspect serde_json 1.0.79                   (used by reqwest, test-project)                             (22855 lines)
-    cargo vet inspect tokio 1.17.0                        (used by h2, hyper, reqwest, and 4 others)                  (91278 lines)
-    cargo vet inspect libc 0.2.123                        (used by mio, atty, tokio, openssl, and 8 others)           (94067 lines)
-    cargo vet inspect winapi 0.3.9                        (used by mio, atty, miow, ntapi, and 7 others)              (181329 lines)
-    cargo vet inspect tinyvec_macros 0.1.0                (used by tinyvec)                                           (87 lines)
-    cargo vet inspect matches 0.1.9                       (used by url, idna, form_urlencoded)                        (211 lines)
-    cargo vet inspect foreign-types-shared 0.1.1          (used by foreign-types)                                     (303 lines)
-    cargo vet inspect try-lock 0.2.3                      (used by want)                                              (386 lines)
-    cargo vet inspect openssl-probe 0.1.5                 (used by native-tls)                                        (456 lines)
-    cargo vet inspect tower-service 0.3.1                 (used by hyper)                                             (507 lines)
-    cargo vet inspect wasm-bindgen-shared 0.2.80          (used by wasm-bindgen-backend, wasm-bindgen-macro-support)  (516 lines)
-    cargo vet inspect pin-utils 0.1.0                     (used by futures-util)                                      (544 lines)
-    cargo vet inspect futures-sink 0.3.21                 (used by h2, tokio-util)                                    (551 lines)
-    cargo vet inspect foreign-types 0.3.2                 (used by openssl)                                           (584 lines)
-    cargo vet inspect cfg-if 1.0.0                        (used by log, instant, openssl, and 5 others)               (588 lines)
-    cargo vet inspect remove_dir_all 0.5.3                (used by tempfile)                                          (598 lines)
-    cargo vet inspect instant 0.1.12                      (used by fastrand)                                          (678 lines)
-    cargo vet inspect form_urlencoded 1.0.1               (used by url, serde_urlencoded)                             (695 lines)
-    cargo vet inspect want 0.3.0                          (used by hyper)                                             (703 lines)
-    cargo vet inspect percent-encoding 2.1.0              (used by url, reqwest, form_urlencoded)                     (708 lines)
-    cargo vet inspect fnv 1.0.7                           (used by h2, http)                                          (736 lines)
-    cargo vet inspect itoa 1.0.1                          (used by http, hyper, serde_json, serde_urlencoded)         (796 lines)
-    cargo vet inspect lazy_static 1.4.0                   (used by reqwest, schannel, and 3 others)                   (882 lines)
-    cargo vet inspect httpdate 1.0.2                      (used by hyper)                                             (1001 lines)
-    cargo vet inspect winapi-util 0.1.5                   (used by termcolor)                                         (1101 lines)
-    cargo vet inspect winapi-i686-pc-windows-gnu 0.4.0    (used by winapi)                                            (1133 lines)
-    cargo vet inspect winapi-x86_64-pc-windows-gnu 0.4.0  (used by winapi)                                            (1168 lines)
-    cargo vet inspect futures-core 0.3.21                 (used by h2, hyper, reqwest, and 3 others)                  (1182 lines)
-    cargo vet inspect futures-task 0.3.21                 (used by futures-util)                                      (1187 lines)
-    cargo vet inspect http-body 0.4.4                     (used by hyper, reqwest)                                    (1262 lines)
-    cargo vet inspect wasm-bindgen-macro 0.2.80           (used by wasm-bindgen)                                      (1275 lines)
-    cargo vet inspect hyper-tls 0.5.0                     (used by reqwest)                                           (1301 lines)
-    cargo vet inspect wasm-bindgen-futures 0.4.30         (used by reqwest)                                           (1304 lines)
-    cargo vet inspect fastrand 1.7.0                      (used by tempfile)                                          (1375 lines)
-    cargo vet inspect mime 0.3.16                         (used by reqwest)                                           (1721 lines)
-    cargo vet inspect pkg-config 0.3.25                   (used by openssl-sys)                                       (1754 lines)
-    cargo vet inspect tokio-native-tls 0.3.0              (used by reqwest, hyper-tls)                                (1804 lines)
-    cargo vet inspect wasm-bindgen-macro-support 0.2.80   (used by wasm-bindgen-macro)                                (1966 lines)
-    cargo vet inspect core-foundation-sys 0.8.3           (used by core-foundation, and 2 others)                     (1971 lines)
-    cargo vet inspect security-framework-sys 2.6.1        (used by native-tls, security-framework)                    (2023 lines)
-    cargo vet inspect unicode-xid 0.2.2                   (used by syn, proc-macro2)                                  (2050 lines)
-    cargo vet inspect serde_urlencoded 0.7.1              (used by reqwest)                                           (2127 lines)
-    cargo vet inspect slab 0.4.6                          (used by h2)                                                (2622 lines)
-    cargo vet inspect wasm-bindgen-backend 0.2.80         (used by wasm-bindgen-macro-support)                        (3019 lines)
-    cargo vet inspect miow 0.3.7                          (used by mio)                                               (3135 lines)
-    cargo vet inspect wasi 0.11.0+wasi-snapshot-preview1  (used by mio)                                               (3309 lines)
-    cargo vet inspect unicode-bidi 0.3.7                  (used by idna)                                              (3398 lines)
-    cargo vet inspect quote 1.0.18                        (used by syn, and 4 others)                                 (3845 lines)
-    cargo vet inspect redox_syscall 0.2.13                (used by tempfile)                                          (3897 lines)
-    cargo vet inspect core-foundation 0.9.3               (used by security-framework)                                (3960 lines)
-    cargo vet inspect tracing-attributes 0.1.20           (used by tracing)                                           (3964 lines)
-    cargo vet inspect ipnet 2.4.0                         (used by reqwest)                                           (3980 lines)
-    cargo vet inspect futures-channel 0.3.21              (used by hyper)                                             (3999 lines)
-    cargo vet inspect tempfile 3.3.0                      (used by native-tls)                                        (4066 lines)
-    cargo vet inspect native-tls 0.2.10                   (used by reqwest, hyper-tls, tokio-native-tls)              (4089 lines)
-    cargo vet inspect once_cell 1.10.0                    (used by openssl)                                           (4140 lines)
-    cargo vet inspect winreg 0.10.1                       (used by reqwest)                                           (4276 lines)
-    cargo vet inspect ryu 1.0.9                           (used by serde_json, serde_urlencoded)                      (4531 lines)
-    cargo vet inspect schannel 0.1.19                     (used by native-tls)                                        (4607 lines)
-    cargo vet inspect log 0.4.16                          (used by mio, want, reqwest, and 2 others)                  (5632 lines)
-    cargo vet inspect proc-macro2 1.0.37                  (used by syn, quote, and 3 others)                          (5702 lines)
-    cargo vet inspect socket2 0.4.4                       (used by hyper, tokio)                                      (6018 lines)
-    cargo vet inspect pin-project-lite 0.2.8              (used by hyper, tokio, reqwest, and 4 others)               (6107 lines)
-    cargo vet inspect tracing-core 0.1.25                 (used by tracing)                                           (6163 lines)
-    cargo vet inspect cc 1.0.73                           (used by openssl-sys)                                       (6671 lines)
-    cargo vet inspect httparse 1.7.0                      (used by hyper)                                             (7265 lines)
-    cargo vet inspect memchr 2.4.1                        (used by tokio, os_str_bytes)                               (8718 lines)
-    cargo vet inspect bytes 1.1.0                         (used by h2, http, hyper, tokio, and 4 others)              (9213 lines)
-    cargo vet inspect openssl-sys 0.9.72                  (used by openssl, native-tls)                               (9484 lines)
-    cargo vet inspect security-framework 2.6.1            (used by native-tls)                                        (9776 lines)
-    cargo vet inspect bumpalo 3.9.1                       (used by wasm-bindgen-backend)                              (10106 lines)
-    cargo vet inspect tracing 0.1.33                      (used by h2, hyper, tokio-util)                             (10957 lines)
-    cargo vet inspect mio 0.8.2                           (used by tokio)                                             (11882 lines)
-    cargo vet inspect js-sys 0.3.57                       (used by reqwest, web-sys, wasm-bindgen-futures)            (12875 lines)
-    cargo vet inspect tokio-util 0.7.1                    (used by h2)                                                (13877 lines)
-    cargo vet inspect hashbrown 0.11.2                    (used by indexmap)                                          (14609 lines)
-    cargo vet inspect serde 1.0.136                       (used by reqwest, serde_json, serde_urlencoded)             (16148 lines)
-    cargo vet inspect url 2.2.2                           (used by reqwest)                                           (16350 lines)
-    cargo vet inspect tinyvec 1.5.1                       (used by unicode-normalization)                             (16758 lines)
-    cargo vet inspect http 0.2.6                          (used by h2, hyper, reqwest, http-body)                     (16826 lines)
-    cargo vet inspect wasm-bindgen 0.2.80                 (used by js-sys, reqwest, web-sys, wasm-bindgen-futures)    (20978 lines)
-    cargo vet inspect ntapi 0.3.7                         (used by mio)                                               (21234 lines)
-    cargo vet inspect futures-util 0.3.21                 (used by h2, hyper, reqwest)                                (25074 lines)
-    cargo vet inspect hyper 0.14.18                       (used by reqwest, hyper-tls)                                (25617 lines)
-    cargo vet inspect h2 0.3.13                           (used by hyper, reqwest)                                    (26066 lines)
-    cargo vet diff syn 1.0.0 1.0.91                       (used by tracing-attributes, and 2 others)                  (93 files changed, 21776 insertions(+), 6701 deletions(-))
-    cargo vet inspect unicode-normalization 0.1.19        (used by idna)                                              (28628 lines)
-    cargo vet inspect openssl 0.10.38                     (used by native-tls)                                        (28634 lines)
-    cargo vet inspect idna 0.2.3                          (used by url)                                               (32538 lines)
-    cargo vet inspect vcpkg 0.2.15                        (used by openssl-sys)                                       (42648 lines)
-    cargo vet inspect web-sys 0.3.57                      (used by reqwest, wasm-bindgen-futures)                     (197014 lines)
-    cargo vet inspect encoding_rs 0.8.31                  (used by reqwest)                                           (507252 lines)
+    cargo vet inspect termcolor 1.1.3                     (used by clap)                                              (2578 lines)
+    cargo vet inspect os_str_bytes 6.0.0                  (used by clap)                                              (2911 lines)
+    cargo vet inspect textwrap 0.15.0                     (used by clap)                                              (5196 lines)
+    cargo vet inspect indexmap 1.8.1                      (used by h2, clap)                                          (9445 lines)
+    cargo vet inspect reqwest 0.11.10                     (used by test-project)                                      (19797 lines)
+    cargo vet inspect serde_json 1.0.79                   (used by reqwest, test-project)                             (22848 lines)
+    cargo vet inspect tokio 1.17.0                        (used by h2, hyper, reqwest, and 4 others)                  (91271 lines)
+    cargo vet inspect libc 0.2.123                        (used by mio, atty, tokio, openssl, and 8 others)           (94060 lines)
+    cargo vet inspect winapi 0.3.9                        (used by mio, atty, miow, ntapi, and 7 others)              (181323 lines)
+    cargo vet inspect tinyvec_macros 0.1.0                (used by tinyvec)                                           (81 lines)
+    cargo vet inspect matches 0.1.9                       (used by url, idna, form_urlencoded)                        (210 lines)
+    cargo vet inspect foreign-types-shared 0.1.1          (used by foreign-types)                                     (302 lines)
+    cargo vet inspect try-lock 0.2.3                      (used by want)                                              (380 lines)
+    cargo vet inspect openssl-probe 0.1.5                 (used by native-tls)                                        (442 lines)
+    cargo vet inspect tower-service 0.3.1                 (used by hyper)                                             (501 lines)
+    cargo vet inspect wasm-bindgen-shared 0.2.80          (used by wasm-bindgen-backend, wasm-bindgen-macro-support)  (515 lines)
+    cargo vet inspect pin-utils 0.1.0                     (used by futures-util)                                      (538 lines)
+    cargo vet inspect futures-sink 0.3.21                 (used by h2, tokio-util)                                    (544 lines)
+    cargo vet inspect cfg-if 1.0.0                        (used by log, instant, openssl, and 5 others)               (582 lines)
+    cargo vet inspect foreign-types 0.3.2                 (used by openssl)                                           (583 lines)
+    cargo vet inspect remove_dir_all 0.5.3                (used by tempfile)                                          (592 lines)
+    cargo vet inspect instant 0.1.12                      (used by fastrand)                                          (672 lines)
+    cargo vet inspect hyper-tls 0.5.0                     (used by reqwest)                                           (673 lines)
+    cargo vet inspect form_urlencoded 1.0.1               (used by url, serde_urlencoded)                             (689 lines)
+    cargo vet inspect want 0.3.0                          (used by hyper)                                             (697 lines)
+    cargo vet inspect percent-encoding 2.1.0              (used by url, reqwest, form_urlencoded)                     (702 lines)
+    cargo vet inspect fnv 1.0.7                           (used by h2, http)                                          (730 lines)
+    cargo vet inspect itoa 1.0.1                          (used by http, hyper, serde_json, serde_urlencoded)         (789 lines)
+    cargo vet inspect lazy_static 1.4.0                   (used by reqwest, schannel, and 3 others)                   (876 lines)
+    cargo vet inspect httpdate 1.0.2                      (used by hyper)                                             (995 lines)
+    cargo vet inspect tokio-native-tls 0.3.0              (used by reqwest, hyper-tls)                                (1089 lines)
+    cargo vet inspect winapi-util 0.1.5                   (used by termcolor)                                         (1095 lines)
+    cargo vet inspect winapi-i686-pc-windows-gnu 0.4.0    (used by winapi)                                            (1132 lines)
+    cargo vet inspect winapi-x86_64-pc-windows-gnu 0.4.0  (used by winapi)                                            (1167 lines)
+    cargo vet inspect futures-core 0.3.21                 (used by h2, hyper, reqwest, and 3 others)                  (1175 lines)
+    cargo vet inspect futures-task 0.3.21                 (used by futures-util)                                      (1180 lines)
+    cargo vet inspect http-body 0.4.4                     (used by hyper, reqwest)                                    (1256 lines)
+    cargo vet inspect wasm-bindgen-macro 0.2.80           (used by wasm-bindgen)                                      (1274 lines)
+    cargo vet inspect wasm-bindgen-futures 0.4.30         (used by reqwest)                                           (1303 lines)
+    cargo vet inspect fastrand 1.7.0                      (used by tempfile)                                          (1368 lines)
+    cargo vet inspect mime 0.3.16                         (used by reqwest)                                           (1715 lines)
+    cargo vet inspect pkg-config 0.3.25                   (used by openssl-sys)                                       (1747 lines)
+    cargo vet inspect core-foundation-sys 0.8.3           (used by core-foundation, and 2 others)                     (1965 lines)
+    cargo vet inspect wasm-bindgen-macro-support 0.2.80   (used by wasm-bindgen-macro)                                (1965 lines)
+    cargo vet inspect security-framework-sys 2.6.1        (used by native-tls, security-framework)                    (2016 lines)
+    cargo vet inspect unicode-xid 0.2.2                   (used by syn, proc-macro2)                                  (2044 lines)
+    cargo vet inspect serde_urlencoded 0.7.1              (used by reqwest)                                           (2120 lines)
+    cargo vet inspect slab 0.4.6                          (used by h2)                                                (2615 lines)
+    cargo vet inspect wasm-bindgen-backend 0.2.80         (used by wasm-bindgen-macro-support)                        (3018 lines)
+    cargo vet inspect miow 0.3.7                          (used by mio)                                               (3129 lines)
+    cargo vet inspect unicode-bidi 0.3.7                  (used by idna)                                              (3217 lines)
+    cargo vet inspect wasi 0.11.0+wasi-snapshot-preview1  (used by mio)                                               (3302 lines)
+    cargo vet inspect native-tls 0.2.10                   (used by reqwest, hyper-tls, tokio-native-tls)              (3715 lines)
+    cargo vet inspect once_cell 1.10.0                    (used by openssl)                                           (3766 lines)
+    cargo vet inspect quote 1.0.18                        (used by syn, and 4 others)                                 (3838 lines)
+    cargo vet inspect redox_syscall 0.2.13                (used by tempfile)                                          (3890 lines)
+    cargo vet inspect winreg 0.10.1                       (used by reqwest)                                           (3920 lines)
+    cargo vet inspect core-foundation 0.9.3               (used by security-framework)                                (3953 lines)
+    cargo vet inspect tracing-attributes 0.1.20           (used by tracing)                                           (3957 lines)
+    cargo vet inspect ipnet 2.4.0                         (used by reqwest)                                           (3973 lines)
+    cargo vet inspect futures-channel 0.3.21              (used by hyper)                                             (3992 lines)
+    cargo vet inspect tempfile 3.3.0                      (used by native-tls)                                        (4059 lines)
+    cargo vet inspect ryu 1.0.9                           (used by serde_json, serde_urlencoded)                      (4362 lines)
+    cargo vet inspect schannel 0.1.19                     (used by native-tls)                                        (4601 lines)
+    cargo vet inspect log 0.4.16                          (used by mio, want, reqwest, and 2 others)                  (5625 lines)
+    cargo vet inspect proc-macro2 1.0.37                  (used by syn, quote, and 3 others)                          (5695 lines)
+    cargo vet inspect socket2 0.4.4                       (used by hyper, tokio)                                      (6011 lines)
+    cargo vet inspect pin-project-lite 0.2.8              (used by hyper, tokio, reqwest, and 4 others)               (6100 lines)
+    cargo vet inspect tracing-core 0.1.25                 (used by tracing)                                           (6156 lines)
+    cargo vet inspect cc 1.0.73                           (used by openssl-sys)                                       (6554 lines)
+    cargo vet inspect httparse 1.7.0                      (used by hyper)                                             (7258 lines)
+    cargo vet inspect memchr 2.4.1                        (used by tokio, os_str_bytes)                               (8712 lines)
+    cargo vet inspect bytes 1.1.0                         (used by h2, http, hyper, tokio, and 4 others)              (9207 lines)
+    cargo vet inspect security-framework 2.6.1            (used by native-tls)                                        (9316 lines)
+    cargo vet inspect openssl-sys 0.9.72                  (used by openssl, native-tls)                               (9477 lines)
+    cargo vet inspect bumpalo 3.9.1                       (used by wasm-bindgen-backend)                              (10099 lines)
+    cargo vet inspect tracing 0.1.33                      (used by h2, hyper, tokio-util)                             (10950 lines)
+    cargo vet inspect mio 0.8.2                           (used by tokio)                                             (11719 lines)
+    cargo vet inspect js-sys 0.3.57                       (used by reqwest, web-sys, wasm-bindgen-futures)            (12874 lines)
+    cargo vet inspect tokio-util 0.7.1                    (used by h2)                                                (13870 lines)
+    cargo vet inspect hashbrown 0.11.2                    (used by indexmap)                                          (14603 lines)
+    cargo vet inspect serde 1.0.136                       (used by reqwest, serde_json, serde_urlencoded)             (16141 lines)
+    cargo vet inspect url 2.2.2                           (used by reqwest)                                           (16344 lines)
+    cargo vet inspect tinyvec 1.5.1                       (used by unicode-normalization)                             (16751 lines)
+    cargo vet inspect http 0.2.6                          (used by h2, hyper, reqwest, http-body)                     (16819 lines)
+    cargo vet inspect wasm-bindgen 0.2.80                 (used by js-sys, reqwest, web-sys, wasm-bindgen-futures)    (20977 lines)
+    cargo vet inspect ntapi 0.3.7                         (used by mio)                                               (21227 lines)
+    cargo vet inspect hyper 0.14.18                       (used by reqwest, hyper-tls)                                (24841 lines)
+    cargo vet inspect futures-util 0.3.21                 (used by h2, hyper, reqwest)                                (25067 lines)
+    cargo vet inspect h2 0.3.13                           (used by hyper, reqwest)                                    (25417 lines)
+    cargo vet inspect openssl 0.10.38                     (used by native-tls)                                        (28435 lines)
+    cargo vet diff syn 1.0.0 1.0.91                       (used by tracing-attributes, and 2 others)                  (92 files changed, 21772 insertions(+), 6698 deletions(-))
+    cargo vet inspect unicode-normalization 0.1.19        (used by idna)                                              (28622 lines)
+    cargo vet inspect idna 0.2.3                          (used by url)                                               (32532 lines)
+    cargo vet inspect vcpkg 0.2.15                        (used by openssl-sys)                                       (42642 lines)
+    cargo vet inspect web-sys 0.3.57                      (used by reqwest, wasm-bindgen-futures)                     (197013 lines)
+    cargo vet inspect encoding_rs 0.8.31                  (used by reqwest)                                           (507245 lines)
 
 recommended audits for safe-to-run:
-    cargo vet inspect hermit-abi 0.1.19  (used by atty)  (938 lines)
+    cargo vet inspect hermit-abi 0.1.19  (used by atty)  (932 lines)
 
-estimated audit backlog: 1742618 lines
+estimated audit backlog: 1734141 lines
 
 Use |cargo vet certify| to record the audits.
 
diff --git a/tests/test-cli.rs b/tests/test-cli.rs
index e546579..6d7baf0 100644
--- a/tests/test-cli.rs
+++ b/tests/test-cli.rs
@@ -15,7 +15,7 @@
 // the env as `CARGO_BIN_EXE_<name>`.
 
 use std::{
-    path::PathBuf,
+    path::{Path, PathBuf},
     process::{Command, Output, Stdio},
 };
 
@@ -342,3 +342,66 @@ fn test_project_bad_certify_json() {
     insta::assert_snapshot!("test-project-bad-certify-json", format_outputs(&output));
     assert!(!output.status.success(), "{}", output.status);
 }
+
+#[test]
+fn test_project_diff_output() {
+    // Test that the diff output from `cargo vet diff` is correctly filtered to
+    // remove files like .cargo_vcs_info.json.
+
+    let project = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
+        .join("tests")
+        .join("test-project");
+    let bin = env!("CARGO_BIN_EXE_cargo-vet");
+    let mut child = Command::new(bin)
+        .current_dir(&project)
+        .arg("vet")
+        .arg("diff")
+        .arg("--mode")
+        .arg("local")
+        .arg("syn")
+        .arg("1.0.90")
+        .arg("1.0.91")
+        .stdout(Stdio::piped())
+        .stderr(Stdio::piped())
+        .stdin(Stdio::piped())
+        .spawn()
+        .unwrap();
+
+    std::io::Write::write_all(child.stdin.as_mut().unwrap(), b"\n").unwrap();
+
+    let output = child.wait_with_output().unwrap();
+
+    // Filter out lines which may contain paths so that the output is portable,
+    // while preserving some of the general format.
+    let stdout = std::str::from_utf8(&output.stdout)
+        .unwrap()
+        .lines()
+        .filter(|line| !line.starts_with("diff --git"))
+        .map(|line| {
+            if let Some(path) = line.strip_prefix("--- ") {
+                return format!(
+                    "--- a/{}",
+                    Path::new(path).file_name().unwrap().to_str().unwrap()
+                );
+            }
+            if let Some(path) = line.strip_prefix("+++ ") {
+                return format!(
+                    "+++ b/{}",
+                    Path::new(path).file_name().unwrap().to_str().unwrap()
+                );
+            }
+            line.to_owned()
+        })
+        .collect::<Vec<_>>()
+        .join("\n");
+    let stderr = std::str::from_utf8(&output.stderr)
+        .unwrap()
+        .lines()
+        .filter(|line| !line.starts_with("Blocking: waiting for file lock"))
+        .collect::<Vec<_>>()
+        .join("\n");
+    let formatted = format!("stdout:\n{stdout}\nstderr:\n{stderr}");
+
+    insta::assert_snapshot!("test-project-diff-output", formatted);
+    assert!(output.status.success(), "{}", output.status);
+}