{- 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 . -} {-# 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