Validate the .info file

This commit is contained in:
2023-10-04 22:36:19 +02:00
parent d5df676df7
commit 7b5598a02e
3 changed files with 75 additions and 10 deletions

View File

@ -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