Validate the .info file
This commit is contained in:
@ -6,6 +6,7 @@ module SlackBuilder.Info
|
||||
, updateDownloadVersion
|
||||
) where
|
||||
|
||||
import Control.Applicative (Alternative(..))
|
||||
import Control.Monad.Combinators (sepBy)
|
||||
import qualified Data.ByteArray as ByteArray
|
||||
import Data.ByteString (ByteString)
|
||||
@ -33,6 +34,7 @@ import Text.URI
|
||||
, render
|
||||
, unRText
|
||||
)
|
||||
import qualified Data.Word8 as Word8
|
||||
|
||||
type GenParser = Parsec Void ByteString
|
||||
|
||||
@ -42,6 +44,11 @@ data PackageInfo = PackageInfo
|
||||
, homepage :: Text
|
||||
, downloads :: [URI]
|
||||
, checksums :: [Digest MD5]
|
||||
, downloadX64 :: [URI]
|
||||
, checksumX64 :: [Digest MD5]
|
||||
, requires :: [ByteString]
|
||||
, maintainer :: Text
|
||||
, email :: Text
|
||||
} deriving (Eq, Show)
|
||||
|
||||
variableEntry :: ByteString -> GenParser ByteString
|
||||
@ -52,8 +59,8 @@ variableEntry variable = string (Char8.append variable "=\"")
|
||||
variableSeparator :: GenParser ()
|
||||
variableSeparator = string " \\" *> space
|
||||
|
||||
packageDownloads :: GenParser [URI]
|
||||
packageDownloads = string "DOWNLOAD=\""
|
||||
packageDownloads :: ByteString -> GenParser [URI]
|
||||
packageDownloads variableName = string (variableName <> "=\"")
|
||||
*> sepBy parserBs variableSeparator
|
||||
<* string "\"\n"
|
||||
|
||||
@ -65,19 +72,41 @@ hexDigit =
|
||||
packageChecksum :: GenParser ByteString
|
||||
packageChecksum = ByteString.pack <$> count 16 hexDigit
|
||||
|
||||
packageChecksums :: GenParser [ByteString]
|
||||
packageChecksums = string "MD5SUM=\""
|
||||
packageChecksums :: ByteString -> GenParser [ByteString]
|
||||
packageChecksums variableName = string (variableName <> "=\"")
|
||||
*> sepBy packageChecksum variableSeparator
|
||||
<* string "\"\n"
|
||||
|
||||
packageRequires :: GenParser [ByteString]
|
||||
packageRequires = string "REQUIRES=\""
|
||||
*> sepBy packageName space
|
||||
<* string "\"\n"
|
||||
|
||||
packageName :: GenParser ByteString
|
||||
packageName = takeWhile1P Nothing isNameToken
|
||||
where
|
||||
isNameToken x = Word8.isAlphaNum x
|
||||
|| x == Word8._hyphen
|
||||
|| x == Word8._underscore
|
||||
|
||||
parseInfoFile :: GenParser PackageInfo
|
||||
parseInfoFile = PackageInfo
|
||||
<$> (Char8.unpack <$> variableEntry "PKGNAM")
|
||||
<$> (Char8.unpack <$> packagePrgnam)
|
||||
<*> (Text.decodeUtf8 <$> variableEntry "VERSION")
|
||||
<*> (Text.decodeUtf8 <$> variableEntry "HOMEPAGE")
|
||||
<*> packageDownloads
|
||||
<*> (mapMaybe digestFromByteString <$> packageChecksums)
|
||||
<*> packageDownloads "DOWNLOAD"
|
||||
<*> (mapMaybe digestFromByteString <$> packageChecksums "MD5SUM")
|
||||
<*> packageDownloads "DOWNLOAD_x86_64"
|
||||
<*> (mapMaybe digestFromByteString <$> packageChecksums "MD5SUM_x86_64")
|
||||
<*> packageRequires
|
||||
<*> (Text.decodeUtf8 <$> variableEntry "MAINTAINER")
|
||||
<*> (Text.decodeUtf8 <$> variableEntry "EMAIL")
|
||||
<* eof
|
||||
where
|
||||
packagePrgnam = (string "PKGNAM" <|> string "PRGNAM")
|
||||
>> string "=\""
|
||||
*> packageName
|
||||
<* "\"\n"
|
||||
|
||||
updateDownloadVersion :: PackageInfo -> Text -> Maybe String -> [URI]
|
||||
updateDownloadVersion package toVersion gnomeVersion
|
||||
|
Reference in New Issue
Block a user