2023-12-23 22:15:10 +01:00
|
|
|
{- This Source Code Form is subject to the terms of the Mozilla Public License,
|
|
|
|
v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
|
|
|
obtain one at https://mozilla.org/MPL/2.0/. -}
|
|
|
|
|
2023-08-04 21:33:21 +02:00
|
|
|
module Main
|
|
|
|
( main
|
|
|
|
) where
|
|
|
|
|
2024-09-14 11:32:34 +02:00
|
|
|
import Control.Monad.Catch (MonadThrow(..), handle)
|
2023-09-03 10:26:43 +02:00
|
|
|
import Control.Monad.IO.Class (MonadIO(..))
|
2023-11-01 17:05:16 +01:00
|
|
|
import qualified Data.Map as Map
|
2023-08-06 14:25:19 +02:00
|
|
|
import Options.Applicative (execParser)
|
|
|
|
import SlackBuilder.CommandLine
|
2023-08-09 20:59:42 +02:00
|
|
|
import SlackBuilder.Config
|
2023-08-15 10:33:19 +02:00
|
|
|
import SlackBuilder.Trans
|
2024-01-01 19:44:45 +01:00
|
|
|
import SlackBuilder.LatestVersionCheck
|
2024-03-19 11:34:19 +01:00
|
|
|
import SlackBuilder.Update
|
2023-08-09 20:59:42 +02:00
|
|
|
import qualified Toml
|
2023-09-03 10:26:43 +02:00
|
|
|
import Data.Text (Text)
|
2024-09-08 16:44:57 +02:00
|
|
|
import qualified Data.Text.IO as Text
|
2024-09-22 18:07:22 +02:00
|
|
|
import Control.Monad.Trans.Reader (ReaderT(..), asks)
|
2024-03-19 11:34:19 +01:00
|
|
|
import SlackBuilder.Package (PackageDescription(..))
|
2023-09-03 10:26:43 +02:00
|
|
|
import qualified SlackBuilder.Package as Package
|
2023-10-28 21:24:21 +02:00
|
|
|
import Text.URI.QQ (uri)
|
2024-09-22 18:07:22 +02:00
|
|
|
import Data.Foldable (find, traverse_)
|
2023-10-08 12:28:46 +02:00
|
|
|
import GHC.Records (HasField(..))
|
2024-03-19 11:34:19 +01:00
|
|
|
import System.Process (CmdSpec(..))
|
2024-08-20 22:36:43 +02:00
|
|
|
import System.Console.ANSI
|
|
|
|
( setSGR
|
|
|
|
, SGR(..)
|
|
|
|
, ColorIntensity(..)
|
|
|
|
, Color(..)
|
|
|
|
, ConsoleLayer(..)
|
|
|
|
)
|
2024-09-22 18:07:22 +02:00
|
|
|
import Data.Maybe (fromJust)
|
2023-09-03 10:26:43 +02:00
|
|
|
|
2024-09-22 18:07:22 +02:00
|
|
|
autoUpdatable :: [PackageSettings] -> [PackageDescription]
|
|
|
|
autoUpdatable packageSettings =
|
2024-02-17 14:15:01 +01:00
|
|
|
[ PackageDescription
|
2023-09-03 10:26:43 +02:00
|
|
|
{ latest =
|
2024-09-22 18:07:22 +02:00
|
|
|
let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
|
|
|
|
setting = fromJust $ find ((== "universal-ctags") . getField @"name") packageSettings
|
|
|
|
template = Package.DownloadTemplate $ getField @"template" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
in Package.Updater
|
2024-03-24 13:20:22 +01:00
|
|
|
{ detectLatest = latestGitHub ghArguments "(v)\\."
|
2024-01-19 09:57:58 +01:00
|
|
|
, getVersion = reuploadWithTemplate template []
|
2024-09-22 18:07:22 +02:00
|
|
|
, is64 = getField @"is64" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
}
|
2023-09-03 10:26:43 +02:00
|
|
|
, name = "universal-ctags"
|
2023-10-24 21:06:37 +02:00
|
|
|
, downloaders = mempty
|
2023-10-01 17:19:06 +02:00
|
|
|
}
|
2024-02-17 14:15:01 +01:00
|
|
|
, PackageDescription
|
2023-10-01 17:19:06 +02:00
|
|
|
{ latest =
|
2024-09-22 18:07:22 +02:00
|
|
|
let packagistArguments = uncurry PackageOwner $ fromJust $ getField @"packagist" setting
|
|
|
|
setting = fromJust $ find ((== "composer") . getField @"name") packageSettings
|
|
|
|
template = Package.DownloadTemplate $ getField @"template" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
in Package.Updater
|
|
|
|
{ detectLatest = latestPackagist packagistArguments
|
|
|
|
, getVersion = downloadWithTemplate template
|
2024-09-22 18:07:22 +02:00
|
|
|
, is64 = getField @"is64" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
}
|
2023-10-01 17:19:06 +02:00
|
|
|
, name = "composer"
|
2023-10-24 21:06:37 +02:00
|
|
|
, downloaders = mempty
|
2023-09-03 10:26:43 +02:00
|
|
|
}
|
2024-02-17 14:15:01 +01:00
|
|
|
, PackageDescription
|
2023-10-03 18:53:41 +02:00
|
|
|
{ latest =
|
2024-09-22 18:07:22 +02:00
|
|
|
let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
|
|
|
|
setting = fromJust $ find ((== "jitsi-meet-desktop") . getField @"name") packageSettings
|
|
|
|
template = Package.DownloadTemplate $ getField @"template" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
in Package.Updater
|
2024-03-24 13:20:22 +01:00
|
|
|
{ detectLatest = latestGitHub ghArguments "(v)*"
|
2024-01-19 09:57:58 +01:00
|
|
|
, getVersion = downloadWithTemplate template
|
2024-09-22 18:07:22 +02:00
|
|
|
, is64 = getField @"is64" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
}
|
2023-10-03 18:53:41 +02:00
|
|
|
, name = "jitsi-meet-desktop"
|
2023-10-24 21:06:37 +02:00
|
|
|
, downloaders = mempty
|
2023-10-03 18:53:41 +02:00
|
|
|
}
|
2024-02-17 14:15:01 +01:00
|
|
|
, PackageDescription
|
2023-10-04 22:36:19 +02:00
|
|
|
{ latest =
|
2024-09-22 18:07:22 +02:00
|
|
|
let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
|
|
|
|
setting = fromJust $ find ((== "php82") . getField @"name") packageSettings
|
|
|
|
template = Package.DownloadTemplate $ getField @"template" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
in Package.Updater
|
2024-03-24 13:20:22 +01:00
|
|
|
{ detectLatest = latestGitHub ghArguments "(php-)8.2.\\d"
|
2024-01-19 09:57:58 +01:00
|
|
|
, getVersion = downloadWithTemplate template
|
2024-09-22 18:07:22 +02:00
|
|
|
, is64 = getField @"is64" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
}
|
2023-10-04 22:36:19 +02:00
|
|
|
, name = "php82"
|
2023-10-24 21:06:37 +02:00
|
|
|
, downloaders = mempty
|
2023-10-08 12:28:46 +02:00
|
|
|
}
|
2024-02-17 14:15:01 +01:00
|
|
|
, PackageDescription
|
2023-10-08 12:28:46 +02:00
|
|
|
{ latest =
|
2024-09-22 18:07:22 +02:00
|
|
|
let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
|
|
|
|
setting = fromJust $ find ((== "kitty") . getField @"name") packageSettings
|
|
|
|
template = Package.DownloadTemplate $ getField @"template" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
in Package.Updater
|
2024-03-24 13:20:22 +01:00
|
|
|
{ detectLatest = latestGitHub ghArguments "(v)\\."
|
2024-01-19 09:57:58 +01:00
|
|
|
, getVersion = reuploadWithTemplate template [RawCommand "go" ["mod", "vendor"]]
|
2024-09-22 18:07:22 +02:00
|
|
|
, is64 = getField @"is64" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
}
|
2023-10-08 12:28:46 +02:00
|
|
|
, name = "kitty"
|
2023-10-24 21:06:37 +02:00
|
|
|
, downloaders = mempty
|
2023-10-04 22:36:19 +02:00
|
|
|
}
|
2024-02-17 14:15:01 +01:00
|
|
|
, PackageDescription
|
2023-10-13 19:34:02 +02:00
|
|
|
{ latest =
|
2024-09-22 18:07:22 +02:00
|
|
|
let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
|
|
|
|
setting = fromJust $ find ((== "rdiff-backup") . getField @"name") packageSettings
|
|
|
|
template = Package.DownloadTemplate $ getField @"template" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
in Package.Updater
|
2024-03-24 13:20:22 +01:00
|
|
|
{ detectLatest = latestGitHub ghArguments "(v)\\."
|
2024-01-19 09:57:58 +01:00
|
|
|
, getVersion = reuploadWithTemplate template []
|
2024-09-22 18:07:22 +02:00
|
|
|
, is64 = getField @"is64" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
}
|
2023-10-13 19:34:02 +02:00
|
|
|
, name = "rdiff-backup"
|
2023-10-24 21:06:37 +02:00
|
|
|
, downloaders = mempty
|
2023-10-13 19:34:02 +02:00
|
|
|
}
|
2024-02-17 14:15:01 +01:00
|
|
|
, PackageDescription
|
2023-10-20 15:53:48 +02:00
|
|
|
{ latest =
|
2024-09-27 12:20:34 +02:00
|
|
|
let textArguments = uncurry TextArguments $ fromJust $ getField @"text" setting
|
2024-09-22 18:07:22 +02:00
|
|
|
setting = fromJust $ find ((== "webex") . getField @"name") packageSettings
|
|
|
|
template = Package.DownloadTemplate $ getField @"template" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
in Package.Updater
|
|
|
|
{ detectLatest = latestText textArguments
|
|
|
|
, getVersion = downloadWithTemplate template
|
2024-09-22 18:07:22 +02:00
|
|
|
, is64 = getField @"is64" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
}
|
2023-10-20 15:53:48 +02:00
|
|
|
, name = "webex"
|
2023-10-24 21:06:37 +02:00
|
|
|
, downloaders = mempty
|
2023-10-20 15:53:48 +02:00
|
|
|
}
|
2024-02-17 14:15:01 +01:00
|
|
|
, PackageDescription
|
2023-10-20 19:23:21 +02:00
|
|
|
{ latest =
|
2024-09-22 18:07:22 +02:00
|
|
|
let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
|
|
|
|
setting = fromJust $ find ((== "librsync") . getField @"name") packageSettings
|
|
|
|
template = Package.DownloadTemplate $ getField @"template" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
in Package.Updater
|
2024-03-24 13:20:22 +01:00
|
|
|
{ detectLatest = latestGitHub ghArguments "(v)\\."
|
2024-01-19 09:57:58 +01:00
|
|
|
, getVersion = reuploadWithTemplate template []
|
2024-09-22 18:07:22 +02:00
|
|
|
, is64 = getField @"is64" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
}
|
2023-10-20 19:23:21 +02:00
|
|
|
, name = "librsync"
|
2023-11-01 17:05:16 +01:00
|
|
|
, downloaders = mempty
|
2023-10-20 19:23:21 +02:00
|
|
|
}
|
2024-02-17 14:15:01 +01:00
|
|
|
, PackageDescription
|
2023-10-20 19:23:21 +02:00
|
|
|
{ latest =
|
2024-09-27 12:20:34 +02:00
|
|
|
let textArguments = uncurry TextArguments $ fromJust $ getField @"text" setting
|
2024-09-22 18:07:22 +02:00
|
|
|
setting = fromJust $ find ((== "dmd") . getField @"name") packageSettings
|
|
|
|
template = Package.DownloadTemplate $ getField @"template" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
in Package.Updater
|
|
|
|
{ detectLatest = latestText textArguments
|
|
|
|
, getVersion = downloadWithTemplate template
|
2024-09-22 18:07:22 +02:00
|
|
|
, is64 = getField @"is64" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
}
|
2023-10-20 19:23:21 +02:00
|
|
|
, name = "dmd"
|
2023-10-24 21:06:37 +02:00
|
|
|
, downloaders = mempty
|
|
|
|
}
|
2024-02-17 14:15:01 +01:00
|
|
|
, PackageDescription
|
2023-10-24 21:06:37 +02:00
|
|
|
{ latest =
|
2024-09-27 12:20:34 +02:00
|
|
|
let textArguments = uncurry TextArguments $ fromJust $ getField @"text" setting
|
2024-09-22 18:07:22 +02:00
|
|
|
setting = fromJust $ find ((== "d-tools") . getField @"name") packageSettings
|
|
|
|
template = Package.DownloadTemplate $ getField @"template" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
in Package.Updater
|
|
|
|
{ detectLatest = latestText textArguments
|
|
|
|
, getVersion = reuploadWithTemplate template []
|
2024-09-22 18:07:22 +02:00
|
|
|
, is64 = getField @"is64" setting
|
2024-01-19 09:57:58 +01:00
|
|
|
}
|
2023-10-24 21:06:37 +02:00
|
|
|
, name = "d-tools"
|
|
|
|
, downloaders =
|
2024-01-01 19:44:45 +01:00
|
|
|
let dubArguments = PackageOwner{ owner = "dlang", name = "dub" }
|
|
|
|
dscannerArguments = PackageOwner{ owner = "dlang-community", name = "D-Scanner" }
|
|
|
|
dcdArguments = PackageOwner{ owner = "dlang-community", name = "DCD" }
|
2024-01-19 09:57:58 +01:00
|
|
|
latestDub = Package.Updater
|
2024-03-24 13:20:22 +01:00
|
|
|
{ detectLatest = latestGitHub dubArguments "(v)\\."
|
2024-05-13 18:26:23 +02:00
|
|
|
, getVersion = reuploadWithTemplate dubTemplate []
|
2024-01-19 09:57:58 +01:00
|
|
|
, is64 = False
|
|
|
|
}
|
|
|
|
latestDscanner = Package.Updater
|
2024-03-24 13:20:22 +01:00
|
|
|
{ detectLatest = latestGitHub dscannerArguments "(v)\\."
|
2024-01-19 09:57:58 +01:00
|
|
|
, getVersion = cloneFromGit dscannerURI "v"
|
|
|
|
, is64 = False
|
|
|
|
}
|
|
|
|
dcdURI = [uri|https://github.com/dlang-community/DCD.git|]
|
|
|
|
latestDcd = Package.Updater
|
2024-03-24 13:20:22 +01:00
|
|
|
{ detectLatest = latestGitHub dcdArguments "(v)\\."
|
2024-01-19 09:57:58 +01:00
|
|
|
, getVersion = cloneFromGit dcdURI "v"
|
|
|
|
, is64 = False
|
|
|
|
}
|
2024-09-01 17:34:24 +02:00
|
|
|
dubTemplate = Package.DownloadTemplate "https://codeload.github.com/dlang/dub/tar.gz/v{version}"
|
2023-10-28 21:24:21 +02:00
|
|
|
dscannerURI = [uri|https://github.com/dlang-community/D-Scanner.git|]
|
2023-11-01 17:05:16 +01:00
|
|
|
in Map.fromList
|
2024-01-19 09:57:58 +01:00
|
|
|
[ ("DUB", latestDub)
|
2024-03-04 17:28:07 +01:00
|
|
|
, ("DSCANNER", latestDscanner)
|
2024-01-19 09:57:58 +01:00
|
|
|
, ("DCD", latestDcd)
|
2023-10-28 21:24:21 +02:00
|
|
|
]
|
2023-10-20 19:23:21 +02:00
|
|
|
}
|
2024-03-26 11:52:16 +01:00
|
|
|
, PackageDescription
|
|
|
|
{ latest =
|
2024-09-22 18:07:22 +02:00
|
|
|
let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
|
|
|
|
setting = fromJust $ find ((== "simde") . getField @"name") packageSettings
|
|
|
|
template = Package.DownloadTemplate $ getField @"template" setting
|
2024-03-26 11:52:16 +01:00
|
|
|
in Package.Updater
|
|
|
|
{ detectLatest = latestGitHub ghArguments "(v)\\."
|
|
|
|
, getVersion = downloadWithTemplate template
|
2024-09-22 18:07:22 +02:00
|
|
|
, is64 = getField @"is64" setting
|
2024-03-26 11:52:16 +01:00
|
|
|
}
|
|
|
|
, name = "simde"
|
|
|
|
, downloaders = mempty
|
|
|
|
}
|
2024-09-09 16:47:44 +02:00
|
|
|
, PackageDescription
|
|
|
|
{ latest =
|
2024-09-22 18:07:22 +02:00
|
|
|
let ghArguments = uncurry PackageOwner $ fromJust $ getField @"github" setting
|
|
|
|
setting = fromJust $ find ((== "nginx") . getField @"name") packageSettings
|
|
|
|
template = Package.DownloadTemplate $ getField @"template" setting
|
2024-09-09 16:47:44 +02:00
|
|
|
in Package.Updater
|
|
|
|
{ detectLatest = latestGitHub ghArguments "(release-)\\d.[02468].\\d"
|
|
|
|
, getVersion = downloadWithTemplate template
|
2024-09-22 18:07:22 +02:00
|
|
|
, is64 = getField @"is64" setting
|
2024-09-09 16:47:44 +02:00
|
|
|
}
|
|
|
|
, name = "nginx"
|
|
|
|
, downloaders = mempty
|
|
|
|
}
|
2023-09-03 10:26:43 +02:00
|
|
|
]
|
|
|
|
|
2023-12-11 08:14:55 +01:00
|
|
|
up2Date :: Maybe Text -> SlackBuilderT ()
|
2024-09-22 18:07:22 +02:00
|
|
|
up2Date selectedPackage = do
|
|
|
|
packages' <- SlackBuilderT $ asks (getField @"packages")
|
|
|
|
case selectedPackage of
|
|
|
|
Nothing -> traverse_ (handle handleException . go) $ autoUpdatable packages'
|
|
|
|
Just packageName
|
|
|
|
| Just foundPackage <- find ((packageName ==) . getField @"name") (autoUpdatable packages') ->
|
|
|
|
go foundPackage
|
|
|
|
| otherwise -> throwM $ UpdaterNotFound packageName
|
2023-09-03 10:26:43 +02:00
|
|
|
where
|
2023-10-20 19:23:21 +02:00
|
|
|
go package = getAndLogLatest package
|
2024-02-17 14:15:01 +01:00
|
|
|
>>= mapM_ updatePackageIfRequired
|
2023-10-20 19:23:21 +02:00
|
|
|
>> liftIO (putStrLn "")
|
2023-09-03 10:26:43 +02:00
|
|
|
|
2023-12-09 21:33:34 +01:00
|
|
|
check :: SlackBuilderT ()
|
2024-09-22 18:07:22 +02:00
|
|
|
check = SlackBuilderT (asks (getField @"packages"))
|
|
|
|
>>= traverse_ (handle handleException . go) . autoUpdatable
|
2023-12-09 21:33:34 +01:00
|
|
|
where
|
|
|
|
go package = getAndLogLatest package
|
2024-02-17 14:15:01 +01:00
|
|
|
>>= mapM_ checkUpdateAvailability
|
2023-12-09 21:33:34 +01:00
|
|
|
>> liftIO (putStrLn "")
|
|
|
|
|
2023-08-04 21:33:21 +02:00
|
|
|
main :: IO ()
|
2024-09-08 16:44:57 +02:00
|
|
|
main = execParser slackBuilderParser
|
|
|
|
>>= handle handleException . withCommandLine
|
2023-08-09 20:59:42 +02:00
|
|
|
where
|
2024-09-08 16:44:57 +02:00
|
|
|
withCommandLine programCommand = do
|
|
|
|
settingsResult <- Toml.decodeFileEither settingsCodec configurationFile
|
|
|
|
case settingsResult of
|
|
|
|
Right settings -> flip runReaderT settings
|
|
|
|
$ runSlackBuilderT
|
|
|
|
$ executeCommand programCommand
|
|
|
|
Left settingsErrors
|
|
|
|
-> setSGR [SetColor Foreground Dull Red]
|
|
|
|
>> putStrLn (configurationFile <> " parsing failed.")
|
|
|
|
>> setSGR [Reset]
|
|
|
|
>> Text.putStr (Toml.prettyTomlDecodeErrors settingsErrors)
|
|
|
|
configurationFile = "config/config.toml"
|
2023-08-15 10:33:19 +02:00
|
|
|
executeCommand = \case
|
2024-08-20 22:36:43 +02:00
|
|
|
CheckCommand -> check
|
|
|
|
Up2DateCommand packageName -> up2Date packageName
|