summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/SlackBuilder/Config.hs12
-rw-r--r--lib/SlackBuilder/LatestVersionCheck.hs30
-rw-r--r--src/Main.hs16
3 files changed, 28 insertions, 30 deletions
diff --git a/lib/SlackBuilder/Config.hs b/lib/SlackBuilder/Config.hs
index 845a2c7..31e6283 100644
--- a/lib/SlackBuilder/Config.hs
+++ b/lib/SlackBuilder/Config.hs
@@ -35,7 +35,7 @@ data PackageSettings = PackageSettings
, is64 :: Bool
, github :: Maybe (Text, Text)
, packagist :: Maybe (Text, Text)
- , text :: Maybe Text
+ , text :: Maybe (Text, [String])
} deriving (Eq, Show)
settingsCodec :: Toml.TomlCodec Settings
@@ -57,6 +57,10 @@ packageSettingsCodec = PackageSettings
<$> Toml.text "name" .= name
<*> Toml.text "template" .= template
<*> 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
+ <*> Toml.dioptional (Toml.table githubCodec "github") .= github
+ <*> Toml.dioptional (Toml.table packagistCodec "packagist") .= packagist
+ <*> Toml.dioptional (Toml.table textCodec "text") .= text
+ where
+ githubCodec = Toml.pair (Toml.text "owner") (Toml.text "name")
+ packagistCodec = Toml.pair (Toml.text "owner") (Toml.text "name")
+ textCodec = Toml.pair (Toml.text "url") (Toml.arrayOf Toml._String "picker")
diff --git a/lib/SlackBuilder/LatestVersionCheck.hs b/lib/SlackBuilder/LatestVersionCheck.hs
index 9fc1b7e..8cbee34 100644
--- a/lib/SlackBuilder/LatestVersionCheck.hs
+++ b/lib/SlackBuilder/LatestVersionCheck.hs
@@ -49,8 +49,10 @@ import Control.Monad.IO.Class (MonadIO(..))
import Data.Char (isAlpha)
import SlackBuilder.Download (responseBodySource, reqGet)
import Network.HTTP.Client (BodyReader, Response(..))
-import Conduit (await)
-import Data.Conduit.Process (sourceCmdWithStreams)
+import Conduit (decodeUtf8C, (.|), linesUnboundedC, sinkNull)
+import qualified Data.Conduit.List as CL
+import Data.Conduit.Process (sourceProcessWithStreams, proc)
+import Data.Maybe (listToMaybe)
data PackageOwner = PackageOwner
{ owner :: Text
@@ -195,27 +197,29 @@ latestPackagist PackageOwner{..} = do
-- * Remote text file
data TextArguments = TextArguments
- { versionPicker :: Either (Text -> Text) [Text]
- , textURL :: Text
+ { textURL :: Text
+ , versionPicker :: [String]
}
latestText :: TextArguments -> SlackBuilderT (Maybe Text)
latestText TextArguments{..} = do
case versionPicker of
- Left versionPicker' -> do
+ (command : arguments) -> do
+ uri' <- mkURI textURL
+ runReq defaultHttpConfig $ reqGet uri' $ readResponse command arguments
+ [] -> do
uri <- liftIO $ useHttpsURI <$> mkURI textURL
packagistResponse <- traverse (runReq defaultHttpConfig . go . fst) uri
- pure $ versionPicker' . Text.Encoding.decodeUtf8 . Network.HTTP.Req.responseBody
+ pure $ Text.strip . Text.Encoding.decodeUtf8 . Network.HTTP.Req.responseBody
<$> packagistResponse
- Right _ -> do
- uri' <- mkURI textURL
- runReq defaultHttpConfig $ reqGet uri' readResponse
where
- readResponse :: Response BodyReader -> IO (Maybe Text)
- readResponse response = do
- (_, stdout', _) <- sourceCmdWithStreams "grep -oh 'Linux—[[:digit:].]\\+'" (responseBodySource response) await (pure ())
- pure $ Text.drop 6 . head . Text.lines . Text.Encoding.decodeUtf8 <$> stdout'
+ readResponse :: String -> [String] -> Response BodyReader -> IO (Maybe Text)
+ readResponse command arguments response = do
+ let createProcess' = proc command arguments
+ (_, stdout', _) <- sourceProcessWithStreams createProcess' (responseBodySource response) stdoutReader sinkNull
+ pure $ Text.drop 6 <$> listToMaybe stdout'
+ stdoutReader = decodeUtf8C .| linesUnboundedC .| CL.consume
go uri = req GET uri NoReqBody bsResponse mempty
-- * GitHub
diff --git a/src/Main.hs b/src/Main.hs
index d7adc88..17546fb 100644
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -17,7 +17,6 @@ import SlackBuilder.LatestVersionCheck
import SlackBuilder.Update
import qualified Toml
import Data.Text (Text)
-import qualified Data.Text as Text
import qualified Data.Text.IO as Text
import Control.Monad.Trans.Reader (ReaderT(..), asks)
import SlackBuilder.Package (PackageDescription(..))
@@ -117,10 +116,7 @@ autoUpdatable packageSettings =
}
, PackageDescription
{ latest =
- let textArguments = TextArguments
- { textURL = fromJust $ getField @"text" setting
- , versionPicker = Right ["grep", "-oh", "Linux—[[:digit:].]\\+"]
- }
+ let textArguments = uncurry TextArguments $ fromJust $ getField @"text" setting
setting = fromJust $ find ((== "webex") . getField @"name") packageSettings
template = Package.DownloadTemplate $ getField @"template" setting
in Package.Updater
@@ -146,10 +142,7 @@ autoUpdatable packageSettings =
}
, PackageDescription
{ latest =
- let textArguments = TextArguments
- { textURL = fromJust $ getField @"text" setting
- , versionPicker = Left Text.strip
- }
+ let textArguments = uncurry TextArguments $ fromJust $ getField @"text" setting
setting = fromJust $ find ((== "dmd") . getField @"name") packageSettings
template = Package.DownloadTemplate $ getField @"template" setting
in Package.Updater
@@ -162,10 +155,7 @@ autoUpdatable packageSettings =
}
, PackageDescription
{ latest =
- let textArguments = TextArguments
- { textURL = fromJust $ getField @"text" setting
- , versionPicker = Left Text.strip
- }
+ let textArguments = uncurry TextArguments $ fromJust $ getField @"text" setting
setting = fromJust $ find ((== "d-tools") . getField @"name") packageSettings
template = Package.DownloadTemplate $ getField @"template" setting
in Package.Updater