Sebastian Thielmake fmtea2136b4 years agoHistory
37 lines · 1.2 KB · Rust
RawDownload
use std::{ffi::OsString, path::PathBuf}; use git::prelude::FindExt;use git_repository as git; pub fn from_tree(    mut spec: OsString,    index_path: Option<PathBuf>,    force: bool,    repo: git::Repository,) -> anyhow::Result<()> {    spec.push("^{tree}");    let spec = git::path::os_str_into_bstr(&spec)?;    let tree = repo.rev_parse_single(spec)?;    let index = git::index::State::from_tree(&tree, |oid, buf| repo.objects.find_tree_iter(oid, buf).ok())?;    let options = git::index::write::Options::default();     match index_path {        Some(index_path) => {            if index_path.is_file() && !force {                anyhow::bail!(                    "File at \"{}\" already exists, to overwrite use the '-f' flag",                    index_path.display()                );            }            let mut index = git::index::File::from_state(index, index_path);            index.write(options)?;        }        None => {            let index = git::index::File::from_state(index, std::path::PathBuf::new());            let mut out = Vec::with_capacity(512 * 1024);            index.write_to(&mut out, options)?;        }    }     Ok(())}