gitai/remote/
check.rs

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}