diff --git a/AGENTS.md b/AGENTS.md index 2698dd58f7..861318417b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -64,24 +64,35 @@ Skips `dotnet publish`, AOT, native C++ projects, payload assembly, installer. For changes that need the GVFS payload (`gvfs.exe`, hooks, service) but not an installer. `PublishAot=false` skips ilc (~3–4 min saved); `SkipCreateInstaller=true` skips Inno Setup (~95 s saved). -`GVFS.Payload` cascades to its dependencies (GVFS, GVFS.Mount, GVFS.Hooks, -GVFS.Service) via `ProjectReference`. +`GVFS.Payload` only assembles the payload directory. It does not build or +publish the projects that it copies from. -> **Prerequisite: the native C++ projects must already be built.** They are -> `.vcxproj` (see [Native C++ projects](#native-c-projects-need-msbuild-not-dotnet-build) +> **Prerequisite: the native C++ projects and all managed payload projects must +> already have built outputs.** The native projects are `.vcxproj` (see +> [Native C++ projects](#native-c-projects-need-msbuild-not-dotnet-build) > below) and `dotnet publish` will not build them for you. If you have not > already done a `Build.bat` once in this enlistment, build the native -> projects via VS MSBuild first (or run `Build.bat` once to populate `out\`, -> then iterate with the commands below). After that they are incremental and -> only rebuild when their own sources change. +> projects via VS MSBuild and publish the managed payload projects below +> (or run `Build.bat` once to populate `out\`, then iterate with the commands +> below). After that they are incremental and only rebuild when their own +> sources change. ```powershell dotnet publish src\GVFS\GVFS.FunctionalTests\GVFS.FunctionalTests.csproj ` -c Debug /p:PublishAot=false +dotnet publish src\GVFS\GVFS\GVFS.csproj ` + -c Debug /p:PublishAot=false +dotnet publish src\GVFS\GVFS.Hooks\GVFS.Hooks.csproj ` + -c Debug /p:PublishAot=false +dotnet publish src\GVFS\GVFS.Mount\GVFS.Mount.csproj ` + -c Debug /p:PublishAot=false +dotnet publish src\GVFS\GVFS.Service\GVFS.Service.csproj ` + -c Debug /p:PublishAot=false dotnet publish src\GVFS\GVFS.Payload\GVFS.Payload.csproj ` -c Debug /p:PublishAot=false /p:SkipCreateInstaller=true -src\scripts\RunFunctionalTests-Dev.ps1 Debug --test=GVFS.FunctionalTests.Tests... +src\scripts\RunFunctionalTests-Dev.ps1 -Configuration Debug -Arch x64 ` + --test=GVFS.FunctionalTests.Tests... ``` `layout.bat` (invoked by GVFS.Payload) `xcopy`s from each project's `publish\` @@ -89,10 +100,28 @@ or native-output directory — the C# projects do not require AOT, so `PublishAot=false` produces a fully functional test payload. The native hook binaries are copied straight from the vcxproj output. +> **Publish each changed project explicitly.** `GVFS.Payload.csproj` has no +> `ProjectReference` items. Its `CreatePayload` target runs `layout.bat`, which +> copies existing project output. A project that you do not publish can +> contribute stale output from an earlier build. Publish all four managed +> payload projects at least once in a new enlistment, and publish a project +> again when you change it. + `RunFunctionalTests-Dev.ps1` runs functional tests against the build output without requiring admin or a system-wide install. It launches the test -service as a console process. Each invocation gets a unique service name -and data dir, so concurrent runs from different worktrees don't collide. +service as a console process. Each invocation gets a unique service name and +service-data directory. Some fixtures still use shared machine paths or drive +mappings, so do not assume that separate test processes can run concurrently. + +The script sets dev-mode variables. `Settings.Default.Initialize` then resolves +`gvfs.exe` and `GVFS.Service.exe` from `out\GVFS.Payload\...`, not +`C:\Program Files\VFS for Git\`. This path does not require a GVFS +installation. + +> **Pass `-Configuration` and `-Arch` by name.** The script's first two +> positional parameters are `Configuration` and `Arch`. A bare +> `RunFunctionalTests-Dev.ps1 Debug --test=...` binds `--test=...` to `-Arch` +> and fails its `ValidateSet`. ### Path C — Installer build (~5 min — only when you need an installer) @@ -135,12 +164,14 @@ participate in the C# inner-loop paths above. ```powershell # ✅ Correct -& "out\GVFS.UnitTests\bin\...\GVFS.UnitTests.exe" --test "GVFS.UnitTests.Common.WorktreeInfoTests" -src\scripts\RunFunctionalTests-Dev.ps1 Debug --test=GVFS.FunctionalTests.Tests.GVFSVerbTests.UnknownVerb +& "out\GVFS.UnitTests\bin\...\GVFS.UnitTests.exe" --test "GVFS.UnitTests.Common.WorktreeInfoTests" +src\scripts\RunFunctionalTests-Dev.ps1 -Configuration Debug -Arch x64 ` + --test=GVFS.FunctionalTests.Tests.GVFSVerbTests.UnknownVerb # ❌ Wrong — silently runs the entire suite -& "out\GVFS.UnitTests\bin\...\GVFS.UnitTests.exe" --where "class =~ Worktree" -src\scripts\RunFunctionalTests-Dev.ps1 Debug --where "cat == Smoke" +& "out\GVFS.UnitTests\bin\...\GVFS.UnitTests.exe" --where "class =~ Worktree" +src\scripts\RunFunctionalTests-Dev.ps1 -Configuration Debug -Arch x64 ` + --where "cat == Smoke" ``` For unit tests, `--where` is merely annoying (the whole suite runs in @@ -230,6 +261,12 @@ string-carrying paths with a real-libgit2 test that uses a non-ASCII input (see `GVFS.FunctionalTests/Tests/LibGit2NonAsciiPathTests.cs`), not a mock-based unit test. +## Public repository hygiene + +Do not include Microsoft-internal work item IDs, ADO URLs, incident IDs, or +internal service names in repository content or pull requests. Describe the +public problem and fix without requiring internal access. + ## Coding standards See [CONTRIBUTING.md](CONTRIBUTING.md) for StyleCop rules, error-handling