diff options
Diffstat (limited to 'src/FSD/ChangeLog.hs')
-rw-r--r-- | src/FSD/ChangeLog.hs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/FSD/ChangeLog.hs b/src/FSD/ChangeLog.hs new file mode 100644 index 0000000..195b713 --- /dev/null +++ b/src/FSD/ChangeLog.hs @@ -0,0 +1,60 @@ +{- +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 #-} +module FSD.ChangeLog where + +import Data.Generics +import Data.Time +import Data.Text qualified as T +import Debian.Changes +import Debian.Version +import Text.Regex.TDFA +import FSD.Types + +readChangeLog :: String -> Maybe ChangeLogEntry +readChangeLog raw = case parseEntry raw of + Left _ -> Nothing + Right (entry, _) -> Just entry + +-- Debian version is an abstract type with no constructor, hence the ugly hack. +getVersion :: DebianVersion -> Maybe String +getVersion v = + let match = show v =~ ("\".*\"" :: String) + in if null match then Nothing else Just $ init $ tail match + +convertChangeLogEntry :: ChangeLogEntry -> Maybe FSDChangeLogEntry +convertChangeLogEntry entry = do + version <- getVersion $ logVersion entry + time <- parseTime' $ logDate entry + return $ + FSDChangeLogEntry + (T.pack $ logPackage entry) + (T.pack version) + (T.pack $ logWho entry) + time + where + parseTime' raw = + orElse + (parseTimeM False defaultTimeLocale "%a, %d %b %Y %T %Z" raw) + (parseTimeM False defaultTimeLocale "%a, %e %b %Y %T %Z" raw) + +getChangeLogEntry :: String -> Maybe FSDChangeLogEntry +getChangeLogEntry raw = readChangeLog raw >>= convertChangeLogEntry |