packages feed

hackage-server-0.5.0: Distribution/Server/Packages/ChangeLog.hs

{-# LANGUAGE NamedFieldPuns #-}
module Distribution.Server.Packages.ChangeLog (
    findChangeLog
  ) where

import Data.TarIndex (TarIndex, TarEntryOffset)
import qualified Data.TarIndex as TarIndex
import Distribution.Server.Packages.Types (PkgInfo)
import Distribution.Package (packageId)
import Distribution.Text (display)

import System.FilePath ((</>), splitExtension)
import Data.Char as Char
import Data.Maybe


findChangeLog :: PkgInfo -> TarIndex -> Maybe (TarEntryOffset, String)
findChangeLog pkg index = do
    let topdir = display (packageId pkg)
    TarIndex.TarDir fnames <- TarIndex.lookup index topdir
    listToMaybe
      [ (offset, fname')
      | fname <- fnames
      , isChangelogFile fname
      , let fname' = topdir </> fname
      , Just (TarIndex.TarFileEntry offset) <- [TarIndex.lookup index fname'] ]
  where
    isChangelogFile fname = 
      let (base, ext) = splitExtension fname
       in map Char.toLower base `elem` basenames
       && ext `elem` extensions

    basenames  = ["changelog", "change_log", "changes"]
    extensions = ["", ".txt", ".md", ".markdown"]