use std::sync::atomic::AtomicBool;
use super::{Failure, Limits, Report};
use crate::{ObjectId, Repository};
impl Repository {
pub fn checkout_tree(
&self,
baseline: Option<ObjectId>,
target: Option<ObjectId>,
limits: Limits,
cancel: &AtomicBool,
) -> Result<Report, Failure> {
let _lock_operation = crate::locks::operation();
for id in baseline.into_iter().chain(target) {
id.require_format(self.object_format())
.map_err(|error| Failure {
cause: Box::new(error.into()),
report: Report::default(),
cleanup: vec![],
})?;
}
#[cfg(any(target_os = "linux", target_os = "macos"))]
return super::worktree::run(self, baseline, target, limits, cancel, &mut |_, _| Ok(()));
#[cfg(not(any(target_os = "linux", target_os = "macos")))]
{
let _ = (baseline, target, limits);
let cause = if cancel.load(std::sync::atomic::Ordering::Relaxed) {
super::Error::Cancelled
} else {
super::types::refused(b"", "checkout requires Linux/macOS")
};
Err(Failure {
cause: Box::new(cause),
report: Report::default(),
cleanup: vec![],
})
}
}
}