From 6747da6e50f440aadf79ee7d25875684c57796f4 Mon Sep 17 00:00:00 2001 From: Josh Junon Date: Thu, 2 May 2024 13:28:21 +0200 Subject: [PATCH] simplify default target retrieval logic --- .../src/virtual_branches/state.rs | 13 + .../src/virtual_branches/virtual.rs | 233 ++++++++++-------- 2 files changed, 149 insertions(+), 97 deletions(-) diff --git a/crates/gitbutler-core/src/virtual_branches/state.rs b/crates/gitbutler-core/src/virtual_branches/state.rs index 3c3e5e8fe..15f816b92 100644 --- a/crates/gitbutler-core/src/virtual_branches/state.rs +++ b/crates/gitbutler-core/src/virtual_branches/state.rs @@ -55,6 +55,19 @@ impl VirtualBranchesHandle { .ok_or(crate::reader::Error::NotFound) } + /// Attempts to get the default target for the given repository, + /// returning None if it's not found. + /// + /// Errors if the file cannot be read or written. + #[inline] + pub fn try_get_default_target(&self) -> Result, crate::reader::Error> { + match self.get_default_target() { + Ok(target) => Ok(Some(target)), + Err(crate::reader::Error::NotFound) => Ok(None), + Err(e) => Err(e), + } + } + /// Sets the target for the given virtual branch. /// /// Errors if the file cannot be read or written. diff --git a/crates/gitbutler-core/src/virtual_branches/virtual.rs b/crates/gitbutler-core/src/virtual_branches/virtual.rs index 63f36e41f..98130a004 100644 --- a/crates/gitbutler-core/src/virtual_branches/virtual.rs +++ b/crates/gitbutler-core/src/virtual_branches/virtual.rs @@ -210,16 +210,6 @@ pub fn normalize_branch_name(name: &str) -> String { pattern.replace_all(name, "-").to_string() } -fn get_default_target( - vb_state: &VirtualBranchesHandle, -) -> Result, reader::Error> { - match vb_state.get_default_target() { - Ok(target) => Ok(Some(target)), - Err(reader::Error::NotFound) => Ok(None), - Err(error) => Err(error), - } -} - pub fn apply_branch( project_repository: &project_repository::Repository, branch_id: &BranchId, @@ -236,13 +226,16 @@ pub fn apply_branch( let repo = &project_repository.git_repository; let vb_state = VirtualBranchesHandle::new(&project_repository.project().gb_dir()); - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to get default target")? - .ok_or_else(|| { - errors::ApplyBranchError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::ApplyBranchError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; let mut branch = match vb_state.get_branch(branch_id) { Ok(branch) => Ok(branch), @@ -489,13 +482,16 @@ pub fn unapply_ownership( let vb_state = VirtualBranchesHandle::new(&project_repository.project().gb_dir()); - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to get default target")? - .ok_or_else(|| { - errors::UnapplyOwnershipError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::UnapplyOwnershipError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; let applied_branches = vb_state .list_branches() @@ -649,13 +645,16 @@ pub fn unapply_branch( return Ok(Some(target_branch)); } - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to get default target")? - .ok_or_else(|| { - errors::UnapplyBranchError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::UnapplyBranchError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; let repo = &project_repository.git_repository; let target_commit = repo @@ -1059,13 +1058,16 @@ pub fn create_virtual_branch( ) -> Result { let vb_state = VirtualBranchesHandle::new(&project_repository.project().gb_dir()); - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to get default target")? - .ok_or_else(|| { - errors::CreateVirtualBranchError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::CreateVirtualBranchError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; let commit = project_repository .git_repository @@ -1416,13 +1418,17 @@ pub fn update_branch( }; if let Some(updated_upstream) = branch_update.upstream { - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to get default target")? - .ok_or_else(|| { - errors::UpdateBranchError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::UpdateBranchError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; + let remote_branch = format!( "refs/remotes/{}/{}", default_target.branch.remote(), @@ -1617,13 +1623,12 @@ pub fn get_status_by_branch( ) -> Result<(AppliedStatuses, Vec)> { let vb_state = VirtualBranchesHandle::new(&project_repository.project().gb_dir()); - let default_target = - match get_default_target(&vb_state).context("failed to read default target")? { - Some(target) => target, - None => { - return Ok((vec![], vec![])); - } - }; + let Some(default_target) = vb_state + .try_get_default_target() + .context("failed to read default target")? + else { + return Ok((vec![], vec![])); + }; let virtual_branches = vb_state .list_branches() @@ -2003,13 +2008,16 @@ pub fn reset_branch( ) -> Result<(), errors::ResetBranchError> { let vb_state = VirtualBranchesHandle::new(&project_repository.project().gb_dir()); - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to read default target")? - .ok_or_else(|| { - errors::ResetBranchError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::ResetBranchError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; let mut branch = match vb_state.get_branch(branch_id) { Ok(branch) => Ok(branch), @@ -2439,13 +2447,16 @@ pub fn push( let remote_branch = if let Some(upstream_branch) = vbranch.upstream.as_ref() { upstream_branch.clone() } else { - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to get default target")? - .ok_or_else(|| { - errors::PushError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::PushError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; let remote_branch = format!( "refs/remotes/{}/{}", @@ -2571,13 +2582,16 @@ pub fn is_remote_branch_mergeable( ) -> Result { let vb_state = VirtualBranchesHandle::new(&project_repository.project().gb_dir()); - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to get default target")? - .ok_or_else(|| { - errors::IsRemoteBranchMergableError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::IsRemoteBranchMergableError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; let target_commit = project_repository .git_repository @@ -2638,13 +2652,16 @@ pub fn is_virtual_branch_mergeable( return Ok(true); } - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to read default target")? - .ok_or_else(|| { - errors::IsVirtualBranchMergeable::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::IsVirtualBranchMergeable::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; // determine if this branch is up to date with the target/base let merge_base = project_repository @@ -2712,13 +2729,16 @@ pub fn move_commit_file( } .context("failed to read branch")?; - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to read default target")? - .ok_or_else(|| { - errors::VirtualBranchError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::VirtualBranchError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; let mut to_amend_oid = to_commit_oid; let mut amend_commit = project_repository @@ -3001,13 +3021,16 @@ pub fn amend( )); } - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to read default target")? - .ok_or_else(|| { - errors::VirtualBranchError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::VirtualBranchError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; let integration_commit_id = super::integration::get_workspace_head(&vb_state, project_repository)?; @@ -3154,13 +3177,16 @@ pub fn reorder_commit( ) -> Result<(), errors::VirtualBranchError> { let vb_state = VirtualBranchesHandle::new(&project_repository.project().gb_dir()); - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to read default target")? - .ok_or_else(|| { - errors::VirtualBranchError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::VirtualBranchError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; let mut branch = match vb_state.get_branch(branch_id) { Ok(branch) => Ok(branch), @@ -3563,7 +3589,8 @@ pub fn cherry_pick( .find_commit(branch.head) .context("failed to find branch tree")?; - let default_target = get_default_target(&vb_state) + let default_target = vb_state + .try_get_default_target() .context("failed to read default target")? .context("no default target set")?; @@ -3723,13 +3750,16 @@ pub fn squash( let vb_state = VirtualBranchesHandle::new(&project_repository.project().gb_dir()); - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to read default target")? - .ok_or_else(|| { - errors::SquashError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::SquashError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; let mut branch = vb_state .get_branch(branch_id) @@ -3856,13 +3886,16 @@ pub fn update_commit_message( let vb_state = VirtualBranchesHandle::new(&project_repository.project().gb_dir()); - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to read default target")? - .ok_or_else(|| { - errors::UpdateCommitMessageError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::UpdateCommitMessageError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; let mut branch = vb_state .get_branch(branch_id) @@ -3987,13 +4020,16 @@ pub fn move_commit( )); } - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to get default target")? - .ok_or_else(|| { - errors::MoveCommitError::DefaultTargetNotSet(errors::DefaultTargetNotSet { + else { + return Err(errors::MoveCommitError::DefaultTargetNotSet( + errors::DefaultTargetNotSet { project_id: project_repository.project().id, - }) - })?; + }, + )); + }; let integration_commit_id = super::integration::get_workspace_head(&vb_state, project_repository)?; @@ -4140,15 +4176,18 @@ pub fn create_virtual_branch_from_branch( let vb_state = VirtualBranchesHandle::new(&project_repository.project().gb_dir()); - let default_target = get_default_target(&vb_state) + let Some(default_target) = vb_state + .try_get_default_target() .context("failed to get default target")? - .ok_or_else(|| { + else { + return Err( errors::CreateVirtualBranchFromBranchError::DefaultTargetNotSet( errors::DefaultTargetNotSet { project_id: project_repository.project().id, }, - ) - })?; + ), + ); + }; if let git::Refname::Remote(remote_upstream) = upstream { if default_target.branch.eq(remote_upstream) {