Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 8 additions & 11 deletions .github/release-drafter.yml
Original file line number Diff line number Diff line change
@@ -1,24 +1,23 @@
# https://github.com/marketplace/actions/release-drafter#configuration
name-template: '$RESOLVED_VERSION CI'
name-template: '$RESOLVED_VERSION xxx Update [Alpha|Beta]'
tag-template: 'v$RESOLVED_VERSION'
version-resolver:
version-resolver: # Sync these labels with Label.yml
major:
labels:
- 'Version/Major'
- 'Impact/Breaking change'
minor:
labels:
- 'Version/Minor'
- 'Type/Platform'
- 'Type/Enhancement'
patch:
labels:
- 'Version/Patch'
- 'Type/Bug'
default: patch
exclude-labels:
- 'Version/None'
- 'Type/Housekeeping'
prerelease: true
template: |
<!--Example release name: $RESOLVED_VERSION xxx Update [Alpha|Beta]-->
<!--Please release immediately after modifying as any changes will be overwritten on next run of the Test workflow-->
<!--Remove these comments, they will be visible in the released NuGet packages!-->
<!--Auto-generated. Any changes will be overwritten on next run of the Nightly workflow.-->

## Changes from $PREVIOUS_TAG (Recently merged first)
$CHANGES
Expand All @@ -35,8 +34,6 @@ categories:
- title: '🐛 Bug Fixes'
labels:
- 'Type/Bug'
- title: '🧰 Maintenance'
label: 'Type/Housekeeping'
# Extra line before $BODY or markdown on the first line of $BODY will be interpreted as plain text
change-template: |
<details><summary>$TITLE (#$NUMBER) @$AUTHOR</summary><table><td>
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/Format.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@ jobs:
with:
submodules: 'recursive'
- name: Check formatting (Fix with "dotnet format --exclude Typography" at repository root)
run: dotnet format --exclude Typography --verify-no-changes --severity error --verbosity diagnostic
run: dotnet format --exclude Typography --verify-no-changes --verbosity diagnostic
63 changes: 63 additions & 0 deletions .github/workflows/Label.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: Label breaking changes for semantic versioning

on: [pull_request]
jobs:
Label:
runs-on: windows-latest
steps:
- uses: actions/checkout@v6
with:
submodules: recursive
- name: If there are changes in PublicApi.Shipped.txt, fail the workflow
if: github.head_ref != 'action/ship-publicapi' # Same branch name specified in Release.yml
run: |
git fetch origin ${{ github.base_ref }}
$changes = git diff --numstat --shortstat origin/${{ github.base_ref }}...HEAD -- '**/PublicApi.Shipped.txt'
Write-Output "$changes"
if ($changes) {
Write-Error "Changes detected in PublicApi.Shipped.txt files. Public API changes must be shipped through the release process, not in regular pull requests."
exit 1
}
shell: pwsh
- name: Label based on PublicApi.Unshipped.txt
run: |
git fetch origin ${{ github.base_ref }}

# Determine the appropriate label (Sync these labels with release-drafter.yml)
if ("${{ github.head_ref }}" -eq "action/ship-publicapi") { # Same branch name specified in Release.yml
$labels = @('Type/Housekeeping')
Write-Output "This is a ship-publicapi PR, labeling as Type/Maintenance"
} else {
# For regular PRs, check for API changes
$changes = git diff origin/${{ github.base_ref }}...HEAD -- '**/PublicApi.Unshipped.txt'
Write-Output "$changes"

if ($changes) {
# Check if any of the changes include *REMOVED* entries (breaking changes)
$addedLines = $changes | Select-String '^\+.*\*REMOVED\*'
if ($addedLines) {
$labels = @('Impact/Breaking change')
Write-Output "Breaking changes detected:"
Write-Output "$addedLines"
} else {
$labels = @('Type/Enhancement')
Write-Output "Publicly facing API changes include only additions. Labelling as enhancement."
}
} else {
$labels = @('Type/Bug')
Write-Output "No publicly facing API changes. Labelling as bug."
}
}

# Add label to PR using GitHub API
$headers = @{
"Authorization" = "Bearer ${{ github.token }}"
"Accept" = "application/vnd.github+json"
}
$body = @{
labels = $labels
} | ConvertTo-Json

Invoke-RestMethod -Method Post -Uri "https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels" -Headers $headers -Body $body -ContentType "application/json"
Write-Output "Added '$($labels -join ', ')' label(s) to PR #${{ github.event.pull_request.number }}"
shell: pwsh
53 changes: 53 additions & 0 deletions .github/workflows/Release-mark-shipped.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# From https://github.com/dotnet/winforms/pull/4837/changes

[CmdletBinding(PositionalBinding=$false)]
param ()

Set-StrictMode -version 2.0
$ErrorActionPreference = "Stop"

function MarkShipped([string]$dir) {
$shippedFilePath = Join-Path $dir "PublicAPI.Shipped.txt"
$shipped = Get-Content $shippedFilePath
if ($null -eq $shipped) {
$shipped = @()
}

$unshippedFilePath = Join-Path $dir "PublicAPI.Unshipped.txt"
$unshipped = Get-Content $unshippedFilePath
$removed = @()
$removedPrefix = "*REMOVED*";
Write-Host "Processing $dir"

foreach ($item in $unshipped) {
if ($item.Length -gt 0) {
if ($item.StartsWith($removedPrefix)) {
$item = $item.Substring($removedPrefix.Length)
$removed += $item
}
else {
$shipped += $item
}
}
}

$shipped | Sort-Object | ?{ -not $removed.Contains($_) } | Out-File $shippedFilePath -Encoding Ascii
$null | Out-File $unshippedFilePath -Encoding Ascii
}

try {
Push-Location $PSScriptRoot\..\..

foreach ($file in Get-ChildItem -re -in "PublicApi.Shipped.txt") {
$dir = Split-Path -parent $file
MarkShipped $dir
}
}
catch {
Write-Host $_
Write-Host $_.Exception
exit 1
}
finally {
Pop-Location
}
16 changes: 15 additions & 1 deletion .github/workflows/Release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,18 @@ on:
jobs:
CSharpMath:
runs-on: windows-latest
permissions:
# permissions requested by https://github.com/marketplace/actions/create-pull-request#token
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v6
with:
submodules: 'recursive'
- uses: actions/setup-dotnet@main
with:
dotnet-version: '10.x'
workloads: maui-ios, maui-maccatalyst, maui-android, wasm-tools
workloads: maui, wasm-tools
- name: Build GitHub Releases draft artifacts
env:
RELEASE_NOTES: |
Expand Down Expand Up @@ -42,3 +46,13 @@ jobs:
# --skip-duplicate enables re-running this workflow even if some packages from the same commit are already uploaded.
dotnet nuget push '.nupkgs\*.nupkg' -s 'https://api.nuget.org/v3/index.json' -k ${{ secrets.NUGET_API_KEY }} --skip-duplicate
shell: pwsh
- name: Move PublicApi.Unshipped.txt to PublicApi.Shipped.txt
run: .github/workflows/Release-mark-shipped.ps1
shell: pwsh
- name: Create PR for shipping PublicApi
uses: peter-evans/create-pull-request@v8
with:
commit-message: 'Move PublicApi.Unshipped.txt to PublicApi.Shipped.txt for ${{ github.event.release.tag_name }}'
title: 'Ship PublicApi for ${{ github.event.release.tag_name }}'
body: 'This PR moves the contents of PublicApi.Unshipped.txt to PublicApi.Shipped.txt to mark the API as shipped for version ${{ github.event.release.tag_name }}.'
branch: action/ship-publicapi # Same branch name specified in Label.yml
1 change: 1 addition & 0 deletions CSharpMath.Avalonia/PublicAPI.Shipped.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#nullable enable
114 changes: 114 additions & 0 deletions CSharpMath.Avalonia/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
#nullable enable
CSharpMath.Avalonia.AvaloniaCanvas
CSharpMath.Avalonia.AvaloniaCanvas.AvaloniaCanvas(Avalonia.Media.DrawingContext! drawingContext, Avalonia.Size size) -> void
CSharpMath.Avalonia.AvaloniaCanvas.CurrentColor.get -> System.Drawing.Color?
CSharpMath.Avalonia.AvaloniaCanvas.CurrentColor.set -> void
CSharpMath.Avalonia.AvaloniaCanvas.CurrentStyle.get -> CSharpMath.Rendering.FrontEnd.PaintStyle
CSharpMath.Avalonia.AvaloniaCanvas.CurrentStyle.set -> void
CSharpMath.Avalonia.AvaloniaCanvas.DefaultColor.get -> System.Drawing.Color
CSharpMath.Avalonia.AvaloniaCanvas.DefaultColor.set -> void
CSharpMath.Avalonia.AvaloniaCanvas.DrawLine(float x1, float y1, float x2, float y2, float lineThickness) -> void
CSharpMath.Avalonia.AvaloniaCanvas.FillRect(float left, float top, float width, float height) -> void
CSharpMath.Avalonia.AvaloniaCanvas.Height.get -> float
CSharpMath.Avalonia.AvaloniaCanvas.Restore() -> void
CSharpMath.Avalonia.AvaloniaCanvas.Save() -> void
CSharpMath.Avalonia.AvaloniaCanvas.Scale(float sx, float sy) -> void
CSharpMath.Avalonia.AvaloniaCanvas.StartNewPath() -> CSharpMath.Rendering.FrontEnd.Path!
CSharpMath.Avalonia.AvaloniaCanvas.StrokeRect(float left, float top, float width, float height) -> void
CSharpMath.Avalonia.AvaloniaCanvas.Translate(float dx, float dy) -> void
CSharpMath.Avalonia.AvaloniaCanvas.Width.get -> float
CSharpMath.Avalonia.AvaloniaPath
CSharpMath.Avalonia.AvaloniaPath.AvaloniaPath(CSharpMath.Avalonia.AvaloniaCanvas! canvas) -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>
CSharpMath.Avalonia.BaseView<TPainter, TContent>.BaseView() -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.Content.get -> TContent?
CSharpMath.Avalonia.BaseView<TPainter, TContent>.Content.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.DisplacementX.get -> float
CSharpMath.Avalonia.BaseView<TPainter, TContent>.DisplacementX.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.DisplacementY.get -> float
CSharpMath.Avalonia.BaseView<TPainter, TContent>.DisplacementY.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.DisplayErrorInline.get -> bool
CSharpMath.Avalonia.BaseView<TPainter, TContent>.DisplayErrorInline.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.EnablePanning.get -> bool
CSharpMath.Avalonia.BaseView<TPainter, TContent>.EnablePanning.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.ErrorColor.get -> Avalonia.Media.Color
CSharpMath.Avalonia.BaseView<TPainter, TContent>.ErrorColor.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.ErrorFontSize.get -> float?
CSharpMath.Avalonia.BaseView<TPainter, TContent>.ErrorFontSize.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.ErrorMessage.get -> string?
CSharpMath.Avalonia.BaseView<TPainter, TContent>.FontSize.get -> float
CSharpMath.Avalonia.BaseView<TPainter, TContent>.FontSize.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.GlyphBoxColor.get -> (Avalonia.Media.Color glyph, Avalonia.Media.Color textRun)?
CSharpMath.Avalonia.BaseView<TPainter, TContent>.GlyphBoxColor.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.HighlightColor.get -> Avalonia.Media.Color
CSharpMath.Avalonia.BaseView<TPainter, TContent>.HighlightColor.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.LaTeX.get -> string?
CSharpMath.Avalonia.BaseView<TPainter, TContent>.LaTeX.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.LineStyle.get -> CSharpMath.Atom.LineStyle
CSharpMath.Avalonia.BaseView<TPainter, TContent>.LineStyle.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.LocalTypefaces.get -> System.Collections.Generic.IEnumerable<Typography.OpenFont.Typeface!>!
CSharpMath.Avalonia.BaseView<TPainter, TContent>.LocalTypefaces.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.Magnification.get -> float
CSharpMath.Avalonia.BaseView<TPainter, TContent>.Magnification.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.Padding.get -> Avalonia.Thickness
CSharpMath.Avalonia.BaseView<TPainter, TContent>.Padding.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.Painter.get -> TPainter!
CSharpMath.Avalonia.BaseView<TPainter, TContent>.PaintStyle.get -> CSharpMath.Rendering.FrontEnd.PaintStyle
CSharpMath.Avalonia.BaseView<TPainter, TContent>.PaintStyle.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.TextAlignment.get -> CSharpMath.Rendering.FrontEnd.TextAlignment
CSharpMath.Avalonia.BaseView<TPainter, TContent>.TextAlignment.set -> void
CSharpMath.Avalonia.BaseView<TPainter, TContent>.TextColor.get -> Avalonia.Media.Color
CSharpMath.Avalonia.BaseView<TPainter, TContent>.TextColor.set -> void
CSharpMath.Avalonia.Extensions
CSharpMath.Avalonia.MathPainter
CSharpMath.Avalonia.MathPainter.MathPainter() -> void
CSharpMath.Avalonia.MathView
CSharpMath.Avalonia.MathView.MathView() -> void
CSharpMath.Avalonia.TextPainter
CSharpMath.Avalonia.TextPainter.TextPainter() -> void
CSharpMath.Avalonia.TextView
CSharpMath.Avalonia.TextView.TextView() -> void
override CSharpMath.Avalonia.AvaloniaPath.CloseContour() -> void
override CSharpMath.Avalonia.AvaloniaPath.Curve3(float x1, float y1, float x2, float y2) -> void
override CSharpMath.Avalonia.AvaloniaPath.Curve4(float x1, float y1, float x2, float y2, float x3, float y3) -> void
override CSharpMath.Avalonia.AvaloniaPath.Dispose() -> void
override CSharpMath.Avalonia.AvaloniaPath.Foreground.get -> System.Drawing.Color?
override CSharpMath.Avalonia.AvaloniaPath.Foreground.set -> void
override CSharpMath.Avalonia.AvaloniaPath.LineTo(float x1, float y1) -> void
override CSharpMath.Avalonia.AvaloniaPath.MoveTo(float x0, float y0) -> void
override CSharpMath.Avalonia.BaseView<TPainter, TContent>.MeasureOverride(Avalonia.Size availableSize) -> Avalonia.Size
override CSharpMath.Avalonia.BaseView<TPainter, TContent>.OnPointerMoved(Avalonia.Input.PointerEventArgs! e) -> void
override CSharpMath.Avalonia.BaseView<TPainter, TContent>.OnPointerPressed(Avalonia.Input.PointerPressedEventArgs! e) -> void
override CSharpMath.Avalonia.BaseView<TPainter, TContent>.OnPointerReleased(Avalonia.Input.PointerReleasedEventArgs! e) -> void
override CSharpMath.Avalonia.BaseView<TPainter, TContent>.Render(Avalonia.Media.DrawingContext! context) -> void
override CSharpMath.Avalonia.MathPainter.UnwrapColor(System.Drawing.Color color) -> Avalonia.Media.Color
override CSharpMath.Avalonia.MathPainter.WrapCanvas(CSharpMath.Avalonia.AvaloniaCanvas! canvas) -> CSharpMath.Rendering.FrontEnd.ICanvas!
override CSharpMath.Avalonia.MathPainter.WrapColor(Avalonia.Media.Color color) -> System.Drawing.Color
override CSharpMath.Avalonia.TextPainter.UnwrapColor(System.Drawing.Color color) -> Avalonia.Media.Color
override CSharpMath.Avalonia.TextPainter.WrapCanvas(CSharpMath.Avalonia.AvaloniaCanvas! canvas) -> CSharpMath.Rendering.FrontEnd.ICanvas!
override CSharpMath.Avalonia.TextPainter.WrapColor(Avalonia.Media.Color color) -> System.Drawing.Color
static CSharpMath.Avalonia.Extensions.DrawAsPng<TContent>(this CSharpMath.Rendering.FrontEnd.Painter<CSharpMath.Avalonia.AvaloniaCanvas!, TContent!, Avalonia.Media.Color>! painter, System.IO.Stream! target, float textPainterCanvasWidth = 2000, int? quality = null, CSharpMath.Rendering.FrontEnd.TextAlignment alignmentForTests = CSharpMath.Rendering.FrontEnd.TextAlignment.TopLeft) -> void
static CSharpMath.Avalonia.Extensions.ToAvaloniaColor(this System.Drawing.Color color) -> Avalonia.Media.Color
static CSharpMath.Avalonia.Extensions.ToSolidColorBrush(this System.Drawing.Color color) -> Avalonia.Media.SolidColorBrush!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.ContentProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.DisplacementXProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.DisplacementYProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.DisplayErrorInlineProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.EnablePanningProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.ErrorColorProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.ErrorFontSizeProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.ErrorMessageProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.FontSizeProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.GlyphBoxColorProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.HighlightColorProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.LaTeXProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.LineStyleProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.LocalTypefacesProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.MagnificationProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.PaddingProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.PaintStyleProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.staticPainter -> TPainter!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.TextAlignmentProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.TextColorProperty -> Avalonia.AvaloniaProperty!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.WritablePainterProperties -> Avalonia.AvaloniaProperty![]!
static readonly CSharpMath.Avalonia.BaseView<TPainter, TContent>.WritablePainterPropertyNames -> System.Collections.Generic.HashSet<string!>!
1 change: 1 addition & 0 deletions CSharpMath.Evaluation/PublicAPI.Shipped.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#nullable enable
Loading
Loading