qlty_analysis/workspace_entries/
diff_source.rs

1use super::workspace_entry::{WorkspaceEntry, WorkspaceEntryKind};
2use crate::WorkspaceEntrySource;
3use std::{
4    fs,
5    path::{Path, PathBuf},
6    sync::Arc,
7    time::SystemTime,
8};
9use tracing::debug;
10
11#[derive(Debug, Clone)]
12pub struct DiffSource {
13    entries: Arc<Vec<WorkspaceEntry>>,
14}
15
16impl DiffSource {
17    pub fn new(changed_files: Vec<PathBuf>, path: &Path) -> Self {
18        Self {
19            entries: Arc::new(Self::build(&changed_files, path)),
20        }
21    }
22
23    fn build(changed_files: &Vec<PathBuf>, path: &Path) -> Vec<WorkspaceEntry> {
24        let mut entries = vec![];
25        let full_path = path.to_path_buf().join(path);
26
27        if !full_path.exists() {
28            debug!("Changed path does not exist: {}", full_path.display());
29            return entries;
30        }
31
32        for path in changed_files {
33            if let Ok(metadata) = fs::metadata(&full_path) {
34                let content_modified = if let Ok(modified) = metadata.modified() {
35                    modified
36                } else {
37                    SystemTime::UNIX_EPOCH
38                };
39                entries.push(WorkspaceEntry {
40                    path: path.to_owned(),
41                    content_modified,
42                    contents_size: metadata.len(),
43                    kind: WorkspaceEntryKind::File,
44                    language_name: None,
45                });
46            } else {
47                debug!("Failed to get metadata from {}", path.display());
48            }
49        }
50
51        entries
52    }
53}
54
55impl WorkspaceEntrySource for DiffSource {
56    fn entries(&self) -> Arc<Vec<WorkspaceEntry>> {
57        self.entries.clone()
58    }
59}