Mix configuration and PackageDescription
All checks were successful
Build / audit (push) Successful in 7s
Build / test (push) Successful in 14m41s

This commit is contained in:
Eugen Wissner 2024-09-22 18:07:22 +02:00
parent 2a78256933
commit 00cc58f87e
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
2 changed files with 69 additions and 79 deletions

View File

@ -33,6 +33,9 @@ data PackageSettings = PackageSettings
{ name :: Text { name :: Text
, template :: Text , template :: Text
, is64 :: Bool , is64 :: Bool
, github :: Maybe (Text, Text)
, packagist :: Maybe (Text, Text)
, text :: Maybe Text
} deriving (Eq, Show) } deriving (Eq, Show)
settingsCodec :: Toml.TomlCodec Settings settingsCodec :: Toml.TomlCodec Settings
@ -54,3 +57,6 @@ packageSettingsCodec = PackageSettings
<$> Toml.text "name" .= name <$> Toml.text "name" .= name
<*> Toml.text "template" .= template <*> Toml.text "template" .= template
<*> Toml.bool "is64" .= is64 <*> Toml.bool "is64" .= is64
<*> Toml.dioptional (flip Toml.table "github" $ Toml.pair (Toml.text "owner") (Toml.text "name")) .= github
<*> Toml.dioptional (flip Toml.table "packagist" $ Toml.pair (Toml.text "owner") (Toml.text "name")) .= packagist
<*> Toml.dioptional (flip Toml.table "text" $ Toml.text "url") .= text

View File

@ -20,11 +20,11 @@ import qualified Toml
import Data.Text (Text) import Data.Text (Text)
import qualified Data.Text as Text import qualified Data.Text as Text
import qualified Data.Text.IO as Text import qualified Data.Text.IO as Text
import Control.Monad.Trans.Reader (ReaderT(..)) import Control.Monad.Trans.Reader (ReaderT(..), asks)
import SlackBuilder.Package (PackageDescription(..)) import SlackBuilder.Package (PackageDescription(..))
import qualified SlackBuilder.Package as Package import qualified SlackBuilder.Package as Package
import Text.URI.QQ (uri) import Text.URI.QQ (uri)
import Data.Foldable (for_, find) import Data.Foldable (find, traverse_)
import GHC.Records (HasField(..)) import GHC.Records (HasField(..))
import System.Process (CmdSpec(..)) import System.Process (CmdSpec(..))
import System.Console.ANSI import System.Console.ANSI
@ -34,95 +34,84 @@ import System.Console.ANSI
, Color(..) , Color(..)
, ConsoleLayer(..) , ConsoleLayer(..)
) )
import Data.Maybe (fromJust)
autoUpdatable :: [PackageDescription] autoUpdatable :: [PackageSettings] -> [PackageDescription]
autoUpdatable = autoUpdatable packageSettings =
[ PackageDescription [ PackageDescription
{ latest = { latest =
let ghArguments = PackageOwner{ owner = "universal-ctags", name = "ctags" } let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
template = Package.DownloadTemplate setting = fromJust $ find ((== "universal-ctags") . getField @"name") packageSettings
"https://github.com/universal-ctags/ctags/archive/{version}/ctags-{version}.tar.gz" template = Package.DownloadTemplate $ getField @"template" setting
in Package.Updater in Package.Updater
{ detectLatest = latestGitHub ghArguments "(v)\\." { detectLatest = latestGitHub ghArguments "(v)\\."
, getVersion = reuploadWithTemplate template [] , getVersion = reuploadWithTemplate template []
, is64 = False , is64 = getField @"is64" setting
} }
, name = "universal-ctags" , name = "universal-ctags"
, downloaders = mempty , downloaders = mempty
} }
, PackageDescription , PackageDescription
{ latest = { latest =
let packagistArguments = PackageOwner{ owner = "composer", name = "composer" } let packagistArguments = uncurry PackageOwner $ fromJust $ getField @"packagist" setting
template = Package.DownloadTemplate setting = fromJust $ find ((== "composer") . getField @"name") packageSettings
"https://getcomposer.org/download/{version}/composer.phar" template = Package.DownloadTemplate $ getField @"template" setting
in Package.Updater in Package.Updater
{ detectLatest = latestPackagist packagistArguments { detectLatest = latestPackagist packagistArguments
, getVersion = downloadWithTemplate template , getVersion = downloadWithTemplate template
, is64 = False , is64 = getField @"is64" setting
} }
, name = "composer" , name = "composer"
, downloaders = mempty , downloaders = mempty
} }
, PackageDescription , PackageDescription
{ latest = { latest =
let ghArguments = PackageOwner let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
{ owner = "jitsi" setting = fromJust $ find ((== "jitsi-meet-desktop") . getField @"name") packageSettings
, name = "jitsi-meet-electron" template = Package.DownloadTemplate $ getField @"template" setting
}
template = Package.DownloadTemplate
"https://github.com/jitsi/jitsi-meet-electron/releases/download/v{version}/jitsi-meet-x86_64.AppImage"
in Package.Updater in Package.Updater
{ detectLatest = latestGitHub ghArguments "(v)*" { detectLatest = latestGitHub ghArguments "(v)*"
, getVersion = downloadWithTemplate template , getVersion = downloadWithTemplate template
, is64 = True , is64 = getField @"is64" setting
} }
, name = "jitsi-meet-desktop" , name = "jitsi-meet-desktop"
, downloaders = mempty , downloaders = mempty
} }
, PackageDescription , PackageDescription
{ latest = { latest =
let ghArguments = PackageOwner let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
{ owner = "php" setting = fromJust $ find ((== "php82") . getField @"name") packageSettings
, name = "php-src" template = Package.DownloadTemplate $ getField @"template" setting
}
template = Package.DownloadTemplate
"https://www.php.net/distributions/php-{version}.tar.xz"
in Package.Updater in Package.Updater
{ detectLatest = latestGitHub ghArguments "(php-)8.2.\\d" { detectLatest = latestGitHub ghArguments "(php-)8.2.\\d"
, getVersion = downloadWithTemplate template , getVersion = downloadWithTemplate template
, is64 = False , is64 = getField @"is64" setting
} }
, name = "php82" , name = "php82"
, downloaders = mempty , downloaders = mempty
} }
, PackageDescription , PackageDescription
{ latest = { latest =
let ghArguments = PackageOwner let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
{ owner = "kovidgoyal" setting = fromJust $ find ((== "kitty") . getField @"name") packageSettings
, name = "kitty" template = Package.DownloadTemplate $ getField @"template" setting
}
template = Package.DownloadTemplate
"https://github.com/kovidgoyal/kitty/releases/download/v{version}/kitty-{version}.tar.xz"
in Package.Updater in Package.Updater
{ detectLatest = latestGitHub ghArguments "(v)\\." { detectLatest = latestGitHub ghArguments "(v)\\."
, getVersion = reuploadWithTemplate template [RawCommand "go" ["mod", "vendor"]] , getVersion = reuploadWithTemplate template [RawCommand "go" ["mod", "vendor"]]
, is64 = False , is64 = getField @"is64" setting
} }
, name = "kitty" , name = "kitty"
, downloaders = mempty , downloaders = mempty
} }
, PackageDescription , PackageDescription
{ latest = { latest =
let ghArguments = PackageOwner let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
{ owner = "rdiff-backup" setting = fromJust $ find ((== "rdiff-backup") . getField @"name") packageSettings
, name = "rdiff-backup" template = Package.DownloadTemplate $ getField @"template" setting
}
template = Package.DownloadTemplate
"https://github.com/rdiff-backup/rdiff-backup/releases/download/v{version}/rdiff-backup-{version}.tar.gz"
in Package.Updater in Package.Updater
{ detectLatest = latestGitHub ghArguments "(v)\\." { detectLatest = latestGitHub ghArguments "(v)\\."
, getVersion = reuploadWithTemplate template [] , getVersion = reuploadWithTemplate template []
, is64 = False , is64 = getField @"is64" setting
} }
, name = "rdiff-backup" , name = "rdiff-backup"
, downloaders = mempty , downloaders = mempty
@ -131,34 +120,31 @@ autoUpdatable =
{ latest = { latest =
let needle = "Linux—" let needle = "Linux—"
textArguments = TextArguments textArguments = TextArguments
{ textURL = "https://help.webex.com/en-us/article/mqkve8/Webex-App-%7C-Release-notes" { textURL = fromJust $ getField @"text" setting
, versionPicker = Text.takeWhile (liftA2 (||) (== '.') isNumber) , versionPicker = Text.takeWhile (liftA2 (||) (== '.') isNumber)
. Text.drop (Text.length needle) . Text.drop (Text.length needle)
. snd . snd
. Text.breakOn needle . Text.breakOn needle
} }
template = Package.DownloadTemplate setting = fromJust $ find ((== "webex") . getField @"name") packageSettings
"https://binaries.webex.com/WebexDesktop-Ubuntu-Official-Package/Webex.deb" template = Package.DownloadTemplate $ getField @"template" setting
in Package.Updater in Package.Updater
{ detectLatest = latestText textArguments { detectLatest = latestText textArguments
, getVersion = downloadWithTemplate template , getVersion = downloadWithTemplate template
, is64 = True , is64 = getField @"is64" setting
} }
, name = "webex" , name = "webex"
, downloaders = mempty , downloaders = mempty
} }
, PackageDescription , PackageDescription
{ latest = { latest =
let ghArguments = PackageOwner let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
{ owner = "librsync" setting = fromJust $ find ((== "librsync") . getField @"name") packageSettings
, name = "librsync" template = Package.DownloadTemplate $ getField @"template" setting
}
template = Package.DownloadTemplate
"https://github.com/librsync/librsync/archive/v{version}/librsync-{version}.tar.gz"
in Package.Updater in Package.Updater
{ detectLatest = latestGitHub ghArguments "(v)\\." { detectLatest = latestGitHub ghArguments "(v)\\."
, getVersion = reuploadWithTemplate template [] , getVersion = reuploadWithTemplate template []
, is64 = False , is64 = getField @"is64" setting
} }
, name = "librsync" , name = "librsync"
, downloaders = mempty , downloaders = mempty
@ -166,15 +152,15 @@ autoUpdatable =
, PackageDescription , PackageDescription
{ latest = { latest =
let textArguments = TextArguments let textArguments = TextArguments
{ textURL = "https://downloads.dlang.org/releases/LATEST" { textURL = fromJust $ getField @"text" setting
, versionPicker = Text.strip , versionPicker = Text.strip
} }
template = Package.DownloadTemplate setting = fromJust $ find ((== "dmd") . getField @"name") packageSettings
"https://downloads.dlang.org/releases/2.x/{version}/dmd.{version}.linux.tar.xz" template = Package.DownloadTemplate $ getField @"template" setting
in Package.Updater in Package.Updater
{ detectLatest = latestText textArguments { detectLatest = latestText textArguments
, getVersion = downloadWithTemplate template , getVersion = downloadWithTemplate template
, is64 = False , is64 = getField @"is64" setting
} }
, name = "dmd" , name = "dmd"
, downloaders = mempty , downloaders = mempty
@ -182,14 +168,15 @@ autoUpdatable =
, PackageDescription , PackageDescription
{ latest = { latest =
let textArguments = TextArguments let textArguments = TextArguments
{ textURL = "https://downloads.dlang.org/releases/LATEST" { textURL = fromJust $ getField @"text" setting
, versionPicker = Text.strip , versionPicker = Text.strip
} }
template = Package.DownloadTemplate "https://codeload.github.com/dlang/tools/tar.gz/v{version}" setting = fromJust $ find ((== "d-tools") . getField @"name") packageSettings
template = Package.DownloadTemplate $ getField @"template" setting
in Package.Updater in Package.Updater
{ detectLatest = latestText textArguments { detectLatest = latestText textArguments
, getVersion = reuploadWithTemplate template [] , getVersion = reuploadWithTemplate template []
, is64 = False , is64 = getField @"is64" setting
} }
, name = "d-tools" , name = "d-tools"
, downloaders = , downloaders =
@ -222,32 +209,26 @@ autoUpdatable =
} }
, PackageDescription , PackageDescription
{ latest = { latest =
let ghArguments = PackageOwner let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
{ owner = "simd-everywhere" setting = fromJust $ find ((== "simde") . getField @"name") packageSettings
, name = "simde" template = Package.DownloadTemplate $ getField @"template" setting
}
template = Package.DownloadTemplate
"https://github.com/simd-everywhere/simde/releases/download/v{version}/simde-amalgamated-{version}.tar.xz"
in Package.Updater in Package.Updater
{ detectLatest = latestGitHub ghArguments "(v)\\." { detectLatest = latestGitHub ghArguments "(v)\\."
, getVersion = downloadWithTemplate template , getVersion = downloadWithTemplate template
, is64 = False , is64 = getField @"is64" setting
} }
, name = "simde" , name = "simde"
, downloaders = mempty , downloaders = mempty
} }
, PackageDescription , PackageDescription
{ latest = { latest =
let ghArguments = PackageOwner let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
{ owner = "nginx" setting = fromJust $ find ((== "nginx") . getField @"name") packageSettings
, name = "nginx" template = Package.DownloadTemplate $ getField @"template" setting
}
template = Package.DownloadTemplate
"http://nginx.org/download/nginx-{version}.tar.gz"
in Package.Updater in Package.Updater
{ detectLatest = latestGitHub ghArguments "(release-)\\d.[02468].\\d" { detectLatest = latestGitHub ghArguments "(release-)\\d.[02468].\\d"
, getVersion = downloadWithTemplate template , getVersion = downloadWithTemplate template
, is64 = False , is64 = getField @"is64" setting
} }
, name = "nginx" , name = "nginx"
, downloaders = mempty , downloaders = mempty
@ -255,19 +236,22 @@ autoUpdatable =
] ]
up2Date :: Maybe Text -> SlackBuilderT () up2Date :: Maybe Text -> SlackBuilderT ()
up2Date = \case up2Date selectedPackage = do
Nothing -> for_ autoUpdatable $ handle handleException . go packages' <- SlackBuilderT $ asks (getField @"packages")
Just packageName case selectedPackage of
| Just foundPackage <- find ((packageName ==) . getField @"name") autoUpdatable -> Nothing -> traverse_ (handle handleException . go) $ autoUpdatable packages'
go foundPackage Just packageName
| otherwise -> throwM $ UpdaterNotFound packageName | Just foundPackage <- find ((packageName ==) . getField @"name") (autoUpdatable packages') ->
go foundPackage
| otherwise -> throwM $ UpdaterNotFound packageName
where where
go package = getAndLogLatest package go package = getAndLogLatest package
>>= mapM_ updatePackageIfRequired >>= mapM_ updatePackageIfRequired
>> liftIO (putStrLn "") >> liftIO (putStrLn "")
check :: SlackBuilderT () check :: SlackBuilderT ()
check = for_ autoUpdatable $ handle handleException . go check = SlackBuilderT (asks (getField @"packages"))
>>= traverse_ (handle handleException . go) . autoUpdatable
where where
go package = getAndLogLatest package go package = getAndLogLatest package
>>= mapM_ checkUpdateAvailability >>= mapM_ checkUpdateAvailability