Skip to content

Upgrade to .NET 10#144

Open
HowardvanRooijen wants to merge 91 commits into
mainfrom
feature/dotnet-10-update
Open

Upgrade to .NET 10#144
HowardvanRooijen wants to merge 91 commits into
mainfrom
feature/dotnet-10-update

Conversation

@HowardvanRooijen

Copy link
Copy Markdown
Contributor

No description provided.

Copilot AI review requested due to automatic review settings January 26, 2026 09:24

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Upgrades the build and project configuration to target .NET 10 and updates the repo’s solution/build setup accordingly.

Changes:

  • Switches the repo from a .sln to a new XML-based .slnx solution file and updates build.ps1 to use it.
  • Updates all projects to target net10.0 and enables nullable + implicit usings with C# language version pinned.
  • Updates CI to build with the .NET 10 SDK and refreshes test package dependencies; adds an additional .gitignore entry.

Reviewed changes

Copilot reviewed 9 out of 10 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
build.ps1 Points the build pipeline at the new Solutions/Argotic.slnx solution file.
Solutions/Argotic.slnx New solution definition listing the projects to build.
Solutions/Argotic.sln Removes the old Visual Studio .sln solution file.
Solutions/Argotic.Common/Argotic.Common.csproj Moves the library to net10.0 and enables nullable/implicit usings (breaking change vs prior multi-targeting).
Solutions/Argotic.Core/Argotic.Core.csproj Moves to net10.0, enables nullable/implicit usings, and bumps a dependency version.
Solutions/Argotic.Extensions/Argotic.Extensions.csproj Moves to net10.0 and enables nullable/implicit usings (breaking change vs prior multi-targeting).
Solutions/Argotic.Examples/Argotic.Examples.csproj Moves to net10.0 and enables nullable/implicit usings (breaking change vs prior multi-targeting).
Solutions/Argotic.Extensions.Tests/Argotic.Extensions.Tests.csproj Moves tests to net10.0 and updates test-related package versions.
.gitignore Adds .endjin/ to ignored paths.
.github/workflows/build.yml Updates CI to install/use .NET SDK 10.x only.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread Solutions/Argotic.Core/Argotic.Core.csproj Outdated
Comment thread Solutions/Argotic.Extensions/Argotic.Extensions.csproj Outdated
Comment thread Solutions/Argotic.Examples/Argotic.Examples.csproj Outdated
Comment thread Solutions/Argotic.Common/Argotic.Common.csproj Outdated
Get-EndjinGist zf prautoflow
Get-EndjinGist zf dotnet
@github-actions

github-actions Bot commented Jan 26, 2026

Copy link
Copy Markdown

Test Results

3 703 tests  +3 589   3 703 ✅ +3 609   7s ⏱️ +7s
    1 suites ±    0       0 💤  -    20 
    1 files   ±    0       0 ❌ ±    0 

Results for commit 1df1a8a. ± Comparison against base commit 37fc3cf.

This pull request removes 114 and adds 3703 tests. Note that renamed tests count towards both.
Argotic.Extensions.Tests.AtomPublishingControlSyndicationExtensionTest ‑ AtomPublishingControlSyndicationExtensionConstructorTest
Argotic.Extensions.Tests.AtomPublishingControlSyndicationExtensionTest ‑ AtomPublishingControl_CompareToTest
Argotic.Extensions.Tests.AtomPublishingControlSyndicationExtensionTest ‑ AtomPublishingControl_ContextTest
Argotic.Extensions.Tests.AtomPublishingControlSyndicationExtensionTest ‑ AtomPublishingControl_CreateXmlTest
Argotic.Extensions.Tests.AtomPublishingControlSyndicationExtensionTest ‑ AtomPublishingControl_EqualsTest
Argotic.Extensions.Tests.AtomPublishingControlSyndicationExtensionTest ‑ AtomPublishingControl_FullTest
Argotic.Extensions.Tests.AtomPublishingControlSyndicationExtensionTest ‑ AtomPublishingControl_GetHashCodeTest
Argotic.Extensions.Tests.AtomPublishingControlSyndicationExtensionTest ‑ AtomPublishingControl_LoadTest
Argotic.Extensions.Tests.AtomPublishingControlSyndicationExtensionTest ‑ AtomPublishingControl_MatchByTypeTest
Argotic.Extensions.Tests.AtomPublishingControlSyndicationExtensionTest ‑ AtomPublishingControl_ToStringTest
…
Argotic.Extensions.Tests.Functionality.Common.ComparisonUtilityTests ‑ CompareSequence_DayOfWeek_WhenBothEmpty_ReturnsZero
Argotic.Extensions.Tests.Functionality.Common.ComparisonUtilityTests ‑ CompareSequence_DayOfWeek_WhenBothListsEqual_ReturnsZero
Argotic.Extensions.Tests.Functionality.Common.ComparisonUtilityTests ‑ CompareSequence_DayOfWeek_WhenDifferentValues_ReturnsNonZero
Argotic.Extensions.Tests.Functionality.Common.ComparisonUtilityTests ‑ CompareSequence_DayOfWeek_WhenSourceLarger_ReturnsOne
Argotic.Extensions.Tests.Functionality.Common.ComparisonUtilityTests ‑ CompareSequence_DayOfWeek_WhenSourceNull_ThrowsArgumentNullException
Argotic.Extensions.Tests.Functionality.Common.ComparisonUtilityTests ‑ CompareSequence_DayOfWeek_WhenSourceSmaller_ReturnsNegativeOne
Argotic.Extensions.Tests.Functionality.Common.ComparisonUtilityTests ‑ CompareSequence_DayOfWeek_WhenTargetNull_ThrowsArgumentNullException
Argotic.Extensions.Tests.Functionality.Common.ComparisonUtilityTests ‑ CompareSequence_Dictionary_CaseInsensitive_WhenSameIgnoringCase_ReturnsZero
Argotic.Extensions.Tests.Functionality.Common.ComparisonUtilityTests ‑ CompareSequence_Dictionary_WhenBothEqual_ReturnsZero
Argotic.Extensions.Tests.Functionality.Common.ComparisonUtilityTests ‑ CompareSequence_Dictionary_WhenDifferentValues_ReturnsNonZero
…

♻️ This comment has been updated with latest results.

HowardvanRooijen and others added 22 commits January 26, 2026 10:43
…cross multiple classes for consistency and adherence to C# coding conventions. Updated comparison methods to use lowercase 'string' as well.
…bility in SyndicationDateTimeUtility and BasicGeocodingSyndicationExtension
Migrate from the custom Guard class to modern .NET 10 built-in exception
helpers, which use CallerArgumentExpression to automatically capture
parameter names without manual string arguments.

Replacements:
- Guard.ArgumentNotNull -> ArgumentNullException.ThrowIfNull (1,322 calls)
- Guard.ArgumentNotNullOrEmptyString -> ArgumentException.ThrowIfNullOrEmpty (140 calls)
- Guard.ArgumentNotGreaterThan -> ArgumentOutOfRangeException.ThrowIfGreaterThan (7 calls)
- Guard.ArgumentNotLessThan -> ArgumentOutOfRangeException.ThrowIfLessThan (13 calls)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
HowardvanRooijen and others added 18 commits January 28, 2026 21:46
Replace bitwise OR operator (|=) with proper conditional comparison logic in all CompareTo methods. This preserves correct ordering semantics by only comparing subsequent fields when the current comparison result is 0.

Fixed patterns:
- YahooMediaUtility: Fixed in CompareCommonObjectEntities, CompareCommonObjectEntityClasses, CompareCommonObjectEntityCollections, and all CompareSequence overloads
- YahooMediaRestriction, YahooMediaThumbnail, YahooMediaTextConstruct, YahooMediaText, YahooMediaPlayer: Fixed consecutive property comparisons
- YahooMediaContent: Fixed comparison of 15+ properties
- FeedSynchronizationRelatedInformation: Fixed comparison of Link, Title, RelationType
- FeedSynchronizationSyndicationExtension: Fixed comparison of extension properties and nested context
- FeedSynchronizationSharingInformation: Fixed in both CompareSequence and CompareTo methods

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
  - Replace verbose type checks with `is` pattern in 26 MatchByType methods
  - Remove unnecessary .ToCharArray() from String.Split calls (9 instances)
  - Convert array initializations to collection expressions in SyndicationDateTimeUtility
  - Replace string.Format(null, ...) with string interpolation (45+ instances)
  - Simplify Context properties using field-backed properties (C# 13) in 8 extensions
  - Add generic enum reflection utilities to EnumerationMetadataAttribute
  - Consolidate repeated enum reflection patterns in iTunes/YahooMedia extensions

  Changes reduce total lines by ~300
  - Introduce generic CompareSequence<T> in ComparisonUtility.cs, consolidating
    8 type-specific overloads into a single generic method with Func<T,T,int>
  - Remove duplicate <, >, <=, >= operators from 47 classes now using C# 14
    extension operators via IComparisonOperators marker interface
  - Apply C# 14 field keyword to 55+ properties, eliminating backing field
    boilerplate in RSS, Atom, iTunes, YahooMedia, and other extension classes
  - Consolidate 9 domain-specific CompareSequence methods to use the generic
    ComparisonUtility.CompareSequence<T>
  - Replace exception-based Version parsing with Version.TryParse in
    SyndicationResourceMetadata.cs
…d syntax updates

Replace enum reflection with generic EnumerationMetadataAttribute methods
- Replace 30+ line manual reflection loops with single-line GetAlternateValue<T>()
  and GetEnumByAlternateValue<T>() calls across 15 files
- Affected: AtomTextConstruct, RssCloud, BlogMLTextConstruct, YahooMedia*,
  FeedSync*, DublinCore*, LiveJournalSecurity, XmlRpcClient, and more

Extract FindExtension to centralized extension method
- Create ExtensibleSyndicationObjectExtensions.cs with shared implementation
- Remove duplicate FindExtension methods from 43 implementing classes
- Update IExtensibleSyndicationObject interface (method moved to extension)

Null-conditional operator modernization
- Replace `x != null ? x.Method() : default` with `x?.Method() ?? default`
- Updated 12 files across Extensions and Core projects

Property expression body modernization
- Convert `get { return field; }` to `get => field;`
- Updated BlogML*, ApmlUtility, RsdUtility, and other files

Results: 105 files changed, 302 insertions, 2,596 deletions (-2,294 net)
…or consistency across multiple classes in the Argotic.Extensions library.
…tring'"

This reverts commit 721007a which contained a faulty find-and-replace
that corrupted code by replacing "o(RssEnclosur" with "cref=\"string\""
in method signatures and code blocks.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…or consistency across multiple classes in the Argotic.Extensions library.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 81 out of 513 changed files in this pull request and generated 5 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread CHANGELOG.md Outdated
Comment thread Solutions/Argotic.Core/Net/XmlRpc/IXmlRpcValue.cs Outdated
Comment thread Solutions/Argotic.Core/Net/XmlRpc/XmlRpcArrayValue.cs Outdated
Comment thread Solutions/Argotic.Common/SyndicationResourceSaveSettings.cs Outdated
Comment thread Solutions/Argotic.Core/Net/XmlRpc/XmlRpcStructureMember.cs Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 81 out of 514 changed files in this pull request and generated 6 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread Solutions/Argotic.Core/Net/XmlRpc/XmlRpcStructureMember.cs Outdated
Comment thread Solutions/Argotic.Core/Net/XmlRpc/XmlRpcStructureMember.cs
Comment thread Solutions/Argotic.Core/Net/XmlRpc/XmlRpcArrayValue.cs Outdated
Comment thread Solutions/Argotic.Core/Configuration/XmlRpcClientOptions.cs Outdated
Comment thread Solutions/Argotic.Core/Configuration/TrackbackClientOptions.cs Outdated
Comment thread Solutions/Argotic.Core/Net/XmlRpc/XmlRpcScalarValueType.cs

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 81 out of 514 changed files in this pull request and generated 6 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +143 to +162
public static string GetAlternateValue<TEnum>(TEnum value) where TEnum : struct, Enum
{
return EnumMetadataCache<TEnum>.EnumToAlternateValue.GetValueOrDefault(value, string.Empty);
}

/// <summary>
/// Returns a hash code for the current instance.
/// </summary>
/// <returns>A 32-bit signed integer hash code.</returns>
public override int GetHashCode()
{
char[] charArray = this.ToString().ToCharArray();
/// <summary>
/// Gets the enum value that corresponds to the specified alternate value name.
/// </summary>
/// <typeparam name="TEnum">The enum type.</typeparam>
/// <param name="name">The alternate value name to search for.</param>
/// <param name="defaultValue">The default value to return if not found.</param>
/// <returns>The enum value if found, otherwise the default value.</returns>
/// <exception cref="ArgumentNullException">The <paramref name="name"/> is a null reference.</exception>
/// <exception cref="ArgumentException">The <paramref name="name"/> is an empty string.</exception>
public static TEnum GetEnumByAlternateValue<TEnum>(string name, TEnum defaultValue) where TEnum : struct, Enum
{
ArgumentException.ThrowIfNullOrEmpty(name);

return charArray.GetHashCode();
}
return EnumMetadataCache<TEnum>.AlternateValueToEnum.GetValueOrDefault(name, defaultValue);
}

Copilot AI Feb 2, 2026

Copy link

Choose a reason for hiding this comment

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

GetAlternateValue<TEnum> returns string.Empty when no mapping exists, but GetEnumByAlternateValue<TEnum> throws on empty strings. This makes round-tripping brittle and prevents representing enums whose AlternateValue is intentionally empty (common for "None"/default cases). Consider returning defaultValue when name is null/empty (instead of throwing), and (if needed) include empty-string alternates in the reverse mapping.

Copilot uses AI. Check for mistakes.
Comment on lines +208 to +212
public static bool operator ==(XmlRpcArrayValue first, XmlRpcArrayValue second)
{
if (first is null) return second is null;
return first.Equals(second);
}

Copilot AI Feb 2, 2026

Copy link

Choose a reason for hiding this comment

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

operator == accepts non-nullable parameters but explicitly handles null. With nullable reference types enabled, it’s better for both API clarity and caller warnings to declare the operands as nullable (XmlRpcArrayValue? first, XmlRpcArrayValue? second) and keep the same null-handling logic.

Copilot uses AI. Check for mistakes.
Comment on lines +60 to +75
int counter = 0;
while (urlIterator.MoveNext())
{
SitemapUrl url = new();
counter++;

if (url.Load(urlIterator.Current, this.Settings))
{
if (this.Settings.RetrievalLimit != 0 && counter > this.Settings.RetrievalLimit)
{
break;
}

resource.Urls.Add(url);
}
}

Copilot AI Feb 2, 2026

Copy link

Choose a reason for hiding this comment

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

The retrieval limit check happens after url.Load(...), so the adapter may still parse one extra entry beyond the requested limit (and could do so even if it won’t be added). To align with the intent of RetrievalLimit and avoid extra work, move the limit check before calling Load.

Copilot uses AI. Check for mistakes.
Comment on lines +102 to +117
int counter = 0;
while (sitemapIterator.MoveNext())
{
SitemapIndexEntry entry = new();
counter++;

if (entry.Load(sitemapIterator.Current))
{
if (this.Settings.RetrievalLimit != 0 && counter > this.Settings.RetrievalLimit)
{
break;
}

resource.Sitemaps.Add(entry);
}
}

Copilot AI Feb 2, 2026

Copy link

Choose a reason for hiding this comment

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

Same pattern as the sitemap URL loop: the retrieval limit is enforced only after entry.Load(...), which can still process one extra entry beyond the limit. Consider checking RetrievalLimit before Load to avoid unnecessary parsing.

Copilot uses AI. Check for mistakes.
Comment on lines +181 to +191
public int CompareTo(XmlRpcStructureMember? other)
{
if (other is null)
{
char[] charArray = this.ToString().ToCharArray();

return charArray.GetHashCode();
return 1;
}

/// <summary>
/// Determines if operands are equal.
/// </summary>
/// <param name="first">Operand to be compared.</param>
/// <param name="second">Operand to compare to.</param>
/// <returns><b>true</b> if the values of its operands are equal, otherwise; <b>false</b>.</returns>
public static bool operator ==(XmlRpcStructureMember first, XmlRpcStructureMember second)
{
if (object.Equals(first, null) && object.Equals(second, null))
{
return true;
}
else if (object.Equals(first, null) && !object.Equals(second, null))
{
return false;
}
int result = string.Compare(this.ToString(), other.ToString(), StringComparison.Ordinal);

return first.Equals(second);
}
return result;
}

Copilot AI Feb 2, 2026

Copy link

Choose a reason for hiding this comment

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

CompareTo serializes both instances to XML (ToString()) on every comparison, which is expensive and creates significant allocations when sorting or using relational operators. Prefer comparing the actual fields (e.g., Name first, then Value) without generating XML.

Copilot uses AI. Check for mistakes.
/// Loads this <see cref="XmlRpcStructureMember"/> using the supplied <see cref="XPathNavigator"/>.
/// </summary>
/// <param name="source">The <see cref="XPathNavigator"/> to extract information from.</param>
/// <returns><b>true</b> if the <see cref="XmlRpcStructureMember"/> was initialized using the supplied <paramref name="source"/>, Otherwise, <b>false</b>.</returns>

Copilot AI Feb 2, 2026

Copy link

Choose a reason for hiding this comment

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

In XML docs, mid-sentence capitalization is inconsistent here. Consider changing 'Otherwise' to 'otherwise'.

Suggested change
/// <returns><b>true</b> if the <see cref="XmlRpcStructureMember"/> was initialized using the supplied <paramref name="source"/>, Otherwise, <b>false</b>.</returns>
/// <returns><b>true</b> if the <see cref="XmlRpcStructureMember"/> was initialized using the supplied <paramref name="source"/>, otherwise, <b>false</b>.</returns>

Copilot uses AI. Check for mistakes.
…nit tests for null/empty cases to return None
@github-actions

github-actions Bot commented Feb 2, 2026

Copy link
Copy Markdown

Code Coverage Summary Report - Linux (No TFM)

Summary
Generated on: 02/02/2026 - 13:56:17
Parser: Cobertura
Assemblies: 3
Classes: 193
Files: 191
Line coverage: 69.8% (11644 of 16680)
Covered lines: 11644
Uncovered lines: 5036
Coverable lines: 16680
Total lines: 64088
Branch coverage: 60.1% (5064 of 8419)
Covered branches: 5064
Total branches: 8419
Method coverage: Feature is only available for sponsors

Coverage

Argotic.Common - 78.6%
Name Line Branch
Argotic.Common 78.6% 66.5%
Argotic.Common.ComparisonOperatorExtensions 100% 100%
Argotic.Common.ComparisonUtility 100% 100%
Argotic.Common.ComparisonUtility 100% 100%
Argotic.Common.ConditionalGetResult 100% 95.4%
Argotic.Common.DiscoverableSyndicationEndpoint 96.3% 84.6%
Argotic.Common.EnumerationMetadataAttribute 68% 77.7%
Argotic.Common.EnumerationMetadataAttribute.EnumMetadataCache 100% 100%
Argotic.Common.HtmlAnchor 100%
Argotic.Common.MimeMediaTypeAttribute 96% 86.3%
Argotic.Common.SyndicationDateTimeUtility 86.2% 67.3%
Argotic.Common.SyndicationDiscoveryUtility 79.3% 66.3%
Argotic.Common.SyndicationEncodingUtility 89.6% 81.5%
Argotic.Common.SyndicationRequestOptions 100% 100%
Argotic.Common.SyndicationResourceLoadedEventArgs 35.4% 0%
Argotic.Common.SyndicationResourceLoadSettings 65.7% 43.7%
Argotic.Common.SyndicationResourceMetadata 63.8% 46.9%
Argotic.Common.SyndicationResourceSaveSettings 51.4% 43.7%
Argotic.Common.TrackbackDiscoveryMetadata 97.8% 77.2%
Argotic.Common.XmlWritableExtensions 48.1%
Argotic.Core - 66.5%
Name Line Branch
Argotic.Core 66.5% 59.3%
Argotic.Configuration.ServiceCollectionExtensions 100% 100%
Argotic.Configuration.TrackbackClientOptions 100%
Argotic.Configuration.XmlRpcClientOptions 100%
Argotic.Data.Adapters.Apml06SyndicationResourceAdapter 100% 89.2%
Argotic.Data.Adapters.Atom03SyndicationResourceAdapter 90.4% 82.6%
Argotic.Data.Adapters.Atom10SyndicationResourceAdapter 94% 90.5%
Argotic.Data.Adapters.AtomPublishing10SyndicationResourceAdapter 91.6% 85.7%
Argotic.Data.Adapters.BlogML20SyndicationResourceAdapter 100% 95.1%
Argotic.Data.Adapters.Opml20SyndicationResourceAdapter 100% 81.2%
Argotic.Data.Adapters.Rsd06SyndicationResourceAdapter 100% 87.5%
Argotic.Data.Adapters.Rsd10SyndicationResourceAdapter 100% 85.7%
Argotic.Data.Adapters.Rss090SyndicationResourceAdapter 100% 100%
Argotic.Data.Adapters.Rss091SyndicationResourceAdapter 97.6% 95.9%
Argotic.Data.Adapters.Rss092SyndicationResourceAdapter 96.4% 96%
Argotic.Data.Adapters.Rss10SyndicationResourceAdapter 100% 100%
Argotic.Data.Adapters.Rss20SyndicationResourceAdapter 100% 100%
Argotic.Data.Adapters.Sitemap09SyndicationResourceAdapter 100% 100%
Argotic.Data.Adapters.SyndicationResourceAdapter 71.3% 64%
Argotic.Net.TrackbackClient 23.6% 14.2%
Argotic.Net.TrackbackMessage 38.4% 10.8%
Argotic.Net.TrackbackResponse 21% 10%
Argotic.Net.WebContentType 35.4% 14.2%
Argotic.Net.XmlRpcArrayValue 98.3% 93.7%
Argotic.Net.XmlRpcClient 27.6% 27.2%
Argotic.Net.XmlRpcMessage 37.3% 28.5%
Argotic.Net.XmlRpcResponse 20.3% 22.9%
Argotic.Net.XmlRpcScalarValue 56.5% 16.6%
Argotic.Net.XmlRpcStructureMember 98.3% 90%
Argotic.Net.XmlRpcStructureValue 2.3% 2.2%
Argotic.Publishing.AtomAcceptedMediaRange 79.1% 57.1%
Argotic.Publishing.AtomCategoryDocument 47.3% 61.7%
Argotic.Publishing.AtomEntryResource 14.4% 0%
Argotic.Publishing.AtomMemberResources 50.7% 65.2%
Argotic.Publishing.AtomServiceDocument 58.1% 70%
Argotic.Publishing.AtomWorkspace 72.5% 76.6%
Argotic.Syndication.AtomCategory 62.1% 30.5%
Argotic.Syndication.AtomContent 22.9% 12.9%
Argotic.Syndication.AtomEntry 64.4% 67.2%
Argotic.Syndication.AtomFeed 66.8% 57.6%
Argotic.Syndication.AtomGenerator 78% 55.5%
Argotic.Syndication.AtomIcon 76.4% 45.4%
Argotic.Syndication.AtomId 76.4% 40.9%
Argotic.Syndication.AtomLink 68.9% 44.8%
Argotic.Syndication.AtomLogo 76.4% 45.4%
Argotic.Syndication.AtomPersonConstruct 75.5% 64.7%
Argotic.Syndication.AtomSource 1% 0.6%
Argotic.Syndication.AtomTextConstruct 71.7% 63%
Argotic.Syndication.AtomUtility 68% 50%
Argotic.Syndication.GenericSyndicationCategory 100% 94.4%
Argotic.Syndication.GenericSyndicationFeed 85.3% 81.8%
Argotic.Syndication.GenericSyndicationItem 100% 94.7%
Argotic.Syndication.OpmlDocument 92.5% 87.5%
Argotic.Syndication.OpmlHead 91.7% 83.3%
Argotic.Syndication.OpmlOutline 80.2% 70.3%
Argotic.Syndication.OpmlOwner 77.1% 53.8%
Argotic.Syndication.OpmlWindow 39.3% 18.7%
Argotic.Syndication.RssCategory 63% 41.1%
Argotic.Syndication.RssChannel 73.4% 61.9%
Argotic.Syndication.RssCloud 41.4% 10.5%
Argotic.Syndication.RssEnclosure 76.5% 52.9%
Argotic.Syndication.RssFeed 89.5% 78.9%
Argotic.Syndication.RssGuid 30.1% 12.5%
Argotic.Syndication.RssImage 38.5% 6.8%
Argotic.Syndication.RssItem 56% 48.5%
Argotic.Syndication.RssSource 26.1% 15.6%
Argotic.Syndication.RssTextInput 32.9% 7.8%
Argotic.Syndication.Sitemap 3.7% 0%
Argotic.Syndication.SitemapIndex 3.8% 0%
Argotic.Syndication.SitemapIndexEntry 50% 45.8%
Argotic.Syndication.SitemapUrl 60.6% 62.5%
Argotic.Syndication.SitemapUtility 100% 75.8%
Argotic.Syndication.Specialized.ApmlApplication 80.3% 50%
Argotic.Syndication.Specialized.ApmlAuthor 85.2% 69.4%
Argotic.Syndication.Specialized.ApmlConcept 85.2% 69.4%
Argotic.Syndication.Specialized.ApmlDocument 87.5% 94.7%
Argotic.Syndication.Specialized.ApmlHead 84.6% 65.7%
Argotic.Syndication.Specialized.ApmlProfile 63.6% 57.6%
Argotic.Syndication.Specialized.ApmlSource 59.3% 46.5%
Argotic.Syndication.Specialized.ApmlUtility 100% 50%
Argotic.Syndication.Specialized.BlogMLAttachment 100% 97.6%
Argotic.Syndication.Specialized.BlogMLAuthor 62.5% 38.4%
Argotic.Syndication.Specialized.BlogMLCategory 58.9% 38.2%
Argotic.Syndication.Specialized.BlogMLComment 58.6% 38.4%
Argotic.Syndication.Specialized.BlogMLDocument 94.3% 92.8%
Argotic.Syndication.Specialized.BlogMLPost 56.9% 51%
Argotic.Syndication.Specialized.BlogMLTextConstruct 92.3% 79.1%
Argotic.Syndication.Specialized.BlogMLTrackback 100% 90%
Argotic.Syndication.Specialized.BlogMLUtility 87.5% 75.4%
Argotic.Syndication.Specialized.RsdApplicationInterface 73.9% 61.2%
Argotic.Syndication.Specialized.RsdDocument 91.1% 88.4%
Argotic.Syndication.Specialized.RsdUtility 100% 87.5%
Argotic.Extensions - 72.5%
Name Line Branch
Argotic.Extensions 72.5% 59.9%
Argotic.Extensions.Core.AtomPublishingControlSyndicationExtension 77.7% 50%
Argotic.Extensions.Core.AtomPublishingControlSyndicationExtensionContext 54.7% 42.8%
Argotic.Extensions.Core.AtomPublishingEditedSyndicationExtension 96.2% 100%
Argotic.Extensions.Core.AtomPublishingEditedSyndicationExtensionContext 100% 100%
Argotic.Extensions.Core.AtomPublishingUtility 70.4% 50%
Argotic.Extensions.Core.BasicGeocodingSyndicationExtension 85.2% 71.8%
Argotic.Extensions.Core.BasicGeocodingSyndicationExtensionContext 100% 100%
Argotic.Extensions.Core.BlogChannelSyndicationExtension 85.7% 50%
Argotic.Extensions.Core.BlogChannelSyndicationExtensionContext 100% 100%
Argotic.Extensions.Core.CreativeCommonsSyndicationExtension 87% 60%
Argotic.Extensions.Core.CreativeCommonsSyndicationExtensionContext 100% 100%
Argotic.Extensions.Core.DublinCoreElementSetSyndicationExtension 85.8% 43.7%
Argotic.Extensions.Core.DublinCoreElementSetSyndicationExtensionContext 92.1% 89.8%
Argotic.Extensions.Core.DublinCoreMetadataTermsSyndicationExtension 94.9% 68.7%
Argotic.Extensions.Core.DublinCoreMetadataTermsSyndicationExtensionContext 93.2% 89.6%
Argotic.Extensions.Core.FeedHistoryLinkRelation 39.3% 20.8%
Argotic.Extensions.Core.FeedHistorySyndicationExtension 96.7% 100%
Argotic.Extensions.Core.FeedHistorySyndicationExtensionContext 81.5% 65.3%
Argotic.Extensions.Core.FeedRankSyndicationExtension 85.7% 50%
Argotic.Extensions.Core.FeedRankSyndicationExtensionContext 80.3% 71.8%
Argotic.Extensions.Core.FeedSynchronizationHistory 70.2% 32.1%
Argotic.Extensions.Core.FeedSynchronizationItem 62.7% 33.3%
Argotic.Extensions.Core.FeedSynchronizationRelatedInformation 75.9% 58.3%
Argotic.Extensions.Core.FeedSynchronizationSharingInformation 86.5% 61.6%
Argotic.Extensions.Core.FeedSynchronizationSyndicationExtension 83.3% 73.6%
Argotic.Extensions.Core.FeedSynchronizationSyndicationExtensionContext 84.6% 78.5%
Argotic.Extensions.Core.ITunesCategory 52.3% 30.7%
Argotic.Extensions.Core.ITunesOwner 66.1% 66.6%
Argotic.Extensions.Core.ITunesSyndicationExtension 88.7% 50%
Argotic.Extensions.Core.ITunesSyndicationExtensionContext 86.4% 72%
Argotic.Extensions.Core.LiveJournalMood 72.7% 83.3%
Argotic.Extensions.Core.LiveJournalSecurity 67.7% 60%
Argotic.Extensions.Core.LiveJournalSyndicationExtension 75.7% 43.7%
Argotic.Extensions.Core.LiveJournalSyndicationExtensionContext 92.1% 78.1%
Argotic.Extensions.Core.LiveJournalUserPicture 38.2% 7.8%
Argotic.Extensions.Core.PheedSyndicationExtension 83.3% 50%
Argotic.Extensions.Core.PheedSyndicationExtensionContext 88.2% 77.7%
Argotic.Extensions.Core.PingbackSyndicationExtension 83.6% 50%
Argotic.Extensions.Core.PingbackSyndicationExtensionContext 85% 60%
Argotic.Extensions.Core.SimpleListGroup 69.2% 43.7%
Argotic.Extensions.Core.SimpleListSort 63.8% 39.1%
Argotic.Extensions.Core.SimpleListSyndicationExtension 91.8% 100%
Argotic.Extensions.Core.SimpleListSyndicationExtensionContext 76.1% 72.2%
Argotic.Extensions.Core.SitemapHreflangExtension 21.4% 15%
Argotic.Extensions.Core.SitemapHreflangLink 29% 10%
Argotic.Extensions.Core.SitemapImage 100% 91.6%
Argotic.Extensions.Core.SitemapImageExtension 5.3% 0%
Argotic.Extensions.Core.SitemapNewsExtension 4.5% 0%
Argotic.Extensions.Core.SitemapNewsPublication 32% 10%
Argotic.Extensions.Core.SitemapVideo 21.5% 8.6%
Argotic.Extensions.Core.SitemapVideoExtension 5.3% 0%
Argotic.Extensions.Core.SitemapVideoId 18.6% 9.3%
Argotic.Extensions.Core.SitemapVideoSegment 18.7% 7.6%
Argotic.Extensions.Core.SiteSummaryContentItem 26.7% 7.6%
Argotic.Extensions.Core.SiteSummaryContentSyndicationExtension 86.5% 70%
Argotic.Extensions.Core.SiteSummaryContentSyndicationExtensionContext 69.2% 42.3%
Argotic.Extensions.Core.SiteSummarySlashSyndicationExtension 88% 75%
Argotic.Extensions.Core.SiteSummarySlashSyndicationExtensionContext 92.1% 88.6%
Argotic.Extensions.Core.SiteSummaryUpdateSyndicationExtension 89.2% 75%
Argotic.Extensions.Core.SiteSummaryUpdateSyndicationExtensionContext 100% 100%
Argotic.Extensions.Core.TrackbackSyndicationExtension 83.3% 50%
Argotic.Extensions.Core.TrackbackSyndicationExtensionContext 80% 54.5%
Argotic.Extensions.Core.WellFormedWebCommentsSyndicationExtension 83.3% 50%
Argotic.Extensions.Core.WellFormedWebCommentsSyndicationExtensionContext 100% 100%
Argotic.Extensions.Core.YahooMediaCategory 88.5% 71.4%
Argotic.Extensions.Core.YahooMediaContent 88.4% 88.4%
Argotic.Extensions.Core.YahooMediaCopyright 89.4% 70.8%
Argotic.Extensions.Core.YahooMediaCredit 95.7% 78.5%
Argotic.Extensions.Core.YahooMediaGroup 92.6% 90%
Argotic.Extensions.Core.YahooMediaHash 47.5% 34.6%
Argotic.Extensions.Core.YahooMediaPlayer 92.3% 79.4%
Argotic.Extensions.Core.YahooMediaRating 95.1% 80%
Argotic.Extensions.Core.YahooMediaRestriction 26.5% 19.4%
Argotic.Extensions.Core.YahooMediaSyndicationExtension 64.1% 0%
Argotic.Extensions.Core.YahooMediaSyndicationExtensionContext 97.7% 95.8%
Argotic.Extensions.Core.YahooMediaText 36.1% 31.4%
Argotic.Extensions.Core.YahooMediaTextConstruct 80% 54.5%
Argotic.Extensions.Core.YahooMediaThumbnail 96.6% 85.7%
Argotic.Extensions.Core.YahooMediaUtility 66.5% 51%
Argotic.Extensions.ExtensibleSyndicationObjectExtensions 100% 100%
Argotic.Extensions.SyndicationExtension 82.4% 91.6%
Argotic.Extensions.SyndicationExtensionAdapter 95.7% 92%
Argotic.Extensions.SyndicationExtensionLoadedEventArgs 22.7% 0%

@HowardvanRooijen HowardvanRooijen requested a review from Copilot April 9, 2026 11:42

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 81 out of 515 changed files in this pull request and generated 9 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 1 to 7
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0;</TargetFrameworks>
<Product>Argotic Syndication Framework</Product>
<Copyright>Copyright © Brian William Kuhn 2008</Copyright>
<Authors>Brian William Kuhn, endjin</Authors>
</PropertyGroup>

<PropertyGroup>
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
<PackageDescription></PackageDescription>
<PackageTags></PackageTags>
<PackageReleaseNotes></PackageReleaseNotes>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<PackageDescription>Main syndication library for RSS, Atom, OPML, APML, BlogML, RSD, and Sitemap formats. Provides reading, writing, and manipulation of web content syndication feeds.</PackageDescription>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

Copilot AI Apr 9, 2026

Copy link

Choose a reason for hiding this comment

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

The project no longer declares a target framework (<TargetFramework> or <TargetFrameworks>). SDK-style projects require this, so this change will break builds. Add a .NET 10 target (e.g., net10.0) or restore multi-targeting as intended for this PR.

Copilot uses AI. Check for mistakes.
Comment on lines 1 to 7
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0;</TargetFrameworks>
<Product>Argotic Syndication Framework</Product>
<Copyright>Copyright © Brian William Kuhn 2008</Copyright>
<Authors>Brian William Kuhn, endjin</Authors>
<PackageDescription>Core interfaces and utilities for the Argotic Syndication Framework, including SyndicationEncodingUtility, SyndicationDateTimeUtility, and SyndicationDiscoveryUtility.</PackageDescription>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

Copilot AI Apr 9, 2026

Copy link

Choose a reason for hiding this comment

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

This project also no longer specifies <TargetFramework>/<TargetFrameworks>, which will prevent it from compiling/packing. Add the intended .NET 10 target (or restore the previous multi-targeting) to make the project file valid.

Copilot uses AI. Check for mistakes.
Comment on lines +5 to +62
/// Provides extension comparison operators for types implementing <see cref="IComparable{T}"/>.
/// </summary>
/// <remarks>
/// C# 14 extension operators for relational comparisons (&lt;, &gt;, &lt;=, &gt;=).
/// Note: == and != cannot be extension operators for reference types due to
/// predefined reference equality taking precedence.
/// </remarks>
public static class ComparisonOperatorExtensions
{
extension<T>(T) where T : class, IComparable<T>, IComparisonOperators
{
/// <summary>
/// Determines if first operand is less than second operand.
/// </summary>
/// <param name="first">Operand to be compared.</param>
/// <param name="second">Operand to compare to.</param>
/// <returns><b>true</b> if the first operand is less than the second, otherwise; <b>false</b>.</returns>
public static bool operator <(T first, T second)
{
if (first is null) return second is not null;
return first.CompareTo(second) < 0;
}

/// <summary>
/// Determines if first operand is greater than second operand.
/// </summary>
/// <param name="first">Operand to be compared.</param>
/// <param name="second">Operand to compare to.</param>
/// <returns><b>true</b> if the first operand is greater than the second, otherwise; <b>false</b>.</returns>
public static bool operator >(T first, T second)
{
if (first is null) return false;
return first.CompareTo(second) > 0;
}

/// <summary>
/// Determines if first operand is less than or equal to the second operand.
/// </summary>
/// <param name="first">Operand to be compared.</param>
/// <param name="second">Operand to compare to.</param>
/// <returns><b>true</b> if the first operand is less than or equal to the second, otherwise; <b>false</b>.</returns>
public static bool operator <=(T first, T second)
{
if (first is null) return true;
return first.CompareTo(second) <= 0;
}

/// <summary>
/// Determines if first operand is greater than or equal to the second operand.
/// </summary>
/// <param name="first">Operand to be compared.</param>
/// <param name="second">Operand to compare to.</param>
/// <returns><b>true</b> if the first operand is greater than or equal to the second, otherwise; <b>false</b>.</returns>
public static bool operator >=(T first, T second)
{
if (first is null) return second is null;
return first.CompareTo(second) >= 0;
}

Copilot AI Apr 9, 2026

Copy link

Choose a reason for hiding this comment

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

This uses the extension<T>(T) syntax (extension operators / extension type blocks), which requires a very new C# language version and typically a preview compiler setting. If the repo/build isn't explicitly enabling the required LangVersion/preview features, this will fail to compile. Consider either (1) setting the project(s) LangVersion appropriately, or (2) replacing this with conventional static extension methods (or regular operator overloads on the types) to avoid depending on preview syntax.

Suggested change
/// Provides extension comparison operators for types implementing <see cref="IComparable{T}"/>.
/// </summary>
/// <remarks>
/// C# 14 extension operators for relational comparisons (&lt;, &gt;, &lt;=, &gt;=).
/// Note: == and != cannot be extension operators for reference types due to
/// predefined reference equality taking precedence.
/// </remarks>
public static class ComparisonOperatorExtensions
{
extension<T>(T) where T : class, IComparable<T>, IComparisonOperators
{
/// <summary>
/// Determines if first operand is less than second operand.
/// </summary>
/// <param name="first">Operand to be compared.</param>
/// <param name="second">Operand to compare to.</param>
/// <returns><b>true</b> if the first operand is less than the second, otherwise; <b>false</b>.</returns>
public static bool operator <(T first, T second)
{
if (first is null) return second is not null;
return first.CompareTo(second) < 0;
}
/// <summary>
/// Determines if first operand is greater than second operand.
/// </summary>
/// <param name="first">Operand to be compared.</param>
/// <param name="second">Operand to compare to.</param>
/// <returns><b>true</b> if the first operand is greater than the second, otherwise; <b>false</b>.</returns>
public static bool operator >(T first, T second)
{
if (first is null) return false;
return first.CompareTo(second) > 0;
}
/// <summary>
/// Determines if first operand is less than or equal to the second operand.
/// </summary>
/// <param name="first">Operand to be compared.</param>
/// <param name="second">Operand to compare to.</param>
/// <returns><b>true</b> if the first operand is less than or equal to the second, otherwise; <b>false</b>.</returns>
public static bool operator <=(T first, T second)
{
if (first is null) return true;
return first.CompareTo(second) <= 0;
}
/// <summary>
/// Determines if first operand is greater than or equal to the second operand.
/// </summary>
/// <param name="first">Operand to be compared.</param>
/// <param name="second">Operand to compare to.</param>
/// <returns><b>true</b> if the first operand is greater than or equal to the second, otherwise; <b>false</b>.</returns>
public static bool operator >=(T first, T second)
{
if (first is null) return second is null;
return first.CompareTo(second) >= 0;
}
/// Provides comparison extension methods for types implementing <see cref="IComparable{T}"/>.
/// </summary>
public static class ComparisonOperatorExtensions
{
/// <summary>
/// Determines if first operand is less than second operand.
/// </summary>
/// <param name="first">Operand to be compared.</param>
/// <param name="second">Operand to compare to.</param>
/// <returns><b>true</b> if the first operand is less than the second, otherwise; <b>false</b>.</returns>
public static bool IsLessThan<T>(this T first, T second) where T : class, IComparable<T>, IComparisonOperators
{
if (first is null) return second is not null;
return first.CompareTo(second) < 0;
}
/// <summary>
/// Determines if first operand is greater than second operand.
/// </summary>
/// <param name="first">Operand to be compared.</param>
/// <param name="second">Operand to compare to.</param>
/// <returns><b>true</b> if the first operand is greater than the second, otherwise; <b>false</b>.</returns>
public static bool IsGreaterThan<T>(this T first, T second) where T : class, IComparable<T>, IComparisonOperators
{
if (first is null) return false;
return first.CompareTo(second) > 0;
}
/// <summary>
/// Determines if first operand is less than or equal to the second operand.
/// </summary>
/// <param name="first">Operand to be compared.</param>
/// <param name="second">Operand to compare to.</param>
/// <returns><b>true</b> if the first operand is less than or equal to the second, otherwise; <b>false</b>.</returns>
public static bool IsLessThanOrEqualTo<T>(this T first, T second) where T : class, IComparable<T>, IComparisonOperators
{
if (first is null) return true;
return first.CompareTo(second) <= 0;
}
/// <summary>
/// Determines if first operand is greater than or equal to the second operand.
/// </summary>
/// <param name="first">Operand to be compared.</param>
/// <param name="second">Operand to compare to.</param>
/// <returns><b>true</b> if the first operand is greater than or equal to the second, otherwise; <b>false</b>.</returns>
public static bool IsGreaterThanOrEqualTo<T>(this T first, T second) where T : class, IComparable<T>, IComparisonOperators
{
if (first is null) return second is null;
return first.CompareTo(second) >= 0;

Copilot uses AI. Check for mistakes.
Comment thread Solutions/.editorconfig
# C# files
[*.cs]

# C# 12 Language features

Copilot AI Apr 9, 2026

Copy link

Choose a reason for hiding this comment

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

The repo configuration claims 'C# 12 Language features', but the PR introduces syntax that appears to require a newer C# version (e.g., extension operators). To avoid confusion and build breaks across environments/CI, update the repo configuration and/or project files to explicitly align the intended C# language version (and whether preview is required).

Suggested change
# C# 12 Language features
# C# language style preferences
# Note: compiler language version should be enforced in project/SDK settings, not in .editorconfig.

Copilot uses AI. Check for mistakes.
{
return false;
}
int result = string.Compare(this.ToString(), other.ToString(), StringComparison.Ordinal);

Copilot AI Apr 9, 2026

Copy link

Choose a reason for hiding this comment

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

Both CompareTo and GetHashCode call ToString(), which serializes the object to XML (allocations + IO over MemoryStream/XmlWriter). This makes comparisons/hashing unexpectedly expensive and can become a bottleneck when these objects are used in sorting or hash-based collections. Prefer comparing/hashing stable fields directly (e.g., Name plus a value-specific comparer/hash) or cache the serialized representation if XML-string identity is the intended semantics.

Copilot uses AI. Check for mistakes.
/// <summary>
/// Gets or sets a value indicating if syndication resource persist operations should attempt to minimize the physical size of the resulting output.
/// </summary>
/// <value><b>true</b> if output size should be as small as possible; Otherwise, <b>false</b>. The default value is <b>false</b>.</value>

Copilot AI Apr 9, 2026

Copy link

Choose a reason for hiding this comment

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

In XML doc comments, 'Otherwise' mid-sentence should be lowercase ('otherwise') for correct grammar.

Copilot uses AI. Check for mistakes.
/// Gets or sets a value indicating if auto-detection of supported syndication extensions is enabled.
/// </summary>
/// <value>
/// <b>true</b> if the syndication extensions supported by the load operation are automatically determined based on the XML namespaces declared on a syndication resource; Otherwise, <b>false</b>.

Copilot AI Apr 9, 2026

Copy link

Choose a reason for hiding this comment

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

In XML doc comments, 'Otherwise' mid-sentence should be lowercase ('otherwise') for correct grammar.

Suggested change
/// <b>true</b> if the syndication extensions supported by the load operation are automatically determined based on the XML namespaces declared on a syndication resource; Otherwise, <b>false</b>.
/// <b>true</b> if the syndication extensions supported by the load operation are automatically determined based on the XML namespaces declared on a syndication resource; otherwise, <b>false</b>.

Copilot uses AI. Check for mistakes.
Comment thread Solutions/.editorconfig
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf

Copilot AI Apr 9, 2026

Copy link

Choose a reason for hiding this comment

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

.editorconfig enforces LF for all files, but .gitattributes enforces CRLF for *.ps1/*.cmd/*.bat (and others). This conflict can cause persistent line-ending churn depending on tooling and checkout settings. Align the two sources of truth (either rely on .gitattributes for EOL normalization or mirror the same per-extension EOL rules in .editorconfig).

Copilot uses AI. Check for mistakes.
Comment thread .gitattributes
Comment on lines +18 to +34
*.sh text eol=lf
*.ps1 text eol=crlf
*.cmd text eol=crlf
*.bat text eol=crlf

# Declare files that will always have LF line endings on checkout.
.gitattributes text eol=lf
.gitignore text eol=lf
*.sh text eol=lf

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf
*.slnx text eol=crlf
*.cmd text eol=crlf
*.bat text eol=crlf
*.ps1 text eol=crlf

Copilot AI Apr 9, 2026

Copy link

Choose a reason for hiding this comment

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

These per-extension EOL rules conflict with the global LF rule in .editorconfig. To avoid repeated diffs and inconsistent formatting across contributors/CI, consider standardizing EOL policy in one place (or ensuring .editorconfig mirrors these per-extension settings).

Suggested change
*.sh text eol=lf
*.ps1 text eol=crlf
*.cmd text eol=crlf
*.bat text eol=crlf
# Declare files that will always have LF line endings on checkout.
.gitattributes text eol=lf
.gitignore text eol=lf
*.sh text eol=lf
# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf
*.slnx text eol=crlf
*.cmd text eol=crlf
*.bat text eol=crlf
*.ps1 text eol=crlf
# Declare files that will always have LF line endings on checkout.
.gitattributes text eol=lf
.gitignore text eol=lf
*.sh text eol=lf
*.ps1 text eol=lf
*.cmd text eol=lf
*.bat text eol=lf
*.sln text eol=lf
*.slnx text eol=lf

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants