Skip to content

Commit 716c2a5

Browse files
authored
Merge pull request #1318 from dotnet/dev/andarno/libtemplateUpdate
Merge latest Library.Template
2 parents fd4de96 + 9613a92 commit 716c2a5

35 files changed

Lines changed: 450 additions & 139 deletions

.config/dotnet-tools.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,39 @@
33
"isRoot": true,
44
"tools": {
55
"powershell": {
6-
"version": "7.5.4",
6+
"version": "7.6.0",
77
"commands": [
88
"pwsh"
99
],
1010
"rollForward": false
1111
},
1212
"dotnet-coverage": {
13-
"version": "18.1.0",
13+
"version": "18.5.2",
1414
"commands": [
1515
"dotnet-coverage"
1616
],
1717
"rollForward": false
1818
},
1919
"nbgv": {
20-
"version": "3.8.118",
20+
"version": "3.9.50",
2121
"commands": [
2222
"nbgv"
2323
],
2424
"rollForward": false
2525
},
2626
"docfx": {
27-
"version": "2.78.4",
27+
"version": "2.78.5",
2828
"commands": [
2929
"docfx"
3030
],
3131
"rollForward": false
3232
},
3333
"nerdbank.dotnetrepotools": {
34-
"version": "1.0.92",
34+
"version": "1.2.1",
3535
"commands": [
3636
"repo"
3737
],
3838
"rollForward": false
3939
}
4040
}
41-
}
41+
}

.devcontainer/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Refer to https://hub.docker.com/_/microsoft-dotnet-sdk for available versions
2-
FROM mcr.microsoft.com/dotnet/sdk:9.0.306-noble@sha256:d88e637d15248531967111fba05c6725ad45ea1dace3d35d8cfe2c4d4094e25d
2+
FROM mcr.microsoft.com/dotnet/sdk:10.0.201@sha256:478b9038d187e5b5c29bfa8173ded5d29e864b5ad06102a12106380ee01e2e49
33

44
# Installing mono makes `dotnet test` work without errors even for net472.
55
# But installing it takes a long time, so it's excluded by default.

.github/Prime-ForCopilot.ps1

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
if ((git -C $PSScriptRoot rev-parse --is-shallow-repository) -eq 'true')
2+
{
3+
Write-Host "Shallow clone detected, disabling NBGV Git engine so the build can succeed."
4+
$env:NBGV_GitEngine='Disabled'
5+
}

.github/actions/publish-artifacts/action.yaml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,46 +14,46 @@ runs:
1414

1515
- name: 📢 Upload project.assets.json files
1616
if: always()
17-
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
17+
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
1818
with:
1919
name: projectAssetsJson-${{ runner.os }}
2020
path: ${{ runner.temp }}/_artifacts/projectAssetsJson
2121
continue-on-error: true
2222
- name: 📢 Upload variables
23-
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
23+
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
2424
with:
2525
name: variables-${{ runner.os }}
2626
path: ${{ runner.temp }}/_artifacts/Variables
2727
continue-on-error: true
2828
- name: 📢 Upload build_logs
2929
if: always()
30-
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
30+
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
3131
with:
3232
name: build_logs-${{ runner.os }}
3333
path: ${{ runner.temp }}/_artifacts/build_logs
3434
continue-on-error: true
3535
- name: 📢 Upload testResults
3636
if: always()
37-
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
37+
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
3838
with:
3939
name: testResults-${{ runner.os }}
4040
path: ${{ runner.temp }}/_artifacts/testResults
4141
continue-on-error: true
4242
- name: 📢 Upload coverageResults
4343
if: always()
44-
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
44+
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
4545
with:
4646
name: coverageResults-${{ runner.os }}
4747
path: ${{ runner.temp }}/_artifacts/coverageResults
4848
continue-on-error: true
4949
- name: 📢 Upload symbols
50-
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
50+
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
5151
with:
5252
name: symbols-${{ runner.os }}
5353
path: ${{ runner.temp }}/_artifacts/symbols
5454
continue-on-error: true
5555
- name: 📢 Upload deployables
56-
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
56+
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
5757
with:
5858
name: deployables-${{ runner.os }}
5959
path: ${{ runner.temp }}/_artifacts/deployables

.github/copilot-instructions.md

Lines changed: 64 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,8 @@
33
## High level guidance
44

55
* Review the `CONTRIBUTING.md` file for instructions to build and test the software.
6-
* Set the `NBGV_GitEngine` environment variable to `Disabled` before running any `dotnet` or `msbuild` commands.
7-
8-
## Environment Setup and Shallow Clone Workaround
9-
10-
This repository uses Nerdbank.GitVersioning which depends on git history for version calculation. Since GitHub Copilot Coding Agent operates on shallow clones, you MUST set the following environment variable before running any build commands:
11-
12-
```bash
13-
export NBGV_GitEngine=Disabled
14-
```
15-
16-
**Important**: The environment variable name and value are case-sensitive. This setting:
17-
- Removes access to git history during builds
18-
- Allows builds to succeed in shallow clone environments
19-
- Results in incorrect version stamps (expected in Copilot environment)
20-
- Still generates the `ThisAssembly` class but with fewer properties
6+
* Run the `.github/Prime-ForCopilot.ps1` script (once) before running any `dotnet` or `msbuild` commands.
7+
If you see any build errors about not finding git objects or a shallow clone, it may be time to run this script again.
218

229
## Building and Testing
2310

@@ -44,12 +31,71 @@ export NBGV_GitEngine=Disabled
4431

4532
## Testing Guidelines
4633

47-
* There should generally be one test project (under the `test` directory) per shipping project (under the `src` directory). Test projects are named after the project being tested with a `.Test` suffix.
48-
* Tests should use the Xunit testing framework.
49-
* Some tests are known to be unstable. When running tests, you should skip the unstable ones by running `dotnet test --filter "TestCategory!=FailsInCloudTest"`.
34+
**IMPORTANT**: This repository uses Microsoft.Testing.Platform (MTP v2) with xunit v3. Traditional `--filter` syntax does NOT work. Use the options below instead.
35+
36+
* There should generally be one test project (under the `test` directory) per shipping project (under the `src` directory). Test projects are named after the project being tested with a `.Tests` suffix.
37+
* Tests use xunit v3 with Microsoft.Testing.Platform (MTP v2). Traditional VSTest `--filter` syntax does NOT work.
38+
* Some tests are known to be unstable. When running tests, you should skip the unstable ones by using `-- --filter-not-trait "FailsInCloudTest=true"`.
5039
* Write tests that cover both happy path and edge cases.
5140
* Ensure all new functionality is covered by tests.
5241

42+
### Running Tests
43+
44+
**Run all tests**:
45+
```bash
46+
dotnet test --no-build -c Release
47+
```
48+
49+
**Run tests for a specific test project**:
50+
```bash
51+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release
52+
```
53+
54+
**Run a single test method**:
55+
```bash
56+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-method ClassName.MethodName
57+
```
58+
59+
**Run all tests in a test class**:
60+
```bash
61+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-class ClassName
62+
```
63+
64+
**Run tests with wildcard matching** (supports wildcards at beginning and/or end):
65+
```bash
66+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-method "*Pattern*"
67+
```
68+
69+
**Run tests with a specific trait** (equivalent to category filtering):
70+
```bash
71+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-trait "TraitName=value"
72+
```
73+
74+
**Exclude tests with a specific trait** (skip unstable tests):
75+
```bash
76+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-not-trait "TestCategory=FailsInCloudTest"
77+
```
78+
79+
**Run tests for a specific framework only**:
80+
```bash
81+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release --framework net9.0
82+
```
83+
84+
**List all available tests without running them**:
85+
```bash
86+
cd test/Library.Tests
87+
dotnet run --no-build -c Release --framework net9.0 -- --list-tests
88+
```
89+
90+
**Key points about test filtering with MTP v2 / xunit v3**:
91+
- Options after `--` are passed to the test runner, not to `dotnet test`
92+
- Use `--filter-method`, `--filter-class`, `--filter-namespace` for simple filtering
93+
- Use `--filter-trait` and `--filter-not-trait` for trait-based filtering (replaces `--filter "TestCategory=..."`)
94+
- Traditional VSTest `--filter` expressions do NOT work
95+
- Wildcards `*` are supported at the beginning and/or end of filter values
96+
- Multiple simple filters of the same type use OR logic, different types combine with AND
97+
- See `--help` for query filter language for advanced scenarios
98+
5399
## Coding Style
54100

55101
* Honor StyleCop rules and fix any reported build warnings *after* getting tests to pass.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Template release notes
2+
3+
This file will describe significant changes in Library.Template as they are introduced, especially if they require special consideration when merging updates into existing repos.
4+
This file is referenced by update-library-template.prompt.md and should remain in place to facilitate future merges, whether done manually or by AI.
5+
6+
## Solution rename
7+
8+
Never leave a Library.slnx file in the repository.
9+
You might even see one there even though this particular merge didn't bring it in.
10+
This can be an artifact of having renamed Library.sln to Library.slnx in the template repo, but ultimately the receiving repo should have only one .sln or .slnx file, with a better name than `Library`.
11+
Delete any `Library.slnx` that you see.
12+
Migrate an `.sln` in the repo root to `.slnx` using this command:
13+
14+
```ps1
15+
dotnet solution EXISTING.sln migrate
16+
```
17+
18+
This will create an EXISTING.slnx file. `git add` that file, then `git rm` the old `.sln` file.
19+
Sometimes a repo will reference the sln filename in a script or doc somewhere.
20+
Search the repo for such references and update them to the slnx file.
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
---
2+
description: Merges the latest Library.Template into this repo (at position of HEAD) and resolves conflicts.
3+
---
4+
5+
# Instructions
6+
7+
1. Run `tools/MergeFrom-Template.ps1`
8+
2. Resolve merge conflicts, taking into account conflict resolution policy below.
9+
3. Validate the changes, as described in the validation section below.
10+
4. Committing your changes (if applicable).
11+
12+
## Conflict resolution policy
13+
14+
There may be special notes in `.github/prompts/template-release-notes.md` that describe special considerations for certain files or scenarios to help you resolve conflicts appropriately.
15+
Always refer to that file before proceeding.
16+
In particular, focus on the *incoming* part of the file, since it represents the changes from the Library.Template that you are merging into your repo.
17+
18+
Also consider that some repos choose to reject certain Library.Template patterns.
19+
For example the template uses MTPv2 for test projects, but a repo might have chosen not to adopt that.
20+
When resolving merge conflicts, consider whether it looks like the relevant code file is older than it should be given the changes the template is bringing in.
21+
Ask the user when in doubt as to whether the conflict should be resolved in favor of 'catching up' with the template or keeping the current changes.
22+
23+
Use #runSubagent to analyze and resolve merge conflicts across files in parallel.
24+
25+
### Keep Current files
26+
27+
Conflicts in the following files should always be resolved by keeping the current version (i.e. discard incoming changes):
28+
29+
* README.md
30+
31+
### Deleted files
32+
33+
Very typically, when the incoming change is to a file that was deleted locally, the correct resolution is to re-delete the file.
34+
35+
In some cases however, the deleted file may have incoming changes that should be applied to other files.
36+
The `test/Library.Tests/Library.Tests.csproj` file is very typical of this.
37+
Changes to this file should very typically be applied to any and all test projects in the repo.
38+
You are responsible for doing this in addition to re-deleting this template file.
39+
40+
## Validation
41+
42+
Validate the merge result (after resolving any conflicts, if applicable).
43+
Use #runSubagent for each step.
44+
45+
1. Verify that `dotnet restore` succeeds. Fix any issues that come up.
46+
2. Verify that `dotnet build` succeeds.
47+
3. Verify that tests succeed by running `tools/dotnet-test-cloud.ps1`.
48+
49+
While these validations are described using `dotnet` CLI commands, some repos require using full msbuild.exe.
50+
You can detect this by checking the `azure-pipelines/dotnet.yml` or `.github/workflows/build.yml` files for use of one or the other tool.
51+
52+
You are *not* responsible for fixing issues that the merge did not cause.
53+
If validation fails for reasons that seem unrelated to the changes brought in by the merge, advise the user and ask how they'd like you to proceed.
54+
That said, sometimes merges will bring in SDK or dependency updates that can cause breaks in seemingly unrelated areas.
55+
In such cases, you should investigate and solve the issues as needed.
56+
57+
## Committing your changes
58+
59+
If you have to make any changes for validations to pass, consider whether they qualify as a bad merge conflict resolution or more of a novel change that you're making to work with the Library.Template update.
60+
Merge conflict resolution fixes ideally get amended into the merge commit, while novel changes would go into a novel commit after the merge commit.
61+
62+
Always author your commits using `git commit --author "🤖 Copilot <no-reply@github.com>"` (and possibly other parameters).
63+
Describe the nature of the merge conflicts you encountered and how you resolved them in your commit message.
64+
65+
Later, if asked to review pull request validation breaks, always author a fresh commit with each fix that you push, unless the user directs you to do otherwise.

.github/renovate.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
3-
"extends": ["config:best-practices"],
3+
"extends": ["config:best-practices","helpers:pinGitHubActionDigestsToSemver"],
44
"labels": ["dependencies"],
55
"packageRules": [
66
{
@@ -11,6 +11,10 @@
1111
"matchPackageNames": ["xunit*"],
1212
"groupName": "xunit"
1313
},
14+
{
15+
"matchPackageNames": ["Microsoft.Testing.Extensions.*"],
16+
"groupName": "Microsoft Testing Platform"
17+
},
1418
{
1519
"matchDatasources": ["dotnet-version", "docker"],
1620
"matchDepNames": ["dotnet-sdk", "mcr.microsoft.com/dotnet/sdk"],

0 commit comments

Comments
 (0)