{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Prelude hiding (FilePath)
import Turtle
import Control.Exception
import qualified Data.HashMap.Strict as HM
import Data.Maybe (fromMaybe)
import System.Console.ANSI (Color(..))
import Changelogged.CheckLog.Check
import Changelogged.Bump.Local
import Changelogged.Bump.Common
import Changelogged.Bump.General
import Changelogged.Types
import Changelogged.Git
import Changelogged.Options
import Changelogged.Utils
import Changelogged.Pure (showPath, fromJustCustom, defaultedEmpty, showText)
import Changelogged.Settings
commonMain :: Paths -> Options -> Git -> IO ()
commonMain paths opts@Options{..} git = do
coloredPrint Green ("Checking " <> showPath (taggedLogPath $ chLog paths) <> " and creating it if missing.\n")
touch $ taggedLogPath (chLog paths)
bump <- checkChangelogWrap opts git optNoCheck (chLog paths)
(when (bump && not optNoBump) $ do
newVersion <- case optPackagesLevel of
Nothing -> generateVersionByChangelog optNoCheck (taggedLogPath $ chLog paths) (gitRevision git)
Just lev -> Just <$> generateVersion lev (gitRevision git)
case newVersion of
Nothing -> return ()
Just version -> case HM.lookup "main" (defaultedEmpty (versioned paths)) of
Just files -> do
printf ("Version: "%s%" -> ") (gitRevision git)
coloredPrint Yellow (version <> "\n")
mapM_ (bumpPart version) files
headChangelog version (taggedLogPath $ chLog paths)
Nothing -> coloredPrint Yellow "WARNING: no files to bump project version in specified.\n"
) `catch` (\(ex :: PatternMatchFail) -> coloredPrint Red (showText ex))
where
chLog cfg = HM.lookupDefault (TaggedLog "ChangeLog.md" Nothing) "main"
(fromMaybe (HM.singleton "main" (TaggedLog "ChangeLog.md" Nothing)) (changelogs cfg))
apiMain :: Paths -> Options -> Git -> IO ()
apiMain paths opts@Options{..} git = do
coloredPrint Green ("Checking " <> showPath (taggedLogPath $ chLog paths)
<> " and creating it if missing.\nIf no indicator exists it will be checked as global changelog.\n")
touch $ taggedLogPath (chLog paths)
bump <- checkChangelogWrap opts git optNoCheck (chLog paths)
(when (bump && not optNoBump) $ do
newVersion <- case optApiLevel of
Nothing -> generateLocalVersionByChangelog optNoCheck (chLog paths)
Just lev -> Just <$> generateLocalVersion lev (fromJustCustom "No file with current API version specified." (taggedLogIndicator (chLog paths)))
case newVersion of
Nothing -> return ()
Just version -> case HM.lookup "api" (defaultedEmpty (versioned paths)) of
Just files -> do
mapM_ (bumpPart version) files
headChangelog version (taggedLogPath $ chLog paths)
Nothing -> coloredPrint Yellow "WARNING: no files to bump API version in specified.\n"
) `catch` (\(ex :: PatternMatchFail) -> coloredPrint Red (showText ex))
where
chLog cfg = HM.lookupDefault (TaggedLog "ApiChangeLog.md" Nothing) "api"
(fromMaybe (HM.singleton "api" (TaggedLog "ApiChangeLog.md" Nothing)) (changelogs cfg))
otherMain :: Paths -> Options -> Git -> IO ()
otherMain paths opts@Options{..} git = do
mapM_ act (entries (changelogs paths))
where
entries :: Maybe (HM.HashMap Text TaggedLog) -> [(Text, TaggedLog)]
entries (Just a) = HM.toList $ HM.delete "main" $ HM.delete "api" a
entries Nothing = []
act (key, changelog) = do
coloredPrint Green ("Checking " <> showPath (taggedLogPath changelog) <> " and creating it if missing.\n")
touch (taggedLogPath changelog)
bump <- checkChangelogWrap opts git optNoCheck changelog
(when (bump && not optNoBump) $ do
newVersion <- generateLocalVersionByChangelog optNoCheck changelog
case newVersion of
Nothing -> return ()
Just version -> case HM.lookup key (defaultedEmpty (versioned paths)) of
Just files -> do
mapM_ (bumpPart version) files
headChangelog version (taggedLogPath changelog)
Nothing -> coloredPrint Yellow "WARNING: no files to bump version in specified.\n"
) `catch` (\(ex :: PatternMatchFail) -> coloredPrint Red (showText ex))
main :: IO ()
main = do
opts@Options{..} <- options welcome parser
defaultPaths <- makeDefaultPaths
paths <- fromMaybe defaultPaths <$> loadPaths
git <- gitData optFromBC
commonMain paths opts git
when optWithAPI $ apiMain paths opts git
when optDifferentChlogs $ otherMain paths opts git
sh $ rm $ gitHistory git