45 lines
1.3 KiB
Rust
45 lines
1.3 KiB
Rust
use std::path::Path;
|
|
|
|
use anyhow::{bail, Result};
|
|
|
|
use crate::app::{Add, Run};
|
|
use crate::db::DatabaseFile;
|
|
use crate::{config, util};
|
|
|
|
impl Run for Add {
|
|
fn run(&self) -> Result<()> {
|
|
// These characters can't be printed cleanly to a single line, so they can cause confusion
|
|
// when writing to fzf / stdout.
|
|
const EXCLUDE_CHARS: &[char] = &['\n', '\r'];
|
|
|
|
let data_dir = config::data_dir()?;
|
|
let exclude_dirs = config::exclude_dirs()?;
|
|
let max_age = config::maxage()?;
|
|
let now = util::current_time()?;
|
|
|
|
let mut db = DatabaseFile::new(data_dir);
|
|
let mut db = db.open()?;
|
|
|
|
for path in &self.paths {
|
|
let path = if config::resolve_symlinks() { util::canonicalize } else { util::resolve_path }(path)?;
|
|
let path = util::path_to_str(&path)?;
|
|
|
|
// Ignore path if it contains unsupported characters, or if it's in the exclude list.
|
|
if path.contains(EXCLUDE_CHARS) || exclude_dirs.iter().any(|glob| glob.matches(path)) {
|
|
continue;
|
|
}
|
|
if !Path::new(path).is_dir() {
|
|
bail!("not a directory: {}", path);
|
|
}
|
|
db.add(path, now);
|
|
}
|
|
|
|
if db.modified {
|
|
db.age(max_age);
|
|
db.save()?;
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
}
|