use glob::glob;
use std::collections::HashSet;
use std::path::{Path, PathBuf};
use super::helpers;
use crate::core::index::{oxenignore, CommitEntryReader, Stager};
use crate::{api, error::OxenError, model::LocalRepository};
pub fn add<P: AsRef<Path>>(repo: &LocalRepository, path: P) -> Result<(), OxenError> {
let stager = Stager::new_with_merge(repo)?;
let commit = api::local::commits::head_commit(repo)?;
let reader = CommitEntryReader::new(repo, &commit)?;
let ignore = oxenignore::create(repo);
log::debug!("---START--- oxen add: {:?}", path.as_ref());
let mut paths: HashSet<PathBuf> = HashSet::new();
if let Some(path_str) = path.as_ref().to_str() {
if helpers::is_glob_path(path_str) {
for entry in glob(path_str)? {
paths.insert(entry?);
}
let pattern_entries = api::local::commits::glob_entry_paths(repo, &commit, path_str)?;
paths.extend(pattern_entries);
} else {
paths.insert(path.as_ref().to_owned());
}
}
for path in paths {
stager.add(path.as_ref(), &reader, &ignore)?;
}
log::debug!("---END--- oxen add: {:?}", path.as_ref());
Ok(())
}