use git2::{FetchOptions, FetchPrune};
use crate::error::Result;
use crate::get_remote_callbacks::get_remote_callbacks;
use crate::worktree::WorktreeDescriptor;
pub fn remotes_tracked_by_worktrees(
repo: &git2::Repository,
worktrees: &[WorktreeDescriptor],
) -> Result<Vec<String>> {
let config = repo.config()?;
let mut remotes: Vec<String> = Vec::new();
for wt in worktrees {
let branch_name = match wt.branch()? {
Some(name) => name,
None => continue, };
let remote_key = format!("branch.{}.remote", branch_name);
if let Ok(remote) = config.get_string(&remote_key) {
if !remotes.contains(&remote) {
remotes.push(remote);
}
}
}
Ok(remotes)
}
pub fn prune_fetch(repo: &git2::Repository, remote_name: &str) -> Result<()> {
let mut remote = repo.find_remote(remote_name)?;
let remote_url = remote.url().ok().map(str::to_owned);
let auth = get_remote_callbacks(repo, remote_url.as_deref())?;
let mut fetch_opts = FetchOptions::new();
fetch_opts.prune(FetchPrune::On); fetch_opts.remote_callbacks(auth.callbacks());
remote.fetch(&[] as &[&str], Some(&mut fetch_opts), None)?;
Ok(())
}