Skip to content

Commit 7c52768

Browse files
committed
Add simple unreleased version logic
- Simply take the latest version, increment patch, add -alpha. - Handle changelogs with no releases. - Hanlde changelogs with no releases nor unreleased - Add targets from ionide#5 which conditionally use the unreleased version in packaging
1 parent 3a05b4b commit 7c52768

13 files changed

+160
-66
lines changed

src/Library.fs

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ type ParseChangeLogs() =
8585

8686
[<Output>]
8787
member val UnreleasedChangelog: ITaskItem = null with get, set
88-
88+
8989
[<Output>]
90-
member val UnreleasedReleaseNotes: string = null with get, set
90+
member val UnreleasedReleaseNotes: string = null with get, set
9191

9292
[<Output>]
9393
member val CurrentReleaseChangelog: ITaskItem = null with get, set
@@ -131,48 +131,53 @@ type ParseChangeLogs() =
131131
Error()
132132

133133
member this.ReadUnreleasedSection(changelog: Changelog) =
134-
match changelog.SectionUnreleased with
135-
| null -> Ok()
136-
| unreleased ->
134+
match changelog.SectionUnreleased, changelog.SectionUnreleased.MarkdownTitle with
135+
| null, _
136+
| _, "" -> Ok()
137+
| unreleased, _ ->
137138
this.UnreleasedChangelog <- unreleased.ToTaskItem()
138139
this.UnreleasedReleaseNotes <- unreleased.SubSectionCollection.ToMarkdown()
139140
Ok()
140-
141-
member this.UpdateUnreleasedVersion(latestVersion : SemVersion) =
141+
142+
member this.UpdateUnreleasedVersion(latestVersion: SemVersion) =
142143
match this.UnreleasedChangelog with
143144
| null -> ()
144145
| _ ->
145-
let newUnreleased = latestVersion.WithPrereleaseParsedFrom "alpha" |> _.WithPatch(latestVersion.Patch + 1)
146+
let newUnreleased =
147+
latestVersion.WithPrereleaseParsedFrom "alpha"
148+
|> _.WithPatch(latestVersion.Patch + 1)
149+
146150
this.UnreleasedChangelog.ItemSpec <- newUnreleased.ToString()
147151

148152
member this.ProcessReleases(changelog: Changelog) =
149153
let releases =
150154
changelog.SectionCollection.Unwrapped()
151155
|> Seq.sortByDescending _.version
152-
|> Seq.toArray
153-
154-
let latestRelease = releases |> (fun x -> x[0])
156+
|> Seq.toList
155157

156158
let mapped =
157159
releases
158-
|> Array.map (fun x ->
160+
|> List.map (fun x ->
159161
let taskItem = TaskItem(x.version.ToString())
160162
taskItem.SetMetadata("Date", x.date.ToString("yyyy-MM-dd"))
161163

162164
for (key, value) in x.collection.ToTaskItemMetadata() do
163165
taskItem.SetMetadata(key, value)
164166

165-
taskItem :> ITaskItem
167+
(x, taskItem :> ITaskItem)
166168
)
167169

168-
this.CurrentReleaseChangelog <- mapped[0]
169-
this.AllReleasedChangelogs <- mapped
170-
this.LatestReleaseNotes <- latestRelease.collection.ToMarkdown()
171-
172-
this.UpdateUnreleasedVersion(latestRelease.version)
173-
170+
match mapped with
171+
| (latestRelease, latestTaskItem) :: _ ->
172+
this.CurrentReleaseChangelog <- latestTaskItem
173+
this.AllReleasedChangelogs <- mapped |> List.map snd |> Array.ofList
174+
this.LatestReleaseNotes <- latestRelease.collection.ToMarkdown()
175+
this.UpdateUnreleasedVersion(latestRelease.version)
176+
| _ ->
177+
this.AllReleasedChangelogs <- [||]
178+
this.UpdateUnreleasedVersion(SemVersion(0, 0, 0))
179+
174180
Ok()
175-
176181

177182
/// <summary>
178183
/// Helper method to log an error with the given log data.

src/build/Core.targets

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<Target Name="GetChangelogVersion" Condition="'$(ChangelogFile)' != '' and Exists('$(ChangelogFile)')" DependsOnTargets="ValidateChangelog" Inputs="$(ChangelogFile)" Outputs="UnreleasedChangelog;CurrentReleaseChangelog;AllReleasedChangelogslLatestReleaseNotes">
1919
<Ionide.KeepAChangelog.Tasks.ParseChangeLogs ChangelogFile="$(ChangelogFile)">
2020
<Output TaskParameter="UnreleasedChangelog" ItemName="UnreleasedChangelog"/>
21+
<Output TaskParameter="UnreleasedReleaseNotes" ItemName="UnreleasedReleaseNotes"/>
2122
<Output TaskParameter="CurrentReleaseChangelog" ItemName="CurrentReleaseChangelog"/>
2223
<Output TaskParameter="AllReleasedChangelogs" ItemName="AllReleasedChangelogs"/>
2324
<Output TaskParameter="LatestReleaseNotes" ItemName="LatestReleaseNotes"/>
@@ -26,15 +27,25 @@
2627

2728
<Target Name="SetVersionFromChangelog" DependsOnTargets="GetChangelogVersion">
2829
<PropertyGroup Condition="'@(CurrentReleaseChangelog)' != ''">
30+
<!-- Set the version to the version of the latest release -->
2931
<Version>%(CurrentReleaseChangelog.Identity)</Version>
3032
<PackageVersion>%(CurrentReleaseChangelog.Identity)</PackageVersion>
3133
<PackageReleaseNotes>@(LatestReleaseNotes)</PackageReleaseNotes>
34+
<_ReleaseDate>%(CurrentReleaseChangelog.Date)</_ReleaseDate>
3235
</PropertyGroup>
36+
37+
<PropertyGroup Condition="'@(UnreleasedChangelog)' != '' and '$(GenerateVersionForUnreleasedChanges)' == 'true'">
38+
<!-- Set the version to the derived version of the unreleased changelog -->
39+
<Version>%(UnreleasedChangelog.Identity)</Version>
40+
<PackageVersion>%(UnreleasedChangelog.Identity)</PackageVersion>
41+
<PackageReleaseNotes>@(UnreleasedReleaseNotes)</PackageReleaseNotes>
42+
<_ReleaseDate>%(UnreleasedChangelog.Date)</_ReleaseDate>
43+
</PropertyGroup>
3344

34-
<ItemGroup Condition="'@(CurrentReleaseChangelog)' != '' and '$(GenerateAssemblyInfo)' == 'true'">
45+
<ItemGroup Condition="'@(_ReleaseDate)' != '' and '$(GenerateAssemblyInfo)' == 'true'">
3546
<AssemblyAttribute Include="System.Reflection.AssemblyMetadataAttribute" Condition="'$(GenerateRepositoryUrlAttribute)' == 'true' and ('$(RepositoryUrl)' != '' or '$(PublishRepositoryUrl)' == 'true')">
3647
<_Parameter1>BuildDate</_Parameter1>
37-
<_Parameter2>%(CurrentReleaseChangelog.Date)</_Parameter2>
48+
<_Parameter2>%(_ReleaseDate)</_Parameter2>
3849
</AssemblyAttribute>
3950
</ItemGroup>
4051
</Target>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2+
<PropertyGroup>
3+
<!-- If set, the assembly/package version and release notes will be set from Unreleased changes, if any are present -->
4+
<GenerateVersionForUnreleasedChanges Condition="'$(GenerateVersionForUnreleasedChanges)' == ''">true</GenerateVersionForUnreleasedChanges>
5+
</PropertyGroup>
6+
</Project>

tests/Ionide.KeepAChangelog.Tasks.Test.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
<ItemGroup>
3535
<Content Include="changelogs\*.md" />
36+
<None Include="fixtures\*"/>
3637
</ItemGroup>
3738

3839
</Project>

tests/UnitTests.fs

Lines changed: 66 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ type UnitTests() =
9292
myTask.BuildEngine <- this.context.BuildEngine.Object
9393

9494
let success = myTask.Execute()
95-
%success.Should().BeTrue "Should have successfully parsed the changelog data"
95+
%success.Should().BeTrue("Should have successfully parsed the changelog data")
9696
%myTask.AllReleasedChangelogs.Length.Should().Be(9, "Should have 9 versions")
9797

9898
%myTask.CurrentReleaseChangelog.ItemSpec
@@ -112,45 +112,93 @@ type UnitTests() =
112112
|> Seq.cast
113113
|> _.Should().Contain("Date", "Should have date metadata"))
114114

115+
%myTask.UnreleasedChangelog.ItemSpec
116+
.Should()
117+
.Be("0.1.9-alpha", "Should have the alpha prefix from a patch release")
118+
119+
%(myTask.UnreleasedChangelog.MetadataNames
120+
|> Seq.cast
121+
|> _.Should().Contain("Removed", "Should have removed metadata"))
122+
115123
[<TestMethod>]
116124
member this.``task produces expected markdown``() =
117-
let myTask = ParseChangeLogs(ChangelogFile = Workspace.changelogs.``CHANGELOG.md``)
125+
let myTask =
126+
ParseChangeLogs(ChangelogFile = Workspace.changelogs.``CHANGELOG_detailed.md``)
118127

119128
myTask.BuildEngine <- this.context.BuildEngine.Object
120129

121130
let success = myTask.Execute()
122-
%success.Should().BeTrue "Should have successfully parsed the changelog data"
131+
%success.Should().BeTrue("Should have successfully parsed the changelog data")
123132

124133
%myTask.LatestReleaseNotes
125134
.Should()
126135
.BeLineEndingEquivalent(
127-
"""### Added
128-
129-
- Created the package
130-
131-
### Changed
136+
"""### Changed
132137
133-
- Changed something in the package
134-
- Updated the target framework"""
138+
- Minor packaging fix for non-Core MSBuild versions"""
135139
)
136-
140+
137141
%myTask.UnreleasedReleaseNotes
138142
.Should()
139143
.BeLineEndingEquivalent(
140144
"""### Removed
141145
142146
- A test removal line
143-
- And another removal""")
147+
- And another removal"""
148+
)
149+
144150
[<TestMethod>]
145-
member this.``task produces correct versions``() =
151+
member this.``task correctly processes a changelog with no unreleased``() =
146152
let myTask = ParseChangeLogs(ChangelogFile = Workspace.changelogs.``CHANGELOG.md``)
147153

148154
myTask.BuildEngine <- this.context.BuildEngine.Object
149155

150156
let success = myTask.Execute()
151-
%success.Should().BeTrue "Should have successfully parsed the changelog data"
157+
%success.Should().BeTrue("Should have successfully parsed the changelog data")
158+
159+
%myTask.CurrentReleaseChangelog.ItemSpec
160+
.Should()
161+
.Be("0.1.0", "It is the latest release")
162+
163+
%myTask.LatestReleaseNotes.Should().NotBeNull().And.NotBeEmpty()
164+
165+
%myTask.AllReleasedChangelogs
166+
.Should()
167+
.HaveLength(1, "There is only a single release section")
152168

153-
%myTask.CurrentReleaseChangelog.ItemSpec.Should().Be("0.1.0")
154-
%myTask.UnreleasedChangelog.ItemSpec.Should().Be("0.1.1-alpha")
155-
156-
169+
%myTask.UnreleasedChangelog.Should().BeNull("There is no unreleased section")
170+
%myTask.UnreleasedReleaseNotes.Should().BeNull("There is no unreleased section")
171+
172+
[<TestMethod>]
173+
member this.``task correctly processes a changelog with only unreleased``() =
174+
let myTask =
175+
ParseChangeLogs(ChangelogFile = Workspace.changelogs.``CHANGELOG_unreleased.md``)
176+
177+
myTask.BuildEngine <- this.context.BuildEngine.Object
178+
179+
let success = myTask.Execute()
180+
%success.Should().BeTrue("Should have successfully parsed the changelog data")
181+
%myTask.CurrentReleaseChangelog.Should().BeNull("There are no released sections")
182+
%myTask.LatestReleaseNotes.Should().BeNull("There are no released sections")
183+
%myTask.AllReleasedChangelogs.Should().BeEmpty("There are no released sections")
184+
185+
%myTask.UnreleasedChangelog.ItemSpec
186+
.Should()
187+
.Be("0.0.1-alpha", "There is no previous version, so it starts from 0.0.0")
188+
189+
%myTask.UnreleasedReleaseNotes.Should().NotBeNull().And.NotBeEmpty()
190+
191+
[<TestMethod>]
192+
member this.``task correctly processes a changelog with only introduction``() =
193+
let myTask =
194+
ParseChangeLogs(ChangelogFile = Workspace.changelogs.``CHANGELOG_empty.md``)
195+
196+
myTask.BuildEngine <- this.context.BuildEngine.Object
197+
198+
let success = myTask.Execute()
199+
%success.Should().BeTrue("Should have successfully parsed the changelog data")
200+
%myTask.CurrentReleaseChangelog.Should().BeNull("There are no released sections")
201+
%myTask.LatestReleaseNotes.Should().BeNull("There are no released sections")
202+
%myTask.AllReleasedChangelogs.Should().BeEmpty("There are no released sections")
203+
%myTask.UnreleasedChangelog.Should().BeNull("There is no unreleased section")
204+
%myTask.UnreleasedReleaseNotes.Should().BeNull("There is no unreleased section")

tests/changelogs/CHANGELOG.md

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
# Changelog
22

3-
## [Unreleased]
4-
5-
### Removed
6-
7-
- A test removal line
8-
- And another removal
9-
103
## [0.1.0] - 2022-01-13
114

125
### Added

tests/changelogs/CHANGELOG_detailed.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## [Unreleased]
4+
5+
### Removed
6+
7+
- A test removal line
8+
- And another removal
9+
310
## [0.1.8] - 2022-03-31
411

512
### Changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Changelog
2+
3+
Some notes in the header but no sections

tests/changelogs/CHANGELOG_unreleased.md

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,3 @@
77
- A test removal line
88
- And another removal
99

10-
## [0.1.0] - 2022-01-13
11-
12-
### Added
13-
14-
- Created the package
15-
16-
### Changed
17-
18-
- Changed something in the package
19-
- Updated the target framework

tests/fixtures/CHANGELOG.md

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
# Changelog
22

3-
## [Unreleased]
4-
5-
### Removed
6-
7-
- A test removal line
8-
- And another removal
9-
103
## [0.1.0] - 2022-01-13
114

125
### Added

0 commit comments

Comments
 (0)