From 1180f0b3c3157b6fd8eb7bf08a255a114e961e5f Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Wed, 31 Jul 2024 17:14:25 +0100 Subject: fix(remote): updating `push` state event ensure refs are included in state event use `HashMap` to improve `RepoState` struct --- src/git_remote_helper.rs | 40 ++++++++++++---------------------------- 1 file changed, 12 insertions(+), 28 deletions(-) (limited to 'src/git_remote_helper.rs') diff --git a/src/git_remote_helper.rs b/src/git_remote_helper.rs index 68aa681..08a59c1 100644 --- a/src/git_remote_helper.rs +++ b/src/git_remote_helper.rs @@ -6,7 +6,7 @@ use core::str; use std::{ - collections::HashSet, + collections::{HashMap, HashSet}, env, io::{self, Stdin}, path::PathBuf, @@ -261,41 +261,25 @@ async fn generate_updated_state( git_repo: &Repo, repo_ref: &RepoRef, refspecs: &Vec, -) -> Result> { +) -> Result> { let new_state = { if let Ok(mut repo_state) = get_state_from_cache(git_repo.get_path()?, repo_ref).await { for refspec in refspecs { let (from, to) = refspec_to_from_to(refspec)?; - if to.is_empty() { + if from.is_empty() { // delete - repo_state.state.retain(|(name, _)| !name.eq(to)); - } else if repo_state.state.iter().any(|(name, _)| name.eq(from)) { - // update - repo_state.state = repo_state - .state - .iter() - .map(|(name, value)| { - ( - name.clone(), - if name.eq(to) { - reference_to_ref_value(&git_repo.git_repo, to).unwrap() - } else { - value.to_string() - }, - ) - }) - .collect(); + repo_state.state.remove(to); } else { - // add - repo_state.state.push(( + // add or update + repo_state.state.insert( to.to_string(), reference_to_ref_value(&git_repo.git_repo, to).unwrap(), - )); + ); } } repo_state.state } else { - let mut state = vec![]; + let mut state = HashMap::new(); let git_server_url = repo_ref .git_server .first() @@ -303,14 +287,14 @@ async fn generate_updated_state( let mut git_server_remote = git_repo.git_repo.remote_anonymous(git_server_url)?; git_server_remote.connect(git2::Direction::Fetch)?; for head in git_server_remote.list()? { - state.push(( + state.insert( head.name().to_string(), if let Some(symbolic_ref) = head.symref_target() { - format!("ref: {}", symbolic_ref) + format!("ref: {symbolic_ref}") } else { head.oid().to_string() }, - )); + ); } git_server_remote.disconnect()?; state @@ -460,7 +444,7 @@ fn get_refspecs_from_push_batch(stdin: &Stdin, initial_refspec: &str) -> Result< impl RepoState { pub async fn build( identifier: String, - state: Vec<(String, String)>, + state: HashMap, signer: &NostrSigner, ) -> Result { let mut tags = vec![Tag::identifier(identifier.clone())]; -- cgit v1.2.3