Conversation
Converge LanguageTags with the ProjectTemplate hub and work this repo's sync task list. ## What this PR does - **Carry-whole shared artifacts.** `.editorconfig` and `CODESTYLE.md` are re-applied verbatim from the template (every section, including blocks inert in this .NET-only repo), so re-sync stays a clean overwrite rather than a per-section merge. Only the documented in-section repo placeholders are adapted: the .NET project-folder list, `InternalsVisibleTo` names, and VS Code task labels. - **Conform orchestration workflows to the template.** `merge-bot-pull-request.yml` keys concurrency on the PR number; `build-release-task.yml` re-adopts the main-only release-version backstop; `get-version-task.yml` drops a stray comment to restore byte-exact verbatim; `build-datebadge-task.yml` + `publish-release.yml` adopt the caller-gated date-badge model (also fixing a pre-existing `SC2086`). Action pins confirmed identical to the template. - **EOL pins.** `.gitattributes` carries the template's `*.sh` + Dockerfile LF pins and adds one repo-specific LF pin: `.husky/pre-commit` (extensionless hook; a CRLF shebang breaks execution). `LanguageData/` holds downloaded source data the parser reads byte-for-byte; it is left untouched under the `* -text` default (no `text`/`eol=` rule), so `LanguageData/iso6392` stays exactly as downloaded (CRLF preserved) - it is deliberately *not* forced to LF. Workflow YAML stays CRLF, matching the template. - **Docs.** AGENTS.md gains a "Template adaptations" block recording the genuine deviations below; sync-doc bullets align with the carry-whole rule. ## Documented adaptations (for review) The only intentional deviations from the carried template state. Everything else tracks the template verbatim. - **Husky.Net pre-commit gate.** This repo wires the clean-compile checks as local Husky.Net pre-commit git hooks (`dotnet tool restore` + `dotnet husky install`); the template ships no git hooks and treats CI as the only lint backstop. `CODESTYLE.md`'s git-hook note and the `.vscode/tasks.json` convenience-task set are adapted accordingly. CI still runs the same checks. - **Codegen via the `LanguageTagsCreate` CLI, no `NINJA_API_KEY`.** Embedded language data is regenerated by the in-repo `LanguageTagsCreate/` tool pulling directly from the official ISO 639-2/3 + RFC 5646 registries. There is no external codegen API, so this repo carries no `NINJA_API_KEY` secret or any reference to one. - **`merge-upstream-version` job legitimately absent.** `merge-bot-pull-request.yml` carries only `merge-dependabot`, `merge-codegen`, and `disable-auto-merge-on-maintainer-push`. The template's `merge-upstream-version` job auto-merges an upstream-version-bump flow this repo does not run (LanguageTags pins no upstream binary version). Concurrency keying and the three carried jobs match the template verbatim. ## Validation - actionlint: clean - markdownlint: 0 errors --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…up (#192) Bumps the actions-deps group with 1 update: [actions/setup-dotnet](https://github.com/actions/setup-dotnet). Updates `actions/setup-dotnet` from 5.3.0 to 5.4.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/setup-dotnet/releases">actions/setup-dotnet's releases</a>.</em></p> <blockquote> <h2>v5.4.0</h2> <h2>What's Changed</h2> <h3>Enhancements</h3> <ul> <li>Improve global.json SDK version validation for rollForward by <a href="https://github.com/priyagupta108"><code>@priyagupta108</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/742">actions/setup-dotnet#742</a></li> <li>Pin actions to commit SHAs in workflows by <a href="https://github.com/priya-kinthali"><code>@priya-kinthali</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/744">actions/setup-dotnet#744</a></li> <li>Expand the CSC problem matcher to light up more errors on GitHub. by <a href="https://github.com/StephenCleary"><code>@StephenCleary</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/717">actions/setup-dotnet#717</a></li> </ul> <h3>Documentation</h3> <ul> <li>Docs(action): Explicitly mark all optional inputs with required: false by <a href="https://github.com/kranthipoturaju"><code>@kranthipoturaju</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/737">actions/setup-dotnet#737</a></li> </ul> <h3>Bug Fixes</h3> <ul> <li>Fix global.json creation command by <a href="https://github.com/michal2612"><code>@michal2612</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/694">actions/setup-dotnet#694</a></li> </ul> <h3>Dependency Updates</h3> <ul> <li>Upgrade <code>@actions/cache</code> to 5.1.0, log cache write denied by <a href="https://github.com/jasongin"><code>@jasongin</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/746">actions/setup-dotnet#746</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/jasongin"><code>@jasongin</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-dotnet/pull/746">actions/setup-dotnet#746</a></li> <li><a href="https://github.com/michal2612"><code>@michal2612</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-dotnet/pull/694">actions/setup-dotnet#694</a></li> <li><a href="https://github.com/kranthipoturaju"><code>@kranthipoturaju</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-dotnet/pull/737">actions/setup-dotnet#737</a></li> <li><a href="https://github.com/StephenCleary"><code>@StephenCleary</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-dotnet/pull/717">actions/setup-dotnet#717</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/setup-dotnet/compare/v5...v5.4.0">https://github.com/actions/setup-dotnet/compare/v5...v5.4.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions/setup-dotnet/commit/26b0ec14cb23fa6904739307f278c14f94c95bf1"><code>26b0ec1</code></a> Expand the CSC problem matcher to light up more errors on GitHub. (<a href="https://redirect.github.com/actions/setup-dotnet/issues/717">#717</a>)</li> <li><a href="https://github.com/actions/setup-dotnet/commit/da5e5482f2d0700168cff080da45b50da8b60f0e"><code>da5e548</code></a> docs(action): explicitly mark all optional inputs with required: false (<a href="https://redirect.github.com/actions/setup-dotnet/issues/737">#737</a>)</li> <li><a href="https://github.com/actions/setup-dotnet/commit/9bd3b44355ba7c500f3d2e029636c6d29ac5caab"><code>9bd3b44</code></a> Improve readability of global.json creation command (<a href="https://redirect.github.com/actions/setup-dotnet/issues/694">#694</a>)</li> <li><a href="https://github.com/actions/setup-dotnet/commit/4406a635cd2be9c92689ea22b2f74ea57297088c"><code>4406a63</code></a> Bump <code>@actions/cache</code> to 5.1.0, log cache write denied (<a href="https://redirect.github.com/actions/setup-dotnet/issues/746">#746</a>)</li> <li><a href="https://github.com/actions/setup-dotnet/commit/dc3262dda80e97f1c7865b3b122e99240e30b738"><code>dc3262d</code></a> pin actions to commit SHAs in workflows (<a href="https://redirect.github.com/actions/setup-dotnet/issues/744">#744</a>)</li> <li><a href="https://github.com/actions/setup-dotnet/commit/95a3f8b067437dc9b2027a437f5dc3b4569ddd49"><code>95a3f8b</code></a> Validate global.json SDK version before rollForward optimization (<a href="https://redirect.github.com/actions/setup-dotnet/issues/742">#742</a>)</li> <li>See full diff in <a href="https://github.com/actions/setup-dotnet/compare/9a946fdbd5fb07b82b2f5a4466058b876ab72bb2...26b0ec14cb23fa6904739307f278c14f94c95bf1">compare view</a></li> </ul> </details> <br /> [](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 show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Resolve #175 - match a UN M.49 region group against a contained region, e.g. es-419 (Latin America) matches es-MX (Mexico). Adds the CLDR-sourced UnM49Data dataset, an opt-in IsMatch(prefix, tag, regionContainment) overload, ExpandRegion, and a parser fix so a numeric region after the language parses as a region. Restores trimmed parser/lookup comments. Bumps version to 1.4. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Re-sync of the #213/#214/#217 workflow fixes from ptr727/ProjectTemplate (PRs #215/#216/#218), adapted to this single-target NuGet repo. - develop leg is versioned against its own branch (NBGV prerelease tag no longer stripped); validate-release entry gate enforces it both directions. - Surgical, condition-gated cleanup of only the consumed release-asset-* artifacts; blanket cleanup job removed. Closes #195. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
This release-promotion PR brings the current develop head to main, shipping the UN M.49 region containment feature (plus parser/matching updates) and synchronizing the release workflow fixes required for publishing from main.
Changes:
- Bump version floor to 1.4 and update release notes/docs to describe UN M.49 containment matching and region expansion.
- Add CLDR-sourced UN M.49 containment dataset + APIs (
IsMatch(..., regionContainment)andExpandRegion) with accompanying tests. - Re-sync / adjust GitHub Actions workflows for correct develop/main version classification and more targeted artifact handling.
Reviewed changes
Copilot reviewed 24 out of 25 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| version.json | Bump version floor to 1.4. |
| README.md | Update release notes and add UN M.49 containment usage/docs; refactor link definitions. |
| HISTORY.md | Add 1.4 release notes entry. |
| CODESTYLE.md | Template re-sync: carry-whole guidance and expanded general/tooling language. |
| AGENTS.md | Template re-sync: update workflow/process guidance and template-carry notes. |
| LanguageTags/UnM49Data.cs | Add UN M.49 containment loader (CLDR XML) + JSON/codegen helpers + containment queries. |
| LanguageTags/UnM49DataGen.cs | Generated embedded UN M.49 containment dataset. |
| LanguageData/unm49.json | Generated UN M.49 JSON dataset. |
| LanguageTags/LanguageLookup.cs | Add UN M.49-backed containment matching overload and ExpandRegion. |
| LanguageTags/LanguageTagParser.cs | Fix extlang validation to 3 alpha to avoid mis-parsing numeric regions (e.g., es-419). |
| LanguageTags/LanguageSchema.cs | Add UnM49Data to the source-gen JSON context. |
| LanguageTagsCreate/CreateTagData.cs | Extend codegen tool to download/convert/generate UN M.49 data. |
| LanguageTagsTests/UnM49Tests.cs | New dataset and containment tests for UN M.49 data. |
| LanguageTagsTests/LanguageLookupTests.cs | New theories for region containment matching and ExpandRegion. |
| .github/workflows/get-version-task.yml | Thread logical branch into NBGV classification to prevent develop publishing as stable. |
| .github/workflows/build-release-task.yml | Add validate-release gate and surgical deletion of consumed release-asset-* artifacts. |
| .github/workflows/build-nugetlibrary-task.yml | Thread branch through to versioning. |
| .github/workflows/publish-release.yml | Grant actions: write to enable surgical artifact cleanup; adjust badge invocation gating. |
| .github/workflows/test-pull-request.yml | Update action pin; remove blanket artifact cleanup job. |
| .github/workflows/run-codegen-pull-request-task.yml | Update action pin. |
| .github/workflows/build-datebadge-task.yml | Simplify gating (caller-gated) and update BYOB action pin. |
| .github/workflows/merge-bot-pull-request.yml | Fix concurrency grouping under pull_request_target to key on PR number. |
| .gitattributes | Add explicit LF pinning rules for execution-sensitive files (e.g., .sh, Dockerfiles, husky hook). |
| .editorconfig | Add LF rule for Dockerfiles. |
| // <territoryContainment> | ||
| // <group type="419" contains="013 029 005" grouping="true"/> | ||
| // <group type="013" contains="BZ CR GT HN MX NI PA SV"/> | ||
| // Numeric types are UN M.49 region codes, 2 letter values are ISO 3166-1 country codes |
Comment on lines
15
to
19
| private readonly Iso6392Data _iso6392 = Iso6392Data.Create(); | ||
| private readonly Iso6393Data _iso6393 = Iso6393Data.Create(); | ||
| private readonly Rfc5646Data _rfc5646 = Rfc5646Data.Create(); | ||
| private readonly UnM49Data _unM49 = UnM49Data.Create(); | ||
| private readonly List<(string ietf, string iso)> _overrides = []; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Promotes the current
develophead tomainfor release.Contents:
IsMatch(prefix, tag, regionContainment),ExpandRegion, CLDR-sourcedUnM49Data, parser fix for numeric regions; version floor 1.4.validate-releaseentry gate; surgical, condition-gated artifact cleanup replacing the blanket delete.Standard release promotion: merge commit (not squash). A separate
publish-release.ymldispatch performs the actual release after this lands — the workflow fixes must be onmainfor the publish to use them.🤖 Generated with Claude Code