fix(Diff): dark theme for rows — RowBackground + AlternatingRowBackgr… #1088
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI/CD Pipeline | ||
| on: | ||
| push: | ||
| branches: [ master, develop ] | ||
| pull_request: | ||
| branches: [ master, develop ] | ||
| workflow_dispatch: | ||
| env: | ||
| SOLUTION_PATH: 'Sources/WpfHexEditorControl.sln' | ||
| DOTNET_NOLOGO: true | ||
| DOTNET_CLI_TELEMETRY_OPTOUT: true | ||
| jobs: | ||
| build-and-test: | ||
| name: Build & Test | ||
| runs-on: windows-latest | ||
| strategy: | ||
| matrix: | ||
| configuration: [Debug, Release] | ||
| framework: [net8.0-windows] | ||
| steps: | ||
| - name: 📥 Checkout code | ||
| uses: actions/checkout@v4 | ||
| with: | ||
| fetch-depth: 0 # Full history for better analysis | ||
| - name: 🔧 Setup .NET 8.0 | ||
| uses: actions/setup-dotnet@v4 | ||
| with: | ||
| dotnet-version: '8.0.x' | ||
| - name: 🔧 Setup MSBuild (for .NET Framework) | ||
| uses: microsoft/setup-msbuild@v2 | ||
| - name: 📦 Restore NuGet packages | ||
| run: dotnet restore ${{ env.SOLUTION_PATH }} | ||
| - name: 🏗️ Build solution - ${{ matrix.configuration }} / ${{ matrix.framework }} | ||
| run: | | ||
| dotnet build ${{ env.SOLUTION_PATH }} ` | ||
| --configuration ${{ matrix.configuration }} ` | ||
| --framework ${{ matrix.framework }} ` | ||
| --no-restore ` | ||
| --verbosity minimal | ||
| - name: 🧪 Run tests - ${{ matrix.configuration }} / ${{ matrix.framework }} | ||
| run: | | ||
| dotnet test Sources/WpfHexEditor.Tests/WpfHexEditor.Tests.csproj ` | ||
| --configuration ${{ matrix.configuration }} ` | ||
| --no-build --verbosity normal ` | ||
| --logger "trx;LogFileName=test-results-main.trx" | ||
| dotnet test Sources/WpfHexEditor.Core.Diff.Tests/WpfHexEditor.Core.Diff.Tests.csproj ` | ||
| --configuration ${{ matrix.configuration }} ` | ||
| --no-build --verbosity normal ` | ||
| --logger "trx;LogFileName=test-results-diff.trx" | ||
| dotnet test Sources/WpfHexEditor.Core.Workspaces.Tests/WpfHexEditor.Core.Workspaces.Tests.csproj ` | ||
| --configuration ${{ matrix.configuration }} ` | ||
| --no-build --verbosity normal ` | ||
| --logger "trx;LogFileName=test-results-workspaces.trx" | ||
| dotnet test Sources/WpfHexEditor.BinaryAnalysis.Tests/WpfHexEditor.BinaryAnalysis.Tests.csproj ` | ||
| --configuration ${{ matrix.configuration }} ` | ||
| --no-build --verbosity normal ` | ||
| --logger "trx;LogFileName=test-results-binanalysis.trx" | ||
| dotnet test Sources/WpfHexEditor.Docking.Tests/WpfHexEditor.Docking.Tests.csproj ` | ||
| --configuration ${{ matrix.configuration }} ` | ||
| --no-build --verbosity normal ` | ||
| --logger "trx;LogFileName=test-results-docking.trx" | ||
| - name: 📊 Upload test results | ||
| uses: actions/upload-artifact@v4 | ||
| if: always() | ||
| with: | ||
| name: test-results-${{ matrix.configuration }}-${{ matrix.framework }} | ||
| path: '**/*.trx' | ||
| retention-days: 30 | ||
| - name: 📈 Upload code coverage | ||
| uses: actions/upload-artifact@v4 | ||
| if: matrix.configuration == 'Release' && matrix.framework == 'net8.0-windows' | ||
| with: | ||
| name: code-coverage | ||
| path: '**/coverage.cobertura.xml' | ||
| retention-days: 30 | ||
| package: | ||
| name: Create NuGet Package | ||
| runs-on: windows-latest | ||
| needs: build-and-test | ||
| if: github.ref == 'refs/heads/master' && github.event_name == 'push' | ||
| steps: | ||
| - name: 📥 Checkout code | ||
| uses: actions/checkout@v4 | ||
| - name: 🔧 Setup .NET 8.0 | ||
| uses: actions/setup-dotnet@v4 | ||
| with: | ||
| dotnet-version: '8.0.x' | ||
| - name: 📦 Restore NuGet packages | ||
| run: dotnet restore ${{ env.SOLUTION_PATH }} | ||
| - name: 🏗️ Build Release | ||
| run: | | ||
| dotnet build ${{ env.SOLUTION_PATH }} ` | ||
| --configuration Release ` | ||
| --no-restore | ||
| - name: 📦 Create NuGet packages | ||
| shell: pwsh | ||
| run: | | ||
| $projects = @( | ||
| 'Sources/Controls/WpfHexEditor.ColorPicker/WpfHexEditor.ColorPicker.csproj', | ||
| 'Sources/Controls/WpfHexEditor.Terminal/WpfHexEditor.Terminal.csproj', | ||
| 'Sources/Core/WpfHexEditor.Core.BinaryAnalysis/WpfHexEditor.Core.BinaryAnalysis.csproj', | ||
| 'Sources/Core/WpfHexEditor.Core.ByteProvider/WpfHexEditor.Core.ByteProvider.csproj', | ||
| 'Sources/Core/WpfHexEditor.Core.Decompiler/WpfHexEditor.Core.Decompiler.csproj', | ||
| 'Sources/Docking/WpfHexEditor.Docking.Core/WpfHexEditor.Docking.Core.csproj', | ||
| 'Sources/Docking/WpfHexEditor.Docking.Wpf/WpfHexEditor.Docking.Wpf.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.AudioViewer/WpfHexEditor.Editor.AudioViewer.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.CodeEditor/WpfHexEditor.Editor.CodeEditor.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.DiffViewer/WpfHexEditor.Editor.DiffViewer.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.DisassemblyViewer/WpfHexEditor.Editor.DisassemblyViewer.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.DocumentEditor.Core/WpfHexEditor.Editor.DocumentEditor.Core.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.DocumentEditor/WpfHexEditor.Editor.DocumentEditor.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.EntropyViewer/WpfHexEditor.Editor.EntropyViewer.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.ImageViewer/WpfHexEditor.Editor.ImageViewer.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.MarkdownEditor.Core/WpfHexEditor.Editor.MarkdownEditor.Core.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.MarkdownEditor/WpfHexEditor.Editor.MarkdownEditor.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.ScriptEditor/WpfHexEditor.Editor.ScriptEditor.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.StructureEditor/WpfHexEditor.Editor.StructureEditor.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.TextEditor/WpfHexEditor.Editor.TextEditor.csproj', | ||
| 'Sources/Editors/WpfHexEditor.Editor.TileEditor/WpfHexEditor.Editor.TileEditor.csproj', | ||
| 'Sources/Editors/WpfHexEditor.HexEditor/WpfHexEditor.HexEditor.csproj', | ||
| 'Sources/Plugins/WpfHexEditor.SDK/WpfHexEditor.SDK.csproj' | ||
| ) | ||
| foreach ($proj in $projects) { | ||
| Write-Host "📦 Packing $proj" | ||
| dotnet pack $proj --configuration Release --no-build --output ./artifacts/nuget | ||
| } | ||
| - name: 📤 Upload NuGet package artifact | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: nuget-package | ||
| path: ./artifacts/*.nupkg | ||
| retention-days: 90 | ||
| code-quality: | ||
| name: Code Quality Analysis | ||
| runs-on: windows-latest | ||
| steps: | ||
| - name: 📥 Checkout code | ||
| uses: actions/checkout@v4 | ||
| with: | ||
| fetch-depth: 0 | ||
| - name: 🔧 Setup .NET 8.0 | ||
| uses: actions/setup-dotnet@v4 | ||
| with: | ||
| dotnet-version: '8.0.x' | ||
| - name: 📦 Restore NuGet packages | ||
| run: dotnet restore ${{ env.SOLUTION_PATH }} | ||
| - name: 🔍 Run code analysis | ||
| run: | | ||
| dotnet build ${{ env.SOLUTION_PATH }} ` | ||
| --configuration Release ` | ||
| --no-restore ` | ||
| /p:TreatWarningsAsErrors=false | ||
| - name: 📊 Analyze warnings and errors | ||
| run: | | ||
| Write-Host "✅ Code quality check completed" | ||
| Write-Host "Review build output above for any warnings or issues" | ||
| documentation: | ||
| name: Documentation Check | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: 📥 Checkout code | ||
| uses: actions/checkout@v4 | ||
| - name: 📝 Check README files | ||
| run: | | ||
| echo "Checking for README files..." | ||
| find . -name "README.md" -type f | while read file; do | ||
| echo "✅ Found: $file" | ||
| done | ||
| - name: 📚 Validate markdown files | ||
| uses: gaurav-nelson/github-action-markdown-link-check@v1 | ||
| with: | ||
| config-file: '.github/markdown-link-check-config.json' | ||
| folder-path: '.' | ||
| file-extension: '.md' | ||
| continue-on-error: true | ||
| summary: | ||
| name: Build Summary | ||
| runs-on: ubuntu-latest | ||
| needs: [build-and-test, code-quality] | ||
| if: always() | ||
| steps: | ||
| - name: 📊 Generate summary | ||
| run: | | ||
| echo "## 🎉 CI/CD Pipeline Summary" >> $GITHUB_STEP_SUMMARY | ||
| echo "" >> $GITHUB_STEP_SUMMARY | ||
| echo "### Build Status" >> $GITHUB_STEP_SUMMARY | ||
| echo "- **Branch:** ${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY | ||
| echo "- **Commit:** ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY | ||
| echo "- **Trigger:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY | ||
| echo "" >> $GITHUB_STEP_SUMMARY | ||
| echo "### Jobs Status" >> $GITHUB_STEP_SUMMARY | ||
| echo "- Build & Test: ${{ needs.build-and-test.result }}" >> $GITHUB_STEP_SUMMARY | ||
| echo "- Code Quality: ${{ needs.code-quality.result }}" >> $GITHUB_STEP_SUMMARY | ||
| echo "" >> $GITHUB_STEP_SUMMARY | ||
| echo "✅ Pipeline completed successfully!" >> $GITHUB_STEP_SUMMARY | ||
| # Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> | ||