Skip to content

Commit d45e03f

Browse files
committed
finish conditional code for multiple release notes
1 parent 83ec58e commit d45e03f

File tree

6 files changed

+297
-27
lines changed

6 files changed

+297
-27
lines changed

Content/DocumentationTasks.fs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,54 @@ open BasicTasks
66

77
open BlackFox.Fake
88

9+
#if (individuaPackageVersions)
10+
11+
let buildDocs =
12+
BuildTask.create "BuildDocs" [ build ] {
13+
printfn "building docs with stable version %s" stableDocsVersionTag
14+
15+
runDotNet
16+
(sprintf
17+
"fsdocs build --eval --clean --properties Configuration=Release --parameters fsdocs-package-version %s"
18+
stableDocsVersionTag)
19+
"./"
20+
}
21+
22+
let buildDocsPrerelease =
23+
BuildTask.create "BuildDocsPrerelease" [ setPrereleaseTag; build ] {
24+
printfn "building docs with prerelease version %s" prereleaseTag
25+
26+
runDotNet
27+
(sprintf
28+
"fsdocs build --eval --clean --properties Configuration=Release --parameters fsdocs-package-version %s"
29+
prereleaseTag)
30+
"./"
31+
}
32+
33+
let watchDocs =
34+
BuildTask.create "WatchDocs" [ build ] {
35+
printfn "watching docs with stable version %s" stableDocsVersionTag
36+
37+
runDotNet
38+
(sprintf
39+
"fsdocs watch --eval --clean --properties Configuration=Release --parameters fsdocs-package-version %s"
40+
stableDocsVersionTag)
41+
"./"
42+
}
43+
44+
let watchDocsPrerelease =
45+
BuildTask.create "WatchDocsPrerelease" [ setPrereleaseTag; build ] {
46+
printfn "watching docs with prerelease version %s" prereleaseTag
47+
48+
runDotNet
49+
(sprintf
50+
"fsdocs watch --eval --clean --properties Configuration=Release --parameters fsdocs-package-version %s"
51+
prereleaseTag)
52+
"./"
53+
}
54+
55+
#else
56+
957
let buildDocs = BuildTask.create "BuildDocs" [build] {
1058
printfn "building docs with stable version %s" stableVersionTag
1159
runDotNet
@@ -33,3 +81,4 @@ let watchDocsPrerelease = BuildTask.create "WatchDocsPrerelease" [setPrereleaseT
3381
(sprintf "fsdocs watch --eval --clean --properties Configuration=Release --parameters fsdocs-package-version %s" prereleaseTag)
3482
"./"
3583
}
84+
#endif

Content/PackageTasks.fs

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,107 @@ open BlackFox.Fake
1010
open Fake.Core
1111
open Fake.IO.Globbing.Operators
1212

13+
#if (individuaPackageVersions)
14+
15+
let pack = BuildTask.create "Pack" [ clean; build; runTests ] {
16+
projects
17+
|> List.iter (fun pInfo ->
18+
if promptYesNo $"creating stable package for {pInfo.Name}{System.Environment.NewLine}\tpackage version: {pInfo.PackageVersionTag}{System.Environment.NewLine}\tassembly version: {pInfo.AssemblyVersion}{System.Environment.NewLine}\tassembly informational version: {pInfo.AssemblyInformationalVersion}{System.Environment.NewLine} OK?" then
19+
pInfo.ProjFile
20+
|> Fake.DotNet.DotNet.pack (fun p ->
21+
let msBuildParams =
22+
match pInfo.ReleaseNotes with
23+
| Some r ->
24+
{ p.MSBuildParams with
25+
Properties =
26+
([
27+
"Version",pInfo.PackageVersionTag
28+
"AssemblyVersion", pInfo.AssemblyVersion
29+
"AssemblyInformationalVersion", pInfo.AssemblyVersion
30+
"PackageReleaseNotes", (r.Notes |> String.concat "\r\n")
31+
"TargetsForTfmSpecificContentInPackage", "" //https://github.com/dotnet/fsharp/issues/12320
32+
]
33+
@ p.MSBuildParams.Properties)
34+
}
35+
| _ ->
36+
{ p.MSBuildParams with
37+
Properties =
38+
([
39+
"Version",pInfo.PackageVersionTag
40+
"AssemblyVersion", pInfo.AssemblyVersion
41+
"AssemblyInformationalVersion", pInfo.AssemblyVersion
42+
"TargetsForTfmSpecificContentInPackage", "" //https://github.com/dotnet/fsharp/issues/12320
43+
]
44+
@ p.MSBuildParams.Properties)
45+
}
46+
47+
48+
{ p with
49+
MSBuildParams = msBuildParams
50+
OutputPath = Some pkgDir
51+
NoBuild = true
52+
}
53+
|> DotNet.Options.withCustomParams (Some "--no-dependencies")
54+
)
55+
else
56+
failwith "aborted"
57+
)
58+
}
59+
60+
let packPrerelease =
61+
BuildTask.create
62+
"PackPrerelease"
63+
[
64+
clean
65+
build
66+
runTests
67+
] {
68+
projects
69+
|> List.iter (fun pInfo ->
70+
printfn $"Please enter pre-release package suffix for {pInfo.Name}"
71+
let prereleaseSuffix = System.Console.ReadLine()
72+
pInfo.PackagePrereleaseTag <- sprintf "%s-%s" pInfo.PackageVersionTag prereleaseSuffix
73+
if promptYesNo $"creating prerelease package for {pInfo.Name}{System.Environment.NewLine}\tpackage version: {pInfo.PackagePrereleaseTag}{System.Environment.NewLine}\tassembly version: {pInfo.AssemblyVersion}{System.Environment.NewLine}\tassembly informational version: {pInfo.AssemblyInformationalVersion}{System.Environment.NewLine} OK?" then
74+
pInfo.ProjFile
75+
|> Fake.DotNet.DotNet.pack (fun p ->
76+
let msBuildParams =
77+
match pInfo.ReleaseNotes with
78+
| Some r ->
79+
{ p.MSBuildParams with
80+
Properties =
81+
([
82+
"Version",pInfo.PackagePrereleaseTag
83+
"AssemblyVersion", pInfo.AssemblyVersion
84+
"InformationalVersion", pInfo.AssemblyInformationalVersion
85+
"PackageReleaseNotes", (r.Notes |> String.concat "\r\n")
86+
"TargetsForTfmSpecificContentInPackage", "" //https://github.com/dotnet/fsharp/issues/12320
87+
])
88+
}
89+
| _ ->
90+
{ p.MSBuildParams with
91+
Properties =
92+
([
93+
"Version",pInfo.PackagePrereleaseTag
94+
"AssemblyVersion", pInfo.AssemblyVersion
95+
"InformationalVersion", pInfo.AssemblyInformationalVersion
96+
"TargetsForTfmSpecificContentInPackage", "" //https://github.com/dotnet/fsharp/issues/12320
97+
])
98+
}
99+
100+
{ p with
101+
VersionSuffix = Some prereleaseSuffix
102+
OutputPath = Some pkgDir
103+
MSBuildParams = msBuildParams
104+
NoBuild = true
105+
}
106+
|> DotNet.Options.withCustomParams (Some "--no-dependencies")
107+
)
108+
else
109+
failwith "aborted"
110+
)
111+
}
112+
113+
#else
13114
open System.Text.RegularExpressions
14115

15116
/// https://github.com/Freymaurer/Fake.Extensions.Release#release-notes-in-nuget
@@ -61,4 +162,5 @@ let packPrerelease = BuildTask.create "PackPrerelease" [setPrereleaseTag; clean;
61162
))
62163
else
63164
failwith "aborted"
64-
}
165+
}
166+
#endif

Content/ProjectInfo.fs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,14 @@ type ProjectInfo = {
5050
AssemblyInformationalVersion = ""
5151
}
5252

53-
let individualProjects =
53+
// adapt this to reflect the core project in your repository. The only effect this will have is the version displayed in the docs, as it is currently only possible to have one version displayed there.
54+
let coreProject = ProjectInfo.create("", "", "")
55+
56+
let projects =
5457
[
5558
// add relative paths (from project root) to your projects here, including individual reslease notes files
5659
// e.g. ProjectInfo.create("MyProject", "src/MyProject/MyProject.fsproj", "src/MyProject/RELEASE_NOTES.md")
60+
coreProject
5761
]
5862

5963
#endif
@@ -80,6 +84,25 @@ let projectRepo = $"https://github.com/{gitOwner}/{project}"
8084

8185
let pkgDir = "pkg"
8286

87+
#if (individuaPackageVersions)
88+
89+
/// docs are always targeting the version of the core project
90+
let stableDocsVersionTag = CoreProject.PackageVersionTag
91+
92+
/// branch tag is always the version of the core project
93+
let branchTag = CoreProject.PackageVersionTag
94+
95+
/// prerelease suffix used by prerelease buildtasks
96+
let mutable prereleaseSuffix = ""
97+
98+
/// prerelease tag used by prerelease buildtasks
99+
let mutable prereleaseTag = ""
100+
101+
/// mutable switch used to signal that we are building a prerelease version, used in prerelease buildtasks
102+
let mutable isPrerelease = false
103+
104+
#else
105+
83106
// Create RELEASE_NOTES.md if not existing. Or "release" would throw an error.
84107
Fake.Extensions.Release.ReleaseNotes.ensure()
85108

@@ -93,4 +116,6 @@ let mutable prereleaseSuffix = ""
93116

94117
let mutable prereleaseTag = ""
95118

96-
let mutable isPrerelease = false
119+
let mutable isPrerelease = false
120+
121+
#endif

Content/ReleaseNotesTasks.fs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
module ReleaseNotesTasks
22

3+
#if (individuaPackageVersions)
4+
5+
// indivudual project release notes do not support automated release notes generation at the moment.
6+
7+
#else
8+
39
open Fake.Extensions.Release
410
open BlackFox.Fake
511

@@ -26,4 +32,6 @@ let githubDraft = BuildTask.createFn "GithubDraft" [] (fun config ->
2632
None,
2733
config
2834
)
29-
)
35+
)
36+
37+
#endif

Content/ReleaseTasks.fs

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,111 @@ open Fake.Tools
1515
open Fake.IO
1616
open Fake.IO.Globbing.Operators
1717

18+
#if (individuaPackageVersions)
19+
20+
let createTag =
21+
BuildTask.create "CreateTag" [ clean; build; runTests; pack ] {
22+
if promptYesNo (sprintf "tagging branch with %s OK?" branchTag) then
23+
Git.Branches.tag "" branchTag
24+
Git.Branches.pushTag "" projectRepo branchTag
25+
else
26+
failwith "aborted"
27+
}
28+
29+
let createPrereleaseTag =
30+
BuildTask.create
31+
"CreatePrereleaseTag"
32+
[
33+
setPrereleaseTag
34+
clean
35+
build
36+
runTests
37+
packPrerelease
38+
] {
39+
if promptYesNo (sprintf "tagging branch with %s OK?" prereleaseTag) then
40+
Git.Branches.tag "" prereleaseTag
41+
Git.Branches.pushTag "" projectRepo prereleaseTag
42+
else
43+
failwith "aborted"
44+
}
45+
46+
47+
let publishNuget =
48+
BuildTask.create "PublishNuget" [ clean; build; runTests; pack ] {
49+
let targets =
50+
(!!(sprintf "%s/*.*pkg" pkgDir))
51+
52+
printfn "package files:"
53+
54+
for target in targets do
55+
printfn "%A" target
56+
57+
printfn "package versions to release:"
58+
59+
projects
60+
|> List.iter (fun p ->
61+
printfn $"{p.Name} @ {p.PackageVersionTag}"
62+
)
63+
64+
if promptYesNo "OK?" then
65+
let source =
66+
"https://api.nuget.org/v3/index.json"
67+
68+
let apikey =
69+
Environment.environVar "NUGET_KEY"
70+
71+
for artifact in targets do
72+
let result =
73+
DotNet.exec id "nuget" (sprintf "push -s %s -k %s %s --skip-duplicate" source apikey artifact)
74+
75+
if not result.OK then
76+
failwith "failed to push packages"
77+
else
78+
failwith "aborted"
79+
}
80+
81+
let publishNugetPrerelease =
82+
BuildTask.create
83+
"PublishNugetPrerelease"
84+
[
85+
clean
86+
build
87+
runTests
88+
packPrerelease
89+
] {
90+
let targets =
91+
(!!(sprintf "%s/*.*pkg" pkgDir))
92+
93+
printfn "package files:"
94+
95+
for target in targets do
96+
printfn "%A" target
97+
98+
printfn "package versions to release:"
99+
100+
projects
101+
|> List.iter (fun p ->
102+
printfn $"{p.Name} @ {p.PackagePrereleaseTag}"
103+
)
104+
105+
if promptYesNo "OK?" then
106+
let source =
107+
"https://api.nuget.org/v3/index.json"
108+
109+
let apikey =
110+
Environment.environVar "NUGET_KEY"
111+
112+
for artifact in targets do
113+
let result =
114+
DotNet.exec id "nuget" (sprintf "push -s %s -k %s %s --skip-duplicate" source apikey artifact)
115+
116+
if not result.OK then
117+
failwith "failed to push packages"
118+
else
119+
failwith "aborted"
120+
}
121+
122+
#else
18123
let createTag = BuildTask.create "CreateTag" [clean; build; runTests; pack] {
19124
if promptYesNo (sprintf "tagging branch with %s OK?" stableVersionTag ) then
20125
Git.Branches.tag "" stableVersionTag
@@ -57,6 +162,7 @@ let publishNugetPrerelease = BuildTask.create "PublishNugetPrerelease" [clean; b
57162
if not result.OK then failwith "failed to push packages"
58163
else failwith "aborted"
59164
}
165+
#endif
60166

61167
let releaseDocs = BuildTask.create "ReleaseDocs" [buildDocs] {
62168
let msg = sprintf "release docs for version %s?" stableVersionTag

0 commit comments

Comments
 (0)