Skip to content

Add support for systems running only .NET 9.0 (without .NET 8.0) in Refitter.MSBuild#746

Merged
christianhelle merged 3 commits into
mainfrom
msbuild
Sep 12, 2025
Merged

Add support for systems running only .NET 9.0 (without .NET 8.0) in Refitter.MSBuild#746
christianhelle merged 3 commits into
mainfrom
msbuild

Conversation

@christianhelle

@christianhelle christianhelle commented Sep 12, 2025

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features
    • Automatic runtime selection: prefers .NET 9 when available, otherwise uses .NET 8.
    • Clearer logs indicating the chosen runtime and executed command.
  • Chores
    • Updated package layout: ships MSBuild task assets for both .NET 8 and .NET 9 with versioned paths.
  • Tests
    • Added an end-to-end build script to validate packaging and MSBuild integration.

@christianhelle christianhelle self-assigned this Sep 12, 2025
Copilot AI review requested due to automatic review settings September 12, 2025 14:00
@christianhelle christianhelle added enhancement New feature, bug fix, or request .NET Pull requests that contain changes to .NET code labels Sep 12, 2025
@coderabbitai

coderabbitai Bot commented Sep 12, 2025

Copy link
Copy Markdown
Contributor

Walkthrough

Updates MSBuild packaging paths to versioned task folders, adds .NET runtime detection in RefitterGenerateTask to choose net8.0 or net9.0 refitter.dll at runtime, and introduces a Bash script to perform an end-to-end local build, pack, and test cycle for the MSBuild integration.

Changes

Cohort / File(s) Summary
MSBuild packaging paths
src/Refitter.MSBuild/Refitter.MSBuild.csproj
Adjusts Content PackagePath for net8.0 to "tasks/net8.0" and adds net9.0 Content at "tasks/net9.0"; includes respective build outputs.
Runtime selection in task
src/Refitter.MSBuild/RefitterGenerateTask.cs
Adds runtime detection via parsing dotnet --list-runtimes. Defaults to net8.0 but switches to net9.0 if a 9.x runtime is present. Refactors argument construction and logging; removes pre-check for refitter.dll existence.
E2E test/build script
test/MSBuild/build.sh
New Bash script to clean, restore, build, pack MSBuild package, add local nupkg source, restore and run with verbose logs, then clean up.

Sequence Diagram(s)

sequenceDiagram
    participant MSB as MSBuild
    participant Task as RefitterGenerateTask
    participant CLI as dotnet CLI
    participant RT as Installed Runtimes
    participant DLL as refitter.dll (net8.0 or net9.0)

    MSB->>Task: Execute()
    Task->>CLI: dotnet --list-runtimes
    CLI-->>Task: list of runtimes
    Task->>RT: Inspect for Microsoft.NETCore.App 9.x
    alt .NET 9 found
        Task->>Task: Select path .../net9.0/refitter.dll
        Task-->>MSB: Log "Using .NET 9"
    else .NET 9 not found
        Task->>Task: Select path .../net8.0/refitter.dll
        Task-->>MSB: Log "Using .NET 8"
    end
    Task->>CLI: dotnet [args] <path to DLL> [...options]
    CLI->>DLL: Launch generator
    DLL-->>Task: Generate files
    Task-->>MSB: Return existing generated files
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Pre-merge checks (2 passed, 1 warning)

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title accurately and concisely summarizes the primary change — adding support for systems with only .NET 9.0 in Refitter.MSBuild via runtime detection and packaging — and is directly relevant to the changes in the changeset.

Poem

A hop, a skip, I sniff the runtime breeze,
net8.0 burrows, net9.0 in the trees.
I pack my tasks in versioned nests,
then build and run my fluffy tests.
With dotnet tracks and pawprint logs,
I ship my bits—swift rabbit jogs. 🐇✨

Tip

👮 Agentic pre-merge checks are now available in preview!

Pro plan users can now enable pre-merge checks in their settings to enforce checklists before merging PRs.

  • Built-in checks – Quickly apply ready-made checks to enforce title conventions, require pull request descriptions that follow templates, validate linked issues for compliance, and more.
  • Custom agentic checks – Define your own rules using CodeRabbit’s advanced agentic capabilities to enforce organization-specific policies and workflows. For example, you can instruct CodeRabbit’s agent to verify that API documentation is updated whenever API schema files are modified in a PR. Note: Upto 5 custom checks are currently allowed during the preview period. Pricing for this feature will be announced in a few weeks.

Please see the documentation for more information.

Example:

reviews:
  pre_merge_checks:
    custom_checks:
      - name: "Undocumented Breaking Changes"
        mode: "warning"
        instructions: |
          Pass/fail criteria: All breaking changes to public APIs, CLI flags, environment variables, configuration keys, database schemas, or HTTP/GraphQL endpoints must be documented in the "Breaking Change" section of the PR description and in CHANGELOG.md. Exclude purely internal or private changes (e.g., code not exported from package entry points or explicitly marked as internal).

Please share your feedback with us on this Discord post.

✨ Finishing touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch msbuild

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR adds support for systems running only .NET 9.0 (without .NET 8.0) in Refitter.MSBuild by implementing runtime detection and dynamic path resolution. The changes ensure the MSBuild task can use the appropriate .NET version of the CLI tool based on what's installed on the system.

  • Adds runtime detection logic to identify available .NET versions
  • Updates package structure to include both .NET 8.0 and 9.0 versions
  • Implements fallback logic prioritizing .NET 9.0 when available

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

File Description
src/Refitter.MSBuild/RefitterGenerateTask.cs Adds runtime detection and dynamic path resolution for .NET 8/9 CLI executables
src/Refitter.MSBuild/Refitter.MSBuild.csproj Updates package structure to include both .NET 8.0 and 9.0 binaries in separate folders
test/MSBuild/build.sh Adds test script for MSBuild integration testing

Comment on lines +81 to 85
var args = $"{refitterDll} --settings-file {file}";
if (DisableLogging)
{
TryLogError($"Refitter CLI not found at: {refitterDll}");
TryLogError($"Assembly location: {assembly.Location}");
TryLogError($"Package folder: {packageFolder}");
return new List<string>();
args += " --no-logging";
}

Copilot AI Sep 12, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code no longer validates if the refitterDll file exists before attempting to execute it. The original file existence check was removed but not replaced, which could lead to runtime errors when the selected .NET version's DLL is missing.

Copilot uses AI. Check for mistakes.
Comment on lines +115 to +133
private static List<string> GetInstalledDotnetRuntimes()
{
var installedRuntimes = new List<string>();
using (var process = new Process())
{
process.StartInfo.FileName = "dotnet";
process.StartInfo.Arguments = "--list-runtimes";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;

process.Start();
using (var reader = process.StandardOutput)
{
var output = reader.ReadToEnd();
installedRuntimes.AddRange(output?.Split([Environment.NewLine], StringSplitOptions.RemoveEmptyEntries));
}
process.WaitForExit();
}

Copilot AI Sep 12, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The method doesn't handle process execution failures or capture stderr output. If the 'dotnet' command fails or isn't found, the method will silently return an empty list, causing the runtime detection to fail without proper error reporting.

Suggested change
private static List<string> GetInstalledDotnetRuntimes()
{
var installedRuntimes = new List<string>();
using (var process = new Process())
{
process.StartInfo.FileName = "dotnet";
process.StartInfo.Arguments = "--list-runtimes";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.Start();
using (var reader = process.StandardOutput)
{
var output = reader.ReadToEnd();
installedRuntimes.AddRange(output?.Split([Environment.NewLine], StringSplitOptions.RemoveEmptyEntries));
}
process.WaitForExit();
}
private List<string> GetInstalledDotnetRuntimes()
{
var installedRuntimes = new List<string>();
try
{
using (var process = new Process())
{
process.StartInfo.FileName = "dotnet";
process.StartInfo.Arguments = "--list-runtimes";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.Start();
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
process.WaitForExit();
if (process.ExitCode != 0)
{
TryLogError($"Failed to execute 'dotnet --list-runtimes'. Exit code: {process.ExitCode}. Error: {error}");
return new List<string>();
}
if (!string.IsNullOrWhiteSpace(error))
{
TryLogError($"Error output from 'dotnet --list-runtimes': {error}");
}
installedRuntimes.AddRange(output?.Split([Environment.NewLine], StringSplitOptions.RemoveEmptyEntries));
}
}
catch (Exception ex)
{
TryLogError($"Exception while executing 'dotnet --list-runtimes': {ex.Message}");
return new List<string>();
}

Copilot uses AI. Check for mistakes.
using (var reader = process.StandardOutput)
{
var output = reader.ReadToEnd();
installedRuntimes.AddRange(output?.Split([Environment.NewLine], StringSplitOptions.RemoveEmptyEntries));

Copilot AI Sep 12, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The null-conditional operator on output is unnecessary since Split is called on a potentially null string. If output is null, this will throw a NullReferenceException. Should use output?.Split(...) ?? [] or check for null explicitly before splitting.

Suggested change
installedRuntimes.AddRange(output?.Split([Environment.NewLine], StringSplitOptions.RemoveEmptyEntries));
installedRuntimes.AddRange(output?.Split([Environment.NewLine], StringSplitOptions.RemoveEmptyEntries) ?? Array.Empty<string>());

Copilot uses AI. Check for mistakes.
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
1 Security Hotspot

See analysis details on SonarQube Cloud

@codecov

codecov Bot commented Sep 12, 2025

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.52%. Comparing base (b791fa9) to head (2d68dd3).
⚠️ Report is 5 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #746      +/-   ##
==========================================
+ Coverage   95.47%   98.52%   +3.05%     
==========================================
  Files          60       60              
  Lines        2982     2918      -64     
==========================================
+ Hits         2847     2875      +28     
+ Misses        102        4      -98     
- Partials       33       39       +6     
Flag Coverage Δ
unittests 98.52% <ø> (+3.05%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (2)
test/MSBuild/build.sh (1)

20-20: Consider capturing build output for debugging.

The verbose logging with -filelogger will create an msbuild.log file, but it's not mentioned or cleaned up.

Apply this diff to handle the log file:

 dotnet run -v d -filelogger
+
+# Display log file location for debugging
+if [ -f msbuild.log ]; then
+    echo "Build log saved to: $(pwd)/msbuild.log"
+fi
+
 dotnet remove package Refitter.MSBuild
 rm -f Refitter.MSBuild.*.nupkg
+rm -f msbuild.log  # Clean up log file
src/Refitter.MSBuild/RefitterGenerateTask.cs (1)

67-67: Typo in variable name: "seperator" should be "separator".

The variable name has a spelling error that appears multiple times in the code.

Apply this diff to fix the typo:

-        var seperator = Path.DirectorySeparatorChar;
-        var refitterDll = $"{packageFolder}{seperator}..{seperator}net8.0{seperator}refitter.dll";
+        var separator = Path.DirectorySeparatorChar;
+        var refitterDll = $"{packageFolder}{separator}..{separator}net8.0{separator}refitter.dll";

And update line 73 as well:

-            refitterDll = $"{packageFolder}{seperator}..{seperator}net9.0{seperator}refitter.dll";
+            refitterDll = $"{packageFolder}{separator}..{separator}net9.0{separator}refitter.dll";
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d231d5e and 2d68dd3.

📒 Files selected for processing (3)
  • src/Refitter.MSBuild/Refitter.MSBuild.csproj (1 hunks)
  • src/Refitter.MSBuild/RefitterGenerateTask.cs (2 hunks)
  • test/MSBuild/build.sh (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.cs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

**/*.cs: Follow existing C# coding conventions defined in .editorconfig
Use PascalCase for public members and camelCase for parameters and local variables
Use meaningful variable and method names
Keep methods focused with single responsibility

Files:

  • src/Refitter.MSBuild/RefitterGenerateTask.cs
src/{Refitter,Refitter.Core,Refitter.SourceGenerator,Refitter.MSBuild}/**/*.cs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Include XML documentation for public APIs

Files:

  • src/Refitter.MSBuild/RefitterGenerateTask.cs
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
PR: christianhelle/refitter#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-08-13T18:27:12.292Z
Learning: Before committing, run 'dotnet format src/Refitter.sln' and ensure 'dotnet format --verify-no-changes' passes
Learnt from: CR
PR: christianhelle/refitter#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-08-13T18:27:12.292Z
Learning: Install .NET 8.0 and 9.0 SDKs and ensure PATH is set as described before building or testing
📚 Learning: 2025-08-13T18:27:12.292Z
Learnt from: CR
PR: christianhelle/refitter#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-08-13T18:27:12.292Z
Learning: Applies to src/{Refitter,Refitter.Core,Refitter.SourceGenerator,Refitter.MSBuild}/**/*.cs : Include XML documentation for public APIs

Applied to files:

  • src/Refitter.MSBuild/Refitter.MSBuild.csproj
📚 Learning: 2025-08-13T18:27:12.292Z
Learnt from: CR
PR: christianhelle/refitter#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-08-13T18:27:12.292Z
Learning: Before committing, run 'dotnet format src/Refitter.sln' and ensure 'dotnet format --verify-no-changes' passes

Applied to files:

  • src/Refitter.MSBuild/Refitter.MSBuild.csproj
  • test/MSBuild/build.sh
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: 👌 Verify build
  • GitHub Check: 👌 Verify build
  • GitHub Check: script
  • GitHub Check: 👌 Verify build
  • GitHub Check: Analyze (csharp)
🔇 Additional comments (2)
src/Refitter.MSBuild/Refitter.MSBuild.csproj (1)

27-28: LGTM! The multi-runtime packaging structure aligns well with the runtime detection logic.

The separation of net8.0 and net9.0 content into versioned task folders enables the MSBuild task to select the appropriate runtime at execution time.

src/Refitter.MSBuild/RefitterGenerateTask.cs (1)

115-136: Add XML documentation for the new public method.

According to the coding guidelines, public APIs in this project should include XML documentation.

Apply this diff to add XML documentation:

+    /// <summary>
+    /// Gets the list of installed .NET runtimes by invoking 'dotnet --list-runtimes'.
+    /// </summary>
+    /// <returns>A list of installed runtime descriptions.</returns>
     private static List<string> GetInstalledDotnetRuntimes()

Actually, since this is a private method, XML documentation is not required. The method visibility is appropriate.

Comment on lines +63 to 79
var expectedFiles = GetExpectedGeneratedFiles(file);
var assembly = Assembly.GetExecutingAssembly();
var packageFolder = Path.GetDirectoryName(assembly.Location);
var seperator = Path.DirectorySeparatorChar;
var refitterDll = $"{packageFolder}{seperator}..{seperator}refitter.dll";
var refitterDll = $"{packageFolder}{seperator}..{seperator}net8.0{seperator}refitter.dll";

var args = $"{refitterDll} --settings-file {file}";
if (DisableLogging)
List<string> installedRuntimes = GetInstalledDotnetRuntimes();
if (installedRuntimes.Any(r => r.StartsWith("Microsoft.NETCore.App 9.")))
{
args += " --no-logging";
// Use .NET 9 version if available
refitterDll = $"{packageFolder}{seperator}..{seperator}net9.0{seperator}refitter.dll";
TryLogCommandLine("Detected .NET 9 runtime. Using .NET 9 version of Refitter.");
}
else
{
TryLogCommandLine("Using .NET 8 version of Refitter.");
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add fallback for when the dotnet command fails to detect runtimes.

The runtime detection could fail if the dotnet command is not available or returns an error. Consider adding error handling.

Apply this diff to add error handling:

         var refitterDll = $"{packageFolder}{seperator}..{seperator}net8.0{seperator}refitter.dll";
 
-        List<string> installedRuntimes = GetInstalledDotnetRuntimes();
-        if (installedRuntimes.Any(r => r.StartsWith("Microsoft.NETCore.App 9.")))
+        try
         {
-            // Use .NET 9 version if available
-            refitterDll = $"{packageFolder}{seperator}..{seperator}net9.0{seperator}refitter.dll";
-            TryLogCommandLine("Detected .NET 9 runtime. Using .NET 9 version of Refitter.");
+            List<string> installedRuntimes = GetInstalledDotnetRuntimes();
+            if (installedRuntimes.Any(r => r.StartsWith("Microsoft.NETCore.App 9.")))
+            {
+                // Use .NET 9 version if available
+                refitterDll = $"{packageFolder}{seperator}..{seperator}net9.0{seperator}refitter.dll";
+                TryLogCommandLine("Detected .NET 9 runtime. Using .NET 9 version of Refitter.");
+            }
+            else
+            {
+                TryLogCommandLine("Using .NET 8 version of Refitter.");
+            }
         }
-        else
+        catch (Exception ex)
         {
-            TryLogCommandLine("Using .NET 8 version of Refitter.");
+            TryLogCommandLine($"Failed to detect .NET runtimes: {ex.Message}. Defaulting to .NET 8 version.");
         }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
var expectedFiles = GetExpectedGeneratedFiles(file);
var assembly = Assembly.GetExecutingAssembly();
var packageFolder = Path.GetDirectoryName(assembly.Location);
var seperator = Path.DirectorySeparatorChar;
var refitterDll = $"{packageFolder}{seperator}..{seperator}refitter.dll";
var refitterDll = $"{packageFolder}{seperator}..{seperator}net8.0{seperator}refitter.dll";
var args = $"{refitterDll} --settings-file {file}";
if (DisableLogging)
List<string> installedRuntimes = GetInstalledDotnetRuntimes();
if (installedRuntimes.Any(r => r.StartsWith("Microsoft.NETCore.App 9.")))
{
args += " --no-logging";
// Use .NET 9 version if available
refitterDll = $"{packageFolder}{seperator}..{seperator}net9.0{seperator}refitter.dll";
TryLogCommandLine("Detected .NET 9 runtime. Using .NET 9 version of Refitter.");
}
else
{
TryLogCommandLine("Using .NET 8 version of Refitter.");
}
var expectedFiles = GetExpectedGeneratedFiles(file);
var assembly = Assembly.GetExecutingAssembly();
var packageFolder = Path.GetDirectoryName(assembly.Location);
var seperator = Path.DirectorySeparatorChar;
var refitterDll = $"{packageFolder}{seperator}..{seperator}net8.0{seperator}refitter.dll";
try
{
List<string> installedRuntimes = GetInstalledDotnetRuntimes();
if (installedRuntimes.Any(r => r.StartsWith("Microsoft.NETCore.App 9.")))
{
// Use .NET 9 version if available
refitterDll = $"{packageFolder}{seperator}..{seperator}net9.0{seperator}refitter.dll";
TryLogCommandLine("Detected .NET 9 runtime. Using .NET 9 version of Refitter.");
}
else
{
TryLogCommandLine("Using .NET 8 version of Refitter.");
}
}
catch (Exception ex)
{
TryLogCommandLine($"Failed to detect .NET runtimes: {ex.Message}. Defaulting to .NET 8 version.");
}
🤖 Prompt for AI Agents
In src/Refitter.MSBuild/RefitterGenerateTask.cs around lines 63 to 79, the code
assumes GetInstalledDotnetRuntimes() always succeeds and will throw or return
nothing if the dotnet command is missing; wrap the call in a try/catch (or
otherwise detect failures) so exceptions are caught and logged via
TryLogCommandLine/TryLogError, treat failures as “unknown” and fall back to
using the .NET 8 refitter.dll path, and ensure you also handle an empty list
case by falling back to .NET 8 and logging a warning that runtime detection
failed so the build continues with the safe default.

Comment on lines +81 to 85
var args = $"{refitterDll} --settings-file {file}";
if (DisableLogging)
{
TryLogError($"Refitter CLI not found at: {refitterDll}");
TryLogError($"Assembly location: {assembly.Location}");
TryLogError($"Package folder: {packageFolder}");
return new List<string>();
args += " --no-logging";
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Verify that the refitter.dll exists before attempting to execute.

The previous version had a check to ensure the refitter.dll file exists. Without this check, the error message might be less clear if the file is missing.

Let me verify if there's any validation elsewhere in the codebase:


🏁 Script executed:

#!/bin/bash
# Check if there's any file existence validation for refitter.dll
rg -n "File\.Exists.*refitter" --type cs
rg -n "refitter\.dll" --type cs -C3

Length of output: 1327


Add a File.Exists guard for refitter.dll before executing.

No existence check was found in src/Refitter.MSBuild/RefitterGenerateTask.cs — refitterDll is built around line ~67 and args are assembled at lines 81–85; add a guard like if (!File.Exists(refitterDll)) { Log.LogError($"Refitter not found at '{refitterDll}'"); return false; } so failures are clear.

🤖 Prompt for AI Agents
In src/Refitter.MSBuild/RefitterGenerateTask.cs around lines 81–85 (refitterDll
is constructed near line ~67), add a File.Exists check for refitterDll before
assembling or executing the args; if the file does not exist call Log.LogError
with a clear message including the refitterDll path and return false to abort
the task so failures are explicit and surfaced.

using (var reader = process.StandardOutput)
{
var output = reader.ReadToEnd();
installedRuntimes.AddRange(output?.Split([Environment.NewLine], StringSplitOptions.RemoveEmptyEntries));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Potential NullReferenceException when splitting output.

The null-conditional operator ?. is used with Split, but the result is then passed to AddRange which doesn't handle null gracefully.

Apply this diff to handle potential null output:

-                installedRuntimes.AddRange(output?.Split([Environment.NewLine], StringSplitOptions.RemoveEmptyEntries));
+                if (!string.IsNullOrEmpty(output))
+                {
+                    installedRuntimes.AddRange(output.Split([Environment.NewLine], StringSplitOptions.RemoveEmptyEntries));
+                }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
installedRuntimes.AddRange(output?.Split([Environment.NewLine], StringSplitOptions.RemoveEmptyEntries));
if (!string.IsNullOrEmpty(output))
{
installedRuntimes.AddRange(output.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries));
}
🤖 Prompt for AI Agents
In src/Refitter.MSBuild/RefitterGenerateTask.cs around line 130, the code calls
AddRange(output?.Split([Environment.NewLine],
StringSplitOptions.RemoveEmptyEntries)) which can pass null to AddRange if
output is null; change it so AddRange receives a non-null sequence (for example
use the null-coalescing operator to supply Array.Empty<string>() or an empty
enumerable when output is null) so AddRange is never called with a null
argument.

Comment thread test/MSBuild/build.sh
Comment on lines +1 to +22
#!/bin/bash

rm -rf bin
rm -rf obj
dotnet build-server shutdown
dotnet nuget locals global-packages --clear
rm -f Refitter.MSBuild.*.nupkg
rm -f Petstore.cs
dotnet restore ../../src/Refitter.sln
dotnet clean -c release ../../src/Refitter.sln
dotnet build -c release ../../src/Refitter/Refitter.csproj
dotnet build -c release ../../src/Refitter.MSBuild/Refitter.MSBuild.csproj
dotnet pack -c release ../../src/Refitter.MSBuild/Refitter.MSBuild.csproj -o .

# Find the nupkg file and add it as a package
find . -name "Refitter.MSBuild.*.nupkg" -exec dotnet add package {} --source . \;

dotnet restore
dotnet add package Refitter.MSBuild --source .
dotnet run -v d -filelogger
dotnet remove package Refitter.MSBuild
rm -f Refitter.MSBuild.*.nupkg No newline at end of file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add error handling and make the script more robust.

The script lacks error handling which could lead to silent failures or incomplete cleanup. Consider adding set -e to exit on errors and trap cleanup operations.

Apply this diff to add error handling:

 #!/bin/bash
+set -e  # Exit on error
+
+# Trap to ensure cleanup even on failure
+trap 'echo "Build failed. Cleaning up..."; rm -f Refitter.MSBuild.*.nupkg' ERR
 
 rm -rf bin
 rm -rf obj

Also consider checking if required tools are available:

# Check required tools
for cmd in dotnet find; do
    if ! command -v $cmd &> /dev/null; then
        echo "Error: $cmd is not installed"
        exit 1
    fi
done
🤖 Prompt for AI Agents
In test/MSBuild/build.sh around lines 1 to 22, the script lacks error handling
and checks for required commands; update it to fail fast and perform guaranteed
cleanup by adding "set -euo pipefail" (or at least "set -e"), add a trap to run
cleanup on EXIT (removing temporary files and shutting down build server), and
explicitly verify required tools (dotnet and find) are available before
proceeding, printing a clear error and exiting if missing; also ensure each
critical command is allowed to fail the script (no silent ignores) and log
failures with descriptive messages so failures are visible.

Comment thread test/MSBuild/build.sh
dotnet pack -c release ../../src/Refitter.MSBuild/Refitter.MSBuild.csproj -o .

# Find the nupkg file and add it as a package
find . -name "Refitter.MSBuild.*.nupkg" -exec dotnet add package {} --source . \;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

The find command may fail if no .nupkg files exist.

The find command with -exec will fail if no matching files are found, which could happen on first run or after cleanup.

Apply this diff to handle the case when no packages are found:

 # Find the nupkg file and add it as a package
-find . -name "Refitter.MSBuild.*.nupkg" -exec dotnet add package {} --source . \;
+NUPKG_FILES=$(find . -name "Refitter.MSBuild.*.nupkg" 2>/dev/null || true)
+if [ -n "$NUPKG_FILES" ]; then
+    echo "$NUPKG_FILES" | xargs -I {} dotnet add package {} --source .
+else
+    echo "Error: No .nupkg files found after packing"
+    exit 1
+fi
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
find . -name "Refitter.MSBuild.*.nupkg" -exec dotnet add package {} --source . \;
# Find the nupkg file and add it as a package
NUPKG_FILES=$(find . -name "Refitter.MSBuild.*.nupkg" 2>/dev/null || true)
if [ -n "$NUPKG_FILES" ]; then
echo "$NUPKG_FILES" | xargs -I {} dotnet add package {} --source .
else
echo "Error: No .nupkg files found after packing"
exit 1
fi
🤖 Prompt for AI Agents
In test/MSBuild/build.sh around line 16 the find command uses -exec which causes
the script to exit/fail when no Refitter.MSBuild.*.nupkg files exist; replace
that single-line command with a safe variant that does nothing when there are no
matches (for example use find ... -print0 piped to xargs -0 with the GNU xargs
-r/--no-run-if-empty option, or use find -exec sh -c 'dotnet add package "$1"
--source .' _ {} \; wrapped to ignore missing results) so the script continues
without error when no .nupkg files are found.

@christianhelle
christianhelle merged commit 0b9fb99 into main Sep 12, 2025
11 of 12 checks passed
@christianhelle
christianhelle deleted the msbuild branch September 12, 2025 14:33
hwinther pushed a commit to hwinther/test that referenced this pull request Dec 4, 2025
Updated [refitter](https://github.com/christianhelle/refitter) from
1.4.0 to 1.7.0.

<details>
<summary>Release notes</summary>

_Sourced from [refitter's
releases](https://github.com/christianhelle/refitter/releases)._

## 1.7.0

## What's Changed
* Fix Multipart file array support by @​christianhelle in
christianhelle/refitter#784
* Add option to remove
`[JsonConverter(typeof(JsonStringEnumConverter))]` from generated
contracts by @​christianhelle in
christianhelle/refitter#786
* Improve OpenAPI Description handling by @​christianhelle in
christianhelle/refitter#787
* Update Smoke Tests workflow trigger by @​christianhelle in
christianhelle/refitter#791
* Add support for customizing the default Integer format by
@​christianhelle in christianhelle/refitter#792
* NSwag v14.6.2 by @​christianhelle in
christianhelle/refitter#800

## New Contributors:
- @​christophdebaene 
- @​7amou3 
- @​HGCollier

**Full Changelog**:
christianhelle/refitter@1.6.5...1.7.0

## 1.6.5

## What's Changed
* Do not remove colon from url paths, verify they're not present in
operation names by @​eoma-knowit in
christianhelle/refitter#765
* Add ability to skip-validation + simplify Unicode logging by
@​david-pw in christianhelle/refitter#767
* Use NSwag's built-in System.Text.Json polymorphic serialization by
@​0xced in christianhelle/refitter#772

## New Contributors
* @​eoma-knowit made their first contribution in
christianhelle/refitter#765
* @​david-pw made their first contribution in
christianhelle/refitter#767
* @​0xced made their first contribution in
christianhelle/refitter#772

**Full Changelog**:
christianhelle/refitter@1.6.4...1.6.5

## 1.6.4

## What's Changed
* Fix SonarCloud maintainability issues - eliminate code duplication and
improve code quality in
christianhelle/refitter#753
* Update --operation-name-template implementation to replace all
{operationName} instances with Execute by @​christianhelle in
christianhelle/refitter#759


**Full Changelog**:
christianhelle/refitter@1.6.3...1.6.4

## 1.6.3

## What's Changed
* Fix MSBuild task so that the generated code is included in the
compilation by @​christianhelle in
christianhelle/refitter#745
* Add support for systems running only .NET 9.0 (without .NET 8.0) in
Refitter.MSBuild by @​christianhelle in
christianhelle/refitter#746
* Introduce --simple-output CLI argument by @​christianhelle in
christianhelle/refitter#751


**Full Changelog**:
christianhelle/refitter@1.6.2...1.6.3

## 1.6.2

## What's Changed
* docs: add @​SWarnberg as a contributor for bug by
@​allcontributors[bot] in
christianhelle/refitter#714
* docs: add @​lilinus as a contributor for bug by @​allcontributors[bot]
in christianhelle/refitter#717
* Fix missing namespace import by @​christianhelle in
christianhelle/refitter#718
* Fix match path on cmd prompt by @​christianhelle in
christianhelle/refitter#719
* Fix table alignments in CLI Output by @​christianhelle in
christianhelle/refitter#720
* NSwag v14.5.0 by @​renovate[bot] in
christianhelle/refitter#722
* Add comprehensive GitHub Copilot instructions for Refitter repository
by @​Copilot in christianhelle/refitter#725
* Bump actions/checkout from 4 to 5 by @​dependabot[bot] in
christianhelle/refitter#727
* chore(deps): update dependency polly to 8.6.2 by @​renovate[bot] in
christianhelle/refitter#716
* chore(deps): update dependency microsoft.extensions.http.resilience to
9.8.0 by @​renovate[bot] in
christianhelle/refitter#728
* ASCII Art Title by @​christianhelle in
christianhelle/refitter#729


**Full Changelog**:
christianhelle/refitter@1.6.1...1.6.2

## 1.6.1

## What's Changed
* Update dependency Refitter.SourceGenerator to 1.6.0 by @​renovate in
christianhelle/refitter#704
* Add console output screenshots to documentation by @​christianhelle in
christianhelle/refitter#705
* docs: add @​sb-chericks as a contributor for ideas, and bug by
@​allcontributors in christianhelle/refitter#707
* chore(deps): update dependency xunit.runner.visualstudio to 3.1.1 by
@​renovate in christianhelle/refitter#708
* Ensure that Refit interfaces have a XML docs by @​christianhelle in
christianhelle/refitter#709

**Full Changelog**:
christianhelle/refitter@1.6.0...1.6.1

## 1.6.0

**Implemented enhancements:**

- fix missing schema for dictionary keys
[\#​697](christianhelle/refitter#697) @​kirides
- Fancy CLI output using Spectre Console
[\#​695](christianhelle/refitter#695)
@​christianhelle

**Fixed bugs:**

- \[Bug\] Refitter generates invalid \[Range\] attribute for decimal
properties starting from v1.5.2
[\#​668](christianhelle/refitter#668)
@​tommieemeli
- Generates Content-Type: multipart/form-data Header which breaks
Multipart uploads
[\#​654](christianhelle/refitter#654) @​dbhjoh
@​jaroslaw-dutka

**Closed issues:**

- Improve documentation
[\#​700](christianhelle/refitter#700)

**Merged pull requests:**

- Update dependency Polly to 8.6.1
[\#​703](christianhelle/refitter#703)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Swashbuckle.AspNetCore to v9
[\#​702](christianhelle/refitter#702)
([renovate[bot]](https://github.com/apps/renovate))
- Fix typos and grammar issues in documentation
[\#​701](christianhelle/refitter#701)
([Copilot](https://github.com/apps/copilot-swe-agent))
- Update dotnet monorepo
[\#​699](christianhelle/refitter#699)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Polly to 8.6.0
[\#​698](christianhelle/refitter#698)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Refitter.SourceGenerator to 1.5.6
[\#​696](christianhelle/refitter#696)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Microsoft.NET.Test.Sdk to 17.14.1
[\#​692](christianhelle/refitter#692)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Swashbuckle.AspNetCore to 8.1.4
[\#​691](christianhelle/refitter#691)
([renovate[bot]](https://github.com/apps/renovate))


See [Full
Changelog](christianhelle/refitter@1.5.6...1.6.0)

## 1.5.6

## What's Changed
* Use fully qualified type name in Class template by @​velvolue in
christianhelle/refitter#686
* Add .NET 9.0 to Target Frameworks by @​christianhelle in
christianhelle/refitter#690
* Do not add both [Multipart] and "Content-Type: multipart/form-data" by
@​jaroslaw-dutka in christianhelle/refitter#693

## Merged pull requests
* chore(deps): update dependency refitter.sourcegenerator to 1.5.5 by
@​renovate in christianhelle/refitter#671
* docs: add MrScottyTay as a contributor for bug by @​allcontributors in
christianhelle/refitter#673
* chore(deps): update dotnet monorepo by @​renovate in
christianhelle/refitter#674
* chore(deps): update dependency microsoft.build.utilities.core to
17.14.7 by @​renovate in
christianhelle/refitter#675
* chore(deps): update dependency microsoft.build.utilities.core to
17.14.8 by @​renovate in
christianhelle/refitter#676
* chore(deps): update dependency microsoft.net.test.sdk to 17.14.0 by
@​renovate in christianhelle/refitter#680
* Add Contribution Guidelines by @​copilot-swe-agent in
christianhelle/refitter#679
* chore(deps): update dependency swashbuckle.aspnetcore to 8.1.2 by
@​renovate in christianhelle/refitter#682
* docs: add velvolue as a contributor for bug by @​allcontributors in
christianhelle/refitter#687
* Use fully qualified type name in Class template by @​velvolue in
christianhelle/refitter#686
* Resolve build warnings and add TreatWarningsAsErrors by
@​copilot-swe-agent in
christianhelle/refitter#689
* Add .NET 9.0 to Target Frameworks by @​christianhelle in
christianhelle/refitter#690
* Do not add both [Multipart] and "Content-Type: multipart/form-data" by
@​jaroslaw-dutka in christianhelle/refitter#693

**Full Changelog**:
christianhelle/refitter@1.5.5...1.5.6

## 1.5.5

## What's Changed

- Using CollectionFormats other than Multi
[\#​640](christianhelle/refitter#640)
(@​ebarnard)
- Add collection format option to CLI tool documentation
[\#​664](christianhelle/refitter#664)
(@​christianhelle)
- Made Security Header Parameters safe for C\# when unsafe characters
are present
[\#​663](christianhelle/refitter#663)
(@​AragornHL)

## Merged pull requests:

- chore\(deps\): update dependency xunit.runner.visualstudio to 3.1.0
[\#​670](christianhelle/refitter#670)
([renovate[bot]](https://github.com/apps/renovate))
- docs: add tommieemeli as a contributor for bug
[\#​669](christianhelle/refitter#669)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- Update nswag monorepo to 14.4.0
[\#​665](christianhelle/refitter#665)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency refitter.sourcegenerator to 1.5.4
[\#​662](christianhelle/refitter#662)
([renovate[bot]](https://github.com/apps/renovate))

**Full Changelog**:
christianhelle/refitter@1.5.4...1.5.5

## 1.5.4

## What's Changed

- Adding security schemes to the api interface generator
[\#​106](christianhelle/refitter#106)
- Response type handling to only use 2XX range
[\#​661](christianhelle/refitter#661)
([christianhelle](https://github.com/christianhelle))
- Add support for 2XX and Default Response Objects
[\#​660](christianhelle/refitter#660)
([christianhelle](https://github.com/christianhelle))
- Add Header Parameters for Security Schemes
[\#​653](christianhelle/refitter#653)
([AragornHL](https://github.com/AragornHL))

## Merged Pull Requests:
* chore(deps): update dependency refitter.sourcegenerator to 1.5.3 by
@​renovate in christianhelle/refitter#645
* chore(deps): update dependency swashbuckle.aspnetcore to 8.1.0 by
@​renovate in christianhelle/refitter#646
* chore(deps): update dependency exceptionless to 6.1.0 by @​renovate in
christianhelle/refitter#647
* chore(deps): update dependency spectre.console.cli to 0.50.0 by
@​renovate in christianhelle/refitter#649
* chore(deps): update dotnet monorepo to 9.0.4 by @​renovate in
christianhelle/refitter#648
* chore(deps): update dependency microsoft.extensions.http.resilience to
9.4.0 by @​renovate in
christianhelle/refitter#650
* chore(deps): update dependency swashbuckle.aspnetcore to 8.1.1 by
@​renovate in christianhelle/refitter#651
* Add Header Parameters for Security Schemes by @​AragornHL in
christianhelle/refitter#653
* docs: add @​AragornHL as a contributor for code by @​allcontributors
in christianhelle/refitter#655
* docs: add @​kmfd3s as a contributor for code by @​allcontributors in
christianhelle/refitter#656
* Update smoke tests to generate authentication headers by
@​christianhelle in christianhelle/refitter#657
* docs: add @​pfeigl as a contributor for bug by @​allcontributors in
christianhelle/refitter#659
* Add support for 2XX and Default Response Objects by @​christianhelle
in christianhelle/refitter#660
* Response type handling to only use 2XX range by @​christianhelle in
christianhelle/refitter#661

## New Contributors
* @​AragornHL made their first contribution in
christianhelle/refitter#653

**Full Changelog**:
christianhelle/refitter@1.5.3...1.5.4

## 1.5.3

**Implemented enhancements:**

- Naming properties problem
[\#​641](christianhelle/refitter#641)
- Allow comments in .refitter Configuration
[\#​631](christianhelle/refitter#631)
- NSwag v14.3.0
[\#​644](christianhelle/refitter#644)
([renovate[bot]](https://github.com/apps/renovate))
- Convert properties with underscores to PascalCase
[\#​643](christianhelle/refitter#643)
([christianhelle](https://github.com/christianhelle))
- Add support for deserializing JSON with comments and update tests
[\#​637](christianhelle/refitter#637)
([sebastian-wachsmuth](https://github.com/sebastian-wachsmuth))
- Temporary fix for Source Generator when running in Visual Studio
[\#​634](christianhelle/refitter#634)
([christianhelle](https://github.com/christianhelle))
- JSON Schema generator for documentation
[\#​623](christianhelle/refitter#623)
([christianhelle](https://github.com/christianhelle))
- Fix missing Content-Type \[Headers\]
[\#​619](christianhelle/refitter#619)
([christianhelle](https://github.com/christianhelle))
- Fix invalid characters in generated XML docs
[\#​607](christianhelle/refitter#607)
([christianhelle](https://github.com/christianhelle))
- Add support for custom DateTimeFormat
[\#​604](christianhelle/refitter#604)
([christianhelle](https://github.com/christianhelle))
- Fix ISO date format handling when dateFormat is defined in settings
file [\#​603](christianhelle/refitter#603)
([christianhelle](https://github.com/christianhelle))

**Fixed bugs:**

- Doesn't add Content-Type request header when body is plain JSON string
[\#​617](christianhelle/refitter#617)
- Broken xml doc when swagger descriptions contains "\<" or "\>"
characters
[\#​605](christianhelle/refitter#605)
- date-time parameters are encoded as date when iso8601 is used
[\#​599](christianhelle/refitter#599)

**Closed issues:**

- OpenAPI Schema and Authorization Attributes
[\#​629](christianhelle/refitter#629)

**Merged pull requests:**

- docs: add @​lowern1ght as a contributor for bug
[\#​642](christianhelle/refitter#642)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add @​qrzychu as a contributor for bug
[\#​639](christianhelle/refitter#639)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add @​sebastian-wachsmuth as a contributor for code
[\#​638](christianhelle/refitter#638)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- Update dependency Swashbuckle.AspNetCore to v8
[\#​633](christianhelle/refitter#633)
([renovate[bot]](https://github.com/apps/renovate))
- Update dotnet monorepo
[\#​630](christianhelle/refitter#630)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Atc.Test to 1.1.18
[\#​628](christianhelle/refitter#628)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Swashbuckle.AspNetCore to 7.3.1
[\#​626](christianhelle/refitter#626)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Swashbuckle.AspNetCore to 7.3.0
[\#​624](christianhelle/refitter#624)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency fluentassertions to 7.2.0
[\#​622](christianhelle/refitter#622)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency apizr.integrations.fusillade to 6.4.2
[\#​621](christianhelle/refitter#621)
([renovate[bot]](https://github.com/apps/renovate))
- docs: add @​Metziell as a contributor for bug
[\#​620](christianhelle/refitter#620)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add @​Fargekritt as a contributor for bug
[\#​618](christianhelle/refitter#618)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- chore\(deps\): update dependency apizr.integrations.automapper to
6.4.2 [\#​616](christianhelle/refitter#616)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency apizr.extensions.microsoft.caching to
6.4.2 [\#​615](christianhelle/refitter#615)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency
microsoft.applicationinsights.windowsserver to 2.23.0
[\#​614](christianhelle/refitter#614)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency microsoft.build.utilities.core to
17.13.9 [\#​612](christianhelle/refitter#612)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dotnet monorepo
[\#​611](christianhelle/refitter#611)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency microsoft.net.test.sdk to 17.13.0
[\#​610](christianhelle/refitter#610)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency xunit.runner.visualstudio to 3.0.2
[\#​609](christianhelle/refitter#609)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency polly to 8.5.2
[\#​608](christianhelle/refitter#608)
([renovate[bot]](https://github.com/apps/renovate))
- docs: add @​wocasella as a contributor for bug
[\#​606](christianhelle/refitter#606)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- chore\(deps\): update dependency refitter.sourcegenerator to 1.5.2
[\#​602](christianhelle/refitter#602)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency atc.test to 1.1.17
[\#​592](christianhelle/refitter#592)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency h.generators.extensions to 1.24.2
[\#​581](christianhelle/refitter#581)
([renovate[bot]](https://github.com/apps/renovate))
 ... (truncated)

## 1.5.2

## Implemented enhancements:

- Fix date formatting for date-time types
christianhelle/refitter#600
- Proper support for multipart form
christianhelle/refitter#595

## Fixed bugs:

- date-time parameters are encoded as date when iso8601 is used
christianhelle/refitter#599
- \[FromForm\] parameter on minimal api doesn't get generated on
Interface christianhelle/refitter#515

## Merged pull requests:
* chore(deps): update dependency coverlet.collector to 6.0.4 by
@​renovate in christianhelle/refitter#594
* Proper support for multipart form by @​jaroslaw-dutka in
christianhelle/refitter#595
* docs: add jaroslaw-dutka as a contributor for code by
@​allcontributors in christianhelle/refitter#596
* chore(deps): update dependency refitter.sourcegenerator to 1.5.0 by
@​renovate in christianhelle/refitter#593
* Remove dependency on System.Text.Json by @​christianhelle in
christianhelle/refitter#597
* chore(deps): update dependency refitter.sourcegenerator to 1.5.1 by
@​renovate in christianhelle/refitter#598
* docs: add maksionkin as a contributor for bug by @​allcontributors in
christianhelle/refitter#601
* Fix date formatting for date-time types by @​christianhelle in
christianhelle/refitter#600

## New Contributors
* @​jaroslaw-dutka made their first contribution in
christianhelle/refitter#595
* @​maksionkin reported their first issue in
christianhelle/refitter#599

**Full Changelog**:
christianhelle/refitter@1.5.0...1.5.2

## 1.5.0

## Implemented enhancements:

- Fix incorrect error message shown due to Spectre.Console parsing
[\#​585](christianhelle/refitter#585)
([christianhelle](https://github.com/christianhelle))
- Return null when object subtype is not found
[\#​577](christianhelle/refitter#577)
([velvolue](https://github.com/velvolue))
- Discard unused union types/inheritance types via config
[\#​575](christianhelle/refitter#575)
([kirides](https://github.com/kirides))
- Show Deserializaton Errors from Source Generator
[\#​572](christianhelle/refitter#572)
([christianhelle](https://github.com/christianhelle))
- Limit Exceptionless telemetry
[\#​564](christianhelle/refitter#564)
([christianhelle](https://github.com/christianhelle))
- Added simple logic to make most identifier strings valid
[\#​562](christianhelle/refitter#562)
([Fargekritt](https://github.com/Fargekritt))
- Fix -v|--version CLI tool argument
[\#​561](christianhelle/refitter#561)
([christianhelle](https://github.com/christianhelle))
- Less strict OpenAPI Validation rules
[\#​558](christianhelle/refitter#558)
([christianhelle](https://github.com/christianhelle))
- Added support for custom date format
[\#​554](christianhelle/refitter#554)
([Fargekritt](https://github.com/Fargekritt))
- Add support for disabling telemetry in MSBuild task
[\#​550](christianhelle/refitter#550)
([christianhelle](https://github.com/christianhelle))
- MSBuild Custom Task
[\#​548](christianhelle/refitter#548)
([christianhelle](https://github.com/christianhelle))
- Generate IDisposable Refit Interfaces
[\#​543](christianhelle/refitter#543)
([christianhelle](https://github.com/christianhelle))
- Clients implementing IDisposable interface
[\#​541](christianhelle/refitter#541)
([shubinp](https://github.com/shubinp))
- \[Apizr\] Deprecated Optional package removed from code & doc
[\#​539](christianhelle/refitter#539)
([JeremyBP](https://github.com/JeremyBP))
- Add PropertyNameGenerator as an optional Parameter
[\#​516](christianhelle/refitter#516)
- NSwag v14.2.0
[\#​532](christianhelle/refitter#532)
([renovate[bot]](https://github.com/apps/renovate))
- added options for a custom Name Generators
[\#​517](christianhelle/refitter#517)
([fsamiec](https://github.com/fsamiec))

## Fixed bugs:

- "Error: Could not find color or style 'System.String'."
[\#​583](christianhelle/refitter#583)
- Source generator errors are hidden
[\#​568](christianhelle/refitter#568)
- Refitter -v not showing version number
[\#​560](christianhelle/refitter#560)
- Not so nice behavior when generating client with trim-unused-schema
[\#​557](christianhelle/refitter#557)
- Two almost identical routes that fail at validation.
[\#​551](christianhelle/refitter#551)
- Code Generator creates unsafe interface method names
[\#​360](christianhelle/refitter#360)

## Closed issues:

- How to use in class library?
[\#​534](christianhelle/refitter#534)
- \[ISSUE\]\[1.2.1-preview.54\] Some impediments using CLI version. Is
not enough for my needs?
[\#​450](christianhelle/refitter#450)

## Merged Pull Requests
* chore(deps): update dependency refitter.sourcegenerator to 1.4.0 by
@​renovate in christianhelle/refitter#513
* chore(deps): update dependency swashbuckle.aspnetcore to 6.9.0 by
@​renovate in christianhelle/refitter#514
* added options for a custom Name Generators by @​fsamiec in
christianhelle/refitter#517
* docs: add fsamiec as a contributor for code by @​allcontributors in
christianhelle/refitter#518
* chore(deps): update refit monorepo to v8 (major) by @​renovate in
christianhelle/refitter#519
* docs: add fabioloreggian as a contributor for bug by @​allcontributors
in christianhelle/refitter#521
* chore(deps): update dependency fluentassertions to 6.12.2 by
@​renovate in christianhelle/refitter#523
* chore(deps): update dependency polly to 8.5.0 by @​renovate in
christianhelle/refitter#525
* chore(deps): update dependency swashbuckle.aspnetcore to v7 by
@​renovate in christianhelle/refitter#526
* chore(deps): update dependency h.generators.extensions to 1.24.0 by
@​renovate in christianhelle/refitter#528
* chore(deps): update dotnet monorepo to v9 (major) by @​renovate in
christianhelle/refitter#527
* NSwag v14.2.0 by @​renovate in
christianhelle/refitter#532
* chore(deps): update dependency microsoft.net.test.sdk to 17.12.0 by
@​renovate in christianhelle/refitter#531
* chore(deps): update dependency refitter.sourcegenerator to 1.4.1 by
@​renovate in christianhelle/refitter#533
* docs: add geometrikal as a contributor for bug by @​allcontributors in
christianhelle/refitter#535
 ... (truncated)

Commits viewable in [compare
view](christianhelle/refitter@1.4.0...1.7.0).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=refitter&package-manager=nuget&previous-version=1.4.0&new-version=1.7.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature, bug fix, or request .NET Pull requests that contain changes to .NET code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants