11{-# LANGUAGE LambdaCase #-}
22module GitBrunch
33 ( main
4- )
5- where
4+ ) where
65
7- import Brick.Main ( halt
8- , continue
6+ import Brick.Main ( continue
7+ , halt
98 , suspendAndResume
109 )
10+ import qualified Brick.Main as M
1111import Brick.Themes ( themeToAttrMap )
1212import Brick.Types
13+ import qualified Brick.Widgets.Border as B
14+ import qualified Brick.Widgets.Border.Style as BS
15+ import qualified Brick.Widgets.Center as C
1316import Brick.Widgets.Core
17+ import qualified Brick.Widgets.Dialog as D
18+ import qualified Brick.Widgets.Edit as E
19+ import qualified Brick.Widgets.List as L
1420import Control.Exception ( SomeException
1521 , catch
1622 )
1723import Control.Monad
1824import Data.Char
1925import Data.List
2026import Data.Maybe ( fromMaybe )
27+ import qualified Data.Vector as Vec
2128import Graphics.Vty hiding ( update )
22- import Lens.Micro ( (^.)
23- , (.~)
24- , (%~)
29+ import Lens.Micro ( (%~)
2530 , (&)
31+ , (.~)
2632 , Lens'
33+ , (^.)
2734 , lens
2835 )
2936import System.Exit
30- import qualified Brick.Main as M
31- import qualified Brick.Widgets.Border as B
32- import qualified Brick.Widgets.Border.Style as BS
33- import qualified Brick.Widgets.Center as C
34- import qualified Brick.Widgets.Dialog as D
35- import qualified Brick.Widgets.Edit as E
36- import qualified Brick.Widgets.List as L
37- import qualified Data.Vector as Vec
3837
3938import Git ( Branch (.. ) )
40- import Theme
4139import qualified Git
40+ import Theme
4241
4342
4443data Name = Local | Remote | Filter deriving (Ord , Eq , Show )
4544data RemoteName = RLocal | RRemote deriving (Eq )
46- data GitCommand = GitRebase | GitCheckout | GitDeleteBranch deriving (Ord , Eq )
45+ data GitCommand = GitRebase | GitMerge | GitCheckout | GitDeleteBranch deriving (Ord , Eq )
4746data DialogResult = SetDialog Dialog | EndDialog DialogOption
4847data DialogOption = Cancel | Confirm
4948type Dialog = D. Dialog DialogOption
5049
5150data State = State
52- { _focus :: RemoteName
53- , _gitCommand :: GitCommand
54- , _branches :: [Branch ]
55- , _localBranches :: L. List Name Branch
56- , _remoteBranches :: L. List Name Branch
57- , _dialog :: Maybe Dialog
58- , _filter :: E. Editor String Name
51+ { _focus :: RemoteName
52+ , _gitCommand :: GitCommand
53+ , _branches :: [Branch ]
54+ , _localBranches :: L. List Name Branch
55+ , _remoteBranches :: L. List Name Branch
56+ , _dialog :: Maybe Dialog
57+ , _filter :: E. Editor String Name
5958 , _isEditingFilter :: Bool
6059 }
6160
6261
63- instance ( Show GitCommand ) where
62+ instance Show GitCommand where
6463 show GitCheckout = " checkout"
6564 show GitRebase = " rebase"
65+ show GitMerge = " merge"
6666 show GitDeleteBranch = " delete"
6767
6868
@@ -81,6 +81,7 @@ main = do
8181 gitFunction = \ case
8282 GitCheckout -> Git. checkout
8383 GitRebase -> Git. rebaseInteractive
84+ GitMerge -> Git. merge
8485 GitDeleteBranch -> Git. deleteBranch
8586
8687emptyState :: State
@@ -126,11 +127,11 @@ appDraw state =
126127 , C. hCenter $ toBranchList RRemote remoteBranchesL
127128 ]
128129 instructions = maxWidth 100 $ hBox
129- [ drawInstruction " HJKL" " move"
130- , drawInstruction " Enter" " checkout"
130+ [ drawInstruction " Enter" " checkout"
131131 , drawInstruction " /" " filter"
132132 , drawInstruction " F" " fetch"
133133 , drawInstruction " R" " rebase"
134+ , drawInstruction " M" " merge"
134135 , drawInstruction " D" " delete"
135136 ]
136137
@@ -225,6 +226,7 @@ appHandleEventMain state (VtyEvent e) =
225226 confirmDelete Nothing = continue state
226227 endWithCheckout = halt $ state { _gitCommand = GitCheckout }
227228 endWithRebase = halt $ state { _gitCommand = GitRebase }
229+ endWithMerge = halt $ state { _gitCommand = GitMerge }
228230 focusLocal = focusBranches RLocal state
229231 focusRemote = focusBranches RRemote state
230232 doFetch = suspendAndResume (fetchBranches state)
@@ -245,7 +247,9 @@ appHandleEventMain state (VtyEvent e) =
245247 EvKey (KChar ' f' ) [MCtrl ] -> startEditingFilter
246248 EvKey (KChar ' d' ) [] -> confirmDelete (selectedBranch state)
247249 EvKey KEnter [] -> endWithCheckout
250+ EvKey (KChar ' c' ) [] -> endWithCheckout
248251 EvKey (KChar ' r' ) [] -> endWithRebase
252+ EvKey (KChar ' m' ) [] -> endWithMerge
249253 EvKey KLeft [] -> focusLocal
250254 EvKey (KChar ' h' ) [] -> focusLocal
251255 EvKey KRight [] -> focusRemote
0 commit comments