use std::path::PathBuf;
use std::sync::Arc;
use std::sync::mpsc::Sender;
use std::thread;
use crate::storage::git_client::GitClient;
pub struct PreviewLog {
pub path: PathBuf,
pub lines: Vec<String>,
}
pub fn spawn_logs(
client: Arc<dyn GitClient>,
paths: Vec<PathBuf>,
max: usize,
sender: Sender<PreviewLog>,
) {
thread::spawn(move || {
for path in paths {
let lines = client.log(&path, max);
if sender.send(PreviewLog { path, lines }).is_err() {
break;
}
}
});
}
#[cfg(test)]
mod tests {
use std::path::Path;
use std::sync::mpsc;
use super::*;
use crate::domain::repo::GitInfo;
use crate::domain::stats::GitStats;
struct FakeClient;
impl GitClient for FakeClient {
fn collect(&self, _path: &Path) -> GitInfo {
GitInfo::default()
}
fn fetch(&self, _path: &Path) {}
fn log(&self, _path: &Path, _max: usize) -> Vec<String> {
vec!["abc123 commit".to_string()]
}
fn stats(&self, _path: &Path) -> GitStats {
GitStats::default()
}
}
#[test]
fn spawn_logs_streams_every_path() {
let paths = vec![PathBuf::from("/a"), PathBuf::from("/b")];
let (tx, rx) = mpsc::channel();
spawn_logs(Arc::new(FakeClient), paths, 5, tx);
let mut count = 0;
while let Ok(log) = rx.recv() {
assert_eq!(log.lines, vec!["abc123 commit".to_string()]);
count += 1;
}
assert_eq!(count, 2);
}
}