From 483350c8cb0009d97c8f7b0a70616fdb2aaf35b2 Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Mon, 9 Sep 2024 11:03:24 -0700 Subject: [PATCH] ;tools: relnotes: more output, robustness --- tools/relnotes.hs | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/tools/relnotes.hs b/tools/relnotes.hs index de34b0bf1..fa55b9da1 100755 --- a/tools/relnotes.hs +++ b/tools/relnotes.hs @@ -18,12 +18,20 @@ and that changelogs and relnotes are non-empty with specific layout and heading In the end I wrote this in haskell because everything else was harder. -} +{-# OPTIONS_GHC -Wno-x-partial #-} + +import Control.Monad import Data.Char import Data.List +import Data.List.Split +import System.Exit import System.IO import System.Process import Text.Printf +strToVer = splitOn "." +verToStr = intercalate "." + main = do -- gather latest release changes & info (projectChangesHeading, projectChanges) <- changelogFirstSection <$> readFile "CHANGES.md" @@ -31,10 +39,23 @@ main = do (hledgerUiChangesHeading, hledgerUiChanges) <- changelogFirstSection <$> readFile "hledger-ui/CHANGES.md" (hledgerWebChangesHeading, hledgerWebChanges) <- changelogFirstSection <$> readFile "hledger-web/CHANGES.md" reltags <- lines <$> readProcess "git" ["tag", "--sort=-creatordate", "-l", "[0-9]*"] "" + printf $ "previous release tags: " <> unwords (take 5 reltags) <> " ...\n" let [_, ver, date] = words projectChangesHeading - prevver:_ = drop 1 $ dropWhile (/=ver) reltags - relauthors <- map (unwords . drop 1 . words) . lines <$> readProcess "git" ["shortlog", "-sn", prevver<>".."<>ver] "" + verexists = ver `elem` reltags + printf $ "project CHANGES.md's top heading: " <> projectChangesHeading + printf $ "inferred latest release version and date: " <> intercalate ", " [ver, date] <> "\n" + printf $ "a tag for this release " <> (if verexists then "exists" else "does not yet exist") <> "\n" + let prevvers = + map verToStr $ dropWhile (>=strToVer ver) $ map strToVer $ reltags + printf $ "releases before this one: " <> unwords (take 5 prevvers) <> " ...\n" + when (null prevvers) $ do + printf $ "error: no previous releases found. This expects to run before new release headings are added to changelogs\n" + exitFailure + let prevver = head prevvers + printf $ "previous release: " <> prevver <> "\n" + relauthors <- map (unwords . drop 1 . words) . lines <$> readProcess "git" ["shortlog", "-sn", prevver<>".."<>if verexists then ver else ""] "" + printf $ "this release's authors: " <> intercalate ", " relauthors <> "\n" -- convert to release notes format let