module Debian.Debianize.Changelog
    ( filterEntries
    , dropFutureEntries
    , findChangelogEntry
    , mergeChangelogEntries
    ) where

import Debian.Changes (ChangeLog(..), ChangeLogEntry(..))
import Debian.Version (DebianVersion)
import Prelude hiding (log)

-- | Apply a filter to the version numbers of the changelog entries.
filterEntries :: (DebianVersion -> Bool) -> ChangeLog -> ChangeLog
filterEntries :: (DebianVersion -> Bool) -> ChangeLog -> ChangeLog
filterEntries DebianVersion -> Bool
p (ChangeLog [ChangeLogEntry]
entries) = [ChangeLogEntry] -> ChangeLog
ChangeLog ([ChangeLogEntry] -> ChangeLog) -> [ChangeLogEntry] -> ChangeLog
forall a b. (a -> b) -> a -> b
$ (ChangeLogEntry -> Bool) -> [ChangeLogEntry] -> [ChangeLogEntry]
forall a. (a -> Bool) -> [a] -> [a]
filter (DebianVersion -> Bool
p (DebianVersion -> Bool)
-> (ChangeLogEntry -> DebianVersion) -> ChangeLogEntry -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChangeLogEntry -> DebianVersion
logVersion) ([ChangeLogEntry] -> [ChangeLogEntry])
-> [ChangeLogEntry] -> [ChangeLogEntry]
forall a b. (a -> b) -> a -> b
$ [ChangeLogEntry]
entries

-- | Filter out versions newer than the given one.
dropFutureEntries :: DebianVersion -> ChangeLog -> ChangeLog
dropFutureEntries :: DebianVersion -> ChangeLog -> ChangeLog
dropFutureEntries DebianVersion
ver ChangeLog
log = (DebianVersion -> Bool) -> ChangeLog -> ChangeLog
filterEntries (DebianVersion -> DebianVersion -> Bool
forall a. Ord a => a -> a -> Bool
<= DebianVersion
ver) ChangeLog
log

-- | Find the log entry with the given version.
findChangelogEntry :: DebianVersion -> ChangeLog -> Maybe ChangeLogEntry
findChangelogEntry :: DebianVersion -> ChangeLog -> Maybe ChangeLogEntry
findChangelogEntry DebianVersion
ver ChangeLog
log =
    case (DebianVersion -> Bool) -> ChangeLog -> ChangeLog
filterEntries (DebianVersion -> DebianVersion -> Bool
forall a. Eq a => a -> a -> Bool
== DebianVersion
ver) ChangeLog
log of
      ChangeLog [] -> Maybe ChangeLogEntry
forall a. Maybe a
Nothing
      ChangeLog [ChangeLogEntry
x] -> ChangeLogEntry -> Maybe ChangeLogEntry
forall a. a -> Maybe a
Just ChangeLogEntry
x
      ChangeLog
_ -> [Char] -> Maybe ChangeLogEntry
forall a. HasCallStack => [Char] -> a
error ([Char] -> Maybe ChangeLogEntry) -> [Char] -> Maybe ChangeLogEntry
forall a b. (a -> b) -> a -> b
$ [Char]
"Multiple version " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ DebianVersion -> [Char]
forall a. Show a => a -> [Char]
show DebianVersion
ver [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" changelog entries"

mergeChangelogEntries :: ChangeLogEntry -> ChangeLogEntry -> ChangeLogEntry
mergeChangelogEntries :: ChangeLogEntry -> ChangeLogEntry -> ChangeLogEntry
mergeChangelogEntries ChangeLogEntry
old ChangeLogEntry
new =
    ChangeLogEntry
old { logComments :: [Char]
logComments = ChangeLogEntry -> [Char]
logComments ChangeLogEntry
old [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ ChangeLogEntry -> [Char]
logComments ChangeLogEntry
new
        , logDate :: [Char]
logDate = ChangeLogEntry -> [Char]
logDate ChangeLogEntry
new }