Skip to content

Commit 8b63bf9

Browse files
authored
Merge pull request #78 from microsoft/dev/tevinstanley/libtemplateUpdate
Dev/tevinstanley/libtemplate update
2 parents e887de3 + 027b686 commit 8b63bf9

57 files changed

Lines changed: 893 additions & 900 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.config/dotnet-tools.json

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,46 @@
33
"isRoot": true,
44
"tools": {
55
"powershell": {
6-
"version": "7.5.3",
6+
"version": "7.6.1",
77
"commands": [
88
"pwsh"
99
],
1010
"rollForward": false
1111
},
1212
"dotnet-coverage": {
13-
"version": "17.14.2",
13+
"version": "18.6.2",
1414
"commands": [
1515
"dotnet-coverage"
1616
],
1717
"rollForward": false
1818
},
1919
"nbgv": {
20-
"version": "3.7.115",
20+
"version": "3.9.50",
2121
"commands": [
2222
"nbgv"
2323
],
2424
"rollForward": false
2525
},
2626
"docfx": {
27-
"version": "2.78.3",
27+
"version": "2.78.5",
2828
"commands": [
2929
"docfx"
3030
],
3131
"rollForward": false
32+
},
33+
"nerdbank.dotnetrepotools": {
34+
"version": "1.3.22",
35+
"commands": [
36+
"repo"
37+
],
38+
"rollForward": false
39+
},
40+
"dotnet-symbol": {
41+
"version": "9.0.661903",
42+
"commands": [
43+
"dotnet-symbol"
44+
],
45+
"rollForward": false
3246
}
3347
}
3448
}

.devcontainer/Dockerfile

Lines changed: 0 additions & 14 deletions
This file was deleted.

.devcontainer/devcontainer.json

Lines changed: 0 additions & 25 deletions
This file was deleted.

.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@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
17+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
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@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
23+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
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@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
30+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
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@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
37+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
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@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
44+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
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@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
50+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
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@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
56+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
5757
with:
5858
name: deployables-${{ runner.os }}
5959
path: ${{ runner.temp }}/_artifacts/deployables

.github/copilot-instructions.md

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +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.
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.
78

89
## Software Design
910

@@ -12,9 +13,68 @@
1213

1314
## Testing
1415

15-
* 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.
16-
* Tests should use the Xunit testing framework.
17-
* Some tests are known to be unstable. When running tests, you should skip the unstable ones by running `dotnet test --filter "TestCategory!=FailsInCloudTest"`.
16+
**IMPORTANT**: This repository uses Microsoft.Testing.Platform (MTP v2) with xunit v3. Traditional `--filter` syntax does NOT work. Use the options below instead.
17+
18+
* 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.
19+
* Tests use xunit v3 with Microsoft.Testing.Platform (MTP v2). Traditional VSTest `--filter` syntax does NOT work.
20+
* Some tests are known to be unstable. When running tests, you should skip the unstable ones by using `-- --filter-not-trait "FailsInCloudTest=true"`.
21+
22+
### Running Tests
23+
24+
**Run all tests**:
25+
```bash
26+
dotnet test --no-build -c Release
27+
```
28+
29+
**Run tests for a specific test project**:
30+
```bash
31+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release
32+
```
33+
34+
**Run a single test method**:
35+
```bash
36+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-method ClassName.MethodName
37+
```
38+
39+
**Run all tests in a test class**:
40+
```bash
41+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-class ClassName
42+
```
43+
44+
**Run tests with wildcard matching** (supports wildcards at beginning and/or end):
45+
```bash
46+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-method "*Pattern*"
47+
```
48+
49+
**Run tests with a specific trait** (equivalent to category filtering):
50+
```bash
51+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-trait "TraitName=value"
52+
```
53+
54+
**Exclude tests with a specific trait** (skip unstable tests):
55+
```bash
56+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-not-trait "TestCategory=FailsInCloudTest"
57+
```
58+
59+
**Run tests for a specific framework only**:
60+
```bash
61+
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release --framework net9.0
62+
```
63+
64+
**List all available tests without running them**:
65+
```bash
66+
cd test/Library.Tests
67+
dotnet run --no-build -c Release --framework net9.0 -- --list-tests
68+
```
69+
70+
**Key points about test filtering with MTP v2 / xunit v3**:
71+
- Options after `--` are passed to the test runner, not to `dotnet test`
72+
- Use `--filter-method`, `--filter-class`, `--filter-namespace` for simple filtering
73+
- Use `--filter-trait` and `--filter-not-trait` for trait-based filtering (replaces `--filter "TestCategory=..."`)
74+
- Traditional VSTest `--filter` expressions do NOT work
75+
- Wildcards `*` are supported at the beginning and/or end of filter values
76+
- Multiple simple filters of the same type use OR logic, different types combine with AND
77+
- See `--help` for query filter language for advanced scenarios
1878

1979
## Coding style
2080

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
---
2+
name: update-library-template
3+
description: Merges the latest Library.Template into this repo (at position of HEAD) and resolves conflicts.
4+
disable-model-invocation: true
5+
---
6+
7+
# Instructions
8+
9+
1. Run `./tools/MergeFrom-Template.ps1` from the repo root.
10+
2. Resolve merge conflicts, taking into account conflict resolution policy below.
11+
3. Validate the changes, as described in the validation section below.
12+
4. Committing your changes (if applicable).
13+
14+
## Conflict resolution policy
15+
16+
There may be [special notes](template-release-notes.md) that describe special considerations for certain files or scenarios to help you resolve conflicts appropriately.
17+
Always refer to that file before proceeding.
18+
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.
19+
20+
Also consider that some repos choose to reject certain Library.Template patterns.
21+
For example the template uses MTPv2 for test projects, but a repo might have chosen not to adopt that.
22+
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.
23+
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.
24+
25+
Use #runSubagent to analyze and resolve merge conflicts across files in parallel.
26+
27+
### Keep Current files
28+
29+
Conflicts in the following files should always be resolved by keeping the current version (i.e. discard incoming changes):
30+
31+
* README.md
32+
33+
### Deleted files
34+
35+
Very typically, when the incoming change is to a file that was deleted locally, the correct resolution is to re-delete the file.
36+
37+
In some cases however, the deleted file may have incoming changes that should be applied to other files.
38+
The `test/Library.Tests/Library.Tests.csproj` file is very typical of this.
39+
Changes to this file should very typically be applied to any and all test projects in the repo.
40+
You are responsible for doing this in addition to re-deleting this template file.
41+
42+
## Updating package and SDK versions
43+
44+
After the merge, always check global.json for MSBuild Sdks with names starting with `Microsoft.VisualStudio.Internal.MicroBuild`.
45+
These SDK versions should match the value of the `MicroBuildVersion` property found in `Directory.Packages.props`.
46+
Always take the latest of the versions you see among these SDKs and the `MicroBuildVersion` property.
47+
48+
## Validation
49+
50+
Validate the merge result (after resolving any conflicts, if applicable).
51+
Use #runSubagent for each step.
52+
53+
1. Verify that `dotnet restore` succeeds. Fix any issues that come up.
54+
2. Verify that `dotnet build` succeeds.
55+
3. Verify that tests succeed by running `tools/dotnet-test-cloud.ps1`.
56+
57+
While these validations are described using `dotnet` CLI commands, some repos require using full msbuild.exe.
58+
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.
59+
60+
You are *not* responsible for fixing issues that the merge did not cause.
61+
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.
62+
That said, sometimes merges will bring in SDK or dependency updates that can cause breaks in seemingly unrelated areas.
63+
In such cases, you should investigate and solve the issues as needed.
64+
65+
## Committing your changes
66+
67+
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.
68+
Merge conflict resolution fixes ideally get amended into the merge commit, while novel changes would go into a novel commit after the merge commit.
69+
70+
Always author your commits using `git commit --author "🤖 Copilot <no-reply@github.com>"` (and possibly other parameters).
71+
Describe the nature of the merge conflicts you encountered and how you resolved them in your commit message.
72+
73+
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.
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.

0 commit comments

Comments
 (0)