diff options
| author | Eugen Wissner <belka@caraus.de> | 2024-11-25 17:08:28 +0100 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2024-11-25 17:08:28 +0100 |
| commit | 468852410e3881910d803192f13ed13f19a7af41 (patch) | |
| tree | f44f6f06a0d1883ab64a07f440dcef6b773da29f /src/Main.hs | |
| parent | b5e6e3a2d68111cc7f84d939dc7b82ff2aac1801 (diff) | |
| download | slackbuilder-468852410e3881910d803192f13ed13f19a7af41.tar.gz | |
List installed packages from a repository
Diffstat (limited to 'src/Main.hs')
| -rw-r--r-- | src/Main.hs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/Main.hs b/src/Main.hs index 2f328f7..3ac5745 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -17,6 +17,7 @@ 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(..), renderTextWithVersion) @@ -32,6 +33,9 @@ import System.Console.ANSI ) import Data.Maybe (mapMaybe) import qualified Text.URI as URI +import System.Directory (listDirectory) +import qualified Data.HashMap.Strict as HashMap +import SlackBuilder.Info (readInfoFile) autoUpdatable :: [PackageSettings] -> [PackageDescription] autoUpdatable = mapMaybe go @@ -97,6 +101,31 @@ check = SlackBuilderT (asks (getField @"packages")) >>= mapM_ checkUpdateAvailability >> liftIO (putStrLn "") +installed :: SlackBuilderT () +installed = do + listing <- listRepository + database <- foldr createDataBase HashMap.empty . mapMaybe createEntry + <$> liftIO (listDirectory "/var/lib/pkgtools/packages") + traverse_ findInfo $ HashMap.intersectionWith (,) database listing + where + findInfo (installed'@Package.DataBaseEntry{ name }, fromRepository) = do + _ <- readInfoFile fromRepository name + liftIO $ print installed' + createDataBase entry@Package.DataBaseEntry{ name } = + HashMap.insert name entry + createEntry filename = createEntryFromChunks + $ Text.split (== '-') + $ Text.reverse + $ Text.pack filename + createEntryFromChunks (build : arch : version : name) = Just + Package.DataBaseEntry + { arch = Text.reverse arch + , build = Text.reverse build + , version = Text.reverse version + , name = Text.reverse (Text.intercalate "-" name) + } + createEntryFromChunks _ = Nothing + main :: IO () main = execParser slackBuilderParser >>= handle handleException . withCommandLine @@ -116,3 +145,4 @@ main = execParser slackBuilderParser executeCommand = \case CheckCommand -> check Up2DateCommand packageName -> up2Date packageName + InstalledCommand -> installed |
