diff options
Diffstat (limited to 'src/diff_thread/server.rs')
-rw-r--r-- | src/diff_thread/server.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/diff_thread/server.rs b/src/diff_thread/server.rs new file mode 100644 index 0000000..d6d43ab --- /dev/null +++ b/src/diff_thread/server.rs @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: EUPL-1.2 +// SPDX-FileCopyrightText: 2021 Alyssa Ross <hi@alyssa.is> + +use super::{FileDiff, MakeDiff}; + +use std::sync::mpsc::{Receiver, SyncSender}; + +use git2::Repository; + +pub fn main( + repository: &Repository, + receiver: Receiver<(impl MakeDiff, SyncSender<Result<FileDiff, git2::Error>>)>, +) { + for (diff_maker, sender) in receiver { + let diff = match diff_maker.make_diff(&repository) { + Ok(diff) => diff, + Err(e) => { + let _ = sender.send(Err(e)); + return; + } + }; + + if let Err(e) = diff.foreach( + &mut |delta, _| { + let _ = sender.send(Ok(FileDiff { + status: delta.status(), + old_path: delta.old_file().path().map(Into::into), + })); + + true + }, + None, + None, + None, + ) { + let _ = sender.send(Err(e)); + } + } +} |