Meziantou.Framework.CodeOwners
7.0.1
Prefix Reserved
dotnet add package Meziantou.Framework.CodeOwners --version 7.0.1
NuGet\Install-Package Meziantou.Framework.CodeOwners -Version 7.0.1
<PackageReference Include="Meziantou.Framework.CodeOwners" Version="7.0.1" />
<PackageVersion Include="Meziantou.Framework.CodeOwners" Version="7.0.1" />
<PackageReference Include="Meziantou.Framework.CodeOwners" />
paket add Meziantou.Framework.CodeOwners --version 7.0.1
#r "nuget: Meziantou.Framework.CodeOwners, 7.0.1"
#:package Meziantou.Framework.CodeOwners@7.0.1
#addin nuget:?package=Meziantou.Framework.CodeOwners&version=7.0.1
#tool nuget:?package=Meziantou.Framework.CodeOwners&version=7.0.1
Meziantou.Framework.CodeOwners
Meziantou.Framework.CodeOwners parses CODEOWNERS file. These files are common on GitHub and GitLab.
Parsing takes the dialect of the file, because the two hosts do not accept the same syntax: sections ([Name], ^[Name], [Name][2]) are a GitLab extension, and in the GitHub syntax a line starting with [ is a pattern, since [ opens a character class.
Each entry is one line of the file: a pattern and the owners it declares.
CodeOwnersFile file = CodeOwnersFile.Parse("* @user1 docs@example.com", CodeOwnersDialect.GitHub);
// file.Entries[0].Pattern: "*"
// file.Entries[0].Owners[0]: Type=Username, Name="user1"
// file.Entries[0].Owners[1]: Type=EmailAddress, Name="docs@example.com"
Entries are returned in file order, and CODEOWNERS resolution is last-match-wins, so the owners of a path are those of the last entry whose pattern matches it:
CodeOwnersEntry? owningEntry = file.Entries.LastOrDefault(entry => Matches(entry.Pattern, path));
IReadOnlyList<CodeOwner> owners = owningEntry?.Owners ?? [];
// An empty Owners list means the entry explicitly leaves the pattern unowned
Parse throws a CodeOwnersParseException when the file is invalid. The exception reports the first error and where it is:
try
{
CodeOwnersFile.Parse("[Section\n* @user1", CodeOwnersDialect.GitLab);
}
catch (CodeOwnersParseException ex)
{
// ex.Error.Kind: CodeOwnersParseErrorKind.UnterminatedSectionHeader
// ex.Error.LineNumber: 1
// ex.Error.LinePosition: 1
Console.WriteLine(ex.Message);
}
Use TryParse when an invalid file should not throw. An overload reports the same error without allocating an exception:
if (CodeOwnersFile.TryParse(content, CodeOwnersDialect.GitHub, out CodeOwnersFile? file, out CodeOwnersParseError error))
{
// ...
}
else
{
Console.WriteLine(error); // line 1, position 1: the section header is not terminated by ']'
}
Parse and both TryParse overloads also accept a ReadOnlySpan<char>, so a file read into a buffer does not have to be turned into a string first. The parsed CodeOwnersFile never references the span: every value it exposes is copied out of it, and reported error positions are relative to the start of the span.
char[] buffer = ...;
CodeOwnersFile file = CodeOwnersFile.Parse(buffer.AsSpan(0, length), CodeOwnersDialect.GitHub);
A CodeOwnersFile only exists for a valid file: neither method hands back a partially parsed one. Entries, Owners and DefaultOwners are read-only views that cannot be cast back to a mutable list.
In the GitLab dialect an owner can also be a role, written @@developer, @@maintainer or @@owner (plural accepted). Anything else after @@ is an error, as is a @ inside a username.
CodeOwnersFile file = CodeOwnersFile.Parse("*.md @@maintainers", CodeOwnersDialect.GitLab);
// file.Entries[0].Owners[0]: Type=Role, Name="maintainers"
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. net11.0 is compatible. |
-
net10.0
- Meziantou.Framework.ValueStringBuilder (>= 3.0.3)
-
net11.0
- Meziantou.Framework.ValueStringBuilder (>= 3.0.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 7.0.1 | 5,357 | 9/13/2026 |
| 7.0.0 | 1,720 | 9/8/2026 |
| 6.0.1 | 115 | 9/6/2026 |
| 6.0.0 | 120 | 9/4/2026 |
| 5.0.2 | 195 | 9/3/2026 |
| 5.0.1 | 8,167 | 7/8/2026 |
| 5.0.0 | 573 | 7/5/2026 |
| 4.0.4 | 2,835 | 6/13/2026 |
| 4.0.3 | 1,040 | 5/23/2026 |
| 4.0.2 | 1,442 | 5/14/2026 |
| 4.0.1 | 306 | 5/11/2026 |
| 4.0.0 | 635 | 5/6/2026 |
| 3.0.18 | 1,923 | 4/25/2026 |
| 3.0.17 | 1,445 | 3/29/2026 |
| 3.0.16 | 20,190 | 3/15/2026 |
| 3.0.15 | 1,581 | 2/22/2026 |
| 3.0.14 | 3,103 | 1/18/2026 |
| 3.0.13 | 1,940 | 12/14/2025 |
| 3.0.12 | 12,665 | 11/16/2025 |
| 3.0.11 | 3,661 | 10/19/2025 |