diff --git a/.github/workflows/check_release_notes.yml b/.github/workflows/check_release_notes.yml new file mode 100644 index 000000000000..f8073d10cd77 --- /dev/null +++ b/.github/workflows/check_release_notes.yml @@ -0,0 +1,200 @@ +name: Check release notes +on: + pull_request: + types: [opened, synchronize, reopened] + branches: + - 'main' + - 'release/*' +permissions: + contents: write + pull-requests: write + +jobs: + check_release_notes: + #if: github.event.issue.pull_request != '' + runs-on: ubuntu-22.04 + steps: + - name: Get github ref + uses: actions/github-script@v3 + id: get-pr + with: + script: | + const result = await github.pulls.get({ + pull_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + }); + return { "pr_number": context.issue.number, "ref": result.data.head.ref, "repository": result.data.head.repo.full_name}; + - name: Checkout repo + uses: actions/checkout@v2 + with: + repository: ${{ fromJson(steps.get-pr.outputs.result).repository }} + ref: ${{ fromJson(steps.get-pr.outputs.result).ref }} + fetch-depth: 0 + - name: Check for release notes changes + id: release_notes_changes + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -e + EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) + + # Parse version from eng/Versions.props + # For FSarp.Core: + # 8 + # 0 + # 100 + # For FCS: + # FCSMajorVersion>43 + # 8 + # $(FSBuildVersion) + # For VS: + # 17 + # 8 + + _fs_major_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props) + _fs_minor_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props) + _fs_build_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props) + _fcs_major_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props) + _fcs_minor_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props) + _fcs_build_version=$_fs_build_version + _vs_major_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props) + _vs_minor_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props) + + FSHARP_CORE_VERSION="$_fs_major_version.$_fs_minor_version.$_fs_build_version" + FCS_VERSION="$_fcs_major_version.$_fcs_minor_version.$_fcs_build_version" + VISUAL_STUDIO_VERSION="$_vs_major_version.$_vs_minor_version" + + echo "Found F# version: ${FSHARP_CORE_VERSION}" + echo "Found FCS version: ${FCS_VERSION}" + echo "Found Visual Studio version: ${VISUAL_STUDIO_VERSION}" + + [[ "$FSHARP_CORE_VERSION" =~ ^[0-9]+\.[0-9]+.[0-9]+$ ]] || (echo "Invalid FSharp.Core Version parsed"; exit 1) + [[ "$FCS_VERSION" =~ ^[0-9]+\.[0-9]+.[0-9]+$ ]] || (echo "Invalid FCS Version parsed"; exit 1) + [[ "$VISUAL_STUDIO_VERSION" =~ ^[0-9]+\.[0-9]+$ ]] || (echo "Invalid Visual Studio Version parsed"; exit 1) + + _release_notes_base_path='docs/release-notes' + _fsharp_core_release_notes_path="${_release_notes_base_path}/FSharp.Core/${FSHARP_CORE_VERSION}.md" + _fsharp_compiler_release_notes_path="${_release_notes_base_path}/FSharp.Compiler.Service/${FSHARP_CORE_VERSION}.md" + _fsharp_language_release_notes_path="${_release_notes_base_path}/Language/preview.md" + _fsharp_vs_release_notes_path="${_release_notes_base_path}/VisualStudio/${VISUAL_STUDIO_VERSION}.md" + + readonly paths=( + "src/FSharp.Core|${_fsharp_core_release_notes_path}" + "src/Compiler|${_fsharp_compiler_release_notes_path}" + "src/Compiler/Facilities/LanguageFeatures.fsi|${_fsharp_language_release_notes_path}" + "vsintegration/src|${_fsharp_vs_release_notes_path}" + ".github|NONEXISTING_NOTES_FOR_TESTING.md" + ) + + # Check all changed paths + RELEASE_NOTES_MESSAGE="" + RELEASE_NOTES_MESSAGE_DETAILS="" + RELEASE_NOTES_FOUND="" + RELEASE_NOTES_CHANGES_SUMMARY="" + RELEASE_NOTES_NOT_FOUND="" + + _modified_paths=`gh pr view ${PR_NUMBER} --json files --jq '.files.[].path'` + + for fields in ${paths[@]} + do + IFS=$'|' read -r path release_notes <<< "$fields" + echo "Checking for changed files in: $path" + + # Check if path is in modified files: + if [[ "${_modified_paths[@]}" =~ "${path}" ]]; then + echo "Found $path in modified files" + echo "Checking if release notes modified in: $release_notes" + if [[ "${_modified_paths[@]}" =~ "${release_notes}" ]]; then + echo "Found $release_notes in modified files" + RELEASE_NOTES_FOUND+="| \`$path\` | \`$release_notes\` |" + RELEASE_NOTES_FOUND+=$'\n' + else + echo "Did not find $release_notes in modified files" + RELEASE_NOTES_NOT_FOUND+="| \`$path\` | \`$release_notes\` |" + RELEASE_NOTES_NOT_FOUND+=$'\n' + fi + else + echo "Nothing found, no release notes required" + fi + + done + + if [[ $RELEASE_NOTES_NOT_FOUND != "" ]]; then + RELEASE_NOTES_MESSAGE_DETAILS+=$"> [!CAUTION]" + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + RELEASE_NOTES_MESSAGE_DETAILS+=$"> No release notes found for the following paths:" + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + RELEASE_NOTES_MESSAGE_DETAILS+=$">" + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + RELEASE_NOTES_MESSAGE_DETAILS+=$"> Please add an entry with short description of the change to the release notes file as well as link to this pull request." + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + RELEASE_NOTES_MESSAGE_DETAILS+='| Change path | Release notes path |' + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + RELEASE_NOTES_MESSAGE_DETAILS+='| ---------------- | ------------------ |' + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + RELEASE_NOTES_MESSAGE_DETAILS+="${RELEASE_NOTES_NOT_FOUND}" + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + fi + + if [[ $RELEASE_NOTES_FOUND != "" ]]; then + RELEASE_NOTES_MESSAGE_DETAILS+=$"> :white_check_mark: Found changes and release notes in following paths:" + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + RELEASE_NOTES_MESSAGE_DETAILS+='| Change path | Release notes path |' + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + RELEASE_NOTES_MESSAGE_DETAILS+='| ---------------- | ------------------ |' + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + RELEASE_NOTES_MESSAGE_DETAILS+="${RELEASE_NOTES_FOUND}" + RELEASE_NOTES_MESSAGE_DETAILS+=$'\n' + fi + + RELEASE_NOTES_MESSAGE+=$'## Release notes check\n\n' + + if [[ $RELEASE_NOTES_MESSAGE_DETAILS == "" ]]; then + RELEASE_NOTES_MESSAGE+=$'### No release notes required.' + else + RELEASE_NOTES_MESSAGE+=$'### Release notes required.\n\n' + RELEASE_NOTES_MESSAGE+=$RELEASE_NOTES_MESSAGE_DETAILS + fi + + echo "release-notes-check-message<<$EOF" >>$GITHUB_OUTPUT + echo "${RELEASE_NOTES_MESSAGE}" >>$GITHUB_OUTPUT + echo "$EOF" >>$GITHUB_OUTPUT + + if [[ $RELEASE_NOTES_NOT_FOUND != "" ]]; then + exit 1 + fi + # Did bot already commented the PR? + - name: Find Comment + if: success() || failure() + uses: peter-evans/find-comment@v2.4.0 + id: fc + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: 'github-actions[bot]' + body-includes: '' + # If not, create a new comment + - name: Create comment + if: steps.fc.outputs.comment-id == '' && (success() || failure()) + uses: peter-evans/create-or-update-comment@v3.1.0 + with: + issue-number: ${{ github.event.pull_request.number }} + body: | + + ${{steps.release_notes_changes.outputs.release-notes-check-message}} + #reactions: rocket + # If yes, update the comment + - name: Update comment + if: steps.fc.outputs.comment-id != '' && (success() || failure()) + uses: peter-evans/create-or-update-comment@v3.1.0 + with: + comment-id: ${{ steps.fc.outputs.comment-id }} + edit-mode: replace + body: | + + ${{steps.release_notes_changes.outputs.release-notes-check-message}} + #reactions: hooray diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d16b15a6ed02..248476682100 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -283,7 +283,7 @@ stages: # We will try to restore both FSharp.Core and FCS and if restore is _successful_, package version needs to be bumped. # NOTE: This CI check should only run on the release branches. - job: Check_Published_Package_Versions - condition: or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), or(startsWith(variables['System.PullRequest.SourceBranch'], 'release/dev'), startsWith(variables['System.PullRequest.TargetBranch'], 'release/dev'))) + # condition: or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), or(startsWith(variables['System.PullRequest.SourceBranch'], 'release/dev'), startsWith(variables['System.PullRequest.TargetBranch'], 'release/dev'))) pool: vmImage: $(UbuntuMachineQueueName) strategy: diff --git a/docs/release-notes/FSharp.Compiler.Service/8.0.200.md b/docs/release-notes/FSharp.Compiler.Service/8.0.200.md new file mode 100644 index 000000000000..33e811413027 --- /dev/null +++ b/docs/release-notes/FSharp.Compiler.Service/8.0.200.md @@ -0,0 +1 @@ +- Miscellaneous fixes to parens analysis - https://github.com/dotnet/fsharp/pull/16262 \ No newline at end of file diff --git a/docs/release-notes/FSharp.Core/8.0.200.md b/docs/release-notes/FSharp.Core/8.0.200.md new file mode 100644 index 000000000000..8bed6454108f --- /dev/null +++ b/docs/release-notes/FSharp.Core/8.0.200.md @@ -0,0 +1 @@ +- More inlines for Result module - https://github.com/dotnet/fsharp/pull/16106 \ No newline at end of file diff --git a/docs/release-notes/Language/preview.md b/docs/release-notes/Language/preview.md new file mode 100644 index 000000000000..7d9996a870e4 --- /dev/null +++ b/docs/release-notes/Language/preview.md @@ -0,0 +1 @@ +- Feature: Better unmanaged structs handling - https://github.com/dotnet/fsharp/pull/12154 \ No newline at end of file diff --git a/docs/release-notes/VisualStudio/17.9.md b/docs/release-notes/VisualStudio/17.9.md new file mode 100644 index 000000000000..7adc4118f71c --- /dev/null +++ b/docs/release-notes/VisualStudio/17.9.md @@ -0,0 +1 @@ +- Respect line limit in quick info popup - https://github.com/dotnet/fsharp/pull/16208 \ No newline at end of file diff --git a/eng/Versions.props b/eng/Versions.props index c96ae7ba9995..d09ec8ccaf66 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -12,10 +12,11 @@ beta + 8 0 - 100 + 200 0 @@ -55,8 +56,9 @@ $(FSToolsMajorVersion).$(FSToolsMinorVersion).$(FSToolsBuildVersion).$(FSToolsRevisionVersion) + 17 - 8 + 9 $(VSMajorVersion).0 $(VSMajorVersion).$(VSMinorVersion).0 $(VSAssemblyVersionPrefix).0 diff --git a/src/Compiler/Facilities/LanguageFeatures.fsi b/src/Compiler/Facilities/LanguageFeatures.fsi index e3d7e7232bc1..a9b1c35db545 100644 --- a/src/Compiler/Facilities/LanguageFeatures.fsi +++ b/src/Compiler/Facilities/LanguageFeatures.fsi @@ -111,3 +111,4 @@ type LanguageVersion = static member GetFeatureVersionString: feature: LanguageFeature -> string static member Default: LanguageVersion + diff --git a/src/FSharp.Core/prim-types-prelude.fs b/src/FSharp.Core/prim-types-prelude.fs index 63c370ba332e..9a002450382d 100644 --- a/src/FSharp.Core/prim-types-prelude.fs +++ b/src/FSharp.Core/prim-types-prelude.fs @@ -119,3 +119,4 @@ namespace Microsoft.FSharp.Core type voidptr = (# "void*" #) type ilsigptr<'T> = (# "!0*" #) + diff --git a/vsintegration/src/Directory.Build.props b/vsintegration/src/Directory.Build.props index f7a21adf80c9..af52f02d17bb 100644 --- a/vsintegration/src/Directory.Build.props +++ b/vsintegration/src/Directory.Build.props @@ -10,3 +10,4 @@ +