From bb7eb0e14f2dc7fdb515463e0d91334e3d9417b4 Mon Sep 17 00:00:00 2001 From: Warren Hood Date: Wed, 9 Oct 2024 01:41:57 +0200 Subject: [PATCH] Show diff of files when applying merges --- Cargo.lock | 7 +++++++ mcmpmgr/Cargo.toml | 1 + mcmpmgr/src/modpack.rs | 14 +++++++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 9465752..77a5d35 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2078,6 +2078,7 @@ dependencies = [ "serde_yaml", "sha1", "sha2", + "similar", "tempfile", "tokio", "toml", @@ -3294,6 +3295,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "similar" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" + [[package]] name = "siphasher" version = "0.3.11" diff --git a/mcmpmgr/Cargo.toml b/mcmpmgr/Cargo.toml index 6fb1eb2..89bad8b 100644 --- a/mcmpmgr/Cargo.toml +++ b/mcmpmgr/Cargo.toml @@ -17,6 +17,7 @@ serde_json = "1.0.128" serde_yaml = "0.9.34" sha1 = "0.10.6" sha2 = "0.10.8" +similar = "2.6.0" tempfile = "3.12.0" tokio = { version = "1.39.2", features = ["full"] } toml = { version = "0.8.19", features = ["preserve_order"] } diff --git a/mcmpmgr/src/modpack.rs b/mcmpmgr/src/modpack.rs index a8e6b6d..459ee7a 100644 --- a/mcmpmgr/src/modpack.rs +++ b/mcmpmgr/src/modpack.rs @@ -6,6 +6,7 @@ use crate::{ }; use anyhow::{Context, Result}; use serde::{Deserialize, Serialize}; +use similar::{ChangeTag, TextDiff}; use std::{ collections::{BTreeMap, BTreeSet}, path::{Path, PathBuf}, @@ -298,9 +299,20 @@ impl ModpackMeta { ) .with_context(|| format!("Failed to merge file {src:?} -> {dst:?}"))?; - std::fs::write(dst, merged_contents).with_context(|| { + std::fs::write(dst, &merged_contents).with_context(|| { format!("Failed to write merged contents of {src:?} -> {dst:?}") })?; + + println!("Successfully merged {src:?} -> {dst:?}. See diff below:"); + let diff = TextDiff::from_lines(&dst_val, &merged_contents); + for change in diff.iter_all_changes() { + let sign = match change.tag() { + ChangeTag::Delete => "-", + ChangeTag::Insert => "+", + ChangeTag::Equal => " ", + }; + print!("{}{}", sign, change); + } } else { println!("Syncing file {} -> {}", src.display(), dst.display()); std::fs::copy(src, dst)?;