use super::Snapshot;
use super::{BackendMarker, BackendOps};
use crate::global::ChrootVerified;
use crate::LogCommand;
use anyhow::Result as AResult;
use std::path::Path;
use std::process::Command;
pub(super) struct BtrfsMarker;
impl BackendMarker for BtrfsMarker {}
pub(super) type BtrfsBackend = Snapshot<BtrfsMarker>;
impl BackendOps for BtrfsBackend {
fn make_blank(&mut self) -> AResult<()> {
let target = self.target.take().unwrap().verify(false)?;
log::info!("Creating blank chroot {target}");
let target: &Path = ⌖
let mut cmd = Command::new("btrfs");
cmd.args(["subvolume", "create"]).arg(target);
execcmd(&mut cmd, self.dry_run)
}
fn duplicate(&mut self, source: ChrootVerified) -> AResult<()> {
let target = self.target.take().unwrap().verify(false)?;
log::info!("Snapshotting {source} to create chroot {target}");
let source: &Path = &source;
let target: &Path = ⌖
let mut cmd = Command::new("btrfs");
cmd.args(["subvolume", "snapshot"]).arg(source).arg(target);
execcmd(&mut cmd, self.dry_run)
}
fn delete(&mut self) -> AResult<()> {
let target = self.target.take().unwrap().verify(true)?;
log::info!("Deleting chroot {target}");
let target: &Path = ⌖
let mut cmd = Command::new("btrfs");
cmd.args(["subvolume", "delete"]).arg(target);
execcmd(&mut cmd, self.dry_run)
}
}
fn execcmd(cmd: &mut Command, dry_run: bool) -> AResult<()> {
const CMDFAIL: &str = "Btrfs command failed";
cmd.log("Command");
if dry_run || cmd.status()?.success() {
Ok(())
} else {
log::error!("{CMDFAIL}");
anyhow::bail!(CMDFAIL)
}
}