use rebackup::{WalkerItemType, WalkerRule, WalkerRuleResult};
use std::env;
use std::ffi::OsString;
use std::process::Command;
pub fn rust_cargo_build() -> WalkerRule {
WalkerRule {
name: "rust_cargo_build",
description: None,
only_for: Some(WalkerItemType::Directory),
matches: Box::new(|path, _, _| path.file_name() == Some(OsString::from("target").as_os_str()) && path.join("..").join("Cargo.toml").is_file()),
action: Box::new(|_, _, _| Ok(WalkerRuleResult::ExcludeItem)),
}
}
pub fn nomedia() -> WalkerRule {
WalkerRule {
name: "nomedia",
description: None,
only_for: Some(WalkerItemType::Directory),
matches: Box::new(|path, _, _| path.join(".nomedia").is_file()),
action: Box::new(|_, _, _| Ok(WalkerRuleResult::ExcludeItem)),
}
}
pub fn dotgit() -> WalkerRule {
WalkerRule {
name: "dotgit",
description: None,
only_for: Some(WalkerItemType::Directory),
matches: Box::new(|path, _, _| path.file_name() == Some(OsString::from(".git").as_os_str())),
action: Box::new(|_, _, _| Ok(WalkerRuleResult::ExcludeItem)),
}
}
pub fn node_modules() -> WalkerRule {
WalkerRule {
name: "node_modules",
description: None,
only_for: Some(WalkerItemType::Directory),
matches: Box::new(|path, _, _| path.file_name() == Some(OsString::from("node_modules").as_os_str())),
action: Box::new(|_, _, _| Ok(WalkerRuleResult::ExcludeItem)),
}
}
pub fn gitignore() -> WalkerRule {
WalkerRule {
name: "gitignore",
description: None,
only_for: None,
matches: Box::new(|path, _, _| path.ancestors().any(|path| path.join(".git").is_dir())),
action: Box::new(|dir, _, _| {
let cwd = env::current_dir()?;
if dir.is_dir() {
env::set_current_dir(dir)?;
} else if let Some(parent) = dir.parent() {
env::set_current_dir(parent)?;
}
let is_excluded = Command::new("git").arg("check-ignore").arg(dir.to_string_lossy().to_string()).output();
env::set_current_dir(cwd)?;
if is_excluded?.status.success() {
Ok(WalkerRuleResult::ExcludeItem)
} else {
Ok(WalkerRuleResult::IncludeItem)
}
}),
}
}
fn main() {
println!("This example is not runnable by itself.");
println!("Its purpose is to show how to make simple or advanced rules for the walker.");
println!("Please check the example's source code for more informations");
}