1- {-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}
2- module Git
3- ( Branch (.. )
4- , checkout
5- , deleteBranch
6- , fetch
7- , fullBranchName
8- , isCommonBranch
9- , isRemoteBranch
10- , listBranches
11- , rebaseInteractive
12- , merge
13- , toBranches
14- ) where
15-
16- import Data.Char ( isSpace )
17- import Data.List
18- import System.Exit
19- import System.Process
20-
21-
22- data Branch = BranchLocal String
23- | BranchCurrent String
24- | BranchRemote String String
25- deriving Eq
26-
27- instance (Show Branch ) where
28- show (BranchLocal n ) = n
29- show (BranchCurrent n ) = n <> " *"
1+ module Git (
2+ Branch (.. ),
3+ checkout ,
4+ deleteBranch ,
5+ fetch ,
6+ fullBranchName ,
7+ isCommonBranch ,
8+ isRemoteBranch ,
9+ listBranches ,
10+ rebaseInteractive ,
11+ merge ,
12+ toBranches ,
13+ ) where
14+
15+ import Data.Char (isSpace )
16+ import Data.List
17+ import System.Exit
18+ import System.Process
19+
20+ data Branch
21+ = BranchLocal String
22+ | BranchCurrent String
23+ | BranchRemote String String
24+ deriving (Eq )
25+
26+ instance Show Branch where
27+ show (BranchLocal n) = n
28+ show (BranchCurrent n) = n <> " *"
3029 show (BranchRemote o n) = o <> " /" <> n
3130
3231fetch :: IO String
3332fetch = readGit [" fetch" , " --all" , " --prune" ]
3433
3534listBranches :: IO [Branch ]
36- listBranches = toBranches <$> readGit
37- [ " branch"
38- , " --list"
39- , " --all"
40- , " --sort=-committerdate"
41- , " --no-column"
42- , " --no-color"
43- ]
35+ listBranches =
36+ toBranches
37+ <$> readGit
38+ [ " branch"
39+ , " --list"
40+ , " --all"
41+ , " --sort=-committerdate"
42+ , " --no-column"
43+ , " --no-color"
44+ ]
4445
4546toBranches :: String -> [Branch ]
4647toBranches input = toBranch <$> filter validBranch (lines input)
47- where validBranch b = not $ isHead b || isDetachedHead b || isNoBranch b
48+ where
49+ validBranch b = not $ isHead b || isDetachedHead b || isNoBranch b
4850
4951toBranch :: String -> Branch
5052toBranch line = mkBranch $ words $ dropWhile isSpace line
5153 where
5254 mkBranch (" *" : name : _) = BranchCurrent name
53- mkBranch (name : _) = case stripPrefix " remotes/" name of
55+ mkBranch (name : _) = case stripPrefix " remotes/" name of
5456 Just rest -> parseRemoteBranch rest
55- Nothing -> BranchLocal name
57+ Nothing -> BranchLocal name
5658 mkBranch [] = error " empty branch name"
5759 parseRemoteBranch str = BranchRemote remote name
58- where (remote, _ : name) = span (' /' /= ) str
60+ where
61+ (remote, rest) = span (' /' /= ) str
62+ name = drop 1 rest
5963
6064checkout :: Branch -> IO ExitCode
6165checkout branch = spawnGit [" checkout" , branchName branch]
@@ -71,8 +75,8 @@ merge branch = do
7175 spawnGit [" merge" , fullBranchName branch]
7276
7377deleteBranch :: Branch -> IO ExitCode
74- deleteBranch (BranchCurrent _ ) = error " Cannot delete current branch"
75- deleteBranch (BranchLocal n ) = spawnGit [" branch" , " -D" , n]
78+ deleteBranch (BranchCurrent _) = error " Cannot delete current branch"
79+ deleteBranch (BranchLocal n ) = spawnGit [" branch" , " -D" , n]
7680deleteBranch (BranchRemote o n) = spawnGit [" push" , o, " --delete" , n]
7781
7882spawnGit :: [String ] -> IO ExitCode
@@ -82,33 +86,33 @@ readGit :: [String] -> IO String
8286readGit args = readProcess " git" args []
8387
8488isCommonBranch :: Branch -> Bool
85- isCommonBranch b =
86- branchName b
87- `elem` [ " master "
88- , " main "
89- , " dev "
90- , " devel "
91- , " develop "
92- , " development "
93- , " staging "
94- , " trunk "
95- ]
96-
89+ isCommonBranch b = branchName b `elem` commonBranchNames
90+ where
91+ commonBranchNames =
92+ [ " master "
93+ , " main "
94+ , " dev "
95+ , " devel "
96+ , " develop "
97+ , " development "
98+ , " staging "
99+ , " trunk "
100+ ]
97101
98102isRemoteBranch :: Branch -> Bool
99103isRemoteBranch (BranchRemote _ _) = True
100- isRemoteBranch _ = False
104+ isRemoteBranch _ = False
101105
102106--- Helper
103107
104108branchName :: Branch -> String
105- branchName (BranchCurrent n ) = n
106- branchName (BranchLocal n ) = n
109+ branchName (BranchCurrent n) = n
110+ branchName (BranchLocal n ) = n
107111branchName (BranchRemote _ n) = n
108112
109113fullBranchName :: Branch -> String
110- fullBranchName (BranchCurrent n ) = n
111- fullBranchName (BranchLocal n ) = n
114+ fullBranchName (BranchCurrent n) = n
115+ fullBranchName (BranchLocal n ) = n
112116fullBranchName (BranchRemote r n) = r <> " /" <> n
113117
114118isHead :: String -> Bool
0 commit comments