From e6628639b8bb2eb784467861f66d7ef24bb1649c Mon Sep 17 00:00:00 2001 From: Stephan Dilly Date: Sun, 9 May 2021 21:39:28 +0200 Subject: [PATCH 1/7] wip --- asyncgit/src/sync/branch/merge_commit.rs | 31 ++++++++++++++++++++++++ asyncgit/src/sync/mod.rs | 3 ++- src/components/branchlist.rs | 29 +++++++++++++++++++++- src/keys.rs | 2 ++ src/strings.rs | 12 +++++++++ vim_style_key_config.ron | 2 ++ 6 files changed, 77 insertions(+), 2 deletions(-) diff --git a/asyncgit/src/sync/branch/merge_commit.rs b/asyncgit/src/sync/branch/merge_commit.rs index 40e436c637..3ab7cb937a 100644 --- a/asyncgit/src/sync/branch/merge_commit.rs +++ b/asyncgit/src/sync/branch/merge_commit.rs @@ -8,6 +8,37 @@ use crate::{ use git2::MergeOptions; use scopetime::scope_time; +/// +pub fn merge_branch(repo_path: &str, branch: &str) -> Result<()> { + scope_time!("merge_branch"); + + let repo = utils::repo(repo_path)?; + + let branch = repo.find_branch(branch, BranchType::Local)?; + + let id = branch.into_reference().peel_to_commit()?; + + let annotated = repo.find_annotated_commit(id.id())?; + + let (analysis, _) = repo.merge_analysis(&[&annotated])?; + + //TODO: support merge on unborn + if analysis.is_unborn() { + return Err(Error::Generic("head is unborn".into())); + } + + let mut opt = MergeOptions::default(); + // opt.fail_on_conflict(true); + + repo.merge(&[&annotated], Some(&mut opt), None)?; + + // if repo.index()?.has_conflicts() { + // return Err(Error::Generic("creates conflicts".into())); + // } + + Ok(()) +} + /// merge upstream using a merge commit without conflicts. fails if not possible without conflicts pub fn merge_upstream_commit( repo_path: &str, diff --git a/asyncgit/src/sync/mod.rs b/asyncgit/src/sync/mod.rs index 1bcba4b860..b899f045c0 100644 --- a/asyncgit/src/sync/mod.rs +++ b/asyncgit/src/sync/mod.rs @@ -29,7 +29,8 @@ pub use blame::{blame_file, BlameHunk, FileBlame}; pub use branch::{ branch_compare_upstream, checkout_branch, config_is_pull_rebase, create_branch, delete_branch, get_branch_remote, - get_branches_info, merge_commit::merge_upstream_commit, + get_branches_info, merge_commit::merge_branch, + merge_commit::merge_upstream_commit, merge_ff::branch_merge_upstream_fastforward, merge_rebase::merge_upstream_rebase, rename::rename_branch, BranchCompare, BranchInfo, diff --git a/src/components/branchlist.rs b/src/components/branchlist.rs index de41295c50..a21f12ea45 100644 --- a/src/components/branchlist.rs +++ b/src/components/branchlist.rs @@ -12,7 +12,7 @@ use crate::{ use anyhow::Result; use asyncgit::{ sync::{ - branch::checkout_remote_branch, checkout_branch, + self, branch::checkout_remote_branch, checkout_branch, get_branches_info, BranchInfo, }, CWD, @@ -150,6 +150,14 @@ impl Component for BranchListComponent { self.local, )); + out.push(CommandInfo::new( + strings::commands::merge_branch_popup( + &self.key_config, + ), + !self.selection_is_cur_branch(), + self.local, + )); + out.push(CommandInfo::new( strings::commands::rename_branch_popup( &self.key_config, @@ -222,6 +230,15 @@ impl Component for BranchListComponent { ), ), ); + } else if e == self.key_config.merge_branch + && !self.selection_is_cur_branch() + && self.valid_selection() + { + try_or_popup!( + self, + "merge branch error:", + self.merge_branch() + ); } else if e == self.key_config.tab_toggle { self.local = !self.local; self.update_branches()?; @@ -294,6 +311,16 @@ impl BranchListComponent { !self.branches.is_empty() } + fn merge_branch(&self) -> Result<()> { + if let Some(branch) = + self.branches.get(usize::from(self.selection)) + { + sync::merge_branch(CWD, &branch.name)?; + } + + Ok(()) + } + fn selection_is_cur_branch(&self) -> bool { self.branches .iter() diff --git a/src/keys.rs b/src/keys.rs index 168ed72cdf..976d6f3313 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -68,6 +68,7 @@ pub struct KeyConfig { pub rename_branch: KeyEvent, pub select_branch: KeyEvent, pub delete_branch: KeyEvent, + pub merge_branch: KeyEvent, pub push: KeyEvent, pub force_push: KeyEvent, pub pull: KeyEvent, @@ -125,6 +126,7 @@ impl Default for KeyConfig { rename_branch: KeyEvent { code: KeyCode::Char('r'), modifiers: KeyModifiers::NONE}, select_branch: KeyEvent { code: KeyCode::Char('b'), modifiers: KeyModifiers::NONE}, delete_branch: KeyEvent{code: KeyCode::Char('D'), modifiers: KeyModifiers::SHIFT}, + merge_branch: KeyEvent{code: KeyCode::Char('m'), modifiers: KeyModifiers::NONE}, push: KeyEvent { code: KeyCode::Char('p'), modifiers: KeyModifiers::empty()}, force_push: KeyEvent { code: KeyCode::Char('P'), modifiers: KeyModifiers::SHIFT}, pull: KeyEvent { code: KeyCode::Char('f'), modifiers: KeyModifiers::empty()}, diff --git a/src/strings.rs b/src/strings.rs index 01ce8faa16..938ff45dab 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -918,6 +918,18 @@ pub mod commands { CMD_GROUP_GENERAL, ) } + pub fn merge_branch_popup( + key_config: &SharedKeyConfig, + ) -> CommandText { + CommandText::new( + format!( + "Merge [{}]", + key_config.get_hint(key_config.merge_branch), + ), + "merge a branch", + CMD_GROUP_GENERAL, + ) + } pub fn select_branch_popup( key_config: &SharedKeyConfig, ) -> CommandText { diff --git a/vim_style_key_config.ron b/vim_style_key_config.ron index abdf498631..197c9f0778 100644 --- a/vim_style_key_config.ron +++ b/vim_style_key_config.ron @@ -72,6 +72,8 @@ rename_branch: ( code: Char('r'), modifiers: ( bits: 0,),), select_branch: ( code: Char('b'), modifiers: ( bits: 0,),), delete_branch: ( code: Char('D'), modifiers: ( bits: 1,),), + merge_branch: ( code: Char('m'), modifiers: ( bits: 0,),), + push: ( code: Char('p'), modifiers: ( bits: 0,),), force_push: ( code: Char('P'), modifiers: ( bits: 1,),), pull: ( code: Char('f'), modifiers: ( bits: 0,),), From 6baa8432667d39a3c0e18434c0c9aa803c87a367 Mon Sep 17 00:00:00 2001 From: Stephan Dilly Date: Sun, 9 May 2021 22:18:10 +0200 Subject: [PATCH 2/7] allow aborting merge --- asyncgit/src/sync/branch/merge_commit.rs | 31 ----------------- asyncgit/src/sync/merge.rs | 43 ++++++++++++++++++++++++ asyncgit/src/sync/mod.rs | 5 +-- src/keys.rs | 10 +++--- src/strings.rs | 10 ++++++ src/tabs/status.rs | 28 ++++++++++++++- 6 files changed, 89 insertions(+), 38 deletions(-) create mode 100644 asyncgit/src/sync/merge.rs diff --git a/asyncgit/src/sync/branch/merge_commit.rs b/asyncgit/src/sync/branch/merge_commit.rs index 3ab7cb937a..40e436c637 100644 --- a/asyncgit/src/sync/branch/merge_commit.rs +++ b/asyncgit/src/sync/branch/merge_commit.rs @@ -8,37 +8,6 @@ use crate::{ use git2::MergeOptions; use scopetime::scope_time; -/// -pub fn merge_branch(repo_path: &str, branch: &str) -> Result<()> { - scope_time!("merge_branch"); - - let repo = utils::repo(repo_path)?; - - let branch = repo.find_branch(branch, BranchType::Local)?; - - let id = branch.into_reference().peel_to_commit()?; - - let annotated = repo.find_annotated_commit(id.id())?; - - let (analysis, _) = repo.merge_analysis(&[&annotated])?; - - //TODO: support merge on unborn - if analysis.is_unborn() { - return Err(Error::Generic("head is unborn".into())); - } - - let mut opt = MergeOptions::default(); - // opt.fail_on_conflict(true); - - repo.merge(&[&annotated], Some(&mut opt), None)?; - - // if repo.index()?.has_conflicts() { - // return Err(Error::Generic("creates conflicts".into())); - // } - - Ok(()) -} - /// merge upstream using a merge commit without conflicts. fails if not possible without conflicts pub fn merge_upstream_commit( repo_path: &str, diff --git a/asyncgit/src/sync/merge.rs b/asyncgit/src/sync/merge.rs new file mode 100644 index 0000000000..1fa538a859 --- /dev/null +++ b/asyncgit/src/sync/merge.rs @@ -0,0 +1,43 @@ +use crate::{ + error::{Error, Result}, + sync::utils, +}; +use git2::{BranchType, MergeOptions}; +use scopetime::scope_time; + +/// +pub fn abort_merge(repo_path: &str) -> Result<()> { + scope_time!("cleanup_state"); + + let repo = utils::repo(repo_path)?; + + repo.cleanup_state()?; + + Ok(()) +} + +/// +pub fn merge_branch(repo_path: &str, branch: &str) -> Result<()> { + scope_time!("merge_branch"); + + let repo = utils::repo(repo_path)?; + + let branch = repo.find_branch(branch, BranchType::Local)?; + + let id = branch.into_reference().peel_to_commit()?; + + let annotated = repo.find_annotated_commit(id.id())?; + + let (analysis, _) = repo.merge_analysis(&[&annotated])?; + + //TODO: support merge on unborn + if analysis.is_unborn() { + return Err(Error::Generic("head is unborn".into())); + } + + let mut opt = MergeOptions::default(); + + repo.merge(&[&annotated], Some(&mut opt), None)?; + + Ok(()) +} diff --git a/asyncgit/src/sync/mod.rs b/asyncgit/src/sync/mod.rs index b899f045c0..7bb41c95f2 100644 --- a/asyncgit/src/sync/mod.rs +++ b/asyncgit/src/sync/mod.rs @@ -15,6 +15,7 @@ mod hooks; mod hunks; mod ignore; mod logwalker; +mod merge; mod patches; pub mod remotes; mod reset; @@ -29,8 +30,7 @@ pub use blame::{blame_file, BlameHunk, FileBlame}; pub use branch::{ branch_compare_upstream, checkout_branch, config_is_pull_rebase, create_branch, delete_branch, get_branch_remote, - get_branches_info, merge_commit::merge_branch, - merge_commit::merge_upstream_commit, + get_branches_info, merge_commit::merge_upstream_commit, merge_ff::branch_merge_upstream_fastforward, merge_rebase::merge_upstream_rebase, rename::rename_branch, BranchCompare, BranchInfo, @@ -50,6 +50,7 @@ pub use hooks::{ pub use hunks::{reset_hunk, stage_hunk, unstage_hunk}; pub use ignore::add_to_ignore; pub use logwalker::LogWalker; +pub use merge::{abort_merge, merge_branch}; pub use remotes::{ get_default_remote, get_remotes, push::AsyncProgress, tags::PushTagsProgress, diff --git a/src/keys.rs b/src/keys.rs index 976d6f3313..6ee72ea9f5 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -72,6 +72,7 @@ pub struct KeyConfig { pub push: KeyEvent, pub force_push: KeyEvent, pub pull: KeyEvent, + pub abort_merge: KeyEvent, } #[rustfmt::skip] @@ -122,14 +123,15 @@ impl Default for KeyConfig { log_tag_commit: KeyEvent { code: KeyCode::Char('t'), modifiers: KeyModifiers::empty()}, commit_amend: KeyEvent { code: KeyCode::Char('a'), modifiers: KeyModifiers::CONTROL}, copy: KeyEvent { code: KeyCode::Char('y'), modifiers: KeyModifiers::empty()}, - create_branch: KeyEvent { code: KeyCode::Char('c'), modifiers: KeyModifiers::NONE}, - rename_branch: KeyEvent { code: KeyCode::Char('r'), modifiers: KeyModifiers::NONE}, - select_branch: KeyEvent { code: KeyCode::Char('b'), modifiers: KeyModifiers::NONE}, + create_branch: KeyEvent { code: KeyCode::Char('c'), modifiers: KeyModifiers::empty()}, + rename_branch: KeyEvent { code: KeyCode::Char('r'), modifiers: KeyModifiers::empty()}, + select_branch: KeyEvent { code: KeyCode::Char('b'), modifiers: KeyModifiers::empty()}, delete_branch: KeyEvent{code: KeyCode::Char('D'), modifiers: KeyModifiers::SHIFT}, - merge_branch: KeyEvent{code: KeyCode::Char('m'), modifiers: KeyModifiers::NONE}, + merge_branch: KeyEvent{code: KeyCode::Char('m'), modifiers: KeyModifiers::empty()}, push: KeyEvent { code: KeyCode::Char('p'), modifiers: KeyModifiers::empty()}, force_push: KeyEvent { code: KeyCode::Char('P'), modifiers: KeyModifiers::SHIFT}, pull: KeyEvent { code: KeyCode::Char('f'), modifiers: KeyModifiers::empty()}, + abort_merge: KeyEvent { code: KeyCode::Char('M'), modifiers: KeyModifiers::SHIFT}, } } } diff --git a/src/strings.rs b/src/strings.rs index 938ff45dab..3c6c07598f 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -520,6 +520,16 @@ pub mod commands { CMD_GROUP_GENERAL, ) } + pub fn abort_merge(key_config: &SharedKeyConfig) -> CommandText { + CommandText::new( + format!( + "Abort merge [{}]", + key_config.get_hint(key_config.abort_merge), + ), + "abort ongoing merge", + CMD_GROUP_GENERAL, + ) + } pub fn select_staging( key_config: &SharedKeyConfig, ) -> CommandText { diff --git a/src/tabs/status.rs b/src/tabs/status.rs index bb5f285a1e..91b7e38a68 100644 --- a/src/tabs/status.rs +++ b/src/tabs/status.rs @@ -8,7 +8,7 @@ use crate::{ }, keys::SharedKeyConfig, queue::{Action, InternalEvent, Queue, ResetItem}, - strings, + strings, try_or_popup, ui::style::SharedTheme, }; use anyhow::Result; @@ -465,6 +465,16 @@ impl Status { .as_ref() .map_or(true, |state| state.ahead > 0) } + + fn can_abort_merge() -> bool { + sync::repo_state(CWD).unwrap_or(RepoState::Clean) + == RepoState::Merge + } + + fn abort_merge(&self) -> Result<()> { + sync::abort_merge(CWD)?; + Ok(()) + } } impl Component for Status { @@ -507,6 +517,12 @@ impl Component for Status { true, !focus_on_diff, )); + + out.push(CommandInfo::new( + strings::commands::abort_merge(&self.key_config), + true, + Self::can_abort_merge() || force_all, + )); } { @@ -653,6 +669,16 @@ impl Component for Status { && !self.is_focus_on_diff() { self.pull(); + Ok(EventState::Consumed) + } else if k == self.key_config.abort_merge + && Self::can_abort_merge() + { + try_or_popup!( + self, + "abort merge error:", + self.abort_merge() + ); + Ok(EventState::Consumed) } else { Ok(EventState::NotConsumed) From 11ddde4671c0bb3143f615530df8154de0d2d5f0 Mon Sep 17 00:00:00 2001 From: Stephan Dilly Date: Sun, 9 May 2021 22:22:38 +0200 Subject: [PATCH 3/7] hide branches after merger --- src/components/branchlist.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/branchlist.rs b/src/components/branchlist.rs index a21f12ea45..c79a22e407 100644 --- a/src/components/branchlist.rs +++ b/src/components/branchlist.rs @@ -239,6 +239,7 @@ impl Component for BranchListComponent { "merge branch error:", self.merge_branch() ); + self.hide(); } else if e == self.key_config.tab_toggle { self.local = !self.local; self.update_branches()?; From e8632d8fdac1ecb1b090f5f0e13a897db16a14eb Mon Sep 17 00:00:00 2001 From: Stephan Dilly Date: Sun, 9 May 2021 22:35:10 +0200 Subject: [PATCH 4/7] confirm abort merge --- src/app.rs | 4 ++++ src/components/reset.rs | 14 +++++++++----- src/queue.rs | 1 + src/strings.rs | 16 ++++++++++------ src/tabs/status.rs | 13 ++++++------- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/app.rs b/src/app.rs index 801f01052d..0daa984a32 100644 --- a/src/app.rs +++ b/src/app.rs @@ -607,6 +607,10 @@ impl App { self.pull_popup.try_conflict_free_merge(rebase); flags.insert(NeedsUpdate::ALL); } + Action::AbortMerge => { + self.status_tab.abort_merge(); + flags.insert(NeedsUpdate::ALL); + } }; Ok(()) diff --git a/src/components/reset.rs b/src/components/reset.rs index eeef90d1ea..2004545fab 100644 --- a/src/components/reset.rs +++ b/src/components/reset.rs @@ -138,8 +138,8 @@ impl ResetComponent { if let Some(ref a) = self.target { return match a { Action::Reset(_) => ( - strings::confirm_title_reset(&self.key_config), - strings::confirm_msg_reset(&self.key_config), + strings::confirm_title_reset(), + strings::confirm_msg_reset(), ), Action::StashDrop(_) => ( strings::confirm_title_stashdrop( @@ -152,12 +152,12 @@ impl ResetComponent { strings::confirm_msg_stashpop(&self.key_config), ), Action::ResetHunk(_, _) => ( - strings::confirm_title_reset(&self.key_config), + strings::confirm_title_reset(), strings::confirm_msg_resethunk(&self.key_config), ), Action::ResetLines(_, lines) => ( - strings::confirm_title_reset(&self.key_config), - strings::confirm_msg_reset_lines(&self.key_config,lines.len()), + strings::confirm_title_reset(), + strings::confirm_msg_reset_lines(lines.len()), ), Action::DeleteBranch(branch_ref) => ( strings::confirm_title_delete_branch( @@ -181,6 +181,10 @@ impl ResetComponent { strings::confirm_title_merge(&self.key_config,*rebase), strings::confirm_msg_merge(&self.key_config,*incoming,*rebase), ), + Action::AbortMerge => ( + strings::confirm_title_abortmerge(), + strings::confirm_msg_abortmerge(), + ), }; } diff --git a/src/queue.rs b/src/queue.rs index 131de06593..a5226e51f5 100644 --- a/src/queue.rs +++ b/src/queue.rs @@ -33,6 +33,7 @@ pub enum Action { DeleteBranch(String), ForcePush(String, bool), PullMerge { incoming: usize, rebase: bool }, + AbortMerge, } /// diff --git a/src/strings.rs b/src/strings.rs index 3c6c07598f..50f201aa55 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -86,7 +86,7 @@ pub fn stash_popup_title(_key_config: &SharedKeyConfig) -> String { pub fn stash_popup_msg(_key_config: &SharedKeyConfig) -> String { "type name (optional)".to_string() } -pub fn confirm_title_reset(_key_config: &SharedKeyConfig) -> String { +pub fn confirm_title_reset() -> String { "Reset".to_string() } pub fn confirm_title_stashdrop( @@ -120,13 +120,17 @@ pub fn confirm_msg_merge( format!("Merge of {} incoming commits?", incoming) } } -pub fn confirm_msg_reset(_key_config: &SharedKeyConfig) -> String { + +pub fn confirm_title_abortmerge() -> String { + "Abort merge".to_string() +} +pub fn confirm_msg_abortmerge() -> String { + "Abort merge?".to_string() +} +pub fn confirm_msg_reset() -> String { "confirm file reset?".to_string() } -pub fn confirm_msg_reset_lines( - _key_config: &SharedKeyConfig, - lines: usize, -) -> String { +pub fn confirm_msg_reset_lines(lines: usize) -> String { format!( "are you sure you want to discard {} selected lines?", lines diff --git a/src/tabs/status.rs b/src/tabs/status.rs index 91b7e38a68..90e947e4c6 100644 --- a/src/tabs/status.rs +++ b/src/tabs/status.rs @@ -471,9 +471,8 @@ impl Status { == RepoState::Merge } - fn abort_merge(&self) -> Result<()> { - sync::abort_merge(CWD)?; - Ok(()) + pub fn abort_merge(&self) { + try_or_popup!(self, "abort merge", sync::abort_merge(CWD)) } } @@ -673,10 +672,10 @@ impl Component for Status { } else if k == self.key_config.abort_merge && Self::can_abort_merge() { - try_or_popup!( - self, - "abort merge error:", - self.abort_merge() + self.queue.borrow_mut().push_back( + InternalEvent::ConfirmAction( + Action::AbortMerge, + ), ); Ok(EventState::Consumed) From 4d79ba675ef2a1b8413cef2137f978791bd6b26d Mon Sep 17 00:00:00 2001 From: Stephan Dilly Date: Sun, 9 May 2021 22:40:37 +0200 Subject: [PATCH 5/7] support revert --- src/strings.rs | 4 ++-- src/tabs/status.rs | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/strings.rs b/src/strings.rs index 50f201aa55..c52298a4db 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -122,10 +122,10 @@ pub fn confirm_msg_merge( } pub fn confirm_title_abortmerge() -> String { - "Abort merge".to_string() + "Abort merge?".to_string() } pub fn confirm_msg_abortmerge() -> String { - "Abort merge?".to_string() + "This will revert all changes. Are you sure?".to_string() } pub fn confirm_msg_reset() -> String { "confirm file reset?".to_string() diff --git a/src/tabs/status.rs b/src/tabs/status.rs index 90e947e4c6..f4dfd66aa5 100644 --- a/src/tabs/status.rs +++ b/src/tabs/status.rs @@ -472,7 +472,14 @@ impl Status { } pub fn abort_merge(&self) { - try_or_popup!(self, "abort merge", sync::abort_merge(CWD)) + try_or_popup!(self, "abort merge", Self::abort_merge_reset()) + } + + fn abort_merge_reset() -> Result<()> { + sync::reset_stage(CWD, "*")?; + sync::reset_workdir(CWD, "*")?; + sync::abort_merge(CWD)?; + Ok(()) } } From b07d3764ce53de12aa1ae76cd8305bc7f344ee58 Mon Sep 17 00:00:00 2001 From: Stephan Dilly Date: Sun, 9 May 2021 22:45:04 +0200 Subject: [PATCH 6/7] clippy fixees --- src/tabs/status.rs | 94 ++++++++++++++++++++-------------------- vim_style_key_config.ron | 1 + 2 files changed, 49 insertions(+), 46 deletions(-) diff --git a/src/tabs/status.rs b/src/tabs/status.rs index f4dfd66aa5..433e962b52 100644 --- a/src/tabs/status.rs +++ b/src/tabs/status.rs @@ -481,6 +481,52 @@ impl Status { sync::abort_merge(CWD)?; Ok(()) } + + fn commands_nav( + &self, + out: &mut Vec, + force_all: bool, + ) { + let focus_on_diff = self.is_focus_on_diff(); + out.push( + CommandInfo::new( + strings::commands::diff_focus_left(&self.key_config), + true, + (self.visible && focus_on_diff) || force_all, + ) + .order(strings::order::NAV), + ); + out.push( + CommandInfo::new( + strings::commands::diff_focus_right(&self.key_config), + self.can_focus_diff(), + (self.visible && !focus_on_diff) || force_all, + ) + .order(strings::order::NAV), + ); + out.push( + CommandInfo::new( + strings::commands::select_staging(&self.key_config), + !focus_on_diff, + (self.visible + && !focus_on_diff + && self.focus == Focus::WorkDir) + || force_all, + ) + .order(strings::order::NAV), + ); + out.push( + CommandInfo::new( + strings::commands::select_unstaged(&self.key_config), + !focus_on_diff, + (self.visible + && !focus_on_diff + && self.focus == Focus::Stage) + || force_all, + ) + .order(strings::order::NAV), + ); + } } impl Component for Status { @@ -541,52 +587,6 @@ impl Component for Status { }, self.visible || force_all, )); - out.push( - CommandInfo::new( - strings::commands::diff_focus_left( - &self.key_config, - ), - true, - (self.visible && focus_on_diff) || force_all, - ) - .order(strings::order::NAV), - ); - out.push( - CommandInfo::new( - strings::commands::diff_focus_right( - &self.key_config, - ), - self.can_focus_diff(), - (self.visible && !focus_on_diff) || force_all, - ) - .order(strings::order::NAV), - ); - out.push( - CommandInfo::new( - strings::commands::select_staging( - &self.key_config, - ), - !focus_on_diff, - (self.visible - && !focus_on_diff - && self.focus == Focus::WorkDir) - || force_all, - ) - .order(strings::order::NAV), - ); - out.push( - CommandInfo::new( - strings::commands::select_unstaged( - &self.key_config, - ), - !focus_on_diff, - (self.visible - && !focus_on_diff - && self.focus == Focus::Stage) - || force_all, - ) - .order(strings::order::NAV), - ); out.push( CommandInfo::new( @@ -598,6 +598,8 @@ impl Component for Status { ) .hidden(), ); + + self.commands_nav(out, force_all); } visibility_blocking(self) diff --git a/vim_style_key_config.ron b/vim_style_key_config.ron index 197c9f0778..0a64ae4daa 100644 --- a/vim_style_key_config.ron +++ b/vim_style_key_config.ron @@ -73,6 +73,7 @@ select_branch: ( code: Char('b'), modifiers: ( bits: 0,),), delete_branch: ( code: Char('D'), modifiers: ( bits: 1,),), merge_branch: ( code: Char('m'), modifiers: ( bits: 0,),), + abort_merge: ( code: Char('M'), modifiers: ( bits: 1,),), push: ( code: Char('p'), modifiers: ( bits: 0,),), force_push: ( code: Char('P'), modifiers: ( bits: 1,),), From 7c23d082b85bdd33b45dc9a98ae2738e09857fc0 Mon Sep 17 00:00:00 2001 From: Stephan Dilly Date: Sun, 9 May 2021 22:51:53 +0200 Subject: [PATCH 7/7] move more into asyncgit --- asyncgit/src/sync/merge.rs | 10 ++++++++-- src/tabs/status.rs | 9 +-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/asyncgit/src/sync/merge.rs b/asyncgit/src/sync/merge.rs index 1fa538a859..c61e7411fa 100644 --- a/asyncgit/src/sync/merge.rs +++ b/asyncgit/src/sync/merge.rs @@ -1,16 +1,22 @@ use crate::{ error::{Error, Result}, - sync::utils, + sync::{reset_stage, reset_workdir, utils}, }; use git2::{BranchType, MergeOptions}; use scopetime::scope_time; -/// +/// does these steps: +/// * reset all staged changes, +/// * revert all changes in workdir +/// * cleanup repo merge state pub fn abort_merge(repo_path: &str) -> Result<()> { scope_time!("cleanup_state"); let repo = utils::repo(repo_path)?; + reset_stage(repo_path, "*")?; + reset_workdir(repo_path, "*")?; + repo.cleanup_state()?; Ok(()) diff --git a/src/tabs/status.rs b/src/tabs/status.rs index 433e962b52..cccca38321 100644 --- a/src/tabs/status.rs +++ b/src/tabs/status.rs @@ -472,14 +472,7 @@ impl Status { } pub fn abort_merge(&self) { - try_or_popup!(self, "abort merge", Self::abort_merge_reset()) - } - - fn abort_merge_reset() -> Result<()> { - sync::reset_stage(CWD, "*")?; - sync::reset_workdir(CWD, "*")?; - sync::abort_merge(CWD)?; - Ok(()) + try_or_popup!(self, "abort merge", sync::abort_merge(CWD)) } fn commands_nav(