Skip to content

Support C# format strings in config #4605

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

9swampy
Copy link
Contributor

@9swampy 9swampy commented Jun 28, 2025

Description

Support C# format strings in config

Related Issue

Fixes #4156

Motivation and Context

#4156

How Has This Been Tested?

I've implemented a number of formatters and added scenario coverage for implementation but a 4-eyes verification and feedback on appropriateness of scenarios included (or not) would be welcome. The specific scenrio noted on the wish-issue tested here and here.

I've an aversion to Helper classes but that's where I've dropped all this as an extension of the original StringFormatWith but please redirect if it should live elsewhere (or just needs some structure).

Screenshots (if appropriate):

image

Checklist:

  • My code follows the code style of this project.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have added tests to cover my changes.
  • All new and existing tests passed.

@9swampy 9swampy marked this pull request as ready for review June 28, 2025 17:15
@9swampy 9swampy force-pushed the SupportFormatStringsInConfig branch 7 times, most recently from f192c56 to 92fa63f Compare June 28, 2025 22:21
@arturcic arturcic self-requested a review June 29, 2025 09:27
@arturcic
Copy link
Member

please rebase and resolve the conflicts

@9swampy 9swampy force-pushed the SupportFormatStringsInConfig branch from 92fa63f to 9a18634 Compare June 29, 2025 11:21
@9swampy 9swampy force-pushed the SupportFormatStringsInConfig branch from 9a18634 to e7652ec Compare July 7, 2025 00:39
@9swampy 9swampy force-pushed the SupportFormatStringsInConfig branch from e7652ec to 16f557c Compare July 9, 2025 20:40
Copy link
Member

@asbjornu asbjornu left a comment

Choose a reason for hiding this comment

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

Awesome work! ❤️

Comment on lines 20 to 25
if (value is string dateStr && DateTime.TryParse(dateStr, out var parsedDate) && format.StartsWith("date:"))
{
var dateFormat = format.Substring(5);
result = parsedDate.ToString(dateFormat, CultureInfo.InvariantCulture);
return true;
}
Copy link
Member

Choose a reason for hiding this comment

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

Couldn't we just always TryParse strings to DateTime? If it's successful, it's a date that can be formatted directly by the format string, removing the need for the date: prefix, no?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Adding a "date:" prefix to the format string has design advantages rather than technical necessity. It allows for format disambiguation, extensibility, and robustness in multi-formatter scenarios.
If you have multiple formatters (e.g., DateFormatter, NumericFormatter), they may all receive the same input format string (like "yyyy-MM-dd"). Without the "date:" prefix, each formatter has to guess whether the format is relevant.
With and the formatter can early-return if the format doesn’t match their expected prefix.

Absolutely, if you prefer without confirm and I'll make it so.

Copy link
Member

Choose a reason for hiding this comment

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

I see the dilemma. It would be beneficial to examine the scenarios that may lead to ambiguity and explore how we can best mitigate them.

Comment on lines 40 to 42
format.Equals("C", StringComparison.OrdinalIgnoreCase) ||
format.Equals("P", StringComparison.OrdinalIgnoreCase) ||
format.StartsWith("N", StringComparison.OrdinalIgnoreCase);
Copy link
Member

Choose a reason for hiding this comment

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

Why are these format strings blocked?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I'd thought they'd create formatted strings with undesirable characters; comma, $, £, %. Opinion; happy to take a steer.

Copy link
Member

Choose a reason for hiding this comment

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

Why would they be undesirable?

@@ -0,0 +1,31 @@
using System.Globalization;

namespace GitVersion.Helpers;
Copy link
Member

Choose a reason for hiding this comment

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

I'm not a huge fan of the Helpers namespace. Can we please put all of this into a more descriptive GitVersion.Formatting (or similar) namespace instead?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I've an aversion to Helper classes but that's where I've dropped all this as an extension of the original StringFormatWith but please redirect if it should live elsewhere (or just needs some structure).

I'll move to GitVersion.Formatting as suggested.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Moved formatters and their tests. Let me know if more should move; those left are coupled more closely with the extension entrypoint.

using System.Text.RegularExpressions;
using GitVersion.Core;
using GitVersion.Formatting;
Copy link
Contributor Author

@9swampy 9swampy Jul 15, 2025

Choose a reason for hiding this comment

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

The type or namespace name 'Formatting' does not exist in the namespace 'GitVersion' (are you missing an assembly reference?)

Unclear what's gone wrong here. Clearly that's what the PR introduces and VS is happy. Is there something in the pipeline to prevent unapproved namespace additions?

Copy link
Member

Choose a reason for hiding this comment

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

Weird. Not that I know of. @arturcic, do you have an idea?

@9swampy 9swampy requested a review from asbjornu July 15, 2025 18:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Support C# format strings in config
3 participants