@@ -4,38 +4,34 @@ open Microsoft.Build.Utilities
44open Microsoft.Build .Framework
55open System.IO
66open Ionide.KeepAChangelog
7- open Ionide.KeepAChangelog .Domain
87open System.Linq
8+ open SemVersion
9+ open System
910
1011module Util =
11- let mapReleaseInfo ( version : SemVersion. SemanticVersion) ( date : System. DateTime) ( item : ITaskItem ) : ITaskItem =
12+ let mapReleaseInfo ( version : SemanticVersion ) ( date : DateTime ) ( item : ITaskItem ) : ITaskItem =
1213 item.ItemSpec <- string version
1314 item.SetMetadata( " Date" , date.ToString( " yyyy-MM-dd" ))
1415 item
1516
16- let mapUnreleasedInfo ( item : ITaskItem ) : ITaskItem =
17- item.ItemSpec <- " Unreleased"
18- item
19-
2017 let allReleaseNotesFor ( data : ChangelogData ) =
2118 let section name items =
2219 match items with
2320 | [] -> []
2421 | items -> $" ### {name}" :: items @ [ " " ]
2522
2623 String.concat
27- System. Environment.NewLine
24+ Environment.NewLine
2825 ([ yield ! section " Added" data.Added
2926 yield ! section " Changed" data.Changed
3027 yield ! section " Deprecated" data.Deprecated
3128 yield ! section " Removed" data.Removed
3229 yield ! section " Fixed" data.Fixed
3330 yield ! section " Security" data.Security
34- for KeyValue( heading, lines) in data.Custom do
35- yield ! section heading lines ])
31+ for KeyValue ( heading, lines) in data.Custom do
32+ yield ! section heading lines ])
3633
37- let stitch items =
38- String.concat System.Environment.NewLine items
34+ let stitch items = String.concat Environment.NewLine items
3935
4036 let mapChangelogData ( data : ChangelogData ) ( item : ITaskItem ) : ITaskItem =
4137 item.SetMetadata( " Added" , stitch data.Added)
@@ -44,10 +40,27 @@ module Util =
4440 item.SetMetadata( " Removed" , stitch data.Removed)
4541 item.SetMetadata( " Fixed" , stitch data.Fixed)
4642 item.SetMetadata( " Security" , stitch data.Security)
47- for ( KeyValue( heading, lines)) in data.Custom do
43+
44+ for ( KeyValue ( heading, lines)) in data.Custom do
4845 item.SetMetadata( heading, stitch lines)
46+
4947 item
5048
49+ let mapUnreleasedInfo changelogs ( item : ITaskItem ) : ITaskItem =
50+ match Promote.fromUnreleased changelogs with
51+ | None ->
52+ item.ItemSpec <- " Unreleased"
53+
54+ changelogs.Unreleased
55+ |> Option.map ( fun d -> mapChangelogData d item)
56+ |> Option.defaultValue item
57+ | Some ( unreleasedVersion, releaseDate, data) ->
58+ let item = mapReleaseInfo unreleasedVersion releaseDate item
59+
60+ data
61+ |> Option.map ( fun d -> mapChangelogData d item)
62+ |> Option.defaultValue item
63+
5164type ParseChangelogs () =
5265 inherit Task()
5366
@@ -57,6 +70,9 @@ type ParseChangelogs() =
5770 [<Output>]
5871 member val UnreleasedChangelog : ITaskItem = null with get, set
5972
73+ [<Output>]
74+ member val UnreleasedReleaseNotes : string = null with get, set
75+
6076 [<Output>]
6177 member val CurrentReleaseChangelog : ITaskItem = null with get, set
6278
@@ -66,6 +82,7 @@ type ParseChangelogs() =
6682 [<Output>]
6783 member val LatestReleaseNotes : string = null with get, set
6884
85+
6986 override this.Execute () : bool =
7087 let file = this.ChangelogFile |> FileInfo
7188
@@ -77,10 +94,8 @@ type ParseChangelogs() =
7794 | Ok changelogs ->
7895 changelogs.Unreleased
7996 |> Option.iter ( fun unreleased ->
80- this.UnreleasedChangelog <-
81- TaskItem()
82- |> Util.mapChangelogData unreleased
83- |> Util.mapUnreleasedInfo)
97+ this.UnreleasedChangelog <- TaskItem() |> Util.mapUnreleasedInfo changelogs
98+ this.UnreleasedReleaseNotes <- Util.allReleaseNotesFor unreleased)
8499
85100 let sortedReleases =
86101 // have to use LINQ here because List.sortBy* require IComparable, which
@@ -92,8 +107,10 @@ type ParseChangelogs() =
92107 |> Seq.map ( fun ( version , date , data ) ->
93108 TaskItem()
94109 |> Util.mapReleaseInfo version date
95- |> fun d -> match data with Some data -> Util.mapChangelogData data d | None -> d
96- )
110+ |> fun d ->
111+ match data with
112+ | Some data -> Util.mapChangelogData data d
113+ | None -> d)
97114 |> Seq.toArray
98115
99116 this.AllReleasedChangelogs <- items
@@ -103,9 +120,7 @@ type ParseChangelogs() =
103120 |> Seq.tryHead
104121 |> Option.iter ( fun ( version , date , data ) ->
105122 data
106- |> Option.iter ( fun data ->
107- this.LatestReleaseNotes <- Util.allReleaseNotesFor data)
108- )
123+ |> Option.iter ( fun data -> this.LatestReleaseNotes <- Util.allReleaseNotesFor data))
109124
110125 true
111126 | Error ( formatted, msg) ->
0 commit comments