diff options
Diffstat (limited to 'src/SlackBuilder/Update.hs')
| -rw-r--r-- | src/SlackBuilder/Update.hs | 63 |
1 files changed, 28 insertions, 35 deletions
diff --git a/src/SlackBuilder/Update.hs b/src/SlackBuilder/Update.hs index 773903d..79964b8 100644 --- a/src/SlackBuilder/Update.hs +++ b/src/SlackBuilder/Update.hs @@ -8,6 +8,7 @@ module SlackBuilder.Update , downloadWithTemplate , getAndLogLatest , handleException + , listRepository , repackageWithTemplate , reuploadWithTemplate , updatePackageIfRequired @@ -17,8 +18,9 @@ import Control.Exception (Exception(..), SomeException(..)) import Control.Monad.Catch (MonadCatch(..)) import Control.Monad.IO.Class (MonadIO(..)) import Control.Monad.Trans.Reader (asks) -import qualified Data.ByteString as ByteString import Data.Foldable (Foldable(..), find) +import Data.HashMap.Strict (HashMap) +import qualified Data.HashMap.Strict as HashMap import qualified Data.List.NonEmpty as NonEmpty import Data.Maybe (fromJust, fromMaybe) import Data.Text (Text) @@ -48,7 +50,6 @@ import SlackBuilder.Info import SlackBuilder.Package (PackageDescription(..), PackageUpdateData(..)) import qualified SlackBuilder.Package as Package import SlackBuilder.Trans -import Text.Megaparsec (parse, errorBundlePretty) import Text.URI (URI(..)) import qualified Text.URI as URI import System.Directory @@ -74,41 +75,32 @@ getAndLogLatest description = do let PackageDescription{ latest = Package.Updater{ detectLatest }, name } = description liftIO (putStrLn $ Text.unpack name <> ": Retreiving the latest version.") detectedVersion <- detectLatest - category <- fmap Text.pack - <$> findCategory (Text.unpack name) + category <- HashMap.lookup name <$> listRepository pure $ PackageUpdateData description <$> category <*> detectedVersion checkUpdateAvailability :: PackageUpdateData -> SlackBuilderT (Maybe PackageInfo) checkUpdateAvailability PackageUpdateData{..} = do - let name' = Text.unpack $ getField @"name" description - packagePath = Text.unpack category </> name' </> (name' <.> "info") - repository' <- SlackBuilderT $ asks repository - infoContents <- liftIO $ ByteString.readFile $ repository' </> packagePath + parsedInfoFile <- readInfoFile category $ getField @"name" description - case parse parseInfoFile packagePath infoContents of - Right parsedInfoFile - | version == getField @"version" parsedInfoFile -> - liftIO $ do - setSGR [SetColor Foreground Dull Green] - Text.IO.putStrLn - $ getField @"name" description <> " is up to date (Version " <> version <> ")." - setSGR [Reset] - pure Nothing - | otherwise -> - liftIO $ do - setSGR [SetColor Foreground Dull Yellow] - Text.IO.putStr - $ "A new version of " - <> getField @"name" description - <> " " <> getField @"version" parsedInfoFile - <> " is available (" <> version <> ")." - setSGR [Reset] - putStrLn "" - pure $ Just parsedInfoFile - Left errorBundle -> liftIO (putStr $ errorBundlePretty errorBundle) - >> pure Nothing + if version == getField @"version" parsedInfoFile + then liftIO $ do + setSGR [SetColor Foreground Dull Green] + Text.IO.putStrLn + $ getField @"name" description <> " is up to date (Version " <> version <> ")." + setSGR [Reset] + pure Nothing + else liftIO $ do + setSGR [SetColor Foreground Dull Yellow] + Text.IO.putStr + $ "A new version of " + <> getField @"name" description + <> " " <> getField @"version" parsedInfoFile + <> " is available (" <> version <> ")." + setSGR [Reset] + putStrLn "" + pure $ Just parsedInfoFile updatePackageIfRequired :: PackageUpdateData -> SlackBuilderT () updatePackageIfRequired updateData @@ -252,19 +244,20 @@ updatePackage PackageUpdateData{..} info = do commit packagePath version -findCategory :: FilePath -> SlackBuilderT (Maybe FilePath) -findCategory packageName = do +listRepository :: SlackBuilderT (HashMap Text Text) +listRepository = do repository' <- SlackBuilderT $ asks repository - go repository' [] "" <&> fmap fst . find ((packageName ==) . snd) + listing <- go repository' [] "" + pure $ HashMap.fromList $ bimap Text.pack Text.pack <$> listing where go currentDirectory found accumulatedDirectory = do let fullDirectory = currentDirectory </> accumulatedDirectory contents <- liftIO $ listDirectory fullDirectory case find (isSuffixOf ".info") contents of Just _ -> - let result = first dropTrailingPathSeparator + let (category, packageName) = first dropTrailingPathSeparator $ splitFileName accumulatedDirectory - in pure $ result : found + in pure $ (packageName, category) : found Nothing -> let accumulatedDirectories = (accumulatedDirectory </>) <$> filter (not . isPrefixOf ".") contents |
