diff options
author | Yuchen Pei <hi@ypei.me> | 2022-05-19 22:23:10 +1000 |
---|---|---|
committer | Yuchen Pei <hi@ypei.me> | 2022-05-19 22:23:10 +1000 |
commit | 3db93bc6f7b46bc322694e6658b8f559433a03c6 (patch) | |
tree | 1273a17e11e0d9888ae57676906c68f8bb77e287 /src/FSD/ChangeLog.hs | |
parent | 09c05e86a1096b08eb7483b970207d47d0388665 (diff) |
Replacing the files with a haskell rewrite.
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 |