-
Notifications
You must be signed in to change notification settings - Fork 833
Release notes proposal #16377
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Release notes proposal #16377
Changes from all commits
80578f2
55ee0c8
06e8874
be9dc2b
6238bd5
28d917d
50770d9
c682759
f30507b
ae63127
74eddeb
125c790
67a7df7
66c6bae
a697451
885da17
2dc5512
e851cab
e60d936
179d506
8f4cc2a
00f1cad
80598db
bebadc3
9dfd116
f4cef95
f49cdb3
6d04c56
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| :root { | ||
| --main-menu-width: 300px; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| ### Fixed | ||
|
|
||
| * Include the `get,set` keywords in the range of `SynMemberDefn.AutoProperty`. ([PR #15835](https://github.com/dotnet/fsharp/pull/15835)) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| ### Fixed | ||
|
|
||
| * Miscellaneous fixes to parentheses analysis. ([PR #16262](https://github.com/dotnet/fsharp/pull/16262), [PR #16391](https://github.com/dotnet/fsharp/pull/16391), [PR #16370](https://github.com/dotnet/fsharp/pull/16370), [PR #16395](https://github.com/dotnet/fsharp/pull/16395)) | ||
| * Correctly handle assembly imports with public key token of 0 length. ([Issue #16359](https://github.com/dotnet/fsharp/issues/16359), [PR #16363](https://github.com/dotnet/fsharp/pull/16363)) | ||
|
|
||
| ### Added | ||
| * Raise a new error when interfaces with auto properties are implemented on constructor-less types. ([PR #16352](https://github.com/dotnet/fsharp/pull/16352)) | ||
| * Allow usage of `[<TailCall>]` with older `FSharp.Core` package versions. ([PR #16373](https://github.com/dotnet/fsharp/pull/16373)) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| ### Added | ||
|
|
||
| * More inlines for Result module. ([PR #16106](https://github.com/dotnet/fsharp/pull/16106)) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| ### Added | ||
|
|
||
| * `while!` ([Language suggestion #1038](https://github.com/fsharp/fslang-suggestions/issues/1038), [PR #14238](https://github.com/dotnet/fsharp/pull/14238)) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| ### Added | ||
|
|
||
| * Better generic unmanaged structs handling. ([Language suggestion #692](https://github.com/fsharp/fslang-suggestions/issues/692), [PR #12154](https://github.com/dotnet/fsharp/pull/12154)) | ||
| * Bidirectional F#/C# interop for 'unmanaged' constraint. ([PR #12154](https://github.com/dotnet/fsharp/pull/12154)) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,49 @@ | ||
| #r "nuget: Markdig, 0.33.0" | ||
| #r "nuget: FsHttp, 12.1.0" | ||
|
|
||
| open System.IO | ||
| open System.Xml.Linq | ||
| open System.Text.RegularExpressions | ||
| open FsHttp | ||
|
|
||
| let versionProps = Path.Combine(__SOURCE_DIRECTORY__, "../../../eng/Versions.props") | ||
| let versionPropsDoc = XDocument.Load(versionProps) | ||
|
|
||
| /// Find all published versions of a package on NuGet | ||
| let getAvailableNuGetVersions (packageName: string) : Set<string> = | ||
| let packageName = packageName.ToLowerInvariant() | ||
|
|
||
| http { GET $"https://api.nuget.org/v3-flatcontainer/%s{packageName}/index.json" } | ||
| |> Request.send | ||
| |> Response.deserializeJson<{| versions: string array |}> | ||
| |> fun json -> Set.ofArray json.versions | ||
|
|
||
| /// Try and find the publish date on NuGet | ||
| let tryGetReleaseDate (packageName: string) (version: string) : string option = | ||
| let packageName = packageName.ToLowerInvariant() | ||
|
|
||
| http { GET $"https://api.nuget.org/v3/registration5-gz-semver2/%s{packageName}/%s{version}.json" } | ||
| |> Request.send | ||
| |> Response.deserializeJson<{| published: string |}> | ||
| |> fun json -> | ||
| if System.String.IsNullOrWhiteSpace json.published then | ||
| None | ||
| else | ||
| Some(json.published.Split('T').[0]) | ||
|
|
||
| /// In order for the heading to appear in the page content menu in fsdocs, | ||
| /// they need to follow a specific HTML structure. | ||
| let transformH3 (version: string) (input: string) : string = | ||
| let pattern = "<h3>(.*?)</h3>" | ||
|
|
||
| let replacement = | ||
| $"<h3><a name=\"%s{version}-$1\" class=\"anchor\" href=\"#%s{version}-$1\">$1</a></h3>" | ||
|
|
||
| Regex.Replace(input, pattern, replacement) | ||
|
|
||
| /// Process all MarkDown files from the given release folder | ||
| let processFolder (path: string) (processFile: string -> string) : string = | ||
| Directory.EnumerateFiles(path, "*.md") | ||
| |> Seq.sortByDescending Path.GetFileNameWithoutExtension | ||
| |> Seq.map processFile | ||
| |> String.concat "\n" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,62 @@ | ||
| --- | ||
| category: Release Notes | ||
| categoryindex: 600 | ||
| index: 1 | ||
| title: About | ||
| --- | ||
|
|
||
| # About | ||
|
|
||
| The release notes for the [F\# language](./Language.md), [FSharp.Core](./FSharp.Core.md) and [FSharp.Compiler.Service](./FSharp.Compiler.Service.md) are based on the [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) format. | ||
| The target audience of these release notes are the respective end-users. | ||
|
|
||
| ## Writing a changelog entry | ||
|
|
||
| In order to keep the change logs consistent the following format was proposed for each entry: | ||
|
|
||
| ```md | ||
| * <Informative description>. ([PR #16106](https://github.com/dotnet/fsharp/pull/16106)) | ||
| ``` | ||
|
|
||
| Some tips: | ||
|
|
||
| * Use valid [Markdown](https://www.markdownguide.org/). | ||
| * Use `*` as bullet point symbol. We don't want to mix `*` and `-`. | ||
| * Start your description with a capital and end the sentence with a dot. | ||
| * **Always** include a link to your pull request before the closing `)`, `([PR #16106](https://github.com/dotnet/fsharp/pull/16106))`. | ||
| * Optionally, include a link to an issue on `dotnet/fsharp` use `Issue #number` before the link to the pull request. | ||
|
|
||
| Example: | ||
|
|
||
| ```md | ||
| * Correctly handle assembly imports with public key token of 0 length. ([Issue #16359](https://github.com/dotnet/fsharp/issues/16359), [PR #16363](https://github.com/dotnet/fsharp/pull/16363)) | ||
| ``` | ||
|
|
||
| * Optionally, include a link to a language suggestion from `dotnet/fsharp` use `Language suggestion #number` before the link to the pull request. | ||
|
|
||
| Example: | ||
|
|
||
| ```md | ||
| * `while!` ([Language suggestion #1038](https://github.com/fsharp/fslang-suggestions/issues/1038), [PR #14238](https://github.com/dotnet/fsharp/pull/14238)) | ||
| ``` | ||
|
|
||
| * Choose the right section for your type of change. (`## Added`, `## Changed`, `## Deprecated`, `## Removed`, `## Fixed` or `## Security`). | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We probably don't want a separate "Security" area, they fit under "Fixes". Also since we categorizing changes, it would be great to somehow mark breaking changes (or rather ask people to mark them (
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Breaking is a good idea, although AFAIU we don't really have a definition for breaking changes yet.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hmm, I'm on the fence with the breaking prefix. Could you give me an example of something that changed, wasn't a fix and isn't breaking? I don't think that combo happens often. If it is listed under change, you can typically assume the change is breaking.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
We do (always had really):
In other words, for libraries - if it doesn't compile anymore with no code changes, it's a breaking change. For compiler - if it's producing any new warnings - it's a breaking change. For FSharp.Core - if it produces different values in runtime than before - it's a breaking change.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice summary. Worth putting somewhere maybe. |
||
| * Ensure your description makes it clear what the change is about. The reader should be informed on a high level without needing to click through the pull request link and find out in the code what actually changed. | ||
| * Maintainers or other contributors might rewrite your changelog entry in the future. This might be done when multiple pull requests can be consolidated under the same umbrella. | ||
| * Related pull requests can be listed in the same entry when it makes sense. | ||
|
|
||
| Example: | ||
|
|
||
| ```md | ||
| * Miscellaneous fixes to parentheses analysis. ([PR #16262](https://github.com/dotnet/fsharp/pull/16262), [PR #16391](https://github.com/dotnet/fsharp/pull/16391), [PR #16370](https://github.com/dotnet/fsharp/pull/16370)) | ||
| ``` | ||
|
|
||
| ## The release process | ||
|
|
||
| ### General | ||
|
|
||
| How does it work? Different stages/phases? | ||
|
|
||
| #### FSharp.Compiler.Service | ||
|
|
||
| Perhaps add some specific info if available? | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,47 @@ | ||
| (** --- | ||
| category: Release Notes | ||
| categoryindex: 600 | ||
| index: 4 | ||
| title: FSharp.Compiler.Service | ||
| --- | ||
|
|
||
| # FSharp.Compiler.Service | ||
| *) | ||
| (*** hide ***) | ||
| #load "./.aux/Common.fsx" | ||
|
|
||
| open System.IO | ||
| open System.Xml.XPath | ||
| open Markdig | ||
| open Common | ||
|
|
||
| let path = Path.Combine(__SOURCE_DIRECTORY__, ".FSharp.Compiler.Service") | ||
| let fcsMajorVersion = versionPropsDoc.XPathSelectElement("//FCSMajorVersion").Value | ||
| let nugetPackage = "FSharp.Compiler.Service" | ||
| let availableNuGetVersions = getAvailableNuGetVersions nugetPackage | ||
|
|
||
| processFolder path (fun file -> | ||
| let versionInFileName = Path.GetFileNameWithoutExtension(file) | ||
| // Example: 8.0.200 | ||
| let versionParts = versionInFileName.Split '.' | ||
|
|
||
| let version = $"%s{fcsMajorVersion}.%s{versionParts.[0]}.%s{versionParts.[2]}" | ||
| // TODO: Can we determine if the current version is in code freeze based on the Version.props info? | ||
| let title = | ||
| if not (availableNuGetVersions.Contains version) then | ||
| $"%s{version} - Unreleased" | ||
| else | ||
| match tryGetReleaseDate nugetPackage version with | ||
| | None -> $"%s{version} - Unreleased" | ||
| | Some d -> $"%s{version} - %s{d}" | ||
|
|
||
| let nugetBadge = | ||
| if not (availableNuGetVersions.Contains version) then | ||
| System.String.Empty | ||
| else | ||
| $"<a href=\"https://www.nuget.org/packages/%s{nugetPackage}/%s{version}\" target=\"_blank\"><img alt=\"Nuget\" src=\"https://img.shields.io/badge/NuGet-%s{version}-blue\"></a>" | ||
|
|
||
| let content = File.ReadAllText file |> Markdown.ToHtml |> transformH3 version | ||
|
|
||
| $"""<h2><a name="%s{version}" class="anchor" href="#%s{version}">%s{title}</a></h2>%s{nugetBadge}%s{content}""") | ||
| (*** include-it-raw ***) |
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| (** --- | ||
| category: Release Notes | ||
| categoryindex: 600 | ||
| index: 3 | ||
| title: FSharp.Core | ||
| --- | ||
|
|
||
| # FSharp.Core | ||
| *) | ||
| (*** hide ***) | ||
| #load "./.aux/Common.fsx" | ||
|
|
||
| open System.IO | ||
| open Markdig | ||
| open Common | ||
|
|
||
| let path = Path.Combine(__SOURCE_DIRECTORY__, ".FSharp.Compiler.Service") | ||
| let nugetPackage = "FSharp.Core" | ||
| let availableNuGetVersions = getAvailableNuGetVersions nugetPackage | ||
|
|
||
| processFolder path (fun file -> | ||
| let version = Path.GetFileNameWithoutExtension(file) | ||
|
|
||
| // TODO: Can we determine if the current version is in code freeze based on the Version.props info? | ||
| let title = | ||
| if not (availableNuGetVersions.Contains version) then | ||
| $"%s{version} - Unreleased" | ||
| else | ||
| match tryGetReleaseDate nugetPackage version with | ||
| | None -> $"%s{version} - Unreleased" | ||
| | Some d -> $"%s{version} - %s{d}" | ||
|
|
||
| let nugetBadge = | ||
| if not (availableNuGetVersions.Contains version) then | ||
| System.String.Empty | ||
| else | ||
| $"<a href=\"https://www.nuget.org/packages/%s{nugetPackage}/%s{version}\" target=\"_blank\"><img alt=\"Nuget\" src=\"https://img.shields.io/badge/NuGet-%s{version}-blue\"></a>" | ||
|
|
||
| let content = File.ReadAllText file |> Markdown.ToHtml |> transformH3 version | ||
|
|
||
| $"""<h2><a name="%s{version}" class="anchor" href="#%s{version}">%s{title}</a></h2>%s{nugetBadge}%s{content}""") | ||
| (*** include-it-raw ***) |
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,35 @@ | ||
| (** --- | ||
| category: Release Notes | ||
| categoryindex: 600 | ||
| index: 2 | ||
| title: F# Language | ||
| --- | ||
|
|
||
| # F\# Language | ||
| *) | ||
| (*** hide ***) | ||
| #load "./.aux/Common.fsx" | ||
|
|
||
| open System.IO | ||
| open Markdig | ||
| open Common | ||
|
|
||
| let path = Path.Combine(__SOURCE_DIRECTORY__, ".Language") | ||
|
|
||
| Directory.EnumerateFiles(path, "*.md") | ||
| |> Seq.sortWith (fun a b -> | ||
| let a = Path.GetFileNameWithoutExtension a | ||
| let b = Path.GetFileNameWithoutExtension b | ||
|
|
||
| match a, b with | ||
| | "preview", "preview" -> 0 | ||
| | "preview", _ -> -1 | ||
| | _, "preview" -> 1 | ||
| | _, _ -> compare (int b) (int a)) | ||
| |> Seq.map (fun file -> | ||
| let version = Path.GetFileNameWithoutExtension(file) | ||
| let version = if version = "preview" then "Preview" else version | ||
| let content = File.ReadAllText file |> Markdown.ToHtml |> transformH3 version | ||
| $"""<h2><a name="%s{version}" class="anchor" href="#%s{version}">%s{version}</a></h2>%s{content}""") | ||
| |> String.concat "\n" | ||
| (*** include-it-raw ***) |
This file was deleted.
Uh oh!
There was an error while loading. Please reload this page.