aboutsummaryrefslogtreecommitdiff
path: root/src/FSD/Package.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/FSD/Package.hs')
-rw-r--r--src/FSD/Package.hs61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/FSD/Package.hs b/src/FSD/Package.hs
new file mode 100644
index 0000000..8ccd852
--- /dev/null
+++ b/src/FSD/Package.hs
@@ -0,0 +1,61 @@
+{-
+Copyright (C) 2022 Yuchen Pei.
+
+This file is part of fsd.
+
+fsd is free software: you can redistribute it and/or modify it under
+the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+fsd is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
+Public License for more details.
+
+You should have received a copy of the GNU Affero General Public
+License along with fsd. If not, see <https://www.gnu.org/licenses/>.
+
+-}
+
+{-# LANGUAGE ImportQualifiedPost #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module FSD.Package where
+
+import Data.Generics
+import Data.Maybe
+import Data.Text (Text)
+import Data.Text qualified as T
+import Debian.Control
+import Text.Regex.TDFA
+import FSD.Types
+
+getTags :: Paragraph -> [Text]
+getTags para = case fieldValue "Tag" para of
+ Nothing -> []
+ Just tags ->
+ (T.splitOn ", " . T.pack . concat . lines) tags
+
+{-package version should be from Source field overriding Version field:
+Package: pandoc
+Source: pandoc (2.9.2.1-1)
+Version: 2.9.2.1-1+b1
+-}
+getPackage :: Paragraph -> Maybe Package
+getPackage para = do
+ package <- T.pack <$> fieldValue "Package" para
+ let homepage = T.pack <$> fieldValue "Homepage" para
+ let tags = getTags para
+ let srcVersion = extractSrcVersion =<< fieldValue "Source" para
+ version <- T.pack <$> orElse srcVersion (fieldValue "Version" para)
+ return $ Package package version homepage (Tags tags)
+ where
+ extractSrcVersion :: String -> Maybe String
+ extractSrcVersion source =
+ case source =~ (".*\\((.*)\\)$" :: String) :: [[String]] of
+ [[_, version]] -> Just version
+ _ -> Nothing
+
+getPackages :: Control -> [Package]
+getPackages = catMaybes . fmap getPackage . unControl