@@ -18,6 +18,7 @@ module Semantic.Git
1818import Control.Monad.IO.Class
1919import Data.Attoparsec.Text (Parser )
2020import Data.Attoparsec.Text as AP
21+ import Data.Char
2122import Data.Text as Text
2223import Shelly hiding (FilePath )
2324import System.IO (hSetBinaryMode )
@@ -41,28 +42,26 @@ sh = shelly . silently . onCommandHandles (initOutputHandles (`hSetBinaryMode` T
4142
4243-- | Parses an list of entries separated by \NUL, and on failure return []
4344parseEntries :: Text -> [TreeEntry ]
44- parseEntries text = case parseOnly everything text of
45- Done " " ls -> ls
46- other -> error (" There was an error parsing the Git output: " <> show other)
45+ parseEntries = either (const [] ) id . AP. parseOnly everything
4746 where
48- everything = AP. sepBy entryParser " \NUL " <* (" \NUL\n " <?> " End sequence" ) <* AP. endOfInput <?> " Everything"
49- parseOnly p t = AP. feed (AP. parse p t) " "
47+ everything = AP. sepBy entryParser " \NUL " <* " \NUL\n " <* AP. endOfInput
5048
5149-- | Parse the entire input with entryParser, and on failure return a default
5250-- For testing purposes only
53- parseEntry :: Text -> TreeEntry
54- parseEntry = either ( const nullTreeEntry) id . AP. parseOnly (entryParser <* AP. endOfInput)
51+ parseEntry :: Text -> Either String TreeEntry
52+ parseEntry = AP. parseOnly (entryParser <* AP. endOfInput)
5553
5654-- | Parses a TreeEntry
5755entryParser :: Parser TreeEntry
5856entryParser = TreeEntry
59- <$> modeParser <* ( " " <?> " First Space " )
60- <*> typeParser <* ( " " <?> " Second Space " )
61- <*> ( OID <$> AP. takeWhile ( AP. inClass " 0123456789abcdef " ) <?> " OID Parser " ) <* ( " \t " <?> " Tab " )
62- <*> (unpack <$> AP. takeWhile (/= ' \NUL ' ) <?> " Filepath " ) <?> " Entry Parser "
57+ <$> modeParser <* AP. char ' '
58+ <*> typeParser <* AP. char ' '
59+ <*> oidParser <* AP. char ' \t '
60+ <*> (unpack <$> AP. takeWhile (/= ' \NUL ' ))
6361 where
64- typeParser = AP. choice [BlobObject <$ " blob" , TreeObject <$ " tree" ] <?> " Type Parser"
65- modeParser = AP. choice [NormalMode <$ " 100644" , ExecutableMode <$ " 100755" , SymlinkMode <$ " 120000" , TreeMode <$ " 040000" ] <?> " Mode Parser"
62+ typeParser = AP. choice [BlobObject <$ " blob" , TreeObject <$ " tree" ]
63+ modeParser = AP. choice [NormalMode <$ " 100644" , ExecutableMode <$ " 100755" , SymlinkMode <$ " 120000" , TreeMode <$ " 040000" ]
64+ oidParser = OID <$> AP. takeWhile isHexDigit
6665
6766newtype OID = OID Text
6867 deriving (Eq , Show , Ord )
@@ -89,5 +88,3 @@ data TreeEntry
8988 , treeEntryPath :: FilePath
9089 } deriving (Eq , Show )
9190
92- nullTreeEntry :: TreeEntry
93- nullTreeEntry = TreeEntry OtherMode OtherObjectType (OID mempty ) mempty
0 commit comments