use std::path::PathBuf;
use iced::Task;
use crate::message::Message;
pub fn stash_save(path: PathBuf, stash_message: Option<String>) -> Task<Message> {
git_task!(
Message::StashUpdated,
(|| {
let mut repo = open_repo!(&path);
let msg_ref = stash_message.as_deref();
gitkraft_core::features::stash::stash_save(&mut repo, msg_ref)
.map_err(|e| e.to_string())?;
refresh_stash_list(&path)
})()
)
}
pub fn stash_pop(path: PathBuf, index: usize) -> Task<Message> {
git_task!(
Message::StashUpdated,
(|| {
let mut repo = open_repo!(&path);
gitkraft_core::features::stash::stash_pop(&mut repo, index)
.map_err(|e| e.to_string())?;
refresh_stash_list(&path)
})()
)
}
pub fn stash_drop(path: PathBuf, index: usize) -> Task<Message> {
git_task!(
Message::StashUpdated,
(|| {
let mut repo = open_repo!(&path);
gitkraft_core::features::stash::stash_drop(&mut repo, index)
.map_err(|e| e.to_string())?;
refresh_stash_list(&path)
})()
)
}
pub fn load_stash_diff(path: PathBuf, index: usize) -> Task<Message> {
git_task!(
Message::StashDiffLoaded,
(|| {
let mut repo = open_repo!(&path);
let mut stash_oid = None;
repo.stash_foreach(|i, _msg, oid| {
if i == index {
stash_oid = Some(oid.to_string());
false } else {
true
}
})
.map_err(|e| e.to_string())?;
let oid = stash_oid.ok_or_else(|| format!("stash@{{{index}}} not found"))?;
let repo = open_repo!(&path); gitkraft_core::features::diff::get_commit_diff(&repo, &oid).map_err(|e| e.to_string())
})()
)
}
pub fn stash_apply(path: PathBuf, index: usize) -> Task<Message> {
git_task!(
Message::StashUpdated,
(|| {
let mut repo = open_repo!(&path);
repo.stash_apply(index, None).map_err(|e| e.to_string())?;
refresh_stash_list(&path)
})()
)
}
fn refresh_stash_list(path: &std::path::Path) -> Result<Vec<gitkraft_core::StashEntry>, String> {
let mut repo = open_repo!(path);
gitkraft_core::features::stash::list_stashes(&mut repo).map_err(|e| e.to_string())
}