1use std::{path::Path, sync::Arc};
2
3use cause::{Cause, cause};
4use colored::Colorize;
5use folder_compare::FolderCompare;
6use temp_dir::TempDir;
7
8use crate::remote::common::{ErrorType, sequence};
9
10use super::common::{
11 ErrorType::{CheckDifferenceExecution, CheckDifferenceStringReplace},
12 Parsed, Target,
13 sequence::Operation,
14};
15
16#[derive(Debug)]
17struct CheckOperation {}
18
19impl Operation for CheckOperation {
20 fn operate(
21 &self,
22 prefix: &str,
23 parsed: &Parsed,
24 rootdir: &str,
25 tempdir: &TempDir,
26 ) -> Result<bool, Cause<ErrorType>> {
27 compare_with_temp(prefix, parsed, rootdir, tempdir.path())
28 }
29}
30
31pub fn check(target: Target, mode: &sequence::Mode) -> Result<bool, Cause<ErrorType>> {
32 println!("git-wire check started\n");
33 let operation: Arc<dyn Operation + Send + Sync + 'static> = Arc::new(CheckOperation {});
34 let result = sequence::sequence(target, &operation, mode)?;
35 Ok(result)
36}
37
38fn compare_with_temp(
39 prefix: &str,
40 parsed: &Parsed,
41 root: &str,
42 temp: &Path,
43) -> Result<bool, Cause<ErrorType>> {
44 println!(" - {prefix}compare `src` and `dst`");
45
46 let temp_root = temp;
47 let temp = temp.join(parsed.src.as_str());
48 let root = Path::new(root).join(parsed.dst.as_str());
49
50 let fc1 =
51 FolderCompare::new(&temp, &root, &vec![]).map_err(|_| cause!(CheckDifferenceExecution))?;
52 let fc2 =
53 FolderCompare::new(&root, &temp, &vec![]).map_err(|_| cause!(CheckDifferenceExecution))?;
54
55 let mut result = true;
56
57 if !fc1.new_files.is_empty() {
58 let temp_root = temp_root
59 .to_str()
60 .ok_or_else(|| cause!(CheckDifferenceStringReplace))?;
61 for file in fc1.new_files {
62 let file = file
63 .to_str()
64 .ok_or_else(|| cause!(CheckDifferenceStringReplace))?;
65 let file = file.replace(temp_root, "");
66 println!(
67 "{}",
68 format!(" {prefix}! file {file} does not exist").red()
69 );
70 }
71 result = false;
72 }
73 if !fc2.new_files.is_empty() {
74 for file in fc2.new_files {
75 println!(
76 "{}",
77 format!(
78 " {prefix}! file {} does not exist on original",
79 file.display()
80 )
81 .red()
82 );
83 }
84 result = false;
85 }
86 if !fc2.changed_files.is_empty() {
87 for file in fc2.changed_files {
88 println!(
89 "{}",
90 format!(
91 " {prefix}! file {} is not identical to original",
92 file.display()
93 )
94 .red()
95 );
96 }
97 result = false;
98 }
99
100 Ok(result)
101}