qlty_analysis/workspace_entries/
diff_source.rs1use 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}