Skip to content

Merge dotnet/templating source into dotnet/sdk (Phase 1: history-preserving migration)#53647

Open
MichaelSimons wants to merge 3685 commits intodotnet:mainfrom
MichaelSimons:merge-templating-phase1
Open

Merge dotnet/templating source into dotnet/sdk (Phase 1: history-preserving migration)#53647
MichaelSimons wants to merge 3685 commits intodotnet:mainfrom
MichaelSimons:merge-templating-phase1

Conversation

@MichaelSimons
Copy link
Copy Markdown
Member

@MichaelSimons MichaelSimons commented Mar 31, 2026

Related to: dotnet/templating#10085

Summary

This PR copies the source, tests, tools, documentation, and supporting files from dotnet/templating into dotnet/sdk with full commit history preserved. This is Phase 1 of the templating consolidation — source migration only, with no build integration yet.

What's included

None of the migrated content is wired into the SDK build. The projects are not referenced in sdk.slnx or source-build.slnf, so they sit inert in the tree. Build integration will come in subsequent check-ins (Phase 2).

Path mapping

Source (dotnet/templating) Destination (dotnet/sdk)
src/ src/TemplateEngine/
tools/ src/TemplateEngine/Tools/
test/ test/TemplateEngine/
template_feed/ template_feed/ (merged with existing)
docs/ documentation/TemplateEngine/
dotnet-template-samples/ documentation/TemplateEngine/Samples/
Microsoft.TemplateEngine.sln src/TemplateEngine/Microsoft.TemplateEngine.sln
search-cache-pipeline.yml eng/pipelines/search-cache-pipeline.yml

Repo scaffolding files (LICENSE, README, CODEOWNERS, Directory.Build.props, azure-pipelines*.yml, etc.) were intentionally excluded. Their contents will be merged into the corresponding SDK files in a later phase.

How history was preserved

  1. Clone dotnet/templating to a temporary directory.
  2. Run git filter-repo to keep only the paths listed above and rename them to their SDK destinations:
    git filter-repo \
      --path src/ --path tools/ --path test/ --path template_feed/ \
      --path docs/ --path dotnet-template-samples/ \
      --path Microsoft.TemplateEngine.sln --path search-cache-pipeline.yml \
      --path-rename src/:src/TemplateEngine/ \
      --path-rename tools/:src/TemplateEngine/Tools/ \
      --path-rename test/:test/TemplateEngine/ \
      --path-rename docs/:documentation/TemplateEngine/ \
      --path-rename dotnet-template-samples/:documentation/TemplateEngine/Samples/ \
      --path-rename Microsoft.TemplateEngine.sln:src/TemplateEngine/Microsoft.TemplateEngine.sln \
      --path-rename search-cache-pipeline.yml:eng/pipelines/search-cache-pipeline.yml
    
  3. Add the filtered repo as a remote in the SDK and merge with --allow-unrelated-histories, producing a two-parent merge commit.
  4. Resolve one conflict in template_feed/README.md — kept the SDK version (the templating version was a redirect).

The result preserves 3,681 commits from dotnet/templating. git log --follow traces individual files back through the original templating history.

Validation

  • SDK build passes with 0 warnings and 0 errors — the migrated content is not compiled.

v-wuzhai and others added 30 commits May 19, 2025 10:49
[automated] Merge branch 'release/9.0.3xx' => 'main'

Commit migrated from dotnet/templating@c39beef
It got accidentally added due to a darc bug, see dotnet/arcade-services#4837

Commit migrated from dotnet/templating@d82ec8b
Delete src/arcade/eng/common directory

Commit migrated from dotnet/templating@6d78307
…into merge/release/8.0.1xx-to-release/8.0.3xx

Commit migrated from dotnet/templating@01c61ad
…elease/8.0.3xx

[automated] Merge branch 'release/8.0.1xx' => 'release/8.0.3xx'

Commit migrated from dotnet/templating@e51f82c
…into merge/release/8.0.3xx-to-release/8.0.4xx

Commit migrated from dotnet/templating@75cccce
…elease/8.0.4xx

[automated] Merge branch 'release/8.0.3xx' => 'release/8.0.4xx'

Commit migrated from dotnet/templating@e3b5e04
…into merge/release/9.0.1xx-to-release/9.0.3xx

Commit migrated from dotnet/templating@d4177d5
…et#9044)

* Update dependencies from https://github.com/dotnet/arcade build 20250425.5

Microsoft.DotNet.Arcade.Sdk
 From Version 8.0.0-beta.25214.7 -> To Version 8.0.0-beta.25225.5

* Update dependencies from https://github.com/dotnet/arcade build 20250428.2

Microsoft.DotNet.Arcade.Sdk
 From Version 8.0.0-beta.25214.7 -> To Version 8.0.0-beta.25228.2

* Update dependencies from https://github.com/dotnet/arcade build 20250429.5

Microsoft.DotNet.Arcade.Sdk
 From Version 8.0.0-beta.25214.7 -> To Version 8.0.0-beta.25229.5

* Update dependencies from https://github.com/dotnet/arcade build 20250430.1

Microsoft.DotNet.Arcade.Sdk
 From Version 8.0.0-beta.25214.7 -> To Version 8.0.0-beta.25230.1

* Update branding to 8.0.117

* Update queue to ubuntu 2204

* [release/8.0.3xx] Update dependencies from dotnet/arcade (dotnet#9014)

[release/8.0.3xx] Update dependencies from dotnet/arcade


 - Use System.Text.Json in tests instead of unlisted log4net

* [release/8.0.1xx] Update dependencies from dotnet/arcade (dotnet#9013)

[release/8.0.1xx] Update dependencies from dotnet/arcade


 - Use System.Text.Json in tests instead of unlisted log4net

* Update dependencies from https://github.com/dotnet/arcade build 20250514.2 (dotnet#9024)

[release/8.0.1xx] Update dependencies from dotnet/arcade

* Update dependencies from https://github.com/dotnet/arcade build 20250514.2 (dotnet#9025)

[release/8.0.3xx] Update dependencies from dotnet/arcade

* Update dependencies from https://github.com/dotnet/arcade build 20250514.2 (dotnet#9026)

[release/8.0.4xx] Update dependencies from dotnet/arcade

* Update branding to 8.0.314

* Update branding to 8.0.411

* Delete src/arcade/eng/common directory

It got accidentally added due to a darc bug, see dotnet/arcade-services#4837

* Delete src/arcade/eng/common directory

---------

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: Sean Reeser <v-seanreeser@microsoft.com>
Co-authored-by: Jason Zhai <v-wuzhai@microsoft.com>
Co-authored-by: dotnet-maestro[bot] <42748379+dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: Marc Paine <marcpop@microsoft.com>
Co-authored-by: Alexander Köplinger <alex.koeplinger@outlook.com>
Co-authored-by: Michael Yanni <MiYanni@microsoft.com>

Commit migrated from dotnet/templating@05b367e
It got accidentally added due to a darc bug, see dotnet/arcade-services#4837

Commit migrated from dotnet/templating@84cec7e
[automated] Merge branch 'release/9.0.3xx' => 'main'

Commit migrated from dotnet/templating@0dc7b80
…scovery

We build for NetMinimum when not in source build so target that

Commit migrated from dotnet/templating@5c86301
…into merge/release/9.0.1xx-to-release/9.0.3xx

Commit migrated from dotnet/templating@f32b405
…elease/9.0.3xx

[automated] Merge branch 'release/9.0.1xx' => 'release/9.0.3xx'

Commit migrated from dotnet/templating@d23a2ad
[automated] Merge branch 'release/9.0.3xx' => 'main'

Commit migrated from dotnet/templating@5715045
* [VMR] Codeflow 86117ef-be6b7b2

[[ commit created by automation ]]

* Update dependencies from https://github.com/dotnet/dotnet build 275021
Updated Dependencies:
System.CommandLine (Version 2.0.0-beta6.25360.101 -> 2.0.0-beta7.25362.103)
Microsoft.DotNet.Arcade.Sdk (Version 10.0.0-beta.25360.101 -> 10.0.0-beta.25362.103)

* Update dependencies from https://github.com/dotnet/dotnet build 275039
Updated Dependencies:
System.CommandLine (Version 2.0.0-beta7.25362.103 -> 2.0.0-beta7.25363.101)
Microsoft.DotNet.Arcade.Sdk (Version 10.0.0-beta.25362.103 -> 10.0.0-beta.25363.101)

* Ajust following the change to dotnet/command-line-api

---------

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: Gang Wang <v-gaw@microsoft.com>

Commit migrated from dotnet/templating@43d52c4
[main] Source code updates from dotnet/dotnet


 - Remove properties which now live in Version.Details.props

 - Update global.json

Commit migrated from dotnet/templating@70f24cf
`FirstOrDefault` can return null, so it's not safe to dereference unconditionally.

Observed while debugging VS:

```
System.NullReferenceException: Object reference not set to an instance of an object.

Microsoft.TemplateEngine.Orchestrator.RunnableProjects.LocalizationModelDeserializer.LoadPostActionModels.AnonymousMethod__4_4((System.Collections.Generic.IEnumerable<string> NameParts, string LocalizedString) s)
System.Linq.Enumerable.WhereSelectEnumerableIterator<(System.Collections.Generic.IEnumerable<string>, string), (System.Collections.Generic.IEnumerable<string>, string)>.MoveNext()
System.Linq.Lookup<string, (System.Collections.Generic.IEnumerable<string>, string)>.Create<(System.Collections.Generic.IEnumerable<string>, string)>(System.Collections.Generic.IEnumerable<(System.Collections.Generic.IEnumerable<string>, string)> source, System.Func<(System.Collections.Generic.IEnumerable<string>, string), string> keySelector, System.Func<(System.Collections.Generic.IEnumerable<string>, string), (System.Collections.Generic.IEnumerable<string>, string)> elementSelector, System.Collections.Generic.IEqualityComparer<string> comparer)
System.Linq.GroupedEnumerable<(System.Collections.Generic.IEnumerable<string>, string), string, (System.Collections.Generic.IEnumerable<string>, string)>.GetEnumerator()
Microsoft.TemplateEngine.Orchestrator.RunnableProjects.LocalizationModelDeserializer.LoadManualInstructionModels(System.Collections.Generic.IEnumerable<(System.Collections.Generic.IEnumerable<string> NameParts, string LocalizedString)> strings)
Microsoft.TemplateEngine.Orchestrator.RunnableProjects.LocalizationModelDeserializer.LoadPostActionModels(System.Collections.Generic.List<(string Key, string Value)> localizedStrings)
Microsoft.TemplateEngine.Orchestrator.RunnableProjects.LocalizationModelDeserializer.Deserialize(Microsoft.TemplateEngine.Abstractions.Mount.IFile file)
Microsoft.TemplateEngine.Orchestrator.RunnableProjects.ScannedTemplateInfo.FindLocalizations()
Microsoft.TemplateEngine.Orchestrator.RunnableProjects.ScannedTemplateInfo.ScannedTemplateInfo(Microsoft.TemplateEngine.Abstractions.IEngineEnvironmentSettings settings, Microsoft.TemplateEngine.Abstractions.IGenerator generator, Microsoft.TemplateEngine.Abstractions.Mount.IFile templateFile)
Microsoft.TemplateEngine.Orchestrator.RunnableProjects.RunnableProjectGenerator.GetTemplatesFromMountPointInternalAsync(Microsoft.TemplateEngine.Abstractions.Mount.IMountPoint source, System.Threading.CancellationToken cancellationToken) Microsoft.TemplateEngine.Orchestrator.RunnableProjects.RunnableProjectGenerator.Microsoft.TemplateEngine.Abstractions.IGenerator.GetTemplatesFromMountPointAsync(Microsoft.TemplateEngine.Abstractions.Mount.IMountPoint source, System.Threading.CancellationToken cancellationToken)
Microsoft.TemplateEngine.Edge.Settings.Scanner.ScanMountPointForTemplatesAsync(Microsoft.TemplateEngine.Edge.Settings.Scanner.MountPointScanSource source, bool logValidationResults, bool returnInvalidTemplates, System.Threading.CancellationToken cancellationToken)
Microsoft.TemplateEngine.Edge.Settings.Scanner.ScanAsync(string mountPointUri, System.Threading.CancellationToken cancellationToken)
Microsoft.TemplateEngine.Edge.Settings.TemplatePackageManager.UpdateTemplateCacheAsync.AnonymousMethod__2(int index)
```

Commit migrated from dotnet/templating@3e63ae5
…ction

Document new options of json post action

Commit migrated from dotnet/templating@fa94156
NikolaMilosavljevic and others added 11 commits March 16, 2026 08:10
# Summary of changes

## 1. Core Shared Infrastructure (1 file)

- **JExtensions.cs** (`src/Shared/JExtensions.cs`) — **Most significant
change.** This shared file (linked into multiple projects) was the
central Newtonsoft.Json helper. Completely rewritten to use
`System.Text.Json.Nodes` (`JsonNode`, `JsonObject`, `JsonArray`,
`JsonValue`) instead of `JObject`/`JToken`/`JArray`. Key changes:
- All extension methods now operate on
`JsonObject`/`JsonNode`/`JsonArray` instead of Newtonsoft types
- `ParseJsonNode()` / `ParseJsonObject()` helpers with
`JsonDocumentOptions` configured for comment handling and trailing
commas
  - `ToJsonString()` for serialization using `JsonSerializer`
- String/int/bool/enum/array/object accessor methods (`ToString()`,
`ToInt32()`, `Get<T>()`, etc.) rewritten for STJ APIs
- `JsonNodeComparer` and `JsonNodeEqualityComparer` utility classes
added

## 2. Package References (5 files)

- **Directory.Packages.props** — Removed `Newtonsoft.Json` package
reference; added `System.Text.Json` and `JsonSchema.Net` (for JSON
schema validation in tests).
- 4 csproj files — Replaced `Newtonsoft.Json` with `System.Text.Json`,
conditioned with `Condition="'$(TargetFrameworkIdentifier)' !=
'.NETCoreApp'"` to avoid NU1510 package pruning warnings
(System.Text.Json is inbox for .NET 10+, but still needed for
`net472`/`netstandard2.0`):
-
`src/Microsoft.TemplateEngine.Edge/Microsoft.TemplateEngine.Edge.csproj`
-
`src/Microsoft.TemplateEngine.Orchestrator.RunnableProjects/Microsoft.TemplateEngine.Orchestrator.RunnableProjects.csproj`
-
`src/Microsoft.TemplateEngine.Utils/Microsoft.TemplateEngine.Utils.csproj`
-
`src/Microsoft.TemplateSearch.Common/Microsoft.TemplateSearch.Common.csproj`
- **Microsoft.TemplateSearch.TemplateDiscovery.csproj** — Removed
`Newtonsoft.Json` reference.
- **RunnableProjects.UnitTests.csproj** — Replaced `Newtonsoft.Json`
with `JsonSchema.Net` for schema validation tests.

## 3. Production Source Files (62 files)

### Microsoft.TemplateEngine.Edge (6 files)

- All converted from `JObject`/`JToken` to `JsonObject`/`JsonNode`

### Microsoft.TemplateEngine.Orchestrator.RunnableProjects (32 files)

### Microsoft.TemplateSearch.Common (11 files)

### Tools/TemplateDiscovery (12 files)

### JsonEncodeValueFormFactory.cs

Added `JavaScriptEncoder.UnsafeRelaxedJsonEscaping` so `"` encodes as
`\"` (matching Newtonsoft behavior) instead of STJ's default `\u0022`.

## 4. Test Files (24 files)

All test files updated to use `System.Text.Json` APIs instead of
Newtonsoft:

## 5. Test Data Fixes (4 files)

Removed duplicate `$schema` properties from template.json files that
Newtonsoft silently tolerated but STJ/JsonSchema.Net rejects:

-
`test_templates/TemplateConditionalProcessing/.template.config/template.json`
-
`test_templates/Invalid/InvalidHostData/.template.config/template.json`
-
`test_templates/SourceWithExcludeAndWithout/With/.template.config/template.json`
-
`test_templates/SourceWithExcludeAndWithout/Without/.template.config/template.json`

## 6. Behavioral Differences Addressed

| Issue | Newtonsoft Behavior | STJ Behavior | Fix Applied |
|-------|-------------------|--------------|-------------|
| Single-quoted JSON | Allowed | Rejected | Fixed test data to use
double quotes |
| Unquoted property names | Allowed | Rejected | Fixed test data to use
quoted names |
| Boolean serialization | `"True"` / `"False"` | `"true"` / `"false"` |
Updated test assertions |
| `"` encoding in JSON strings | `\"` | `\u0022` | Added
`UnsafeRelaxedJsonEscaping` |
| Duplicate JSON keys | Last value wins | Throws `ArgumentException` |
Removed duplicates from test data |
| `JsonNode.ToString()` format | Indented | Indented (but
`ToJsonString()` is compact) | Used `ToJsonString()` in assertions |

## 7. Validation

[VMR
build](https://dev.azure.com/dnceng/internal/_build/results?buildId=2922641&view=results)

Commit migrated from dotnet/templating@9419d16
…otnet#10007)

The pipeline hardcoded net8.0 in the path to the TemplateDiscovery DLL,
but the Arcade SDK NetMinimum changed from net8.0 to net10.0 in January
2026, so the DLL is no longer produced at that path. This has caused
every hourly run to fail since Jan 12.

Use 'dotnet run --no-build --project' instead of a hardcoded DLL path so
the pipeline is TFM-agnostic and won't break when TFMs change.

Also add PublishTestResults@2 task so test results from the build step
are published to Azure DevOps, matching the pattern used by the CI
pipelines.

### Problem
<!-- Add the issue number if exists. Describe the problem otherwise. -->

### Solution
<!-- Describe the solution. -->

### Checks:
- [ ] Added unit tests

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Commit migrated from dotnet/templating@a861186
Contributes to dotnet/templating#9193

Summary of changes.

## 1. Enable AOT compatibility analyzers on all `src/` projects

Each `.csproj` under `src/` received:

```xml
<IsAotCompatible Condition="$([MSBuild]::GetTargetFrameworkIdentifier('$(TargetFramework)')) == '.NETCoreApp'">true</IsAotCompatible>
```

The condition restricts it to .NET Core TFMs, avoiding errors on
`netstandard2.0` / `net472`.

## 2. Replace reflection-based JSON serialization with source-generated
contexts

Three new `JsonSerializerContext` files were added to eliminate
AOT-unsafe `JsonSerializer.Serialize(obj)` calls:

| New file | Serializable type |
|---|---|
| `GlobalSettingsJsonSerializerContext.cs` | `GlobalSettingsData` |
| `SettingsStoreJsonSerializerContext.cs` | `SettingsStore` |
| `TemplateCacheJsonSerializerContext.cs` | `TemplateCache` |

The callers in `GlobalSettings.cs`, `ComponentManager.cs`, and
`TemplatePackageManager.cs` were updated to use the new typed
`WriteObject<T>` overload with `JsonTypeInfo<T>`.

## 3. Convert `WriteObject` to a type-safe generic

In `JExtensions.cs`, the untyped `WriteObject(string, object)` was
replaced with:

```csharp
WriteObject<T>(string path, T obj, JsonTypeInfo<T> jsonTypeInfo)
```

This uses `JsonSerializer.Serialize(stream, obj, jsonTypeInfo)` — fully
AOT-safe.

## 4. Source-gen context for `JsonEncodeValueFormFactory`

In `JsonEncodeValueFormFactory.cs`, the static `JsonSerializerOptions` +
`JsonSerializer.Serialize(value, options)` was replaced with a
`JsonEncodeSerializerContext` using
`[JsonSerializable(typeof(string))]`, calling
`JsonSerializer.Serialize(value, context.String)`.

## 5. AOT suppression attributes on reflection-heavy methods

Methods that inherently use reflection (assembly loading,
`Type.GetType()`, `Activator.CreateInstance`) received method-level
`[UnconditionalSuppressMessage]` attributes with specific IL warning
codes:

| File | Methods annotated | Warning codes |
|---|---|---|
| `ComponentManager.cs` | Constructor, `TryGetComponent<T>`,
`RegisterType`, `GetType` | IL2026, IL2057, IL2067, IL2070, IL2072,
IL3000, IL3050 |
| `Scanner.cs` | `ScanForComponents`, `LoadAllFromPath` | IL2026 |
| `ReflectionLoadProbingPath.cs` | `SelectBestMatch`, `Resolving` |
IL2026 |
| `Bootstrapper.cs` | `Register(Assembly)` | IL2026 |

## 6. AOT annotations on remaining unsafe shared methods

`ToJsonString(object)` and `FromObject(object)` in `JExtensions.cs`
received `[RequiresUnreferencedCode]` + `[RequiresDynamicCode]`
attributes, propagating warnings to callers. The callers in
`TemplateSearchCache.Json.cs`, `TemplateSearchData.Json.cs`,
`TemplatePackageSearchData.Json.cs`, and `TemplateDiscoveryMetadata.cs`
received corresponding `[UnconditionalSuppressMessage]` attributes with
justifications.

All attributes are guarded with `#if NET7_0_OR_GREATER` (or `#if NET`
where appropriate) so they compile cleanly on older TFMs.

Commit migrated from dotnet/templating@97a3783
> [!NOTE]
> This is a codeflow update. It may contain both source code changes
from
> [the VMR](https://github.com/dotnet/dotnet)
> as well as dependency updates. Learn more
[here](https://github.com/dotnet/dotnet/tree/main/docs/Codeflow-PRs.md).

This pull request brings the following source code changes

[marker]: <> (Begin:d76c7d80-5f10-46a5-b5fd-11f3249ef6fc)

## From https://github.com/dotnet/dotnet
- **Subscription**:
[d76c7d80-5f10-46a5-b5fd-11f3249ef6fc](https://maestro.dot.net/subscriptions?search=d76c7d80-5f10-46a5-b5fd-11f3249ef6fc)
- **Build**:
[20260322.8](https://dev.azure.com/dnceng/internal/_build/results?buildId=2933324)
([307311](https://maestro.dot.net/channel/8298/github:dotnet:dotnet/build/307311))
- **Date Produced**: March 23, 2026 10:34:07 AM UTC
- **Commit**:
[491bbab262d2f8179cf5f5651bc0689d9c12739a](dotnet/dotnet@491bbab)
- **Commit Diff**:
[840ea13...491bbab](dotnet/dotnet@840ea13...491bbab)
- **Branch**: [main](https://github.com/dotnet/dotnet/tree/main)

**Updated Dependencies**
- From [11.0.0-beta.26171.106 to 11.0.0-beta.26172.108][1]
  - Microsoft.DotNet.Arcade.Sdk
- From [3.0.0-preview.3.26171.106 to 3.0.0-preview.3.26172.108][1]
  - System.CommandLine

[marker]: <> (End:d76c7d80-5f10-46a5-b5fd-11f3249ef6fc)

[1]: dotnet/dotnet@840ea13...491bbab
[marker]: <> (Start:Footer:CodeFlow PR)

## Associated changes in source repos
-
dotnet/aspnetcore@faf0ea0...3dafd5c
-
dotnet/runtime@cf53805...443d53e
-
dotnet/sdk@31f158e...2122e7d

<details>
<summary>Diff the source with this PR branch</summary>

```bash
darc vmr diff --name-only https://github.com/dotnet/dotnet:491bbab262d2f8179cf5f5651bc0689d9c12739a..https://github.com/dotnet/templating:darc-main-53fc3d74-8494-46da-8cb5-8311f988ae2c
```
</details>

[marker]: <> (End:Footer:CodeFlow PR)

Commit migrated from dotnet/templating@bcf27d1
Fixes dotnet/templating#10025

## Problem

After migrating from Newtonsoft.Json to System.Text.Json, loading
template.json files with duplicate case-insensitive property keys (e.g.
`"Empty"` and `"empty"`) throws an `ArgumentException`:

```
System.ArgumentException: An item with the same key has already been added. Key: empty (Parameter 'key')
   at System.Collections.Generic.OrderedDictionary`2.Add(TKey key, TValue value)
   at System.Text.Json.Nodes.JsonObject.InitializeDictionary()
   at System.Text.Json.Nodes.JsonObject.get_Count()
   ...
   at Microsoft.TemplateEngine.Orchestrator.RunnableProjects.ConfigModel.TemplateConfigModel..ctor(...)
```

This affected MAUI templates (`maui-blazor`, `maui-blazor-solution`)
which intentionally had both `"Empty"` (PascalCase backward-compat
alias) and `"empty"` (lowercase) symbol definitions.

## Root Cause

In `src/Shared/JExtensions.cs`, the `NodeOptions` field was configured
with `PropertyNameCaseInsensitive = true`:

```csharp
private static readonly JsonNodeOptions NodeOptions = new() { PropertyNameCaseInsensitive = true };
```

This caused `JsonObject` to use a case-insensitive internal dictionary.
When any operation triggered `JsonObject.InitializeDictionary()` (e.g.
accessing `.Count`, iterating via `.ToList()`), it attempted to insert
both `"Empty"` and `"empty"` into the same case-insensitive dictionary,
throwing on the duplicate.

This setting was **redundant** — all case-insensitive property lookups
in the codebase already go through the `GetPropertyCaseInsensitive()`
helper method, which manually performs a case-insensitive fallback
search.

## Fix

**File changed:** `src/Shared/JExtensions.cs`

- Removed the `NodeOptions` field entirely (it only existed to set
`PropertyNameCaseInsensitive = true`)
- Replaced all 6 usages of `NodeOptions` in `JsonNode.Parse()` calls
with `null` (uses default `JsonNodeOptions`, which is case-sensitive)

This means `JsonObject` now stores properties with their original casing
and uses a case-sensitive internal dictionary — which tolerates keys
like `"Empty"` and `"empty"` coexisting. Case-insensitive lookups
continue to work through the existing `GetPropertyCaseInsensitive()`
helper.

## Test Added

**File:**
`test/Microsoft.TemplateEngine.Orchestrator.RunnableProjects.UnitTests/TemplateConfigTests/GenericTests.cs`

Added `CanReadTemplateWithDuplicateCaseInsensitiveSymbolKeys` — a
regression test that verifies a template.json with symbols `"Empty"` and
`"empty"` loads without throwing.

Commit migrated from dotnet/templating@791a389
## Summary

`Verify.XunitV3` auto-detects `[Theory]` parameters from the xunit v3
test context and appends them to snapshot file paths. This breaks
snapshot matching because TemplateVerifier already manages naming
uniqueness via `ScenarioName`. It can also cause path-too-long errors,
particularly in Helix where the directory structure is deeper.

This is a behavioral difference between `Verify.Xunit` (xunit v2) and
`Verify.XunitV3` (xunit v3) — the v2 package does not auto-append
parameters, while the v3 package does regardless of test runner mode.

## Fix

Switch from `UseTypeName` + `UseMethodName` to `UseFileName`, which
replaces the entire type+method+parameters naming in a single call. This
prevents Verify from appending auto-detected parameters.

`UseFileName` is the only Verify API that fully controls the output path
— there is no more targeted API to disable parameter auto-appending.
Snapshot file names remain functionally identical; the parameters
previously managed via `UseMethodName` are now pre-baked into the file
name string.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Commit migrated from dotnet/templating@80848b3
…source migration)

Copy source, tools, tests, docs, samples, template_feed, and search-cache pipeline
from dotnet/templating into dotnet/sdk with full commit history preserved.

Path mapping:
  src/                       → src/TemplateEngine/
  tools/                     → src/TemplateEngine/Tools/
  test/                      → test/TemplateEngine/
  docs/                      → documentation/TemplateEngine/
  dotnet-template-samples/   → src/TemplateEngine/Samples/
  template_feed/             → template_feed/
  Microsoft.TemplateEngine.sln → src/TemplateEngine/Microsoft.TemplateEngine.sln
  search-cache-pipeline.yml  → eng/pipelines/search-cache-pipeline.yml

# Conflicts:
#	template_feed/README.md
The dotnet-template-samples content belongs with documentation, not source.
@MichaelSimons MichaelSimons marked this pull request as ready for review March 31, 2026 15:01
@MichaelSimons MichaelSimons requested review from a team and MiYanni as code owners March 31, 2026 15:01
Copilot AI review requested due to automatic review settings March 31, 2026 15:01
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR performs Phase 1 of the dotnet/templating consolidation by migrating TemplateEngine source, tests, tools, docs, and samples into dotnet/sdk with history preserved, without integrating it into the SDK build yet.

Changes:

  • Added TemplateEngine source tree under src/TemplateEngine/ (core engine + abstractions + contracts).
  • Added TemplateEngine documentation and template samples under documentation/TemplateEngine/.
  • Added supporting project files for the migrated content (e.g., TemplateEngine .csproj files).

Reviewed changes

Copilot reviewed 295 out of 1707 changed files in this pull request and generated 14 comments.

Show a summary per file
File Description
src/TemplateEngine/Microsoft.TemplateEngine.Core/TokenConfigExtensions.cs Adds TokenConfig helper extension APIs.
src/TemplateEngine/Microsoft.TemplateEngine.Core/KeysChangedEventArgs.cs Adds event args implementation for monitored variable collections.
src/TemplateEngine/Microsoft.TemplateEngine.Core/FileChange.cs Adds file-change model used during instantiation/dry-run.
src/TemplateEngine/Microsoft.TemplateEngine.Core/CommonOperations.cs Adds common processor operations (whitespace trimming, consume line, etc.).
src/TemplateEngine/Microsoft.TemplateEngine.Core/Operations/ReplacementTokens.cs Adds replacement token model used by operations.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Operations/Replacement.cs Adds “replacement” operation provider implementation.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Operations/Phase.cs Adds phase model for operation sequencing.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Operations/MarkupTokens.cs Adds markup token bundle for markup parsing operations.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Operations/MarkupTokenMapping.cs Adds internal mapping for markup tokens.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Operations/ExpandVariables.cs Adds variable expansion operation provider.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Operations/ConditionalTokens.cs Adds token sets for conditional processing.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Operations/ConditionEvaluator.cs Adds delegate type for condition evaluation callbacks.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Matching/TriePath.cs Adds trie evaluation path tracking type.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Matching/TrieNode.cs Adds trie node type.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Matching/TrieEvaluationDriver.cs Adds driver that advances through byte buffers while evaluating trie.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Matching/Trie.cs Adds trie structure implementation for token matching.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Matching/TerminalLocation.cs Adds match result container for terminals.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Matching/TerminalBase.cs Adds base terminal type for trie matches.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Matching/OperationTerminal.cs Adds terminal tying an IOperation to a token index.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/UnaryScope.cs Adds unary expression scope model.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/BinaryScope.cs Adds binary expression scope model.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/TokenScope.cs Adds expression scope for literal/ref tokens.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/Token.cs Adds token container used by scope builder.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/Operators.cs Adds operator enum used by expression evaluation.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/IEvaluable.cs Adds expression node interface.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/ITypeConverter.cs Adds type conversion abstraction for expression evaluation.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/IOperatorMap.cs Adds operator map abstraction used by parsers.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/TypeConverterDelegate.cs Adds delegate type for typed conversion callbacks.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/ScopeBuilderHelper.cs Adds processor extension to create scope builders.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/Shared/VisualBasicStyleConverters.cs Adds VB-style numeric parsing conversions.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/Shared/CppStyleConverters.cs Adds C++-style numeric parsing and escape encoding/decoding.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/Shared/CoreConverters.cs Adds shared conversion helpers (hex parsing, etc.).
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/Cpp/TokenRef.cs Adds C++ expression token reference model.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/Cpp/TokenFamily.cs Adds C++ token family enum.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/Cpp/QuotedRegionKind.cs Adds quoted region kind enum.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Expressions/Cpp/Operator.cs Adds C++ operator enum.
src/TemplateEngine/Microsoft.TemplateEngine.Core/Microsoft.TemplateEngine.Core.csproj Adds TemplateEngine Core project definition for multi-targeting.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/ValueReadEventHander.cs Adds delegate for value-read events (monitored collections).
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/KeysChangedEventHander.cs Adds delegate for keys-changed events (monitored collections).
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IKeysChangedEventArgs.cs Adds (currently empty) keys-changed event args interface.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IValueReadEventArgs.cs Adds value-read event args interface.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IVariableCollection.cs Adds monitored variable collection contract.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IVariableConfig.cs Adds variable config contract.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IEngineConfig.cs Adds engine config contract used by processor state.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IEncodingConfig.cs Adds encoding config contract used for token matching and variables.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IProcessorState.cs Adds processor state contract used by operations.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IProcessor.cs Adds processor contract for running transformations on streams.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IRunSpec.cs Adds run specification contract.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IGlobalRunSpec.cs Adds global run specification contract.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IOrchestrator.cs Adds orchestrator contract.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IPathMatcher.cs Adds path matcher contract.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IToken.cs Adds token contract used by matching/operations.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/ITokenConfig.cs Adds token-config contract capable of generating tokens by encoding.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/ITokenTrie.cs Adds token trie contract for efficient token matching.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/ITokenTrieEvaluator.cs Adds token trie evaluator contract.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IOperationProvider.cs Adds operation-provider contract.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IOperation.cs Adds operation contract used by the processor.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/IReplacementTokens.cs Adds replacement token contract.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/Microsoft.TemplateEngine.Core.Contracts.csproj Adds contracts project definition.
src/TemplateEngine/Microsoft.TemplateEngine.Core.Contracts/PublicAPI.Unshipped.txt Adds PublicAPI analyzer baseline for new contracts APIs.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ChangeKind.cs Adds file-change kind enum for instantiation results/dry-run.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IVariableCollection.cs Adds base variable collection contract used by the engine.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/TemplateParameterPriority.cs Adds legacy parameter priority enum (obsolete).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/TemplateParameterPrecedenceExtensions.cs Adds conversion extensions between legacy priority and new precedence.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/PrecedenceDefinition.cs Adds precedence definition enum.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/EvaluatedPrecedence.cs Adds evaluated precedence enum.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ParameterChoice.cs Adds parameter choice model.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ParameterChoiceLocalizationModel.cs Adds localization model for parameter choices.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IAllowDefaultIfOptionWithoutValue.cs Adds legacy interface for default-if-no-value behavior (obsolete).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IBaselineInfo.cs Adds baseline info contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ICacheParameter.cs Adds legacy cache parameter contract (obsolete).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ICacheTag.cs Adds legacy cache tag contract (obsolete).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IComponentManager.cs Adds component manager contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IEnvironment.cs Adds environment abstraction for host integration.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IEngineEnvironmentSettings.cs Adds environment settings contract (host, paths, components).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IFileChange.cs Adds file-change contracts for instantiation effects.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ICreationEffects.cs Adds creation effects contracts (v1 and v2).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ICreationPath.cs Adds primary output path contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ICreationResult.cs Adds creation result contract (post actions + outputs).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IIdentifiedComponent.cs Adds identified component contract (Guid Id).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ILocalizationLocator.cs Adds localization locator contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IParameterSet.cs Adds legacy parameter set contract (obsolete).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IParameterSymbolLocalizationModel.cs Adds parameter localization model contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IPathInfo.cs Adds common paths contract for engine settings.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IPostAction.cs Adds post action contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IPrioritizedComponent.cs Adds prioritized component contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IScanTemplateInfo.cs Adds scan template info contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ISearchPackFilter.cs Adds legacy search pack filter contract (obsolete).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ISettingsLoader.cs Adds legacy settings loader contract (obsolete).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IShortNameList.cs Adds legacy short-name list contract (obsolete).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ISimpleConfigModifiers.cs Adds legacy simple config modifiers contract (obsolete).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ITemplate.cs Adds template contract (metadata + validation + generator + mount).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ITemplateInfo.cs Adds template info contract (metadata + locator).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ITemplateLocator.cs Adds template locator contracts.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/ITemplateParameter.cs Adds template parameter contract (priority/precedence, defaults, etc.).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IValidationEntry.cs Adds validation entry contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/IValidationInfo.cs Adds validation info contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Microsoft.TemplateEngine.Abstractions.csproj Adds abstractions project definition.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/PhysicalFileSystem/IFileLastWriteTimeSource.cs Adds legacy file timestamp source (obsolete).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Parameters/DataSource.cs Adds parameter value data source enum.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Parameters/IParameterDefinitionSet.cs Adds parameter definition set contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Parameters/IParameterSetData.cs Adds merged/bound parameter set contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Parameters/ParameterData.cs Adds parameter instance data model.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Parameters/ParameterDefinitionSet.cs Adds parameter definition set implementation.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Parameters/ParameterSetDataExtensions.cs Adds IParameterSetData convenience extensions.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/TemplateFiltering/ITemplateMatchInfo.cs Adds template match info contract for filtering results.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/TemplateFiltering/MatchKind.cs Adds filter match kind enum.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/TemplatePackage/ITemplatePackage.cs Adds template package contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/TemplatePackage/ITemplatePackageProvider.cs Adds template package provider contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/TemplatePackage/ITemplatePackageProviderFactory.cs Adds provider factory contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/TemplatePackage/IManagedTemplatePackage.cs Adds managed template package contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/TemplatePackage/IManagedTemplatePackageProvider.cs Adds managed template package provider contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/TemplatePackage/TemplatePackage.cs Adds basic template package implementation.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Installer/IInstallerFactory.cs Adds installer factory contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Installer/ISerializableInstaller.cs Adds serialization contract for built-in providers.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Installer/InstallRequest.cs Adds install request model.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Installer/InstallResult.cs Adds install result model.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Installer/UpdateRequest.cs Adds update request model.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Installer/UninstallResult.cs Adds uninstall result model.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Installer/InstallerConstants.cs Adds installer constants used by default installers.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Installer/InstallerErrorCode.cs Adds installer error codes.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Installer/InstallerOperationResult.cs Adds base operation result model.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Installer/TemplatePackageData.cs Adds serialized template package data model.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Installer/VulnerabilityInfo.cs Adds vulnerability info record struct.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Mount/IDirectory.cs Adds mount directory abstraction.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Mount/IFile.cs Adds mount file abstraction.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Mount/IFileSystemInfo.cs Adds mount FS entry abstraction.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Mount/IMountPoint.cs Adds mount point abstraction.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Mount/IMountPointFactory.cs Adds mount point factory abstraction.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Mount/IMountPointManager.cs Adds legacy mount point manager abstraction (obsolete).
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Mount/FileSystemInfoKind.cs Adds mount entry kind enum.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Constraints/ITemplateConstraint.cs Adds template constraint contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Constraints/ITemplateConstraintFactory.cs Adds template constraint factory contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Constraints/TemplateConstraintInfo.cs Adds constraint definition model.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Components/IBindSymbolSource.cs Adds bind symbol source component contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Components/ISdkInfoProvider.cs Adds SDK info provider component contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Components/IWorkloadsInfoProvider.cs Adds workloads info provider component contract.
src/TemplateEngine/Microsoft.TemplateEngine.Abstractions/Components/WorkloadInfo.cs Adds workload info model.
documentation/TemplateEngine/Home.md Adds TemplateEngine documentation landing page.
documentation/TemplateEngine/Blog-posts.md Adds list of community blog posts related to templating.
documentation/TemplateEngine/authoring-tools/Authoring-Tools.md Adds authoring tools overview doc.
documentation/TemplateEngine/Samples/README.md Adds template samples overview/readme.
documentation/TemplateEngine/Samples/Microsoft.TemplateEngine.Samples.csproj Adds packaging project for samples content.
documentation/TemplateEngine/Samples/content/17-rename-file/README.md Adds sample 17 README and content.
documentation/TemplateEngine/Samples/content/17-rename-file/MyProject.Con/Program.cs Adds sample 17 project content.
documentation/TemplateEngine/Samples/content/17-rename-file/MyProject.Con/MyProject.Con.csproj Adds sample 17 project content.
documentation/TemplateEngine/Samples/content/17-rename-file/MyProject.Con/FileToRename.cs Adds sample 17 project content.
documentation/TemplateEngine/Samples/content/17-rename-file/MyProject.Con/.template.config/template.json Adds sample 17 template definition.
documentation/TemplateEngine/Samples/content/16-string-value-transform/README.md Adds sample 16 README and content.
documentation/TemplateEngine/Samples/content/16-string-value-transform/MyProject.Con/Program.cs Adds sample 16 project content.
documentation/TemplateEngine/Samples/content/16-string-value-transform/MyProject.Con/MyProject.Con.csproj Adds sample 16 project content.
documentation/TemplateEngine/Samples/content/16-string-value-transform/MyProject.Con/.template.config/template.json Adds sample 16 template definition.
documentation/TemplateEngine/Samples/content/15-computed-symbol/README.md Adds sample 15 README and content.
documentation/TemplateEngine/Samples/content/15-computed-symbol/MyProject.Con/Program.cs Adds sample 15 project content.
documentation/TemplateEngine/Samples/content/15-computed-symbol/MyProject.Con/MyProject.Con.csproj Adds sample 15 project content.
documentation/TemplateEngine/Samples/content/15-computed-symbol/MyProject.Con/.template.config/template.json Adds sample 15 template definition.
documentation/TemplateEngine/Samples/content/14-guid/README.md Adds sample 14 README and content.
documentation/TemplateEngine/Samples/content/14-guid/MyProject.Con/Program.cs Adds sample 14 project content.
documentation/TemplateEngine/Samples/content/14-guid/MyProject.Con/MyProject.Con.csproj Adds sample 14 project content.
documentation/TemplateEngine/Samples/content/14-guid/MyProject.Con/.template.config/template.json Adds sample 14 template definition.
documentation/TemplateEngine/Samples/content/13-constant-value/README.md Adds sample 13 README and content.
documentation/TemplateEngine/Samples/content/13-constant-value/MyProject.Con/Program.cs Adds sample 13 project content.
documentation/TemplateEngine/Samples/content/13-constant-value/MyProject.Con/MyProject.Con.csproj Adds sample 13 project content.
documentation/TemplateEngine/Samples/content/13-constant-value/MyProject.Con/.template.config/template.json Adds sample 13 template definition.
documentation/TemplateEngine/Samples/content/12-random-number/README.md Adds sample 12 README and content.
documentation/TemplateEngine/Samples/content/12-random-number/MyProject.Con/Program.cs Adds sample 12 project content.
documentation/TemplateEngine/Samples/content/12-random-number/MyProject.Con/MyProject.Con.csproj Adds sample 12 project content.
documentation/TemplateEngine/Samples/content/12-random-number/MyProject.Con/.template.config/template.json Adds sample 12 template definition.
documentation/TemplateEngine/Samples/content/11-change-string-casing/README.md Adds sample 11 README and content.
documentation/TemplateEngine/Samples/content/11-change-string-casing/MyProject.Con/Program.cs Adds sample 11 project content.
documentation/TemplateEngine/Samples/content/11-change-string-casing/MyProject.Con/MyProject.Con.csproj Adds sample 11 project content.
documentation/TemplateEngine/Samples/content/11-change-string-casing/MyProject.Con/.template.config/template.json Adds sample 11 template definition.
documentation/TemplateEngine/Samples/content/10-symbol-from-date/README.md Adds sample 10 README and content.
documentation/TemplateEngine/Samples/content/10-symbol-from-date/MyProject.Con/Program.cs Adds sample 10 project content.
documentation/TemplateEngine/Samples/content/10-symbol-from-date/MyProject.Con/MyProject.Con.csproj Adds sample 10 project content.
documentation/TemplateEngine/Samples/content/10-symbol-from-date/MyProject.Con/.template.config/template.json Adds sample 10 template definition.
documentation/TemplateEngine/Samples/content/09-replace-onlyif-after/README.md Adds sample 09 README and content.
documentation/TemplateEngine/Samples/content/09-replace-onlyif-after/MyProject.Con/site.css Adds sample 09 content for onlyIf matching.
documentation/TemplateEngine/Samples/content/09-replace-onlyif-after/MyProject.Con/contact.txt Adds sample 09 content.
documentation/TemplateEngine/Samples/content/09-replace-onlyif-after/MyProject.Con/Program.cs Adds sample 09 project content.
documentation/TemplateEngine/Samples/content/09-replace-onlyif-after/MyProject.Con/MyProject.Con.csproj Adds sample 09 project content.
documentation/TemplateEngine/Samples/content/09-replace-onlyif-after/MyProject.Con/.template.config/template.json Adds sample 09 template definition.
documentation/TemplateEngine/Samples/content/08-restore-on-create/README.md Adds sample 08 README and content.
documentation/TemplateEngine/Samples/content/08-restore-on-create/MyProject.Con.CSharp/Program.cs Adds sample 08 project content.
documentation/TemplateEngine/Samples/content/08-restore-on-create/MyProject.Con.CSharp/MyProject.Con.csproj Adds sample 08 project content.
documentation/TemplateEngine/Samples/content/08-restore-on-create/MyProject.Con.CSharp/.template.config/template.json Adds sample 08 template definition.
documentation/TemplateEngine/Samples/content/08-restore-on-create/MyProject.Con.CSharp/.template.config/dotnetcli.host.json Adds sample 08 CLI host config.
documentation/TemplateEngine/Samples/content/07-param-with-custom-short-name/README.md Adds sample 07 README and content.
documentation/TemplateEngine/Samples/content/07-param-with-custom-short-name/MyProject.Con/contact.txt Adds sample 07 content.
documentation/TemplateEngine/Samples/content/07-param-with-custom-short-name/MyProject.Con/Program.cs Adds sample 07 project content.
documentation/TemplateEngine/Samples/content/07-param-with-custom-short-name/MyProject.Con/MyProject.Con.csproj Adds sample 07 project content.
documentation/TemplateEngine/Samples/content/07-param-with-custom-short-name/MyProject.Con/.template.config/template.json Adds sample 07 template definition.
documentation/TemplateEngine/Samples/content/07-param-with-custom-short-name/MyProject.Con/.template.config/dotnetcli.host.json Adds sample 07 CLI host config.
documentation/TemplateEngine/Samples/content/06-console-csharp-fsharp/README.md Adds sample 06 README and content.
documentation/TemplateEngine/Samples/content/06-console-csharp-fsharp/MyProject.Con.FSharp/Program.fs Adds sample 06 F# content.
documentation/TemplateEngine/Samples/content/06-console-csharp-fsharp/MyProject.Con.FSharp/MyProject.Con.fsproj Adds sample 06 F# project content.
documentation/TemplateEngine/Samples/content/06-console-csharp-fsharp/MyProject.Con.FSharp/.template.config/template.json Adds sample 06 F# template definition.
documentation/TemplateEngine/Samples/content/06-console-csharp-fsharp/MyProject.Con.CSharp/Program.cs Adds sample 06 C# content.
documentation/TemplateEngine/Samples/content/06-console-csharp-fsharp/MyProject.Con.CSharp/MyProject.Con.csproj Adds sample 06 C# project content.
documentation/TemplateEngine/Samples/content/06-console-csharp-fsharp/MyProject.Con.CSharp/.template.config/template.json Adds sample 06 C# template definition.
documentation/TemplateEngine/Samples/content/05-multi-project/README.md Adds sample 05 README and content.
documentation/TemplateEngine/Samples/content/05-multi-project/MyProject.Console/Sample.cs Adds sample 05 project content.
documentation/TemplateEngine/Samples/content/05-multi-project/MyProject.Console/MyProject.Console.csproj Adds sample 05 project content.
documentation/TemplateEngine/Samples/content/05-multi-project/MyProject.Console.Test/MyTest.cs Adds sample 05 test project content.
documentation/TemplateEngine/Samples/content/05-multi-project/MyProject.Console.Test/MyProject.Console.Test.csproj Adds sample 05 test project content.
documentation/TemplateEngine/Samples/content/05-multi-project/.template.config/template.json Adds sample 05 template definition.
documentation/TemplateEngine/Samples/content/04-parameter-from-list/README.md Adds sample 04 README and content.
documentation/TemplateEngine/Samples/content/04-parameter-from-list/MyProject.Con/contact.txt Adds sample 04 content.
documentation/TemplateEngine/Samples/content/04-parameter-from-list/MyProject.Con/Program.cs Adds sample 04 project content.
documentation/TemplateEngine/Samples/content/04-parameter-from-list/MyProject.Con/MyProject.Con.csproj Adds sample 04 project content.
documentation/TemplateEngine/Samples/content/04-parameter-from-list/MyProject.Con/.template.config/template.json Adds sample 04 template definition.
documentation/TemplateEngine/Samples/content/03-optional-page/README.md Adds sample 03 README and content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/appsettings.json Adds sample 03 web content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/appsettings.Development.json Adds sample 03 web content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/Views/_ViewStart.cshtml Adds sample 03 web content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/Views/_ViewImports.cshtml Adds sample 03 web content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/Views/Shared/_Layout.cshtml Adds sample 03 web content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/Views/Shared/Error.cshtml Adds sample 03 web content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/Views/Home/Index.cshtml Adds sample 03 web content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/Views/Home/Contact.cshtml Adds sample 03 web content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/Views/Home/About.cshtml Adds sample 03 web content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/Startup.cs Adds sample 03 web content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/Program.cs Adds sample 03 web content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/MyProject.StarterWeb.csproj Adds sample 03 web project content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/Controllers/HomeController.cs Adds sample 03 web content.
documentation/TemplateEngine/Samples/content/03-optional-page/MyProject.StarterWeb/.template.config/template.json Adds sample 03 template definition.
documentation/TemplateEngine/Samples/content/02-add-parameters/README.md Adds sample 02 README and content.
documentation/TemplateEngine/Samples/content/02-add-parameters/MyProject.Con/Program.cs Adds sample 02 project content.
documentation/TemplateEngine/Samples/content/02-add-parameters/MyProject.Con/MyProject.Con.csproj Adds sample 02 project content.
documentation/TemplateEngine/Samples/content/02-add-parameters/MyProject.Con/.template.config/template.json Adds sample 02 template definition.
documentation/TemplateEngine/Samples/content/01-basic-template/README.md Adds sample 01 README and content.
documentation/TemplateEngine/Samples/content/01-basic-template/MyProject.Con/Program.cs Adds sample 01 project content.
documentation/TemplateEngine/Samples/content/01-basic-template/MyProject.Con/MyProject.Con.csproj Adds sample 01 project content.
documentation/TemplateEngine/Samples/content/01-basic-template/MyProject.Con/.template.config/template.json Adds sample 01 template definition.

The test project discovery globs in UnitTests.proj match TemplateEngine
test projects under test/TemplateEngine/. These projects are not compatible
with the SDK's XUnitRunner.targets infrastructure, causing Helix test
failures. Add TemplateEngine\**\* to the exclude lists.
The template_feed/Microsoft.TemplateEngine.Authoring.Templates directory
adds template.json and templatepack templates that now appear in tab
completion results.
@KalleOlaviNiemitalo
Copy link
Copy Markdown
Contributor

KalleOlaviNiemitalo commented Apr 1, 2026

This import causes GitHub to treat the issue and PR numbers in the commit messages as referring to the wrong repository. For example, Merge pull request #9672 in dotnet/templating@ad57e90 refers to dotnet/templating#9672, but when 4fb7c7a contains the same text, GitHub mislinks it to #9672 instead – which isn't even a pull request.

One way to make that less confusing would be to add trailers referring to the commits in the original repository, so that the links to issues and pull requests could be followed from there (assuming the original repository will be just archived rather than deleted). This would also let people find and read any comments on the original commits.

It would be even nicer to inject the repository name or URL into the issue and PR numbers in commit messages, but I don't know how well that would work if issues are later moved from dotnet/templating to dotnet/sdk. Also, some commit messages might contain occurrences of # + number that don't actually refer to anything on GitHub.

Copy link
Copy Markdown
Member

@mmitche mmitche left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks generally good. There do appear to be some missing dirs:

@MichaelSimons
Copy link
Copy Markdown
Member Author

MichaelSimons commented Apr 1, 2026

Looks generally good. There do appear to be some missing dirs:

Copy link
Copy Markdown
Member

@MiYanni MiYanni left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Structure looks good to me. Definitely makes sense to not pull eng files forward. That required some level of... massaging when moving dotnet/installer into this repo. So, I expect some level of that here too.

@MichaelSimons MichaelSimons force-pushed the merge-templating-phase1 branch from b741251 to 0e4a8a6 Compare April 2, 2026 17:52
@MichaelSimons
Copy link
Copy Markdown
Member Author

MichaelSimons commented Apr 2, 2026

After discussing with @mmitche and the feedback from https://github.com/KalleOlaviNiemitalo, I re-wrote the migrated commit messages and appended a "Commit migrated from https://github.com/dotnet/templating/commit/" message to the end. This makes traversal of the history better.

@MichaelSimons MichaelSimons requested a review from mmitche April 2, 2026 18:14
@mmitche
Copy link
Copy Markdown
Member

mmitche commented Apr 2, 2026

After discussing with @mmitche and the feedback from https://github.com/KalleOlaviNiemitalo, I re-wrote the migrated commit messages and appended a "Commit migrated from https://github.com/dotnet/templating/commit/" message to the end. This makes traversal of the history better.

If you want to go one step further, rewriting the #NNNN to dotnet/templating#NNNN would also help.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.