Showing preview only (1,092K chars total). Download the full file or copy to clipboard to get everything.
Repository: Microsoft/slow-cheetah
Branch: main
Commit: 6e80afd1f24d
Files: 328
Total size: 999.6 KB
Directory structure:
gitextract_7_2kiagc/
├── .azuredevops/
│ └── dependabot.yml
├── .config/
│ └── dotnet-tools.json
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── .editorconfig
│ ├── Prime-ForCopilot.ps1
│ ├── actions/
│ │ └── publish-artifacts/
│ │ └── action.yaml
│ ├── copilot-instructions.md
│ ├── renovate.json
│ ├── skills/
│ │ └── update-library-template/
│ │ ├── SKILL.md
│ │ └── template-release-notes.md
│ └── workflows/
│ ├── copilot-setup-steps.yml
│ ├── docs.yml
│ ├── docs_validate.yml
│ └── libtemplate-update.yml
├── .gitignore
├── .vscode/
│ ├── extensions.json
│ ├── launch.json
│ ├── mcp.json
│ ├── settings.json
│ └── tasks.json
├── .vsts-ci.yml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── CodeQL.yml
├── Directory.Build.props
├── Directory.Build.rsp
├── Directory.Build.targets
├── Directory.Packages.props
├── LICENSE
├── README.md
├── Restore.cmd
├── SECURITY.md
├── SUPPORT.md
├── ThirdPartyNotices.txt
├── appveyor.yml
├── azure-pipelines/
│ ├── Archive-SourceCode.ps1
│ ├── BuildStageVariables.yml
│ ├── Get-InsertionPRId.ps1
│ ├── GlobalVariables.yml
│ ├── Merge-CodeCoverage.ps1
│ ├── NuGetSbom.props
│ ├── PoliCheckExclusions.xml
│ ├── PostPRMessage.ps1
│ ├── TSAOptions.json
│ ├── WIFtoPATauth.yml
│ ├── apiscan.yml
│ ├── archive-sourcecode.yml
│ ├── build.yml
│ ├── dotnet.yml
│ ├── falsepositives.gdnsuppress
│ ├── install-dependencies.yml
│ ├── libtemplate-update.yml
│ ├── microbuild.after.yml
│ ├── microbuild.before.yml
│ ├── no_authenticode.txt
│ ├── no_strongname.txt
│ ├── official.yml
│ ├── prepare-insertion-stages.yml
│ ├── publish-codecoverage.yml
│ ├── publish-symbols.yml
│ ├── publish_artifacts.ps1
│ ├── release-deployment-prep.yml
│ ├── release.yml
│ ├── unofficial.yml
│ ├── vs-insertion-script.ps1
│ ├── vs-insertion.yml
│ └── vs-validation.yml
├── azure-pipelines.yml
├── doc/
│ ├── targets.md
│ ├── transforming_files.md
│ └── update.md
├── docfx/
│ ├── .gitignore
│ ├── docfx.json
│ ├── docs/
│ │ ├── features.md
│ │ ├── getting-started.md
│ │ └── toc.yml
│ ├── index.md
│ └── toc.yml
├── global.json
├── init.cmd
├── init.ps1
├── nuget.config
├── samples/
│ ├── FSharpDemo/
│ │ ├── FSharpDemo.fsproj
│ │ ├── Program.fs
│ │ ├── app.Debug.config
│ │ ├── app.Release.config
│ │ └── app.config
│ ├── Linked-files/
│ │ ├── connectionStrings.Debug.config
│ │ ├── connectionStrings.Release.config
│ │ └── connectionStrings.config
│ ├── SlowCheetah.Samples.sln
│ ├── TransformSetupProject/
│ │ ├── .gitignore
│ │ └── TransformSetupProject.vdproj
│ ├── WebDemo/
│ │ ├── Default.aspx
│ │ ├── Default.aspx.cs
│ │ ├── Default.aspx.designer.cs
│ │ ├── Properties/
│ │ │ └── AssemblyInfo.cs
│ │ ├── Web.Debug.config
│ │ ├── Web.Release.config
│ │ ├── Web.config
│ │ ├── WebDemo.csproj
│ │ ├── connectionStrings.Debug.config
│ │ ├── connectionStrings.Release.config
│ │ ├── connectionStrings.ToPkg.config
│ │ └── connectionStrings.config
│ ├── WindowsAzure1/
│ │ ├── ServiceConfiguration.Cloud.cscfg
│ │ ├── ServiceConfiguration.Local.cscfg
│ │ ├── ServiceDefinition.csdef
│ │ └── WindowsAzure1.ccproj
│ ├── WorkerRole1/
│ │ ├── Properties/
│ │ │ └── AssemblyInfo.cs
│ │ ├── WorkerRole.cs
│ │ ├── WorkerRole1.csproj
│ │ ├── XMLFile1.xml
│ │ ├── app.Debug.config
│ │ ├── app.Release.config
│ │ ├── app.config
│ │ ├── contacts.Debug.xml
│ │ ├── contacts.Release.xml
│ │ ├── contacts.xml
│ │ └── packages.config
│ └── Wpf.Transform/
│ ├── App.xaml
│ ├── App.xaml.cs
│ ├── Assets/
│ │ └── BureauBlue.xaml
│ ├── MainWindow.xaml
│ ├── MainWindow.xaml.cs
│ ├── Properties/
│ │ ├── AssemblyInfo.cs
│ │ ├── Resources.Designer.cs
│ │ ├── Resources.resx
│ │ ├── Settings.Designer.cs
│ │ └── Settings.settings
│ ├── TransformModel.cs
│ ├── Wpf.Transform.csproj
│ ├── app.Debug.config
│ ├── app.Release.config
│ ├── app.config
│ ├── connectionStrings.Debug.config
│ ├── connectionStrings.Release.config
│ ├── connectionStrings.config
│ ├── contacts.Debug.xml
│ ├── contacts.Release.xml
│ └── contacts.xml
├── src/
│ ├── .editorconfig
│ ├── AssemblyInfo.cs
│ ├── AssemblyInfo.vb
│ ├── Directory.Build.props
│ ├── Directory.Build.targets
│ ├── Microsoft.VisualStudio.SlowCheetah/
│ │ ├── Build/
│ │ │ ├── Microsoft.VisualStudio.SlowCheetah.App.targets
│ │ │ ├── Microsoft.VisualStudio.SlowCheetah.ClickOnce.targets
│ │ │ ├── Microsoft.VisualStudio.SlowCheetah.SetupProject.targets
│ │ │ ├── Microsoft.VisualStudio.SlowCheetah.Web.targets
│ │ │ ├── Microsoft.VisualStudio.SlowCheetah.targets
│ │ │ ├── TransformTask.cs
│ │ │ └── readme.txt
│ │ ├── Exceptions/
│ │ │ └── TransformFailedException.cs
│ │ ├── Logging/
│ │ │ ├── ITransformationLogger.cs
│ │ │ ├── JsonShimLogger.cs
│ │ │ ├── TransformationTaskLogger.cs
│ │ │ └── XmlShimLogger.cs
│ │ ├── Microsoft.VisualStudio.SlowCheetah.csproj
│ │ ├── Properties/
│ │ │ └── AssemblyInfo.cs
│ │ ├── Resources/
│ │ │ ├── Resources.Designer.cs
│ │ │ └── Resources.resx
│ │ └── Transformer/
│ │ ├── ITransformer.cs
│ │ ├── JsonTransformer.cs
│ │ ├── TransformUtilities.cs
│ │ ├── TransformerFactory.cs
│ │ └── XmlTransformer.cs
│ ├── Microsoft.VisualStudio.SlowCheetah.Tests/
│ │ ├── App.config
│ │ ├── BaseTest.cs
│ │ ├── BuildTests/
│ │ │ ├── ConfigTransformTestsBase.cs
│ │ │ ├── ConsoleAppTests.cs
│ │ │ ├── TestProjects/
│ │ │ │ ├── ConsoleApp/
│ │ │ │ │ ├── App.Debug.config
│ │ │ │ │ ├── App.Release.config
│ │ │ │ │ ├── App.config
│ │ │ │ │ ├── ConsoleApp.csproj
│ │ │ │ │ ├── Other.Debug.config
│ │ │ │ │ ├── Other.Release.config
│ │ │ │ │ ├── Other.config
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ └── Properties/
│ │ │ │ │ └── AssemblyInfo.cs
│ │ │ │ ├── Directory.Build.props
│ │ │ │ ├── Directory.Build.targets
│ │ │ │ └── WebApplication/
│ │ │ │ ├── Other.Debug.config
│ │ │ │ ├── Other.Release.config
│ │ │ │ ├── Other.config
│ │ │ │ ├── Properties/
│ │ │ │ │ └── AssemblyInfo.cs
│ │ │ │ ├── Web.Debug.config
│ │ │ │ ├── Web.Release.config
│ │ │ │ ├── Web.config
│ │ │ │ └── WebApplication.csproj
│ │ │ └── WebAppTests.cs
│ │ ├── Microsoft.VisualStudio.SlowCheetah.Tests.csproj
│ │ ├── TestUtilities.cs
│ │ ├── TransformTest.cs
│ │ └── example.txt
│ ├── Microsoft.VisualStudio.SlowCheetah.VS/
│ │ ├── Directory.Build.targets
│ │ ├── Microsoft.VisualStudio.SlowCheetah.VS.csproj
│ │ ├── Microsoft.VisualStudio.SlowCheetah.VS.pkgdef
│ │ ├── NugetHandler/
│ │ │ ├── PackageHandlers/
│ │ │ │ ├── BackgroundInstallationHandler.cs
│ │ │ │ ├── BasePackageHandler.cs
│ │ │ │ ├── DialogInstallationHandler.cs
│ │ │ │ ├── EmptyHandler.cs
│ │ │ │ ├── IPackageHandler.cs
│ │ │ │ ├── NuGetUninstaller.cs
│ │ │ │ ├── NugetInstaller.cs
│ │ │ │ ├── TargetsUninstaller.cs
│ │ │ │ └── UserInstallationHandler.cs
│ │ │ ├── SlowCheetahNuGetManager.cs
│ │ │ └── VsProjectTypes.cs
│ │ ├── Options/
│ │ │ ├── AdvancedOptionsDialogPage.cs
│ │ │ ├── AdvancedOptionsUserControl.Designer.cs
│ │ │ ├── AdvancedOptionsUserControl.cs
│ │ │ ├── AdvancedOptionsUserControl.resx
│ │ │ ├── BaseOptionsDialogPage.cs
│ │ │ ├── OptionsDialogPage.cs
│ │ │ ├── OptionsUserControl.Designer.cs
│ │ │ ├── OptionsUserControl.cs
│ │ │ └── OptionsUserControl.resx
│ │ ├── Package/
│ │ │ ├── AddTransformCommand.cs
│ │ │ ├── BaseCommand.cs
│ │ │ ├── PackageSolutionEvents.cs
│ │ │ ├── PreviewTransformCommand.cs
│ │ │ └── SlowCheetahPackageLogger.cs
│ │ ├── Resources/
│ │ │ ├── Guids.cs
│ │ │ ├── PkgCmdID.cs
│ │ │ ├── Resources.Designer.cs
│ │ │ └── Resources.resx
│ │ ├── SlowCheetah.vsct
│ │ ├── SlowCheetahPackage.cs
│ │ ├── TransformationPreviewLogger.cs
│ │ ├── Utilities/
│ │ │ ├── PackageUtilities.cs
│ │ │ └── ProjectUtilities.cs
│ │ ├── VSPackage.Designer.cs
│ │ ├── VSPackage.resx
│ │ └── source.extension.vsixmanifest
│ ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests/
│ │ ├── App.config
│ │ ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests.csproj
│ │ ├── PackageUtilitiesTest.cs
│ │ └── xunit.runner.json
│ ├── Microsoft.VisualStudio.SlowCheetah.Vsix/
│ │ └── Microsoft.VisualStudio.SlowCheetah.Vsix.csproj
│ ├── OptProf.targets
│ ├── SlowCheetah.sln
│ └── build/
│ ├── no_authenticode.txt
│ └── no_strongname.txt
├── stylecop.json
├── test/
│ ├── .editorconfig
│ ├── Directory.Build.props
│ ├── Directory.Build.targets
│ ├── Microsoft.VisualStudio.SlowCheetah.Tests/
│ │ ├── App.config
│ │ ├── BaseTest.cs
│ │ ├── BuildTests/
│ │ │ ├── ConfigTransformTestsBase.cs
│ │ │ ├── ConsoleAppTests.cs
│ │ │ ├── TestProjects/
│ │ │ │ ├── ConsoleApp/
│ │ │ │ │ ├── App.Debug.config
│ │ │ │ │ ├── App.Release.config
│ │ │ │ │ ├── App.config
│ │ │ │ │ ├── ConsoleApp.csproj
│ │ │ │ │ ├── Other.Debug.config
│ │ │ │ │ ├── Other.Release.config
│ │ │ │ │ ├── Other.config
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ └── Properties/
│ │ │ │ │ └── AssemblyInfo.cs
│ │ │ │ ├── Directory.Build.props
│ │ │ │ ├── Directory.Build.targets
│ │ │ │ └── WebApplication/
│ │ │ │ ├── Other.Debug.config
│ │ │ │ ├── Other.Release.config
│ │ │ │ ├── Other.config
│ │ │ │ ├── Web.Debug.config
│ │ │ │ ├── Web.Release.config
│ │ │ │ ├── Web.config
│ │ │ │ └── WebApplication.csproj
│ │ │ └── WebAppTests.cs
│ │ ├── Microsoft.VisualStudio.SlowCheetah.Tests.csproj
│ │ ├── TestUtilities.cs
│ │ ├── TransformTest.cs
│ │ └── example.txt
│ ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests/
│ │ ├── App.config
│ │ ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests.csproj
│ │ └── PackageUtilitiesTest.cs
│ └── dirs.proj
├── tools/
│ ├── Check-DotNetRuntime.ps1
│ ├── Check-DotNetSdk.ps1
│ ├── Convert-PDB.ps1
│ ├── Download-NuGetPackage.ps1
│ ├── Get-ArtifactsStagingDirectory.ps1
│ ├── Get-CodeCovTool.ps1
│ ├── Get-ExternalSymbolFiles.ps1
│ ├── Get-LibTemplateBasis.ps1
│ ├── Get-NuGetTool.ps1
│ ├── Get-ProcDump.ps1
│ ├── Get-SymbolFiles.ps1
│ ├── Get-TempToolsPath.ps1
│ ├── Install-DotNetSdk.ps1
│ ├── Install-NuGetCredProvider.ps1
│ ├── Install-NuGetPackage.ps1
│ ├── MergeFrom-Template.ps1
│ ├── Prepare-Legacy-Symbols.ps1
│ ├── Set-EnvVars.ps1
│ ├── artifacts/
│ │ ├── APIScanInputs.ps1
│ │ ├── LocBin.ps1
│ │ ├── VSInsertion.ps1
│ │ ├── Variables.ps1
│ │ ├── _all.ps1
│ │ ├── _stage_all.ps1
│ │ ├── build_logs.ps1
│ │ ├── coverageResults.ps1
│ │ ├── deployables.ps1
│ │ ├── projectAssetsJson.ps1
│ │ ├── symbols.ps1
│ │ ├── testResults.ps1
│ │ └── test_symbols.ps1
│ ├── dotnet-test-cloud.ps1
│ ├── publish-CodeCov.ps1
│ ├── test.runsettings
│ └── variables/
│ ├── BusinessGroupName.ps1
│ ├── DotNetSdkVersion.ps1
│ ├── InsertJsonValues.ps1
│ ├── InsertPropsValues.ps1
│ ├── InsertTargetBranch.ps1
│ ├── InsertVersionsValues.ps1
│ ├── LocLanguages.ps1
│ ├── ProfilingInputsDropName.ps1
│ ├── ProfilingInputsPropsName.ps1
│ ├── SymbolsFeatureName.ps1
│ ├── VstsDropNames.ps1
│ ├── _all.ps1
│ └── _define.ps1
└── version.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .azuredevops/dependabot.yml
================================================
# Please see the documentation for all configuration options:
# https://eng.ms/docs/products/dependabot/configuration/version_updates
version: 2
updates:
- package-ecosystem: nuget
directory: /
schedule:
interval: monthly
================================================
FILE: .config/dotnet-tools.json
================================================
{
"version": 1,
"isRoot": true,
"tools": {
"powershell": {
"version": "7.6.1",
"commands": [
"pwsh"
],
"rollForward": false
},
"dotnet-coverage": {
"version": "18.6.2",
"commands": [
"dotnet-coverage"
],
"rollForward": false
},
"nbgv": {
"version": "3.9.50",
"commands": [
"nbgv"
],
"rollForward": false
},
"docfx": {
"version": "2.78.5",
"commands": [
"docfx"
],
"rollForward": false
},
"nerdbank.dotnetrepotools": {
"version": "1.3.22",
"commands": [
"repo"
],
"rollForward": false
},
"dotnet-symbol": {
"version": "9.0.661903",
"commands": [
"dotnet-symbol"
],
"rollForward": false
}
}
}
================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome:http://EditorConfig.org
# top-most EditorConfig file
root = true
# Don't use tabs for indentation.
[*]
indent_style = space
# (Please don't specify an indent_size here; that has too many unintended consequences.)
[*.yml]
indent_size = 2
indent_style = space
# Code files
[*.{cs,csx,vb,vbx,h,cpp,idl}]
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true
# MSBuild project files
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj,msbuildproj,props,targets}]
indent_size = 2
# Xml config files
[*.{ruleset,config,nuspec,resx,vsixmanifest,vsct,runsettings}]
indent_size = 2
indent_style = space
# JSON files
[*.json]
indent_size = 2
indent_style = space
[*.ps1]
indent_style = space
indent_size = 4
# Dotnet code style settings:
[*.{cs,vb}]
# Sort using and Import directives with System.* appearing first
dotnet_sort_system_directives_first = true
dotnet_separate_import_directive_groups = false
dotnet_style_qualification_for_field = true:warning
dotnet_style_qualification_for_property = true:warning
dotnet_style_qualification_for_method = true:warning
dotnet_style_qualification_for_event = true:warning
# Use language keywords instead of framework type names for type references
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
# Suggest more modern language features when available
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
# Non-private static fields are PascalCase
dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.symbols = non_private_static_fields
dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.style = non_private_static_field_style
dotnet_naming_symbols.non_private_static_fields.applicable_kinds = field
dotnet_naming_symbols.non_private_static_fields.applicable_accessibilities = public, protected, internal, protected internal, private protected
dotnet_naming_symbols.non_private_static_fields.required_modifiers = static
dotnet_naming_style.non_private_static_field_style.capitalization = pascal_case
# Constants are PascalCase
dotnet_naming_rule.constants_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.constants_should_be_pascal_case.symbols = constants
dotnet_naming_rule.constants_should_be_pascal_case.style = constant_style
dotnet_naming_symbols.constants.applicable_kinds = field, local
dotnet_naming_symbols.constants.required_modifiers = const
dotnet_naming_style.constant_style.capitalization = pascal_case
# Static fields are camelCase
dotnet_naming_rule.static_fields_should_be_camel_case.severity = suggestion
dotnet_naming_rule.static_fields_should_be_camel_case.symbols = static_fields
dotnet_naming_rule.static_fields_should_be_camel_case.style = static_field_style
dotnet_naming_symbols.static_fields.applicable_kinds = field
dotnet_naming_symbols.static_fields.required_modifiers = static
dotnet_naming_style.static_field_style.capitalization = camel_case
# Instance fields are camelCase
dotnet_naming_rule.instance_fields_should_be_camel_case.severity = suggestion
dotnet_naming_rule.instance_fields_should_be_camel_case.symbols = instance_fields
dotnet_naming_rule.instance_fields_should_be_camel_case.style = instance_field_style
dotnet_naming_symbols.instance_fields.applicable_kinds = field
dotnet_naming_style.instance_field_style.capitalization = camel_case
# Locals and parameters are camelCase
dotnet_naming_rule.locals_should_be_camel_case.severity = suggestion
dotnet_naming_rule.locals_should_be_camel_case.symbols = locals_and_parameters
dotnet_naming_rule.locals_should_be_camel_case.style = camel_case_style
dotnet_naming_symbols.locals_and_parameters.applicable_kinds = parameter, local
dotnet_naming_style.camel_case_style.capitalization = camel_case
# Local functions are PascalCase
dotnet_naming_rule.local_functions_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.local_functions_should_be_pascal_case.symbols = local_functions
dotnet_naming_rule.local_functions_should_be_pascal_case.style = local_function_style
dotnet_naming_symbols.local_functions.applicable_kinds = local_function
dotnet_naming_style.local_function_style.capitalization = pascal_case
# By default, name items with PascalCase
dotnet_naming_rule.members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.members_should_be_pascal_case.symbols = all_members
dotnet_naming_rule.members_should_be_pascal_case.style = pascal_case_style
dotnet_naming_symbols.all_members.applicable_kinds = *
dotnet_naming_style.pascal_case_style.capitalization = pascal_case
# CSharp code style settings:
[*.cs]
# Indentation preferences
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = flush_left
# Prefer "var" everywhere
csharp_style_var_for_built_in_types = false
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = false:warning
# Prefer method-like constructs to have a block body
csharp_style_expression_bodied_methods = false:none
csharp_style_expression_bodied_constructors = false:none
csharp_style_expression_bodied_operators = false:none
# Prefer property-like constructs to have an expression-body
csharp_style_expression_bodied_properties = true:none
csharp_style_expression_bodied_indexers = true:none
csharp_style_expression_bodied_accessors = true:none
# Suggest more modern language features when available
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion
# Newline settings
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
# Blocks are allowed
csharp_prefer_braces = true:silent
# SA1130: Use lambda syntax
dotnet_diagnostic.SA1130.severity = silent
# IDE1006: Naming Styles - StyleCop handles these for us
dotnet_diagnostic.IDE1006.severity = none
dotnet_diagnostic.DOC100.severity = silent
dotnet_diagnostic.DOC104.severity = warning
dotnet_diagnostic.DOC105.severity = warning
dotnet_diagnostic.DOC106.severity = warning
dotnet_diagnostic.DOC107.severity = warning
dotnet_diagnostic.DOC108.severity = warning
dotnet_diagnostic.DOC200.severity = warning
dotnet_diagnostic.DOC202.severity = warning
# CA1062: Validate arguments of public methods
dotnet_diagnostic.CA1062.severity = warning
# CA2016: Forward the CancellationToken parameter
dotnet_diagnostic.CA2016.severity = warning
[*.sln]
indent_style = tab
================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
# Ensure shell scripts use LF line endings (linux only accepts LF)
*.sh eol=lf
*.ps1 eol=lf
# The macOS codesign tool is extremely picky, and requires LF line endings.
*.plist eol=lf
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
================================================
FILE: .github/.editorconfig
================================================
[renovate.json*]
indent_style = tab
================================================
FILE: .github/Prime-ForCopilot.ps1
================================================
if ((git -C $PSScriptRoot rev-parse --is-shallow-repository) -eq 'true')
{
Write-Host "Shallow clone detected, disabling NBGV Git engine so the build can succeed."
$env:NBGV_GitEngine='Disabled'
}
================================================
FILE: .github/actions/publish-artifacts/action.yaml
================================================
name: Publish artifacts
description: Publish artifacts
runs:
using: composite
steps:
- name: 📥 Collect artifacts
run: tools/artifacts/_stage_all.ps1
shell: pwsh
if: always()
# TODO: replace this hard-coded list with a loop that utilizes the NPM package at
# https://github.com/actions/toolkit/tree/main/packages/artifact (or similar) to push the artifacts.
- name: 📢 Upload project.assets.json files
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: projectAssetsJson-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/projectAssetsJson
continue-on-error: true
- name: 📢 Upload variables
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: variables-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/Variables
continue-on-error: true
- name: 📢 Upload build_logs
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: build_logs-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/build_logs
continue-on-error: true
- name: 📢 Upload testResults
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: testResults-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/testResults
continue-on-error: true
- name: 📢 Upload coverageResults
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: coverageResults-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/coverageResults
continue-on-error: true
- name: 📢 Upload symbols
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: symbols-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/symbols
continue-on-error: true
- name: 📢 Upload deployables
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: deployables-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/deployables
if: always()
================================================
FILE: .github/copilot-instructions.md
================================================
# Copilot instructions for this repository
## High level guidance
* Review the `CONTRIBUTING.md` file for instructions to build and test the software.
* Run the `.github/Prime-ForCopilot.ps1` script (once) before running any `dotnet` or `msbuild` commands.
If you see any build errors about not finding git objects or a shallow clone, it may be time to run this script again.
## Software Design
* Design APIs to be highly testable, and all functionality should be tested.
* Avoid introducing binary breaking changes in public APIs of projects under `src` unless their project files have `IsPackable` set to `false`.
## Testing
**IMPORTANT**: This repository uses Microsoft.Testing.Platform (MTP v2) with xunit v3. Traditional `--filter` syntax does NOT work. Use the options below instead.
* 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.
* Tests use xunit v3 with Microsoft.Testing.Platform (MTP v2). Traditional VSTest `--filter` syntax does NOT work.
* Some tests are known to be unstable. When running tests, you should skip the unstable ones by using `-- --filter-not-trait "FailsInCloudTest=true"`.
### Running Tests
**Run all tests**:
```bash
dotnet test --no-build -c Release
```
**Run tests for a specific test project**:
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release
```
**Run a single test method**:
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-method ClassName.MethodName
```
**Run all tests in a test class**:
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-class ClassName
```
**Run tests with wildcard matching** (supports wildcards at beginning and/or end):
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-method "*Pattern*"
```
**Run tests with a specific trait** (equivalent to category filtering):
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-trait "TraitName=value"
```
**Exclude tests with a specific trait** (skip unstable tests):
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-not-trait "TestCategory=FailsInCloudTest"
```
**Run tests for a specific framework only**:
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release --framework net9.0
```
**List all available tests without running them**:
```bash
cd test/Library.Tests
dotnet run --no-build -c Release --framework net9.0 -- --list-tests
```
**Key points about test filtering with MTP v2 / xunit v3**:
- Options after `--` are passed to the test runner, not to `dotnet test`
- Use `--filter-method`, `--filter-class`, `--filter-namespace` for simple filtering
- Use `--filter-trait` and `--filter-not-trait` for trait-based filtering (replaces `--filter "TestCategory=..."`)
- Traditional VSTest `--filter` expressions do NOT work
- Wildcards `*` are supported at the beginning and/or end of filter values
- Multiple simple filters of the same type use OR logic, different types combine with AND
- See `--help` for query filter language for advanced scenarios
## Coding style
* Honor StyleCop rules and fix any reported build warnings *after* getting tests to pass.
* In C# files, use namespace *statements* instead of namespace *blocks* for all new files.
* Add API doc comments to all new public and internal members.
================================================
FILE: .github/renovate.json
================================================
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"github>microsoft/vs-renovate-presets:microbuild",
"github>microsoft/vs-renovate-presets:vs_main_dependencies"
],
"packageRules": []
}
================================================
FILE: .github/skills/update-library-template/SKILL.md
================================================
---
name: update-library-template
description: Merges the latest Library.Template into this repo (at position of HEAD) and resolves conflicts.
disable-model-invocation: true
---
# Instructions
1. Run `./tools/MergeFrom-Template.ps1` from the repo root.
2. Resolve merge conflicts, taking into account conflict resolution policy below.
3. Validate the changes, as described in the validation section below.
4. Committing your changes (if applicable).
## Conflict resolution policy
There may be [special notes](template-release-notes.md) that describe special considerations for certain files or scenarios to help you resolve conflicts appropriately.
Always refer to that file before proceeding.
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.
Also consider that some repos choose to reject certain Library.Template patterns.
For example the template uses MTPv2 for test projects, but a repo might have chosen not to adopt that.
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.
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.
Use #runSubagent to analyze and resolve merge conflicts across files in parallel.
### Keep Current files
Conflicts in the following files should always be resolved by keeping the current version (i.e. discard incoming changes):
* README.md
### Deleted files
Very typically, when the incoming change is to a file that was deleted locally, the correct resolution is to re-delete the file.
In some cases however, the deleted file may have incoming changes that should be applied to other files.
The `test/Library.Tests/Library.Tests.csproj` file is very typical of this.
Changes to this file should very typically be applied to any and all test projects in the repo.
You are responsible for doing this in addition to re-deleting this template file.
## Updating package and SDK versions
After the merge, always check global.json for MSBuild Sdks with names starting with `Microsoft.VisualStudio.Internal.MicroBuild`.
These SDK versions should match the value of the `MicroBuildVersion` property found in `Directory.Packages.props`.
Always take the latest of the versions you see among these SDKs and the `MicroBuildVersion` property.
## Validation
Validate the merge result (after resolving any conflicts, if applicable).
Use #runSubagent for each step.
1. Verify that `dotnet restore` succeeds. Fix any issues that come up.
2. Verify that `dotnet build` succeeds.
3. Verify that tests succeed by running `tools/dotnet-test-cloud.ps1`.
While these validations are described using `dotnet` CLI commands, some repos require using full msbuild.exe.
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.
You are *not* responsible for fixing issues that the merge did not cause.
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.
That said, sometimes merges will bring in SDK or dependency updates that can cause breaks in seemingly unrelated areas.
In such cases, you should investigate and solve the issues as needed.
## Committing your changes
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.
Merge conflict resolution fixes ideally get amended into the merge commit, while novel changes would go into a novel commit after the merge commit.
Always author your commits using `git commit --author "🤖 Copilot <no-reply@github.com>"` (and possibly other parameters).
Describe the nature of the merge conflicts you encountered and how you resolved them in your commit message.
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.
================================================
FILE: .github/skills/update-library-template/template-release-notes.md
================================================
# Template release notes
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.
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.
## Solution rename
Never leave a Library.slnx file in the repository.
You might even see one there even though this particular merge didn't bring it in.
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`.
Delete any `Library.slnx` that you see.
Migrate an `.sln` in the repo root to `.slnx` using this command:
```ps1
dotnet solution EXISTING.sln migrate
```
This will create an EXISTING.slnx file. `git add` that file, then `git rm` the old `.sln` file.
Sometimes a repo will reference the sln filename in a script or doc somewhere.
Search the repo for such references and update them to the slnx file.
================================================
FILE: .github/workflows/copilot-setup-steps.yml
================================================
name: 💪🏼 Copilot Setup Steps
# Automatically run the setup steps when they are changed to allow for easy validation, and
# allow manual testing through the repository's "Actions" tab
on:
workflow_dispatch:
push:
branches:
- main
paths:
- .github/workflows/copilot-setup-steps.yml
pull_request:
paths:
- .github/workflows/copilot-setup-steps.yml
jobs:
# The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot.
copilot-setup-steps:
runs-on: ubuntu-latest
# Set the permissions to the lowest permissions possible needed for your steps.
# Copilot will be given its own token for its operations.
permissions:
# If you want to clone the repository as part of your setup steps, for example to install dependencies, you'll need the `contents: read` permission. If you don't clone the repository in your setup steps, Copilot will do this for you automatically after the steps complete.
contents: read
# You can define any steps you want, and they will run before the agent starts.
# If you do not check out your code, Copilot will do this for you.
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
- name: ⚙ Install prerequisites
run: |
./init.ps1 -UpgradePrerequisites -NoNuGetCredProvider
dotnet --info
# Print mono version if it is present.
if (Get-Command mono -ErrorAction SilentlyContinue) {
mono --version
}
shell: pwsh
================================================
FILE: .github/workflows/docs.yml
================================================
name: 📚 Docs
on:
push:
branches:
- main
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: pages
cancel-in-progress: false
jobs:
publish-docs:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
actions: read
pages: write
id-token: write
contents: read
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
- name: ⚙ Install prerequisites
run: ./init.ps1 -UpgradePrerequisites
- run: dotnet docfx docfx/docfx.json
name: 📚 Generate documentation
- name: Upload artifact
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
with:
path: docfx/_site
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
================================================
FILE: .github/workflows/docs_validate.yml
================================================
name: 📃 Docfx Validate
on:
push:
branches:
- main
- microbuild
workflow_dispatch:
jobs:
build:
name: 📚 Doc validation
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
- name: 🔗 Markup Link Checker (mlc)
uses: becheran/mlc@7ec24825cefe0c9c8c6bac48430e1f69e3ec356e # v1.2.0
with:
args: --do-not-warn-for-redirect-to https://learn.microsoft.com*,https://dotnet.microsoft.com/*,https://dev.azure.com/*,https://app.codecov.io/* -p docfx -i https://aka.ms/onboardsupport,https://aka.ms/spot,https://msrc.microsoft.com/*,https://www.microsoft.com/msrc*,https://microsoft.com/msrc*,https://www.npmjs.com/package/*,https://get.dot.net/
- name: ⚙ Install prerequisites
run: |
./init.ps1 -UpgradePrerequisites
dotnet --info
shell: pwsh
- name: 📚 Verify docfx build
run: dotnet docfx docfx/docfx.json --warningsAsErrors --disableGitFeatures
================================================
FILE: .github/workflows/libtemplate-update.yml
================================================
name: ⛜ Library.Template update
# PREREQUISITE: This workflow requires the repo to be configured to allow workflows to create pull requests.
# Visit https://github.com/USER/REPO/settings/actions
# Under "Workflow permissions" check "Allow GitHub Actions to create ...pull requests"
# Click Save.
on:
schedule:
- cron: "0 3 * * Mon" # Sun @ 8 or 9 PM Mountain Time (depending on DST)
workflow_dispatch:
jobs:
merge:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
- name: merge
id: merge
shell: pwsh
run: |
$LibTemplateBranch = & ./tools/Get-LibTemplateBasis.ps1 -ErrorIfNotRelated
if ($LASTEXITCODE -ne 0) {
exit $LASTEXITCODE
}
git fetch https://github.com/aarnott/Library.Template $LibTemplateBranch
if ($LASTEXITCODE -ne 0) {
exit $LASTEXITCODE
}
$LibTemplateCommit = git rev-parse FETCH_HEAD
git diff --stat ...FETCH_HEAD
if ((git rev-list FETCH_HEAD ^HEAD --count) -eq 0) {
Write-Host "There are no Library.Template updates to merge."
echo "uptodate=true" >> $env:GITHUB_OUTPUT
exit 0
}
# Pushing commits that add or change files under .github/workflows will cause our workflow to fail.
# But it usually isn't necessary because the target branch already has (or doesn't have) these changes.
# So if the merge doesn't bring in any changes to these files, try the merge locally and push that
# to keep github happy.
if ((git rev-list FETCH_HEAD ^HEAD --count -- .github/workflows) -eq 0) {
# Indeed there are no changes in that area. So merge locally to try to appease GitHub.
git checkout -b auto/libtemplateUpdate
git config user.name "Andrew Arnott"
git config user.email "andrewarnott@live.com"
git merge FETCH_HEAD
if ($LASTEXITCODE -ne 0) {
Write-Host "Merge conflicts prevent creating the pull request. Please run tools/MergeFrom-Template.ps1 locally and push the result as a pull request."
exit 2
}
git -c http.extraheader="AUTHORIZATION: bearer $env:GH_TOKEN" push origin -u HEAD
} else {
Write-Host "Changes to github workflows are included in this update. Please run tools/MergeFrom-Template.ps1 locally and push the result as a pull request."
exit 1
}
- name: pull request
shell: pwsh
if: success() && steps.merge.outputs.uptodate != 'true'
run: |
# If there is already an active pull request, don't create a new one.
$existingPR = gh pr list -H auto/libtemplateUpdate --json url | ConvertFrom-Json
if ($existingPR) {
Write-Host "::warning::Skipping pull request creation because one already exists at $($existingPR[0].url)"
exit 0
}
$prTitle = "Merge latest Library.Template"
$prBody = "This merges the latest features and fixes from [Library.Template's branch](https://github.com/AArnott/Library.Template/tree/).
⚠️ Do **not** squash this pull request when completing it. You must *merge* it.
<details>
<summary>Merge conflicts?</summary>
Resolve merge conflicts locally by carrying out these steps:
```
git fetch
git checkout auto/libtemplateUpdate
git merge origin/main
# resolve conflicts
git commit
git push
```
</details>"
gh pr create -H auto/libtemplateUpdate -b $prBody -t $prTitle
env:
GH_TOKEN: ${{ github.token }}
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
*.lutconfig
launchSettings.json
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Jetbrains Rider cache directory
.idea/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
!Directory.Build.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
/coveragereport/
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# dotnet tool local install directory
.store/
# mac-created file to track user view preferences for a directory
.DS_Store
# Analysis results
*.sarif
# C# Dev Kit cache files
*.lscache
================================================
FILE: .vscode/extensions.json
================================================
{
// See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp
// List of extensions which should be recommended for users of this workspace.
"recommendations": [
"ms-azure-devops.azure-pipelines",
"ms-dotnettools.csharp",
"k--kato.docomment",
"editorconfig.editorconfig",
"esbenp.prettier-vscode",
"pflannery.vscode-versionlens",
"davidanson.vscode-markdownlint",
"dotjoshjohnson.xml",
"ms-vscode-remote.remote-containers",
"ms-azuretools.vscode-docker",
"tintoy.msbuild-project-tools"
],
// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
"unwantedRecommendations": []
}
================================================
FILE: .vscode/launch.json
================================================
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach",
"processId": "${command:pickProcess}"
}
]
}
================================================
FILE: .vscode/mcp.json
================================================
{
"servers": {
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/"
},
"azure-devops": {
"type": "http",
"url": "https://mcp.dev.azure.com/devdiv",
"headers": {
"X-MCP-Toolsets": "repos,pipelines,wit,wiki"
}
},
"microsoftdocs": {
"type": "http",
"url": "https://learn.microsoft.com/api/mcp"
}
}
}
================================================
FILE: .vscode/settings.json
================================================
{
"files.trimTrailingWhitespace": true,
"files.insertFinalNewline": true,
"files.trimFinalNewlines": true,
"azure-pipelines.1ESPipelineTemplatesSchemaFile": true,
"omnisharp.enableEditorConfigSupport": true,
"omnisharp.enableRoslynAnalyzers": true,
"dotnet.completion.showCompletionItemsFromUnimportedNamespaces": true,
"editor.formatOnSave": true,
"[xml]": {
"editor.wordWrap": "off"
},
// Treat these files as Azure Pipelines files
"files.associations": {
"**/azure-pipelines/**/*.yml": "azure-pipelines",
"azure-pipelines.yml": "azure-pipelines"
},
// Use Prettier as the default formatter for Azure Pipelines files.
// Needs to be explicitly configured: https://github.com/Microsoft/azure-pipelines-vscode#document-formatting
"[azure-pipelines]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": false // enable this when they conform
},
}
================================================
FILE: .vscode/tasks.json
================================================
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
}
]
}
================================================
FILE: .vsts-ci.yml
================================================
trigger:
branches:
include:
- main
paths:
exclude:
- .github
- doc
- '*.md'
schedules:
- cron: "0 10 * * Sun"
displayName: Weekly api-scan
always: true
branches:
include:
- main
parameters:
- name: RunApiScanTools
displayName: Run API Scan?
type: boolean
default: false
variables:
NugetSecurityAnalysisWarningLevel: none
${{ if or(eq(parameters.RunApiScanTools, 'true'), eq(variables['Build.CronSchedule.DisplayName'], 'Weekly api-scan')) }}:
RunAPIScan: true
${{ else }}:
RunAPIScan: false
Codeql.Enabled: true
Codeql.TSAEnabled: true
Codeql.TSAOptionsPath: $(Build.SourcesDirectory)\azure-pipelines\TSAOptions.json
resources:
repositories:
- repository: MicroBuildTemplate
type: git
name: 1ESPipelineTemplates/MicroBuildTemplate
ref: refs/tags/release
extends:
template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate
parameters:
sdl:
sourceAnalysisPool:
name: VSEngSS-MicroBuild2022-1ES
image: server2022-microbuildVS2022-1es
pool:
name: VSEngSS-MicroBuild2022-1ES
image: server2022-microbuildVS2022-1es
os: windows
customBuildTags:
- ES365AIMigrationTooling
stages:
- stage: stage
jobs:
- job: job
templateContext:
mb:
signing:
enabled: true
signType: $(SignType)
zipSources: false
outputs:
- output: pipelineArtifact
displayName: 'Publish Artifact: build logs'
condition: succeededOrFailed()
targetPath: $(Build.ArtifactStagingDirectory)/build_logs
artifactName: build_logs
artifactType: Container
- output: pipelineArtifact
displayName: 'Publish Artifact: symbols'
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
targetPath: '$(Build.ArtifactStagingDirectory)/symbols'
artifactName: symbols
publishLocation: Container
- output: pipelineArtifact
displayName: 'Publish packages'
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
targetPath: $(Build.ArtifactStagingDirectory)/packages
artifactName: packages
artifactType: Container
- output: nuget
displayName: 'Publish Sdk NuGet packages to VSTS feeds'
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
packageParentPath: '$(Build.ArtifactStagingDirectory)'
searchPatternPush: 'bin/$(BuildConfiguration)/packages/*.nupkg'
publishVstsFeed: $(feedGuid)
allowPackageConflicts: true
steps:
- task: ComponentGovernanceComponentDetection@0
inputs:
scanType: 'Register'
verbosity: 'Verbose'
alertWarningLevel: 'High'
- task: PowerShell@2
displayName: Set VSTS variables
inputs:
targetType: inline
script: |
if ($env:SignType -eq 'Real') {
$feedGuid = '09d8d03c-1ac8-456e-9274-4d2364527d99' ## VSIDE-RealSigned-Release
} else {
$feedGuid = 'da484c78-f942-44ef-b197-99e2a1bef53c' ## VSIDE-TestSigned-Release
}
Write-Host "##vso[task.setvariable variable=feedGuid]$feedGuid"
$SkipPublishingNetworkArtifacts = 'true' ## Network artifacts not allowed on Scale Set Pool
Write-Host "##vso[task.setvariable variable=SkipPublishingNetworkArtifacts]$SkipPublishingNetworkArtifacts"
if ($env:ComputerName.StartsWith('factoryvm', [StringComparison]::OrdinalIgnoreCase)) {
Write-Host "Running on hosted queue"
Write-Host "##vso[task.setvariable variable=Hosted]true"
}
- task: CmdLine@2
inputs:
script: |
del /s /q "bin"
displayName: Purge bin
- task: NuGetToolInstaller@0
displayName: Pin nuget.exe version
inputs:
versionSpec: 6.4.0
- task: AntiMalware@4
displayName: 'Run MpCmdRun.exe'
inputs:
InputType: Basic
ScanType: CustomScan
FileDirPath: '$(Build.StagingDirectory)'
DisableRemediation: false
- task: NuGetAuthenticate@1
displayName: 'NuGet Authenticate'
inputs:
forceReinstallCredentialProvider: true
- task: VSBuild@1
inputs:
solution: 'src\SlowCheetah.sln'
msbuildArgs: /t:Restore
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
displayName: Restore SlowCheetah solution
- task: VSBuild@1
inputs:
solution: 'src\SlowCheetah.sln'
msbuildArgs: '/bl:"$(Build.ArtifactStagingDirectory)/build_logs/slowcheetah.binlog"'
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
displayName: Build SlowCheetah solution
- task: MicroBuildCodesignVerify@3
inputs:
TargetFolders: |
$(Build.SourcesDirectory)\bin\$(BuildConfiguration)\packages
ApprovalListPathForCerts: $(Build.SourcesDirectory)\src\build\no_authenticode.txt
ApprovalListPathForSigs: $(Build.SourcesDirectory)\src\build\no_strongname.txt
displayName: Verify code signing
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
- task: VSTest@2
inputs:
testFiltercriteria: TestCategory!=FailsInCloudTest
searchFolder: $(System.DefaultWorkingDirectory)\bin\
testAssemblyVer2: |
$(BuildConfiguration)\**\*test*.dll
!**\obj\**
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
displayName: Run Tests
condition: and(succeeded(), ne(variables['SignType'], 'real'))
- task: PoliCheck@2
displayName: 'Run PoliCheck'
inputs:
targetType: F
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
- task: ManifestGeneratorTask@0
inputs:
BuildDropPath: $(Build.ArtifactStagingDirectory)/build_logs
- task: BinSkim@4
displayName: Run BinSkim
inputs:
InputType: 'Basic'
Function: 'analyze'
TargetPattern: 'guardianGlob'
AnalyzeTargetGlob: 'bin/$(BuildConfiguration)/net472/Microsoft.VisualStudio.SlowCheetah*.dll;'
- task: CopyFiles@2
displayName: 'Copy Files for APIScan'
inputs:
SourceFolder: 'bin/$(BuildConfiguration)/net472/'
Contents: |
**/Microsoft.VisualStudio.SlowCheetah*.dll
**/Microsoft.VisualStudio.SlowCheetah*.pdb
TargetFolder: $(Agent.TempDirectory)\APIScanFiles
condition: and(succeeded(), eq(variables['RunAPIScan'], 'true'))
- task: APIScan@2
displayName: Run APIScan
inputs:
softwareFolder: $(Agent.TempDirectory)\APIScanFiles
softwareName: 'Slowcheetah'
softwareVersionNum: '$(Build.BuildId)'
isLargeApp: false
toolVersion: 'Latest'
condition: and(succeeded(), eq(variables['RunAPIScan'], 'true'))
env:
AzureServicesAuthConnectionString: RunAs=App;AppId=$(ApiScanClientId)
- task: PublishSecurityAnalysisLogs@3
displayName: 'Publish Guardian Artifacts'
inputs:
ArtifactName: CodeAnalysisLogs
ArtifactType: Container
PublishProcessedResults: false
AllTools: true
- task: TSAUpload@2
displayName: 'Create bugs for APIScan'
inputs:
GdnPublishTsaOnboard: true
GdnPublishTsaConfigFile: '$(Build.SourcesDirectory)\azure-pipelines\TSAOptions.json'
condition: eq(variables['RunApiScan'], 'true')
- task: CopyFiles@1
displayName: Collecting symbols artifacts
inputs:
SourceFolder: bin/$(BuildConfiguration)/net472
Contents: |
**/Microsoft.VisualStudio.SlowCheetah?(*.dll|*.pdb|*.xml)
!**/*Test*
TargetFolder: $(Build.ArtifactStagingDirectory)/symbols
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
- task: MicroBuildArchiveSymbols@5
displayName: 🔣 Archive symbols to Symweb
inputs:
SymbolsFeatureName: $(SymbolsFeatureName)
SymbolsProject: VS
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), eq(variables['SignType'], 'real'))
- task: CopyFiles@1
displayName: Collecting packages
inputs:
SourceFolder: bin/$(BuildConfiguration)/packages
Contents: |
*.nupkg
*.vsix
TargetFolder: $(Build.ArtifactStagingDirectory)/packages
flattenFolders: false
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Microsoft Open Source Code of Conduct
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
Resources:
- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns
================================================
FILE: CONTRIBUTING.md
================================================
# Microsoft.VisualStudio.SlowCheetah
This project welcomes contributions and suggestions. Most contributions require you to
agree to a Contributor License Agreement (CLA) declaring that you have the right to,
and actually do, grant us the rights to use your contribution. For details, visit
https://cla.microsoft.com.
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
## Pull requests
When you submit a pull request, a CLA-bot will automatically determine whether you need
to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the
instructions provided by the bot. You will only need to do this once across all repositories using our CLA.
## Prerequisites
All dependencies can be installed by running the `init.ps1` script at the root of the repository
using Windows PowerShell or [PowerShell Core][pwsh] (on any OS).
Some dependencies installed by `init.ps1` may only be discoverable from the same command line environment the init script was run from due to environment variables, so be sure to launch Visual Studio or build the repo from that same environment.
Alternatively, run `init.ps1 -InstallLocality Machine` (which may require elevation) in order to install dependencies at machine-wide locations so Visual Studio and builds work everywhere.
The only prerequisite for building, testing, and deploying from this repository
is the [.NET SDK](https://get.dot.net/).
You should install the version specified in `global.json` or a later version within
the same major.minor.Bxx "hundreds" band.
For example if 2.2.300 is specified, you may install 2.2.300, 2.2.301, or 2.2.310
while the 2.2.400 version would not be considered compatible by .NET SDK.
See [.NET Core Versioning](https://learn.microsoft.com/dotnet/core/versions/) for more information.
## Package restore
The easiest way to restore packages may be to run `init.ps1` which automatically authenticates
to the feeds that packages for this repo come from, if any.
`dotnet restore` or `nuget restore` also work but may require extra steps to authenticate to any applicable feeds.
## Building
This repository can be built on Windows, Linux, and OSX.
Building, testing, and packing this repository can be done by using the standard dotnet CLI commands (e.g. `dotnet build`, `dotnet test`, `dotnet pack`, etc.).
[pwsh]: https://learn.microsoft.com/powershell/scripting/install/installing-powershell
## Releases
Use `nbgv tag` to create a tag for a particular commit that you mean to release.
[Learn more about `nbgv` and its `tag` and `prepare-release` commands](https://dotnet.github.io/Nerdbank.GitVersioning/docs/nbgv-cli.html).
Push the tag.
### GitHub Actions
When your repo is hosted by GitHub and you are using GitHub Actions, you should create a GitHub Release using the standard GitHub UI.
Having previously used `nbgv tag` and pushing the tag will help you identify the precise commit and name to use for this release.
After publishing the release, the `.github/workflows/release.yml` workflow will be automatically triggered, which will:
1. Find the most recent `.github/workflows/build.yml` GitHub workflow run of the tagged release.
1. Upload the `deployables` artifact from that workflow run to your GitHub Release.
1. If you have `NUGET_API_KEY` defined as a secret variable for your repo or org, any nuget packages in the `deployables` artifact will be pushed to nuget.org.
### Azure Pipelines
When your repo builds with Azure Pipelines, use the `azure-pipelines/release.yml` pipeline.
Trigger the pipeline by adding the `auto-release` tag on a run of your main `azure-pipelines.yml` pipeline.
## Tutorial and API documentation
API and hand-written docs are found under the `docfx/` directory and are built by [docfx](https://dotnet.github.io/docfx/).
You can make changes and host the site locally to preview them by switching to that directory and running the `dotnet docfx --serve` command.
After making a change, you can rebuild the docs site while the localhost server is running by running `dotnet docfx` again from a separate terminal.
The `.github/workflows/docs.yml` GitHub Actions workflow publishes the content of these docs to github.io if the workflow itself and [GitHub Pages is enabled for your repository](https://docs.github.com/en/pages/quickstart).
## Updating dependencies
This repo uses Renovate to keep dependencies current.
Configuration is in the `.github/renovate.json` file.
[Learn more about configuring Renovate](https://docs.renovatebot.com/configuration-options/).
When changing the renovate.json file, follow [these validation steps](https://docs.renovatebot.com/config-validation/).
If Renovate is not creating pull requests when you expect it to, check that the [Renovate GitHub App](https://github.com/apps/renovate) is configured for your account or repo.
## Merging latest from Library.Template
### Maintaining your repo based on this template
The best way to keep your repo in sync with Library.Template's evolving features and best practices is to periodically merge the template into your repo:
```ps1
git fetch
git checkout origin/main
./tools/MergeFrom-Template.ps1
# resolve any conflicts, then commit the merge commit.
git push origin -u HEAD
```
================================================
FILE: CodeQL.yml
================================================
path_classifiers:
library:
- 'test/**'
================================================
FILE: Directory.Build.props
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project>
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<RepoRootPath>$(MSBuildThisFileDirectory)</RepoRootPath>
<BaseIntermediateOutputPath>$(RepoRootPath)obj\$([MSBuild]::MakeRelative($(RepoRootPath), $(MSBuildProjectDirectory)))\</BaseIntermediateOutputPath>
<BaseOutputPath Condition=" '$(BaseOutputPath)' == '' ">$(RepoRootPath)bin\$(MSBuildProjectName)\</BaseOutputPath>
<PackageOutputPath>$(RepoRootPath)bin\Packages\$(Configuration)\NuGet\</PackageOutputPath>
<VSIXOutputPath>$(RepoRootPath)bin\Packages\$(Configuration)\Vsix\$(Platform)\</VSIXOutputPath>
<VSIXOutputPath Condition="'$(Platform)'=='' or '$(Platform)'=='AnyCPU'">$(RepoRootPath)bin\Packages\$(Configuration)\Vsix\</VSIXOutputPath>
<SBOMFileDestPath>$(VSIXOutputPath)</SBOMFileDestPath>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<AnalysisLevel>latest</AnalysisLevel>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<ProduceReferenceAssembly>true</ProduceReferenceAssembly>
<RestoreEnablePackagePruning>true</RestoreEnablePackagePruning>
<!-- https://learn.microsoft.com/en-us/dotnet/fundamentals/apicompat/package-validation/overview -->
<EnablePackageValidation>true</EnablePackageValidation>
<!-- https://github.com/dotnet/msbuild/blob/main/documentation/ProjectReference-Protocol.md#setplatform-negotiation -->
<EnableDynamicPlatformResolution>true</EnableDynamicPlatformResolution>
<!-- Opt in till https://github.com/NuGet/Home/issues/9803 makes this the default. -->
<RestoreUseStaticGraphEvaluation>true</RestoreUseStaticGraphEvaluation>
<!-- This entire repo has just one version.json file, so compute the version once and share with all projects in a large build. -->
<GitVersionBaseDirectory>$(MSBuildThisFileDirectory)</GitVersionBaseDirectory>
<!-- Local builds should embed PDBs so we never lose them when a subsequent build occurs. -->
<DebugType Condition=" '$(CI)' != 'true' and '$(TF_BUILD)' != 'true' ">embedded</DebugType>
<PackageProjectUrl>https://github.com/microsoft/slow-cheetah</PackageProjectUrl>
<Company>Microsoft</Company>
<Authors>Microsoft</Authors>
<Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<IncludeSymbols Condition=" '$(DebugType)' != 'embedded' ">true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>
<PropertyGroup>
<LangVersion Condition="'$(MSBuildProjectExtension)'=='.csproj'">14</LangVersion>
<LangVersion Condition="'$(MSBuildProjectExtension)'=='.vbproj'">16.9</LangVersion>
</PropertyGroup>
<ItemGroup>
<None Include="$(RepoRootPath)obj/NOTICE" Pack="true" PackagePath="" Visible="false" Condition=" Exists('$(RepoRootPath)obj/NOTICE') " />
</ItemGroup>
<ItemGroup>
<AdditionalFiles Include="$(MSBuildThisFileDirectory)stylecop.json" Link="stylecop.json" />
</ItemGroup>
<ItemDefinitionGroup>
<!-- We always want MSBuild properties generated that point at the restored location of each package. -->
<PackageReference GeneratePathProperty="true" />
</ItemDefinitionGroup>
<Target Name="PrepareReleaseNotes" BeforeTargets="GenerateNuspec" DependsOnTargets="GetBuildVersion">
<PropertyGroup>
<PackageReleaseNotes Condition="'$(RepositoryUrl)'!=''">$(RepositoryUrl)/releases/tag/v$(Version)</PackageReleaseNotes>
</PropertyGroup>
</Target>
<Import Project="azure-pipelines\NuGetSbom.props" />
</Project>
================================================
FILE: Directory.Build.rsp
================================================
#------------------------------------------------------------------------------
# This file contains command-line options that MSBuild will process as part of
# every build, unless the "/noautoresponse" switch is specified.
#
# MSBuild processes the options in this file first, before processing the
# options on the command line. As a result, options on the command line can
# override the options in this file. However, depending on the options being
# set, the overriding can also result in conflicts.
#
# NOTE: The "/noautoresponse" switch cannot be specified in this file, nor in
# any response file that is referenced by this file.
#------------------------------------------------------------------------------
/nr:false
/m
/verbosity:minimal
/clp:Summary;ForceNoAlign
================================================
FILE: Directory.Build.targets
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project>
<ItemGroup>
<!-- Avoid compile error about missing namespace when combining ImplicitUsings with .NET Framework target frameworks. -->
<Using Remove="System.Net.Http" Condition="'$(TargetFrameworkIdentifier)'=='.NETFramework'" />
</ItemGroup>
</Project>
================================================
FILE: Directory.Packages.props
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project>
<!-- https://learn.microsoft.com/nuget/consume-packages/central-package-management -->
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
<MicrosoftTestingPlatformVersion>2.2.2</MicrosoftTestingPlatformVersion>
<MicroBuildVersion>2.0.226</MicroBuildVersion>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Microsoft.IO.Redist" Version="6.0.1" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
<PackageVersion Include="xunit" Version="2.9.2" />
<PackageVersion Include="Microsoft.VisualStudio.SDK" Version="17.5.33428.388" />
<PackageVersion Include="Microsoft.Web.Xdt" Version="3.1.0" />
<PackageVersion Include="Microsoft.VisualStudio.Jdt" Version="0.9.63" />
<PackageVersion Include="NuGet.VisualStudio" Version="17.6.0" />
<PackageVersion Include="Microsoft.VSSDK.BuildTools" Version="17.6.2164" />
<PackageVersion Include="EnvDTE" Version="17.6.36389" />
<PackageVersion Include="Microsoft.Build.Utilities.Core" Version="17.12.50" />
<PackageVersion Include="MessagePack" Version="2.5.187" />
<PackageVersion Include="System.Text.Json" Version="8.0.5" />
</ItemGroup>
<ItemGroup Label="Library.Template">
<PackageVersion Include="Microsoft.Testing.Extensions.CodeCoverage" Version="18.6.2" />
<PackageVersion Include="Microsoft.Testing.Extensions.CrashDump" Version="$(MicrosoftTestingPlatformVersion)" />
<PackageVersion Include="Microsoft.Testing.Extensions.HangDump" Version="$(MicrosoftTestingPlatformVersion)" />
<PackageVersion Include="Microsoft.Testing.Extensions.TrxReport" Version="$(MicrosoftTestingPlatformVersion)" />
<PackageVersion Include="Microsoft.VisualStudio.Internal.MicroBuild.NonShipping" Version="$(MicroBuildVersion)" />
<PackageVersion Include="xunit.v3.mtp-v2" Version="3.2.2" />
</ItemGroup>
<ItemGroup>
<!-- Put repo-specific GlobalPackageReference items in this group. -->
</ItemGroup>
<ItemGroup Label="Library.Template">
<GlobalPackageReference Include="CSharpIsNullAnalyzer" Version="0.1.593" />
<GlobalPackageReference Include="DotNetAnalyzers.DocumentationAnalyzers" Version="1.0.0-beta.59" />
<GlobalPackageReference Include="Microsoft.VisualStudio.Internal.MicroBuild.VisualStudio" Version="$(MicroBuildVersion)" />
<!-- The condition works around https://github.com/dotnet/sdk/issues/44951 -->
<GlobalPackageReference Include="Nerdbank.GitVersioning" Version="3.9.50" Condition="!('$(TF_BUILD)'=='true' and '$(dotnetformat)'=='true')" />
<GlobalPackageReference Include="PolySharp" Version="1.15.0" />
<GlobalPackageReference Include="StyleCop.Analyzers.Unstable" Version="1.2.0.556" />
<!--<GlobalPackageReference Include="StyleCop.Analyzers" Version="1.1.118" />-->
</ItemGroup>
</Project>
================================================
FILE: LICENSE
================================================
Microsoft.VisualStudio.SlowCheetah
Copyright (c) Microsoft Corporation
All rights reserved.
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# slow-cheetah
[](https://nuget.org/packages/Microsoft.VisualStudio.SlowCheetah)
[](https://ci.appveyor.com/project/jviau/slow-cheetah/branch/master)
Transformations for XML files (such as app.config) and JSON files.
Includes two primary components:
1. NuGet package that adds an msbuild task to perform transforms on build.
2. Visual Studio extension for generating and previewing transforms.
This project has adopted the [Microsoft Open Source Code of
Conduct](https://opensource.microsoft.com/codeofconduct/).
For more information see the [Code of Conduct
FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
contact [opencode@microsoft.com](mailto:opencode@microsoft.com)
with any additional questions or comments.
## Supported Platforms
* Visual Studio 2022: [SlowCheetah VS 2022 Extension](https://marketplace.visualstudio.com/items?itemName=vscps.SlowCheetah-XMLTransforms-VS2022) (version 4.x)
* Visual Studio 2015-2019: [SlowCheetah VS 2015-2019 Extension](https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.SlowCheetah-XMLTransforms) (version 3.x)
## Supported File Types
SlowCheetah supports transformations for XML files, specified by [XDT](https://msdn.microsoft.com/en-us/library/dd465326(v=vs.110).aspx) and for JSON files, specified by [JDT](https://github.com/Microsoft/json-document-transforms). Transform files created by the extension follow these formats.
## Features
Perform transformations of XML and JSON files on build per configuration and publish profiles.
Quickly add and preview transformations to a file in the project.
## [How to Perform Transformations](doc/transforming_files.md)
## Trademarks
This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.
================================================
FILE: Restore.cmd
================================================
@echo off
WHERE /q msbuild
IF ERRORLEVEL 1 (
ECHO Error: Could not find msbuild. Make sure msbuild is in the PATH and try again.
EXIT /B %ERRORLEVEL%
)
msbuild /t:restore %~dp0\src\SlowCheetah.sln
================================================
FILE: SECURITY.md
================================================
<!-- BEGIN MICROSOFT SECURITY.MD V0.0.5 BLOCK -->
## Security
Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).
If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://learn.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)), please report it to us as described below.
## Reporting Security Issues
**Please do not report security vulnerabilities through public GitHub issues.**
Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report).
If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/msrc/pgp-key-msrc).
You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc).
Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
* Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
* Full paths of source file(s) related to the manifestation of the issue
* The location of the affected source code (tag/branch/commit or direct URL)
* Any special configuration required to reproduce the issue
* Step-by-step instructions to reproduce the issue
* Proof-of-concept or exploit code (if possible)
* Impact of the issue, including how an attacker might exploit the issue
This information will help us triage your report more quickly.
If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs.
## Preferred Languages
We prefer all communications to be in English.
## Policy
Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/msrc/cvd).
<!-- END MICROSOFT SECURITY.MD BLOCK -->
================================================
FILE: SUPPORT.md
================================================
# Support
## How to file issues and get help
This project uses GitHub Issues to track bugs and feature requests.
Please search the existing issues before filing new issues to avoid duplicates.
For new issues, file your bug or feature request as a new Issue.
For help and questions about using this project, please create an issue.
## Microsoft Support Policy
Support for this **slow-cheetah** is limited to the resources listed above.
================================================
FILE: ThirdPartyNotices.txt
================================================
NOTICES AND INFORMATION
Do Not Translate or Localize
This software incorporates material from third parties.
Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com,
or you may send a check or money order for US $5.00, including the product name,
the open source component name, platform, and version number, to:
Source Code Compliance Team
Microsoft Corporation
One Microsoft Way
Redmond, WA 98052
USA
Notwithstanding any other terms, you may reverse engineer this software to the extent
required to debug changes to any libraries licensed under the GNU Lesser General Public License.
---------------------------------------------------------
StyleCop.Analyzers 1.0.0 - Apache-2.0
Copyright Sam Harwell 2015
Copyright James Newton-King 2008
GetCopyrightText copyrightText WithDocumentText
copyrightText CircularReference InvalidReference
Copyright Sam Harwell 2015 StyleCop DotNetAnalyzers Roslyn Diagnostic Analyzer
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
---------------------------------------------------------
================================================
FILE: appveyor.yml
================================================
# Notes:
# - Minimal appveyor.yml file is an empty file. All sections are optional.
# - Indent each level of configuration with 2 spaces. Do not use tabs!
# - All section names are case-sensitive.
# - Section names should be unique on each level.
#---------------------------------#
# general configuration #
#---------------------------------#
# version format
version: 1.0.{build}
#---------------------------------#
# environment configuration #
#---------------------------------#
# Build worker image (VM template)
image: Visual Studio 2017
skip_tags: true
branches:
only:
- master
environment:
DeployExtension: false
Package: true
cache:
- packages -> **\packages.config
configuration: Release
#---------------------------------#
# build configuration #
#---------------------------------#
before_build:
nuget restore src
build:
project: src\SlowCheetah.sln # path to Visual Studio solution or project
verbosity: normal # MSBuild verbosity level
#---------------------------------#
# test configuration #
#---------------------------------#
test:
assemblies:
- '**\*tests.dll'
#---------------------------------#
# artifact configuration #
#---------------------------------#
artifacts:
- path: 'bin\**\packages\Microsoft.VisualStudio.SlowCheetah*.nupkg'
name: Nuget Package
- path: 'bin\**\packages\Microsoft.VisualStudio.SlowCheetah*.vsix'
name: VSIX Package
================================================
FILE: azure-pipelines/Archive-SourceCode.ps1
================================================
#Requires -PSEdition Core -Version 7
<#
.SYNOPSIS
Submits a source archival request for this repo.
.PARAMETER Requester
The alias for the user requesting this backup.
.PARAMETER ManagerAlias
The alias of the manager that owns the repo.
.PARAMETER TeamAlias
The alias of the team that owns the repo.
.PARAMETER BusinessGroupName
A human-readable title for your team or business group.
.PARAMETER ProductionType
.PARAMETER ReleaseType
The type of release being backed up.
.PARAMETER ReleaseDate
The date of the release of your software. Defaults to today.
.PARAMETER OwnerAlias
The alias of the owner.
.PARAMETER OS
.PARAMETER ProductLanguage
One or more languages.
.PARAMETER Notes
Any notes to record with the backup.
.PARAMETER FileCollection
One or more collections to archive.
.PARAMETER ProductName
The name of the product. This will default to the repository name.
.PARAMETER RepoUrl
The URL to the repository. This will default to the repository containing this script.
.PARAMETER BackupType
The kind of backup to be performed.
.PARAMETER ServerPath
The UNC path to the server to be backed up (if applicable).
.PARAMETER SourceCodeArchivalUri
The URI to POST the source code archival request to.
This value will typically come automatically by a variable group associated with your pipeline.
You can also look it up at https://dpsopsrequestforms.azurewebsites.net/#/help -> SCA Request Help -> SCA API Help -> Description
#>
[CmdletBinding(SupportsShouldProcess = $true, PositionalBinding = $false)]
param (
[Parameter()]
[string]$Requester,
[Parameter(Mandatory = $true)]
[string]$ManagerAlias,
[Parameter(Mandatory = $true)]
[string]$TeamAlias,
[Parameter(Mandatory = $true)]
[string]$BusinessGroupName,
[Parameter()]
[string]$ProductionType = 'Visual Studio',
[Parameter()]
[string]$ReleaseType = 'RTW',
[Parameter()]
[DateTime]$ReleaseDate = [DateTime]::Today,
[Parameter()]
[string]$OwnerAlias,
[Parameter()]
[ValidateSet('64-Bit Win', '32-Bit Win', 'Linux', 'Mac', '64-Bit ARM', '32-Bit ARM')]
[string[]]$OS = @('64-Bit Win'),
[Parameter(Mandatory = $true)]
[ValidateSet('English', 'Chinese Simplified', 'Chinese Traditional', 'Czech', 'French', 'German', 'Italian', 'Japanese', 'Korean', 'Polish', 'Portuguese', 'Russian', 'Spanish', 'Turkish')]
[string[]]$ProductLanguage,
[Parameter()]
[string]$Notes = '',
[Parameter()]
[ValidateSet('Binaries', 'Localization', 'Source Code')]
[string[]]$FileCollection = @('Source Code'),
[Parameter()]
[string]$ProductName,
[Parameter()]
[Uri]$RepoUrl,
[Parameter()]
[ValidateSet('Server Path', 'Code Repo(Git URL/AzureDevOps)', 'Git', 'Azure Storage Account')]
[string]$BackupType = 'Code Repo(Git URL/AzureDevOps)',
[Parameter()]
[string]$ServerPath = '',
[Parameter()]
[Uri]$SourceCodeArchivalUri = $env:SOURCECODEARCHIVALURI,
[Parameter(Mandatory = $true)]
[string]$AccessToken
)
function Invoke-Git() {
# Make sure we invoke git from within the repo.
Push-Location $PSScriptRoot
try {
return (git $args)
}
finally {
Pop-Location
}
}
if (!$ProductName) {
if ($env:BUILD_REPOSITORY_NAME) {
Write-Verbose 'Using $env:BUILD_REPOSITORY_NAME for ProductName.' # single quotes are intentional so user sees the name of env var.
$ProductName = $env:BUILD_REPOSITORY_NAME
}
else {
$originUrl = [Uri](Invoke-Git remote get-url origin)
if ($originUrl) {
$lastPathSegment = $originUrl.Segments[$originUrl.Segments.Length - 1]
if ($lastPathSegment.EndsWith('.git')) {
$lastPathSegment = $lastPathSegment.Substring(0, $lastPathSegment.Length - '.git'.Length)
}
Write-Verbose 'Using origin remote URL to derive ProductName.'
$ProductName = $lastPathSegment
}
}
if (!$ProductName) {
Write-Error "Unable to determine default value for -ProductName."
}
}
if (!$OwnerAlias) {
if ($env:BUILD_REQUESTEDFOREMAIL) {
Write-Verbose 'Using $env:BUILD_REQUESTEDFOREMAIL and slicing to just the alias for OwnerAlias.'
$OwnerAlias = ($env:BUILD_REQUESTEDFOREMAIL -split '@')[0]
} else {
$OwnerAlias = $TeamAlias
}
if (!$OwnerAlias) {
Write-Error "Unable to determine default value for -OwnerAlias."
}
}
if (!$Requester) {
if ($env:BUILD_REQUESTEDFOREMAIL) {
Write-Verbose 'Using $env:BUILD_REQUESTEDFOREMAIL and slicing to just the alias for Requester.'
$Requester = ($env:BUILD_REQUESTEDFOREMAIL -split '@')[0]
}
else {
Write-Verbose 'Using $env:USERNAME for Requester.'
$Requester = $env:USERNAME
}
if (!$Requester) {
$Requester = $OwnerAlias
}
}
if (!$RepoUrl) {
$RepoUrl = $env:BUILD_REPOSITORY_URI
if (!$RepoUrl) {
$originUrl = [Uri](Invoke-Git remote get-url origin)
if ($originUrl) {
Write-Verbose 'Using git origin remote url for GitURL.'
$RepoUrl = $originUrl
}
if (!$RepoUrl) {
Write-Error "Unable to determine default value for -RepoUrl."
}
}
}
Push-Location $PSScriptRoot
$versionsObj = dotnet nbgv get-version -f json | ConvertFrom-Json
Pop-Location
$ReleaseDateString = $ReleaseDate.ToShortDateString()
$Version = $versionsObj.Version
$BackupSize = Get-ChildItem $PSScriptRoot\..\.git -Recurse -File | Measure-Object -Property Length -Sum
$DataSizeMB = [int]($BackupSize.Sum / 1mb)
$FileCount = $BackupSize.Count
$Request = @{
"Requester" = $Requester
"Manager" = $ManagerAlias
"TeamAlias" = $TeamAlias
"AdditionalContacts" = $AdditionalContacts
"BusinessGroupName" = $BusinessGroupName
"ProductName" = $ProductName
"Version" = $Version
"ProductionType" = $ProductionType
"ReleaseType" = $ReleaseType
"ReleaseDateString" = $ReleaseDateString
"OS" = [string]::Join(',', $OS)
"ProductLanguage" = [string]::Join(',', $ProductLanguage)
"FileCollection" = [string]::Join(',', $FileCollection)
"OwnerAlias" = $OwnerAlias
"Notes" = $Notes.Trim()
"CustomerProvidedDataSizeMB" = $DataSizeMB
"CustomerProvidedFileCount" = $FileCount
"BackupType" = $BackupType
"ServerPath" = $ServerPath
"AzureStorageAccount" = $AzureStorageAccount
"AzureStorageContainer" = $AzureStorageContainer
"GitURL" = $RepoUrl
}
$RequestJson = ConvertTo-Json $Request
Write-Host "SCA request:`n$RequestJson"
if ($PSCmdlet.ShouldProcess('source archival request', 'post')) {
if (!$SourceCodeArchivalUri) {
Write-Error "Unable to post request without -SourceCodeArchivalUri parameter."
exit 1
}
$headers = @{
'Authorization' = "Bearer $AccessToken"
}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$Response = Invoke-WebRequest -Uri $SourceCodeArchivalUri -Method POST -Headers $headers -Body $RequestJson -ContentType "application/json" -UseBasicParsing -SkipHttpErrorCheck
Write-Host "Status Code : " -NoNewline
if ($Response.StatusCode -eq 200) {
Write-Host $Response.StatusCode -ForegroundColor Green
Write-Host "Ticket ID : " -NoNewline
$responseContent = ConvertFrom-Json ($Response.Content)
Write-Host $responseContent
}
else {
Write-Host $Response.StatusCode -ForegroundColor Red
try {
$responseContent = ConvertFrom-Json $Response.Content
Write-Host "Message : $($responseContent.message)"
}
catch {
Write-Host "JSON Parse Error: $($_.Exception.Message)"
Write-Host "Raw response content:"
Write-Host $Response.Content
}
exit 2
}
} elseif ($SourceCodeArchivalUri) {
Write-Host "Would have posted to $SourceCodeArchivalUri"
}
================================================
FILE: azure-pipelines/BuildStageVariables.yml
================================================
variables:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
BuildConfiguration: Release
NUGET_PACKAGES: $(Agent.TempDirectory)/.nuget/packages/
================================================
FILE: azure-pipelines/Get-InsertionPRId.ps1
================================================
<#
.SYNOPSIS
Look up the pull request URL of the insertion PR.
#>
$stagingFolder = $env:BUILD_STAGINGDIRECTORY
if (!$stagingFolder) {
$stagingFolder = $env:SYSTEM_DEFAULTWORKINGDIRECTORY
if (!$stagingFolder) {
Write-Error "This script must be run in an Azure Pipeline."
exit 1
}
}
$markdownFolder = Join-Path $stagingFolder (Join-Path 'MicroBuild' 'Output')
$markdownFile = Join-Path $markdownFolder 'PullRequestUrl.md'
if (!(Test-Path $markdownFile)) {
Write-Error "This script should be run after the MicroBuildInsertVsPayload task."
exit 2
}
$insertionPRUrl = Get-Content $markdownFile
if (!($insertionPRUrl -match 'https:.+?/pullrequest/(\d+)')) {
Write-Error "Failed to parse pull request URL: $insertionPRUrl"
exit 3
}
$Matches[1]
================================================
FILE: azure-pipelines/GlobalVariables.yml
================================================
variables:
# These variables are required for MicroBuild tasks
TeamName: VS IDE
TeamEmail: vsidemicrobuild@microsoft.com
# These variables influence insertion pipelines
ContainsVsix: false # This should be true when the repo builds a VSIX that should be inserted to VS.
================================================
FILE: azure-pipelines/Merge-CodeCoverage.ps1
================================================
#!/usr/bin/env pwsh
<#
.SYNOPSIS
Merges code coverage reports.
.PARAMETER Path
The path(s) to search for Cobertura code coverage reports.
.PARAMETER Format
The format for the merged result. The default is Cobertura
.PARAMETER OutputDir
The directory the merged result will be written to. The default is `coveragereport` in the root of this repo.
#>
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true)]
[string[]]$Path,
[ValidateSet('Badges', 'Clover', 'Cobertura', 'CsvSummary', 'Html', 'Html_Dark', 'Html_Light', 'HtmlChart', 'HtmlInline', 'HtmlInline_AzurePipelines', 'HtmlInline_AzurePipelines_Dark', 'HtmlInline_AzurePipelines_Light', 'HtmlSummary', 'JsonSummary', 'Latex', 'LatexSummary', 'lcov', 'MarkdownSummary', 'MHtml', 'PngChart', 'SonarQube', 'TeamCitySummary', 'TextSummary', 'Xml', 'XmlSummary')]
[string]$Format='Cobertura',
[string]$OutputFile=("$PSScriptRoot/../coveragereport/merged.cobertura.xml")
)
$RepoRoot = [string](Resolve-Path $PSScriptRoot/..)
Push-Location $RepoRoot
try {
Write-Verbose "Searching $Path for *.cobertura.xml files"
$reports = Get-ChildItem -Recurse $Path -Filter *.cobertura.xml
if ($reports) {
$reports |% { $_.FullName } |% {
# In addition to replacing {reporoot}, we also normalize on one kind of slash so that the report aggregates data for a file whether data was collected on Windows or not.
Write-Verbose "Processing $_"
$xml = [xml](Get-Content -LiteralPath $_)
$xml.coverage.packages.package.classes.class |? { $_.filename} |% {
$_.filename = $_.filename.Replace('{reporoot}', $RepoRoot).Replace([IO.Path]::AltDirectorySeparatorChar, [IO.Path]::DirectorySeparatorChar)
}
$xml.Save($_)
}
$Inputs = $reports |% { Resolve-Path -relative $_.FullName }
if ((Split-Path $OutputFile) -and -not (Test-Path (Split-Path $OutputFile))) {
New-Item -Type Directory -Path (Split-Path $OutputFile) | Out-Null
}
& dotnet dotnet-coverage merge $Inputs -o $OutputFile -f cobertura
} else {
Write-Error "No reports found to merge."
}
} finally {
Pop-Location
}
================================================
FILE: azure-pipelines/NuGetSbom.props
================================================
<Project>
<PropertyGroup>
<GenerateSBOMThisProject>true</GenerateSBOMThisProject>
<UseMicroBuildSbomPluginVersion>2</UseMicroBuildSbomPluginVersion>
</PropertyGroup>
</Project>
================================================
FILE: azure-pipelines/PoliCheckExclusions.xml
================================================
<PoliCheckExclusions>
<!--Each of these exclusions is a folder name -if \[name]\exists in the file path, it will be skipped -->
<Exclusion Type="FolderPathFull">NODE_MODULES|.STORE</Exclusion>
<!--Each of these exclusions is a folder name -if any folder or file starts with "\[name]", it will be skipped -->
<!-- <Exclusion Type="FolderPathStart">ABC|XYZ</Exclusion>-->
<!--Each of these file types will be completely skipped for the entire scan -->
<!-- <Exclusion Type="FileType">.ABC|.XYZ</Exclusion>-->
<!--The specified file names will be skipped during the scan regardless which folder they are in -->
<!-- <Exclusion Type="FileName">ABC.TXT|XYZ.CS</Exclusion>-->
</PoliCheckExclusions>
================================================
FILE: azure-pipelines/PostPRMessage.ps1
================================================
[CmdletBinding(SupportsShouldProcess = $true)]
param(
[Parameter(Mandatory=$true)]
$AccessToken,
[Parameter(Mandatory=$true)]
$Markdown,
[ValidateSet('Active','ByDesign','Closed','Fixed','Pending','Unknown','WontFix')]
$CommentState='Active'
)
# See https://learn.microsoft.com/dotnet/api/microsoft.teamfoundation.sourcecontrol.webapi.commentthreadstatus
if ($CommentState -eq 'Active') {
$StatusCode = 1
} elseif ($CommentState -eq 'ByDesign') {
$StatusCode = 5
} elseif ($CommentState -eq 'Closed') {
$StatusCode = 4
} elseif ($CommentState -eq 'Fixed') {
$StatusCode = 2
} elseif ($CommentState -eq 'Pending') {
$StatusCode = 6
} elseif ($CommentState -eq 'Unknown') {
$StatusCode = 0
} elseif ($CommentState -eq 'WontFix') {
$StatusCode = 3
}
# Build the JSON body up
$body = ConvertTo-Json @{
comments = @(@{
parentCommentId = 0
content = $Markdown
commentType = 1
})
status = $StatusCode
}
Write-Verbose "Posting JSON payload: `n$Body"
# Post the message to the Pull Request
# https://learn.microsoft.com/rest/api/azure/devops/git/pull-request-threads
$url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/git/repositories/$($env:BUILD_REPOSITORY_NAME)/pullRequests/$($env:SYSTEM_PULLREQUEST_PULLREQUESTID)/threads?api-version=5.1"
if ($PSCmdlet.ShouldProcess($url, 'Post comment via REST call')) {
try {
if (!$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) {
Write-Error "Posting to the pull request requires that the script is running in an Azure Pipelines context."
exit 1
}
Write-Host "Posting PR comment to: $url"
Invoke-RestMethod -Uri $url -Method POST -Headers @{Authorization = "Bearer $AccessToken"} -Body $Body -ContentType application/json
}
catch {
Write-Error $_
Write-Error $_.Exception.Message
exit 2
}
}
================================================
FILE: azure-pipelines/TSAOptions.json
================================================
{
"tsaVersion": "TsaV2",
"codebase": "NewOrUpdate",
"codebaseName": "SlowCheetah",
"tsaStamp": "DevDiv",
"tsaEnvironment": "PROD",
"notificationAliases": [
"vsslnx@microsoft.com"
],
"codebaseAdmins": [
"REDMOND\\tevinstanley"
],
"instanceUrl": "https://devdiv.visualstudio.com",
"projectName": "DevDiv",
"areaPath": "DevDiv\\VS Core\\Project\\SlowCheetah",
"iterationPath": "DevDiv",
"tools": [
"APIScan",
"CodeQL"
],
"repositoryName": "SlowCheetah"
}
================================================
FILE: azure-pipelines/WIFtoPATauth.yml
================================================
parameters:
- name: deadPATServiceConnectionId # The GUID of the PAT-based service connection whose access token must be replaced.
type: string
- name: wifServiceConnectionName # The name of the WIF service connection to use to get the access token.
type: string
- name: resource # The scope for which the access token is requested.
type: string
default: 499b84ac-1321-427f-aa17-267ca6975798 # Azure Artifact feeds (any of them)
steps:
- task: AzureCLI@2
displayName: 🔏 Authenticate with WIF service connection
inputs:
azureSubscription: ${{ parameters.wifServiceConnectionName }}
scriptType: pscore
scriptLocation: inlineScript
inlineScript: |
$accessToken = az account get-access-token --query accessToken --resource '${{ parameters.resource }}' -o tsv
# Set the access token as a secret, so it doesn't get leaked in the logs
Write-Host "##vso[task.setsecret]$accessToken"
# Override the apitoken of the nuget service connection, for the duration of this stage
Write-Host "##vso[task.setendpoint id=${{ parameters.deadPATServiceConnectionId }};field=authParameter;key=apitoken]$accessToken"
================================================
FILE: azure-pipelines/apiscan.yml
================================================
parameters:
- name: windowsPool
type: object
- name: RealSign
type: boolean
jobs:
- job: apiscan
displayName: APIScan
dependsOn: Windows
pool: ${{ parameters.windowsPool }}
timeoutInMinutes: 120
templateContext:
${{ if not(parameters.RealSign) }}:
mb:
signing: # if the build is test-signed, install the signing plugin so that CSVTestSignPolicy.xml is available
enabled: true
zipSources: false
signType: test
outputs:
- output: pipelineArtifact
displayName: 📢 collect apiscan artifact
targetPath: $(Pipeline.Workspace)/.gdn/.r/apiscan/001/Logs
artifactName: apiscan-logs
condition: succeededOrFailed()
variables:
- name: SymbolsFeatureName
value: $[ dependencies.Windows.outputs['SetPipelineVariables.SymbolsFeatureName'] ]
- name: NBGV_MajorMinorVersion
value: $[ dependencies.Windows.outputs['nbgv.NBGV_MajorMinorVersion'] ]
- ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
# https://dev.azure.com/devdiv/DevDiv/_wiki/wikis/DevDiv.wiki/25351/APIScan-step-by-step-guide-to-setting-up-a-Pipeline
- group: VSEng sponsored APIScan # Expected to provide ApiScanClientId
steps:
# We need TSAOptions.json
- checkout: self
fetchDepth: 1
- download: current
artifact: APIScanInputs
displayName: 🔻 Download APIScanInputs artifact
- task: APIScan@2
displayName: 🔍 Run APIScan
inputs:
softwareFolder: $(Pipeline.Workspace)/APIScanInputs
softwareName: $(SymbolsFeatureName)
softwareVersionNum: $(NBGV_MajorMinorVersion)
isLargeApp: false
toolVersion: Latest
preserveLogsFolder: true
azureSubscription: VSEng-APIScanSC
env:
AzureServicesAuthConnectionString: $(APIScanAuthConnectionString)
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
# File bugs when APIScan finds issues
- task: TSAUpload@2
displayName: 🪳 TSA upload
inputs:
GdnPublishTsaOnboard: True
GdnPublishTsaConfigFile: $(Build.SourcesDirectory)\azure-pipelines\TSAOptions.json
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
================================================
FILE: azure-pipelines/archive-sourcecode.yml
================================================
trigger: none # We only want to trigger manually or based on resources
pr: none
# Source archival requirements come from a compliance tenet. Review a sample task here: https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1550985
# Source code should be archived within 30 days of the release date, and at least every quarter if your product is releasing more than once every 6 months.
# If your sources on GitHub are public open source project, then using GitHub Public Archive is sufficient.
schedules:
- cron: "13 13 13 */3 *" # Every three months
displayName: Periodic source archival
branches:
include:
- main
resources:
repositories:
- repository: MicroBuildTemplate
type: git
name: 1ESPipelineTemplates/MicroBuildTemplate
ref: refs/tags/release
parameters:
- name: notes
displayName: Notes to include in the SCA request
type: string
default: ' ' # optional parameters require a non-empty default.
- name: whatif
displayName: Only simulate the request
type: boolean
default: false
variables:
- group: VS Core team # Expected to provide ManagerAlias, SourceCodeArchivalUri
- template: GlobalVariables.yml
extends:
template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate
parameters:
sdl:
sourceAnalysisPool: VSEng-MicroBuildVSStable
stages:
- stage: archive
jobs:
- job: archive
pool:
name: AzurePipelines-EO
demands:
- ImageOverride -equals 1ESPT-Ubuntu22.04
os: Linux
steps:
- checkout: self
clean: true
fetchDepth: 0
- powershell: tools/Install-DotNetSdk.ps1
displayName: ⚙ Install .NET SDK
- task: NuGetAuthenticate@1
displayName: 🔏 Authenticate NuGet feeds
inputs:
forceReinstallCredentialProvider: true
- script: dotnet tool restore
displayName: ⚙️ Restore CLI tools
- powershell: tools/variables/_define.ps1
failOnStderr: true
displayName: ⚙ Set pipeline variables based on source
- task: AzureCLI@2
displayName: 🔏 Authenticate with WIF service connection
inputs:
azureSubscription: VS Core Source Code Archival
scriptType: pscore
scriptLocation: inlineScript
inlineScript: |
$accessToken = az account get-access-token --query accessToken --resource api://177cf50a-4bf5-4481-8b7e-f32900dfc8e6 -o tsv
Write-Host "##vso[task.setvariable variable=scaToken;issecret=true]$accessToken"
- pwsh: >
$TeamAlias = '$(TeamEmail)'.Substring(0, '$(TeamEmail)'.IndexOf('@'))
azure-pipelines/Archive-SourceCode.ps1
-ManagerAlias '$(ManagerAlias)'
-TeamAlias $TeamAlias
-BusinessGroupName '$(BusinessGroupName)'
-ProductName '$(SymbolsFeatureName)'
-ProductLanguage English
-Notes '${{ parameters.notes }}'
-AccessToken '$(scaToken)'
-Verbose
-WhatIf:$${{ parameters.whatif }}
displayName: 🗃️ Submit archival request
================================================
FILE: azure-pipelines/build.yml
================================================
parameters:
##### The following parameters are not set by other YAML files that import this one,
##### but we use parameters because they support rich types and defaults.
##### Feel free to adjust their default value as needed.
# Whether this repo uses OptProf to optimize the built binaries.
# When enabling this, be sure to update these files:
# - OptProf.targets: InstallationPath and match TestCase selection with what's in the VS repo.
# - The project file(s) for the libraries to optimize must import OptProf.targets (for multi-targeted projects, only import it for ONE target).
# - OptProf.yml: Search for LibraryName (or your library's name) and verify that those names are appropriate.
# - OptProf_part2.yml: Search for LibraryName (or your library's name) and verify that those names are appropriate.
# and create pipelines for OptProf.yml, OptProf_part2.yml
- name: EnableOptProf
type: boolean
default: false
# Whether this repo is localized.
- name: EnableLocalization
type: boolean
default: false
# Whether to run `dotnet format` as part of the build to ensure code style consistency.
# This is just one of a a few mechanisms to enforce code style consistency.
- name: EnableDotNetFormatCheck
type: boolean
default: false
# This lists the names of the artifacts that will be published *from every OS build agent*.
# Any new tools/artifacts/*.ps1 script needs to be added to this list.
# If an artifact is only generated or collected on one OS, it should NOT be listed here,
# but should be manually added to the `outputs:` field in the appropriate OS job.
- name: artifact_names
type: object
default:
- name: build_logs
- name: coverageResults
- name: deployables
sbomEnabled: true
- name: projectAssetsJson
- name: symbols
- name: testResults
testOnly: true
- name: test_symbols
testOnly: true
- name: Variables
# The Enable*Build parameters turn non-Windows agents on or off.
# Their default value should be based on whether the build and tests are expected/required to pass on that platform.
# Callers (e.g. Official.yml) *may* expose these parameters at queue-time in order to turn OFF optional agents.
- name: EnableLinuxBuild
type: boolean
default: false
- name: EnableMacOSBuild
type: boolean
default: false
##### 👆🏼 You MAY change the defaults above.
##### 👇🏼 You should NOT change the defaults below.
##### The following parameters are expected to be set by other YAML files that import this one.
##### Those without defaults require explicit values to be provided by our importers.
# Indicates whether the entrypoint file is 1ESPT compliant. Use this parameter to switch between publish tasks to fit 1ES or non-1ES needs.
- name: Is1ESPT
type: boolean
# Indicates whether the 'official' 1ES PT templates are being used (as opposed to the unofficial ones).
- name: Is1ESPTOfficial
type: boolean
default: false
- name: RealSign
type: boolean
default: false
- name: RunTests
type: boolean
default: true
- name: PublishCodeCoverage
type: boolean
default: true
# Whether this is a special one-off build for inserting into VS for a validation insertion PR (that will never be merged).
- name: SkipCodesignVerify
type: boolean
default: false
- name: EnableAPIScan
type: boolean
default: false
# This parameter exists to provide a workaround to get a build out even when no OptProf profiling outputs can be found.
# Entrypoint yaml files like official.yml should expose this as a queue-time setting when EnableOptProf is true in this file.
# The OptProf.yml entrypoint sets this parameter to true so that collecting profile data isn't blocked by a prior lack of profile data.
- name: ShouldSkipOptimize
type: boolean
default: false
# The pool parameters are set to defaults that work in the azure-public AzDO account.
# They are overridden by callers for the devdiv AzDO account to use 1ES compliant pools.
- name: windowsPool
type: object
default:
vmImage: windows-2025
- name: linuxPool
type: object
default:
vmImage: ubuntu-24.04
- name: macOSPool
type: object
default:
vmImage: macOS-15
jobs:
- job: Windows
pool: ${{ parameters.windowsPool }}
timeoutInMinutes: 180 # Give plenty of time due to real signing
${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
templateContext:
mb:
signing:
enabled: true
zipSources: false
${{ if parameters.RealSign }}:
signType: real
signWithProd: true
${{ else }}:
signType: test
sbom:
enabled: true
sbomToolVersion: 5.0.3
localization:
enabled: ${{ parameters.EnableLocalization }}
${{ if eq(variables['Build.Reason'], 'pullRequest') }}:
languages: ENU,JPN
optprof:
enabled: ${{ parameters.EnableOptProf }}
ProfilingInputsDropName: $(ProfilingInputsDropName)
GeneratePropsFile: true
PropsPath: $(Build.ArtifactStagingDirectory)/InsertionOutputs/$(ProfilingInputsPropsName)
OptimizationInputsLookupMethod: GitTagRepo
GitTagProject: DevDiv
GitTagRepo: VS
ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
AccessToken: $(System.AccessToken)
mbpresteps:
- checkout: self
fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
clean: true
- ${{ if parameters.EnableOptProf }}:
- powershell: |
Write-Host "##vso[task.setvariable variable=PROFILINGINPUTSDROPNAME]$(tools/variables/ProfilingInputsDropName.ps1)"
Write-Host "##vso[task.setvariable variable=PROFILINGINPUTSPROPSNAME]$(tools/variables/ProfilingInputsPropsName.ps1)"
displayName: ⚙ Setting variables for optprof
sdl:
binskim:
analyzeTargetGlob: $(Build.ArtifactStagingDirectory)\symbols-Windows\**
outputParentDirectory: $(Build.ArtifactStagingDirectory)
outputs:
- ${{ each artifact in parameters.artifact_names }}:
- ${{ if or(ne(artifact.testOnly, 'true'), parameters.RunTests) }}:
- output: pipelineArtifact
displayName: 📢 Publish ${{ artifact.name }}-Windows
targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Windows
artifactName: ${{ artifact.name }}-Windows
${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
sbomEnabled: true
- output: pipelineArtifact
displayName: 📢 Publish ${{ artifact.name }}-Windows (for failed attempts)
targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Windows
artifactName: ${{ artifact.name }}-Windows-$(System.PhaseAttempt)
${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
sbomEnabled: true
condition: failed()
- output: pipelineArtifact
displayName: 📢 Publish VSInsertion-Windows
targetPath: $(Build.ArtifactStagingDirectory)/VSInsertion-Windows
artifactName: VSInsertion-Windows
- ${{ if parameters.EnableLocalization }}:
- output: pipelineArtifact
displayName: 📢 Publish LocBin-Windows
targetPath: $(Build.ArtifactStagingDirectory)/LocBin-Windows
artifactName: LocBin-Windows
- ${{ if parameters.EnableAPIScan }}:
- output: pipelineArtifact
displayName: 📢 Publish APIScanInputs
targetPath: $(Build.ArtifactStagingDirectory)/APIScanInputs-Windows
artifactName: APIScanInputs
- ${{ if parameters.EnableOptProf }}:
- output: artifactsDrop
displayName: 📢 Publish to Artifact Services - ProfilingInputs
dropServiceURI: https://devdiv.artifacts.visualstudio.com
buildNumber: $(ProfilingInputsDropName)
sourcePath: $(Build.ArtifactStagingDirectory)\OptProf\ProfilingInputs
toLowerCase: false
retentionDays: 500
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
steps:
- ${{ if not(parameters.Is1ESPT) }}:
- checkout: self
fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
clean: true
- ${{ if parameters.EnableOptProf }}:
- powershell: Write-Host "##vso[task.setvariable variable=PROFILINGINPUTSDROPNAME]$(tools/variables/ProfilingInputsDropName.ps1)"
displayName: ⚙ Set ProfilingInputsDropName for optprof
- template: install-dependencies.yml
- script: dotnet nbgv cloud -ca
displayName: ⚙ Set build number
name: nbgv
- ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
- template: microbuild.before.yml
parameters:
EnableLocalization: ${{ parameters.EnableLocalization }}
ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
RealSign: ${{ parameters.RealSign }}
- template: dotnet.yml
parameters:
Is1ESPT: ${{ parameters.Is1ESPT }}
RunTests: ${{ parameters.RunTests }}
- ${{ if and(parameters.EnableDotNetFormatCheck, not(parameters.EnableLinuxBuild)) }}:
- script: dotnet format --verify-no-changes --no-restore src
displayName: 💅 Verify formatted code
env:
dotnetformat: true # part of a workaround for https://github.com/dotnet/sdk/issues/44951
- ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
- template: microbuild.after.yml
parameters:
SkipCodesignVerify: ${{ parameters.SkipCodesignVerify }}
- ${{ if parameters.EnableLinuxBuild }}:
- job: Linux
pool: ${{ parameters.linuxPool }}
${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
templateContext:
mb:
${{ if parameters.RealSign }}:
signing:
enabled: false # enable when building unique artifacts on this agent that must be signed
signType: real
signWithProd: true
outputParentDirectory: $(Build.ArtifactStagingDirectory)
outputs:
- ${{ each artifact in parameters.artifact_names }}:
- ${{ if or(ne(artifact.testOnly, 'true'), parameters.RunTests) }}:
- output: pipelineArtifact
displayName: 📢 Publish ${{ artifact.name }}-Linux
targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Linux
artifactName: ${{ artifact.name }}-Linux
${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
sbomEnabled: true
- output: pipelineArtifact
displayName: 📢 Publish ${{ artifact.name }}-Linux (for failed attempts)
targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Linux
artifactName: ${{ artifact.name }}-Linux-$(System.PhaseAttempt)
${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
sbomEnabled: true
condition: failed()
steps:
- checkout: self
fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
clean: true
- template: install-dependencies.yml
- template: dotnet.yml
parameters:
Is1ESPT: ${{ parameters.Is1ESPT }}
RunTests: ${{ parameters.RunTests }}
BuildRequiresAccessToken: ${{ parameters.RealSign }} # Real signing on non-Windows machines requires passing through access token to build steps that sign
- ${{ if parameters.EnableDotNetFormatCheck }}:
- script: dotnet format --verify-no-changes
displayName: 💅 Verify formatted code
env:
dotnetformat: true # part of a workaround for https://github.com/dotnet/sdk/issues/44951
- template: expand-template.yml
- ${{ if parameters.EnableMacOSBuild }}:
- job: macOS
pool: ${{ parameters.macOSPool }}
${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
templateContext:
mb:
${{ if parameters.RealSign }}:
signing:
enabled: false # enable when building unique artifacts on this agent that must be signed
signType: real
signWithProd: true
outputParentDirectory: $(Build.ArtifactStagingDirectory)
outputs:
- ${{ each artifact in parameters.artifact_names }}:
- ${{ if or(ne(artifact.testOnly, 'true'), parameters.RunTests) }}:
- output: pipelineArtifact
displayName: 📢 Publish ${{ artifact.name }}-macOS
targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-macOS
artifactName: ${{ artifact.name }}-macOS
${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
sbomEnabled: true
- output: pipelineArtifact
displayName: 📢 Publish ${{ artifact.name }}-macOS (for failed attempts)
targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-macOS
artifactName: ${{ artifact.name }}-macOS-$(System.PhaseAttempt)
${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
sbomEnabled: true
condition: failed()
steps:
- checkout: self
fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
clean: true
- template: install-dependencies.yml
- template: dotnet.yml
parameters:
Is1ESPT: ${{ parameters.Is1ESPT }}
RunTests: ${{ parameters.RunTests }}
BuildRequiresAccessToken: ${{ parameters.RealSign }} # Real signing on non-Windows machines requires passing through access token to build steps that sign
- template: expand-template.yml
- job: WrapUp
dependsOn:
- Windows
- ${{ if parameters.EnableLinuxBuild }}:
- Linux
- ${{ if parameters.EnableMacOSBuild }}:
- macOS
pool: ${{ parameters.windowsPool }} # Use Windows agent because PublishSymbols task requires it (https://github.com/microsoft/azure-pipelines-tasks/issues/13821).
condition: succeededOrFailed()
variables:
ONEES_ENFORCED_CODEQL_ENABLED: false # CodeQL runs on build jobs, we don't need it here
${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
templateContext:
${{ if not(parameters.RealSign) }}:
mb:
signing: # if the build is test-signed, install the signing plugin so that CSVTestSignPolicy.xml is available
enabled: true
zipSources: false
signType: test
outputParentDirectory: $(Build.ArtifactStagingDirectory)
outputs:
- output: pipelineArtifact
displayName: 📢 Publish symbols-legacy
targetPath: $(Build.ArtifactStagingDirectory)/symbols-legacy
artifactName: symbols-legacy
condition: succeededOrFailed()
steps:
- checkout: self
fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
clean: true
- template: install-dependencies.yml
parameters:
initArgs: -NoRestore
- template: publish-symbols.yml
parameters:
EnableLinuxBuild: ${{ parameters.EnableLinuxBuild }}
EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
- ${{ if and(parameters.RunTests, parameters.PublishCodeCoverage) }}:
- template: publish-codecoverage.yml
parameters:
EnableLinuxBuild: ${{ parameters.EnableLinuxBuild }}
EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
- ${{ if parameters.EnableAPIScan }}:
- template: apiscan.yml
parameters:
windowsPool: ${{ parameters.windowsPool }}
RealSign: ${{ parameters.RealSign }}
================================================
FILE: azure-pipelines/dotnet.yml
================================================
parameters:
- name: RunTests
- name: Is1ESPT
type: boolean
- name: BuildRequiresAccessToken
type: boolean
default: false
steps:
- task: VSBuild@1
inputs:
solution: src/SlowCheetah.sln
msbuildArgs: /t:build,pack /bl:"$(Build.ArtifactStagingDirectory)/build_logs/build.binlog"
configuration: $(BuildConfiguration)
displayName: 🛠 Build
- powershell: tools/dotnet-test-cloud.ps1 -Configuration $(BuildConfiguration) -Agent $(Agent.JobName) -PublishResults
displayName: 🧪 dotnet test
condition: and(succeeded(), ${{ parameters.RunTests }})
- powershell: tools/variables/_define.ps1
failOnStderr: true
displayName: ⚙ Update pipeline variables based on build outputs
condition: succeededOrFailed()
- ${{ if parameters.Is1ESPT }}:
- powershell: azure-pipelines/publish_artifacts.ps1 -StageOnly -AvoidSymbolicLinks -ArtifactNameSuffix "-$(Agent.JobName)" -Verbose
failOnStderr: true
displayName: 📢 Stage artifacts
condition: succeededOrFailed()
- ${{ else }}:
- powershell: azure-pipelines/publish_artifacts.ps1 -ArtifactNameSuffix "-$(Agent.JobName)" -Verbose
failOnStderr: true
displayName: 📢 Publish artifacts
condition: succeededOrFailed()
- ${{ if parameters.RunTests }}:
- powershell: |
$ArtifactStagingFolder = & "tools/Get-ArtifactsStagingDirectory.ps1"
$CoverageResultsFolder = Join-Path $ArtifactStagingFolder "coverageResults-$(Agent.JobName)"
tools/publish-CodeCov.ps1 -CodeCovToken "$(CODECOV_TOKEN)" -PathToCodeCoverage "$CoverageResultsFolder" -Name "$(Agent.JobName) Coverage Results" -Flags "$(Agent.JobName)"
displayName: 📢 Publish code coverage results to codecov.io
timeoutInMinutes: 3
continueOnError: true
# Set the CODECOV_TOKEN variable in your Azure Pipeline to enable code coverage reporting
# Get a token from https://codecov.io/
condition: and(succeeded(), ne(variables['CODECOV_TOKEN'], ''))
================================================
FILE: azure-pipelines/falsepositives.gdnsuppress
================================================
{
"version": "latest",
"suppressionSets": {
"falsepositives": {
"name": "falsepositives",
"createdDate": "2021-12-03 00:23:08Z",
"lastUpdatedDate": "2021-12-03 00:23:08Z"
}
},
"results": {
}
}
================================================
FILE: azure-pipelines/install-dependencies.yml
================================================
parameters:
- name: initArgs
type: string
default: ''
- name: needsAzurePublicFeeds
type: boolean
default: true # If nuget.config pulls from the azure-public account, we need to authenticate when building on the devdiv account.
steps:
- ${{ if and(parameters.needsAzurePublicFeeds, eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9')) }}:
- template: WIFtoPATauth.yml
parameters:
wifServiceConnectionName: azure-public/vside package pull
deadPATServiceConnectionId: 0ae39abc-4d06-4436-a7b5-865833df49db # azure-public/msft_consumption
- task: NuGetAuthenticate@1
displayName: 🔏 Authenticate NuGet feeds
inputs:
${{ if and(parameters.needsAzurePublicFeeds, eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9')) }}:
nuGetServiceConnections: azure-public/msft_consumption
- powershell: |
$AccessToken = '$(System.AccessToken)' # Avoid specifying the access token directly on the init.ps1 command line to avoid it showing up in errors
.\init.ps1 -AccessToken $AccessToken ${{ parameters['initArgs'] }} -UpgradePrerequisites -NoNuGetCredProvider
dotnet --info
# Print mono version if it is present.
if (Get-Command mono -ErrorAction SilentlyContinue) {
mono --version
}
displayName: ⚙ Install prerequisites
- powershell: tools/variables/_define.ps1
failOnStderr: true
displayName: ⚙ Set pipeline variables based on source
name: SetPipelineVariables
================================================
FILE: azure-pipelines/libtemplate-update.yml
================================================
# This pipeline schedules regular merges of Library.Template into a repo that is based on it.
# Only Azure Repos are supported. GitHub support comes via a GitHub Actions workflow.
trigger: none
pr: none
schedules:
- cron: "0 3 * * Mon" # Sun @ 8 or 9 PM Mountain Time (depending on DST)
displayName: Weekly trigger
branches:
include:
- main
always: true
resources:
repositories:
- repository: MicroBuildTemplate
type: git
name: 1ESPipelineTemplates/MicroBuildTemplate
ref: refs/tags/release
parameters:
- name: AutoComplete
displayName: Auto-complete pull request
type: boolean
default: false
variables:
- template: GlobalVariables.yml
extends:
template: azure-pipelines/MicroBuild.1ES.Unofficial.yml@MicroBuildTemplate
parameters:
sdl:
sourceAnalysisPool:
name: AzurePipelines-EO
demands:
- ImageOverride -equals 1ESPT-Windows2022
credscan:
enabled: false
stages:
- stage: Merge
jobs:
- job: merge
pool:
name: AzurePipelines-EO
demands:
- ImageOverride -equals 1ESPT-Ubuntu22.04
os: Linux
steps:
- checkout: self
fetchDepth: 0
clean: true
- pwsh: |
$LibTemplateBranch = & ./tools/Get-LibTemplateBasis.ps1 -ErrorIfNotRelated
if ($LASTEXITCODE -ne 0) {
exit $LASTEXITCODE
}
git fetch https://github.com/aarnott/Library.Template $LibTemplateBranch
if ($LASTEXITCODE -ne 0) {
exit $LASTEXITCODE
}
$LibTemplateCommit = git rev-parse FETCH_HEAD
if ((git rev-list FETCH_HEAD ^HEAD --count) -eq 0) {
Write-Host "There are no Library.Template updates to merge."
exit 0
}
$UpdateBranchName = 'auto/libtemplateUpdate'
git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" push origin -f FETCH_HEAD:refs/heads/$UpdateBranchName
Write-Host "Creating pull request"
$contentType = 'application/json';
$headers = @{ Authorization = 'Bearer $(System.AccessToken)' };
$rawRequest = @{
sourceRefName = "refs/heads/$UpdateBranchName";
targetRefName = "refs/heads/main";
title = 'Merge latest Library.Template';
description = "This merges the latest features and fixes from [Library.Template's $LibTemplateBranch branch](https://github.com/AArnott/Library.Template/tree/$LibTemplateBranch).";
}
$request = ConvertTo-Json $rawRequest
$prApiBaseUri = '$(System.TeamFoundationCollectionUri)/$(System.TeamProject)/_apis/git/repositories/$(Build.Repository.ID)/pullrequests'
$prCreationUri = $prApiBaseUri + "?api-version=6.0"
Write-Host "POST $prCreationUri"
Write-Host $request
$prCreationResult = Invoke-RestMethod -uri $prCreationUri -method POST -Headers $headers -ContentType $contentType -Body $request
$prUrl = "$($prCreationResult.repository.webUrl)/pullrequest/$($prCreationResult.pullRequestId)"
Write-Host "Pull request: $prUrl"
$prApiBaseUri += "/$($prCreationResult.pullRequestId)"
$SummaryPath = Join-Path '$(Agent.TempDirectory)' 'summary.md'
Set-Content -Path $SummaryPath -Value "[Insertion pull request]($prUrl)"
Write-Host "##vso[task.uploadsummary]$SummaryPath"
# Tag the PR
$tagUri = "$prApiBaseUri/labels?api-version=7.0"
$rawRequest = @{
name = 'auto-template-merge';
}
$request = ConvertTo-Json $rawRequest
Invoke-RestMethod -uri $tagUri -method POST -Headers $headers -ContentType $contentType -Body $request | Out-Null
# Add properties to the PR that we can programatically parse later.
Function Set-PRProperties($properties) {
$rawRequest = $properties.GetEnumerator() |% {
@{
op = 'add'
path = "/$($_.key)"
from = $null
value = $_.value
}
}
$request = ConvertTo-Json $rawRequest
$setPrPropertyUri = "$prApiBaseUri/properties?api-version=7.0"
Write-Debug "$request"
$setPrPropertyResult = Invoke-RestMethod -uri $setPrPropertyUri -method PATCH -Headers $headers -ContentType 'application/json-patch+json' -Body $request -StatusCodeVariable setPrPropertyStatus -SkipHttpErrorCheck
if ($setPrPropertyStatus -ne 200) {
Write-Host "##vso[task.logissue type=warning]Failed to set pull request properties. Result: $setPrPropertyStatus. $($setPrPropertyResult.message)"
}
}
Write-Host "Setting pull request properties"
Set-PRProperties @{
'AutomatedMerge.SourceBranch' = $LibTemplateBranch
'AutomatedMerge.SourceCommit' = $LibTemplateCommit
}
# Add an *active* PR comment to warn users to *merge* the pull request instead of squash it.
$request = ConvertTo-Json @{
comments = @(
@{
parentCommentId = 0
content = "Do **not** squash this pull request when completing it. You must *merge* it."
commentType = 'system'
}
)
status = 'active'
}
$result = Invoke-RestMethod -uri "$prApiBaseUri/threads?api-version=7.1" -method POST -Headers $headers -ContentType $contentType -Body $request -StatusCodeVariable addCommentStatus -SkipHttpErrorCheck
if ($addCommentStatus -ne 200) {
Write-Host "##vso[task.logissue type=warning]Failed to post comment on pull request. Result: $addCommentStatus. $($result.message)"
}
# Set auto-complete on the PR
if ('${{ parameters.AutoComplete }}' -eq 'True') {
Write-Host "Setting auto-complete"
$mergeMessage = "Merged PR $($prCreationResult.pullRequestId): " + $commitMessage
$rawRequest = @{
autoCompleteSetBy = @{
id = $prCreationResult.createdBy.id
};
completionOptions = @{
deleteSourceBranch = $true;
mergeCommitMessage = $mergeMessage;
mergeStrategy = 'noFastForward';
};
}
$request = ConvertTo-Json $rawRequest
Write-Host $request
$uri = "$($prApiBaseUri)?api-version=6.0"
$result = Invoke-RestMethod -uri $uri -method PATCH -Headers $headers -ContentType $contentType -Body $request -StatusCodeVariable autoCompleteStatus -SkipHttpErrorCheck
if ($autoCompleteStatus -ne 200) {
Write-Host "##vso[task.logissue type=warning]Failed to set auto-complete on pull request. Result: $autoCompleteStatus. $($result.message)"
}
}
displayName: Create pull request
================================================
FILE: azure-pipelines/microbuild.after.yml
================================================
parameters:
- name: SkipCodesignVerify
type: boolean
steps:
- ${{ if not(parameters.SkipCodesignVerify) }}:
- task: MicroBuildCodesignVerify@3
displayName: 🔍 Verify Signed Files
inputs:
ApprovalListPathForSigs: $(Build.SourcesDirectory)\azure-pipelines\no_strongname.txt
ApprovalListPathForCerts: $(Build.SourcesDirectory)\azure-pipelines\no_authenticode.txt
TargetFolders: |
$(Build.SourcesDirectory)/bin/Packages/$(BuildConfiguration)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
================================================
FILE: azure-pipelines/microbuild.before.yml
================================================
parameters:
- name: EnableLocalization
type: boolean
default: false
- name: ShouldSkipOptimize
type: boolean
default: false
- name: RealSign
type: boolean
steps:
- ${{ if ne(variables['Build.Reason'], 'PullRequest') }}:
# notice@0 requires CG detection to run first, and non-default branches don't inject it automatically.
# default branch injection (main) is happening too late for notice@0 to run successfully. Adding this as a workaround.
- task: ComponentGovernanceComponentDetection@0
displayName: 🔍 Component Detection
- task: notice@0
displayName: 🛠️ Generate NOTICE file
inputs:
outputfile: $(System.DefaultWorkingDirectory)/obj/NOTICE
outputformat: text
retryCountOnTaskFailure: 10 # fails when the cloud service is overloaded
continueOnError: ${{ not(parameters.RealSign) }} # Tolerate failures when we're not building something that may ship.
================================================
FILE: azure-pipelines/no_authenticode.txt
================================================
bin\packages\release\vsix\_manifest\manifest.cat,sbom signed
bin\packages\release\vsix\_manifest\spdx_2.2\manifest.cat,sbom signed
================================================
FILE: azure-pipelines/no_strongname.txt
================================================
================================================
FILE: azure-pipelines/official.yml
================================================
trigger:
branches:
include:
- main
schedules:
# Monthly compliance sweep: runs at 03:00 UTC (8 PM PST previous day) on the 1st of every month.
# `always: true` ensures it runs even if there have been no code changes since the last successful build,
# so we can detect regressions in compliance tooling (APIScan, PoliCheck, CodeSignValidation, etc.).
- cron: "0 3 1 * *"
displayName: Monthly compliance sweep
branches:
include:
- main
always: true
parameters:
# As an entrypoint pipeline yml file, all parameters here show up in the Queue Run dialog.
# If any paramaters should NOT be queue-time options, they should be removed from here
# and references to them in this file replaced with hard-coded values.
# - name: ShouldSkipOptimize # Uncomment this and references to it below when setting EnableOptProf to true in build.yml.
# displayName: Skip OptProf optimization
# type: boolean
# default: false
- name: EnableMacOSBuild
displayName: Build on macOS
type: boolean
default: false # macOS is often bogged down in Azure Pipelines
- name: RunTests
displayName: Run tests
type: boolean
default: true
- name: EnableAPIScan
displayName: Include APIScan with compliance tools
type: boolean
default: true # enable in individual repos only AFTER updating TSAOptions.json with your own values
- name: PublishCodeCoverage
displayName: Publish code coverage
type: boolean
default: true
resources:
repositories:
- repository: MicroBuildTemplate
type: git
name: 1ESPipelineTemplates/MicroBuildTemplate
ref: refs/tags/release
variables:
- template: GlobalVariables.yml
extends:
template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate
parameters:
sdl:
sourceAnalysisPool: VSEng-MicroBuildVSStable
codeSignValidation:
enabled: true
break: true
additionalTargetsGlobPattern: -|Variables-*\*.ps1;-|LocBin-*\**;-|APIScanInputs-*\**;-|test_symbols-*\**;-|MicroBuild\**;-|$(Build.ArtifactStagingDirectory)\VSInsertion-Windows\vs-insertion-script.ps1
policheck:
enabled: true
exclusionsFile: $(System.DefaultWorkingDirectory)\azure-pipelines\PoliCheckExclusions.xml
suppression:
suppressionFile: $(System.DefaultWorkingDirectory)\azure-pipelines\falsepositives.gdnsuppress
sbom:
enabled: false # Skip 1ES SBOM because microbuild has our own sbom system
stages:
- stage: Build
variables:
- template: /azure-pipelines/BuildStageVariables.yml@self
jobs:
- template: /azure-pipelines/build.yml@self
parameters:
Is1ESPT: true
Is1ESPTOfficial: true
RealSign: true
# ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
EnableAPIScan: ${{ parameters.EnableAPIScan }}
windowsPool: VSEng-MicroBuildVSStable
linuxPool:
name: AzurePipelines-EO
demands:
- ImageOverride -equals 1ESPT-Ubuntu22.04
os: Linux
macOSPool:
name: Azure Pipelines
vmImage: macOS-15
os: macOS
EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
RunTests: ${{ parameters.RunTests }}
PublishCodeCoverage: ${{ parameters.PublishCodeCoverage }}
- template: /azure-pipelines/prepare-insertion-stages.yml@self
parameters:
RealSign: true
================================================
FILE: azure-pipelines/prepare-insertion-stages.yml
================================================
parameters:
- name: ArchiveSymbols
type: boolean
default: true
- name: RealSign
displayName: Real sign?
type: boolean
- name: PackagePush
type: boolean
default: false # Switch to true to enable the push job below
stages:
- ${{ if or(parameters.ArchiveSymbols, parameters.PackagePush) }}:
- stage: release
displayName: Publish
jobs:
- ${{ if parameters.ArchiveSymbols }}:
- job: symbol_archive
displayName: Archive symbols
pool: VSEng-MicroBuildVSStable
variables:
ONEES_ENFORCED_CODEQL_ENABLED: false # CodeQL runs on build stages, we don't need it here
steps:
- checkout: none
- download: current
artifact: Variables-Windows
displayName: 🔻 Download Variables-Windows artifact
- powershell: $(Pipeline.Workspace)/Variables-Windows/_define.ps1
displayName: ⚙️ Set pipeline variables based on artifacts
- download: current
artifact: symbols-legacy
displayName: 🔻 Download symbols-legacy artifact
- task: MicroBuildArchiveSymbols@6
displayName: 🔣 Archive symbols to Symweb
inputs:
SymbolsFeatureName: $(SymbolsFeatureName)
SymbolsProject: VS
SymbolsAgentPath: $(Pipeline.Workspace)/symbols-legacy
azureSubscription: Vseng-SymbolsUpload
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- ${{ if parameters.PackagePush }}:
- job: push
${{ if parameters.RealSign }}:
displayName: azure-public/vs-impl feed
${{ else }}:
displayName: devdiv/vs-impl feed # Leave this as-is, since non-signed builds must not be pushed to public feeds.
${{ if parameters.ArchiveSymbols }}:
dependsOn: symbol_archive
pool:
name: AzurePipelines-EO
demands:
- ImageOverride -equals 1ESPT-Ubuntu22.04
os: Linux
templateContext:
outputs:
- output: nuget
displayName: 📦 Push nuget packages
packagesToPush: '$(Pipeline.Workspace)/deployables-Windows/NuGet/*.nupkg'
packageParentPath: $(Pipeline.Workspace)/deployables-Windows/NuGet
allowPackageConflicts: true
${{ if parameters.RealSign }}:
nuGetFeedType: external
publishFeedCredentials: azure-public/vs-impl
${{ else }}:
nuGetFeedType: internal
publishVstsFeed: vs-impl # Leave this as-is, since non-signed builds must not be pushed to public feeds.
variables:
ONEES_ENFORCED_CODEQL_ENABLED: false # CodeQL runs on build stages, we don't need it here
steps:
- checkout: none
- download: current
artifact: Variables-Windows
displayName: 🔻 Download Variables-Windows artifact
- powershell: $(Pipeline.Workspace)/Variables-Windows/_define.ps1
displayName: ⚙️ Set pipeline variables based on artifacts
- download: current
artifact: deployables-Windows
displayName: 🔻 Download deployables-Windows artifact
- ${{ if parameters.RealSign }}:
- template: WIFtoPATauth.yml
parameters:
wifServiceConnectionName: azure-public/vside package push
deadPATServiceConnectionId: 207efd62-fd0f-43e7-aeae-17c4febcc660 # azure-public/vs-impl
================================================
FILE: azure-pipelines/publish-codecoverage.yml
================================================
parameters:
- name: EnableMacOSBuild
type: boolean
- name: EnableLinuxBuild
type: boolean
steps:
- download: current
artifact: coverageResults-Windows
displayName: 🔻 Download Windows code coverage results
continueOnError: true
- ${{ if parameters.EnableLinuxBuild }}:
- download: current
artifact: coverageResults-Linux
displayName: 🔻 Download Linux code coverage results
continueOnError: true
- ${{ if parameters.EnableMacOSBuild }}:
- download: current
artifact: coverageResults-macOS
displayName: 🔻 Download macOS code coverage results
continueOnError: true
- powershell: azure-pipelines/Merge-CodeCoverage.ps1 -Path '$(Pipeline.Workspace)' -OutputFile coveragereport/merged.cobertura.xml -Format Cobertura -Verbose
displayName: ⚙ Merge coverage
- task: PublishCodeCoverageResults@2
displayName: 📢 Publish code coverage results to Azure DevOps
inputs:
summaryFileLocation: coveragereport/merged.cobertura.xml
failIfCoverageEmpty: true
================================================
FILE: azure-pipelines/publish-symbols.yml
================================================
parameters:
- name: EnableMacOSBuild
type: boolean
- name: EnableLinuxBuild
type: boolean
steps:
- task: DownloadPipelineArtifact@2
inputs:
artifact: symbols-Windows
path: $(Pipeline.Workspace)/symbols/Windows
displayName: 🔻 Download Windows symbols
continueOnError: true
- ${{ if parameters.EnableLinuxBuild }}:
- task: DownloadPipelineArtifact@2
inputs:
artifact: symbols-Linux
path: $(Pipeline.Workspace)/symbols/Linux
displayName: 🔻 Download Linux symbols
continueOnError: true
- ${{ if parameters.EnableMacOSBuild }}:
- task: DownloadPipelineArtifact@2
inputs:
artifact: symbols-macOS
path: $(Pipeline.Workspace)/symbols/macOS
displayName: 🔻 Download macOS symbols
continueOnError: true
- task: DownloadPipelineArtifact@2
inputs:
artifact: test_symbols-Windows
path: $(Pipeline.Workspace)/test_symbols/Windows
displayName: 🔻 Download Windows test symbols
continueOnError: true
- ${{ if parameters.EnableLinuxBuild }}:
- task: DownloadPipelineArtifact@2
inputs:
artifact: test_symbols-Linux
path: $(Pipeline.Workspace)/test_symbols/Linux
displayName: 🔻 Download Linux test symbols
continueOnError: true
- ${{ if parameters.EnableMacOSBuild }}:
- task: DownloadPipelineArtifact@2
inputs:
artifact: test_symbols-macOS
path: $(Pipeline.Workspace)/test_symbols/macOS
displayName: 🔻 Download macOS test symbols
continueOnError: true
- task: PublishSymbols@2
inputs:
SymbolsFolder: $(Pipeline.Workspace)/symbols
SearchPattern: '**/*.pdb'
IndexSources: false
SymbolServerType: TeamServices
displayName: 📢 Publish symbols
- task: PublishSymbols@2
inputs:
SymbolsFolder: $(Pipeline.Workspace)/test_symbols
SearchPattern: '**/*.pdb'
IndexSources: false
SymbolServerType: TeamServices
displayName: 📢 Publish test symbols
- powershell: tools/Prepare-Legacy-Symbols.ps1 -Path $(Pipeline.Workspace)/symbols/Windows
displayName: ⚙ Prepare symbols for symbol archival
================================================
FILE: azure-pipelines/publish_artifacts.ps1
================================================
<#
.SYNOPSIS
This script translates all the artifacts described by _all.ps1
into commands that instruct Azure Pipelines to actually collect those artifacts.
#>
[CmdletBinding()]
param (
[string]$ArtifactNameSuffix,
[switch]$StageOnly,
[switch]$AvoidSymbolicLinks
)
Function Set-PipelineVariable($name, $value) {
if ((Test-Path "Env:\$name") -and (Get-Item "Env:\$name").Value -eq $value) {
return # already set
}
#New-Item -LiteralPath "Env:\$name".ToUpper() -Value $value -Force | Out-Null
Write-Host "##vso[task.setvariable variable=$name]$value"
}
Function Test-ArtifactUploaded($artifactName) {
$varName = "ARTIFACTUPLOADED_$($artifactName.ToUpper())"
Test-Path "env:$varName"
}
& "$PSScriptRoot/../tools/artifacts/_stage_all.ps1" -ArtifactNameSuffix $ArtifactNameSuffix -AvoidSymbolicLinks:$AvoidSymbolicLinks |% {
# Set a variable which will out-live this script so that a subsequent attempt to collect and upload artifacts
# will skip this one from a check in the _all.ps1 script.
Set-PipelineVariable "ARTIFACTSTAGED_$($_.Name.ToUpper())" 'true'
Write-Host "Staged artifact $($_.Name) to $($_.Path)"
if (!$StageOnly) {
if (Test-ArtifactUploaded $_.Name) {
Write-Host "Skipping $($_.Name) because it has already been uploaded." -ForegroundColor DarkGray
} else {
Write-Host "##vso[artifact.upload containerfolder=$($_.Name);artifactname=$($_.Name);]$($_.Path)"
# Set a variable which will out-live this script so that a subsequent attempt to collect and upload artifacts
# will skip this one from a check in the _all.ps1 script.
Set-PipelineVariable "ARTIFACTUPLOADED_$($_.Name.ToUpper())" 'true'
}
}
}
================================================
FILE: azure-pipelines/release-deployment-prep.yml
================================================
steps:
- download: CI
artifact: Variables-Windows
displayName: 🔻 Download Variables-Windows artifact
- powershell: $(Pipeline.Workspace)/CI/Variables-Windows/_define.ps1
displayName: ⚙️ Set pipeline variables based on artifacts
================================================
FILE: azure-pipelines/release.yml
================================================
trigger: none # We only want to trigger manually or based on resources
pr: none
resources:
repositories:
- repository: MicroBuildTemplate
type: git
name: 1ESPipelineTemplates/MicroBuildTemplate
ref: refs/tags/release
pipelines:
- pipeline: CI
source: slow-cheetah-ci
trigger:
tags:
- auto-release
variables:
- template: GlobalVariables.yml
extends:
template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate
parameters:
sdl:
sourceAnalysisPool: VSEng-MicroBuildVSStable
stages:
- stage: release
jobs:
- job: nuget
displayName: 📦 Push nuget.org packages
pool:
name: AzurePipelines-EO
demands:
- ImageOverride -equals 1ESPT-Ubuntu22.04
os: Linux
templateContext:
outputs:
- output: nuget
displayName: 📦 Push packages to nuget.org
packagesToPush: '$(Pipeline.Workspace)/CI/deployables-Windows/NuGet/*.nupkg'
packageParentPath: $(Pipeline.Workspace)/CI/deployables-Windows/NuGet
allowPackageConflicts: true
nuGetFeedType: external
publishFeedCredentials: VisualStudioExtensibility (nuget.org)
steps:
- checkout: none
- download: CI
artifact: deployables-Windows
displayName: 🔻 Download deployables-Windows artifact
patterns: 'NuGet/*'
- job: github
displayName: 📢 GitHub release
dependsOn: nuget
pool:
name: AzurePipelines-EO
demands:
- ImageOverride -equals 1ESPT-Ubuntu22.04
os: Linux
templateContext:
type: releaseJob
isProduction: true
inputs:
- input: pipelineArtifact
pipeline: CI
artifactName: deployables-Windows
targetPath: $(Pipeline.Workspace)/CI/deployables-Windows
steps:
- checkout: none
- powershell: |
Write-Host "##vso[build.updatebuildnumber]$(resources.pipeline.CI.runName)"
if ('$(resources.pipeline.CI.runName)'.Contains('-')) {
Write-Host "##vso[task.setvariable variable=IsPrerelease]true"
} else {
Write-Host "##vso[task.setvariable variable=IsPrerelease]false"
}
displayName: ⚙ Set up pipeline
- task: GitHubRelease@1
displayName: 📢 GitHub release (create)
inputs:
gitHubConnection: ttstanley # service connection
repositoryName: $(Build.Repository.Name)
target: $(resources.pipeline.CI.sourceCommit)
tagSource: userSpecifiedTag
tag: v$(resources.pipeline.CI.runName)
title: v$(resources.pipeline.CI.runName)
isDraft: true # After running this step, visit the new draft release, edit, and publish.
isPreRelease: $(IsPrerelease)
assets: $(Pipeline.Workspace)/CI/deployables-Windows/NuGet/*.nupkg
changeLogCompareToRelease: lastNonDraftRelease
changeLogType: issueBased
changeLogLabels: |
[
{ "label" : "breaking change", "displayName" : "Breaking changes", "state" : "closed" },
{ "label" : "bug", "displayName" : "Fixes", "state" : "closed" },
{ "label" : "enhancement", "displayName": "Enhancements", "state" : "closed" }
]
================================================
FILE: azure-pipelines/unofficial.yml
================================================
trigger:
batch: true
branches:
include:
- main
- microbuild
- 'validate/*'
paths:
exclude:
- doc/
- '*.md'
- .vscode/
- azure-pipelines/release.yml
- azure-pipelines/vs-insertion.yml
parameters:
# As an entrypoint pipeline yml file, all parameters here show up in the Queue Run dialog.
# If any paramaters should NOT be queue-time options, they should be removed from here
# and references to them in this file replaced with hard-coded values.
# - name: ShouldSkipOptimize # Uncomment this and references to it below when setting EnableOptProf to true in build.yml.
# displayName: Skip OptProf optimization
# type: boolean
# default: false
- name: EnableMacOSBuild
displayName: Build on macOS
type: boolean
default: false # macOS is often bogged down in Azure Pipelines
- name: RunTests
displayName: Run tests
type: boolean
default: true
- name: EnableAPIScan
displayName: Include APIScan with compliance tools
type: boolean
default: false
- name: EnableProductionSDL
displayName: Enable Production SDL
type: boolean
default: false
- name: PublishCodeCoverage
displayName: Publish code coverage
type: boolean
default: true
resources:
repositories:
- repository: MicroBuildTemplate
type: git
name: 1ESPipelineTemplates/MicroBuildTemplate
ref: refs/tags/release
variables:
- template: GlobalVariables.yml
extends:
template: azure-pipelines/MicroBuild.1ES.Unofficial.yml@MicroBuildTemplate
parameters:
sdl:
sourceAnalysisPool: VSEng-MicroBuildVSStable
credscan:
enabled: false
suppression:
suppressionFile: $(System.DefaultWorkingDirectory)\azure-pipelines\falsepositives.gdnsuppress
enableProductionSDL: ${{ parameters.EnableProductionSDL }}
codeSignValidation:
enabled: ${{ parameters.EnableProductionSDL }}
break: true
additionalTargetsGlobPattern: -|Variables-*\*.ps1;-|APIScanInputs-*\**;-|test_symbols-*\**;-|MicroBuild\**;-|$(Build.ArtifactStagingDirectory)\VSInsertion-Windows\vs-insertion-script.ps1
policyFile: $(MBSIGN_APPFOLDER)\CSVTestSignPolicy.xml
policheck:
enabled: ${{ parameters.EnableProductionSDL }}
exclusionsFile: $(System.DefaultWorkingDirectory)\azure-pipelines\PoliCheckExclusions.xml
sbom:
enabled: false # Skip 1ES SBOM because microbuild has our own sbom system
stages:
- stage: Build
variables:
- template: /azure-pipelines/BuildStageVariables.yml@self
jobs:
- template: /azure-pipelines/build.yml@self
parameters:
Is1ESPT: true
RealSign: false
# ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
EnableAPIScan: ${{ parameters.EnableAPIScan }}
windowsPool: VSEng-MicroBuildVSStable
linuxPool:
name: AzurePipelines-EO
demands:
- ImageOverride -equals 1ESPT-Ubuntu22.04
os: Linux
macOSPool:
name: Azure Pipelines
vmImage: macOS-15
os: macOS
EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
RunTests: ${{ parameters.RunTests }}
PublishCodeCoverage: ${{ parameters.PublishCodeCoverage }}
================================================
FILE: azure-pipelines/vs-insertion-script.ps1
================================================
# List of build artifact files [Source => Destination] to be committed into the VS repo.
$FilesToCommit = @{
"$env:PROFILINGINPUTSPROPSNAME" = "src/Tests/config/runsettings/Official/OptProf/External/$env:PROFILINGINPUTSPROPSNAME";
}
foreach ($File in $FilesToCommit.GetEnumerator()) {
$SourcePath = Join-Path $PSScriptRoot $File.Key
if (Test-Path $SourcePath) {
$DestinationPath = Join-Path (Get-Location) $File.Value
Write-Host "Copying $SourcePath to $DestinationPath"
Copy-Item -Path $SourcePath -Destination $DestinationPath
git add $DestinationPath
}
else {
Write-Host "$SourcePath is not present, skipping"
}
}
================================================
FILE: azure-pipelines/vs-insertion.yml
================================================
trigger: none # We only want to trigger manually or based on resources
pr: none
resources:
repositories:
- repository: MicroBuildTemplate
type: git
name: 1ESPipelineTemplates/MicroBuildTemplate
ref: refs/tags/release
pipelines:
- pipeline: CI
source: Library # TODO: This should match the name of your CI pipeline
tags:
- Real signed
trigger:
tags:
- Real signed
variables:
- template: GlobalVariables.yml
extends:
template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate
parameters:
sdl:
sourceAnalysisPool: VSEng-MicroBuildVSStable
sbom:
enabled: false
stages:
- stage: insertion
jobs:
- job: insertion
displayName: VS insertion
pool: VSEng-MicroBuildVSStable
templateContext:
outputParentDirectory: $(Pipeline.Workspace)/CI
steps:
- checkout: none
- powershell: Write-Host "##vso[build.updatebuildnumber]$(resources.pipeline.CI.runName)"
displayName: ⚙️ Set pipeline name
- template: azure-pipelines/release-deployment-prep.yml@self
- download: CI
artifact: VSInsertion-Windows
displayName: 🔻 Download VSInsertion-Windows artifact
- ${{ if eq(variables['ContainsVsix'], 'true') }}:
- task: 1ES.MicroBuildVstsDrop@1
displayName: 🔺 Upload VSTS Drop
inputs:
dropFolder: $(Pipeline.Workspace)/CI/VSInsertion-windows/Vsix
dropName: $(VstsDropNames)
accessToken: $(System.AccessToken)
- task: 1ES.PublishNuget@1
displayName: 📦 Push VS-repo packages to VS feed
inputs:
packagesToPush: '$(Pipeline.Workspace)/CI/VSInsertion-Windows/*.nupkg'
packageParentPath: $(Pipeline.Workspace)/CI/VSInsertion-Windows
allowPackageConflicts: true
publishVstsFeed: VS
- task: MicroBuildInsertVsPayload@5
displayName: 🏭 Insert VS Payload
inputs:
TeamName: $(TeamName)
TeamEmail: $(TeamEmail)
InsertionPayloadName: $(Build.Repository.Name) $(Build.BuildNumber)
InsertionBuildPolicies: Request Perf DDRITs
InsertionReviewers: $(Build.RequestedFor) # Append `,Your team name` (without quotes)
CustomScriptExecutionCommand: $(Pipeline.Workspace)\CI\VSInsertion-Windows\vs-insertion-script.ps1
AutoCompletePR: true
AutoCompleteMergeStrategy: Squash
ShallowClone: true
${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
ConnectedVSDropServiceName: 'VSEng-VSDrop-MI'
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- powershell: |
$contentType = 'application/json';
$headers = @{ Authorization = 'Bearer $(System.AccessToken)' };
$rawRequest = @{ daysValid = 365 * 2; definitionId = $(resources.pipeline.CI.pipelineID); ownerId = 'User:$(Build.RequestedForId)'; protectPipeline = $false; runId = $(resources.pipeline.CI.runId) };
$request = ConvertTo-Json @($rawRequest);
Write-Host $request
$uri = "$(System.CollectionUri)$(System.TeamProject)/_apis/build/retention/leases?api-version=6.0-preview.1";
Invoke-RestMethod -uri $uri -method POST -Headers $headers -ContentType $contentType -Body $request;
displayName: 🗻 Retain inserted builds
================================================
FILE: azure-pipelines/vs-validation.yml
================================================
# This is a top-level pipeline file, which is designed to be added as an optional PR build policy
# so that a VS insertion and all the validation that entails can be done before ever merging the PR
# in its original repo.
trigger: none # We only want to trigger manually or based on resources
pr: none
# parameters:
# - name: ShouldSkipOptimize # Uncomment this and references to it below when setting EnableOptProf to true in build.yml.
# displayName: Skip OptProf optimization
# type: boolean
# default: false
resources:
repositories:
- repository: MicroBuildTemplate
type: git
name: 1ESPipelineTemplates/MicroBuildTemplate
ref: refs/tags/release
variables:
- template: GlobalVariables.yml
- name: MicroBuild_NuPkgSigningEnabled
value: false # test-signed nuget packages fail to restore in the VS insertion PR validations. Just don't sign them *at all*.
extends:
template: azure-pipelines/MicroBuild.1ES.Unofficial.yml@MicroBuildTemplate
parameters:
sdl:
sourceAnalysisPool: VSEng-MicroBuildVSStable
credscan:
enabled: false
stages:
- stage: Build
variables:
- template: /azure-pipelines/BuildStageVariables.yml@self
- name: SkipCodesignVerify
value: true
jobs:
- template: /azure-pipelines/build.yml@self
parameters:
Is1ESPT: true
RealSign: false
# ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
windowsPool: VSEng-MicroBuildVSStable
linuxPool:
name: AzurePipelines-EO
demands:
- ImageOverride -equals 1ESPT-Ubuntu22.04
os: Linux
macOSPool:
name: Azure Pipelines
vmImage: macOS-15
os: macOS
EnableMacOSBuild: false
RunTests: false
SkipCodesignVerify: true
- template: /azure-pipelines/prepare-insertion-stages.yml@self
parameters:
ArchiveSymbols: false
RealSign: false
- stage: insertion
displayName: VS insertion
jobs:
- job: insertion
displayName: VS insertion
pool: VSEng-MicroBuildVSStable
steps:
- checkout: self
clean: true
fetchDepth: 1
- download: current
artifact: Variables-Windows
displayName: 🔻 Download Variables-Windows artifact
- powershell: $(Pipeline.Workspace)/Variables-Windows/_define.ps1
displayName: ⚙️ Set pipeline variables based on artifacts
- download: current
artifact: VSInsertion-Windows
displayName: 🔻 Download VSInsertion-Windows artifact
- ${{ if eq(variables['ContainsVsix'], 'true') }}:
- task: 1ES.MicroBuildVstsDrop@1
displayName: 🔺 Upload VSTS Drop
inputs:
dropFolder: $(Pipeline.Workspace)/VSInsertion-windows/Vsix
dropName: $(VstsDropNames)
accessToken: $(System.AccessToken)
- task: 1ES.PublishNuget@1
displayName: 📦 Push VS-repo packages to VS feed
inputs:
packagesToPush: '$(Pipeline.Workspace)/VSInsertion-Windows/*.nupkg'
packageParentPath: $(Pipeline.Workspace)/VSInsertion-Windows
allowPackageConflicts: true
publishVstsFeed: VS
- task: MicroBuildInsertVsPayload@5
displayName: 🏭 Insert VS Payload
inputs:
TeamName: $(TeamName)
TeamEmail: $(TeamEmail)
InsertionPayloadName: $(Build.Repository.Name) VALIDATION BUILD $(Build.BuildNumber) ($(Build.SourceBranch)) [Skip-SymbolCheck] [Skip-HashCheck] [Skip-SignCheck]
InsertionDescription: |
This PR is for **validation purposes only** for !$(System.PullRequest.PullRequestId). **Do not complete**.
CustomScriptExecutionCommand: $(Pipeline.Workspace)\VSInsertion-Windows\vs-insertion-script.ps1; src\VSSDK\NuGet\AllowUnstablePackages.ps1
InsertionBuildPolicies: Request Perf DDRITs
InsertionReviewers: $(Build.RequestedFor)
DraftPR: false # set to true and update InsertionBuildPolicy when we can specify all the validations we want to run (https://dev.azure.com/devdiv/DevDiv/_workitems/edit/2224288)
AutoCompletePR: false
ShallowClone: true
${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
ConnectedVSDropServiceName: 'VSEng-VSDrop-MI'
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- powershell: |
$insertionPRId = azure-pipelines/Get-InsertionPRId.ps1
$Markdown = @"
Validation insertion pull request created: !$insertionPRId
Please check status there before proceeding to merge this PR.
Remember to Abandon and (if allowed) to Delete Source Branch on that insertion PR when validation is complete.
"@
azure-pipelines/PostPRMessage.ps1 -AccessToken '$(System.AccessToken)' -Markdown $Markdown -Verbose
displayName: ✏️ Comment on pull request
condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'))
================================================
FILE: azure-pipelines.yml
================================================
trigger:
batch: true
branches:
include:
- main
- 'v*.*'
- microbuild
- 'validate/*'
paths:
exclude:
- doc/
- '*.md'
- .vscode/
- .github/
- azure-pipelines/release.yml
parameters:
- name: EnableMacOSBuild
displayName: Build on macOS
type: boolean
default: false # macOS is often bogged down in Azure Pipelines
- name: RunTests
displayName: Run tests
type: boolean
default: true
variables:
- template: /azure-pipelines/BuildStageVariables.yml@self
jobs:
- template: azure-pipelines/build.yml
parameters:
Is1ESPT: false
EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
RunTests: ${{ parameters.RunTests }}
================================================
FILE: doc/targets.md
================================================
# SlowCheetah Build Targets
### Summary
SlowCheetah alters the build process for projects to ensure that the transformations are executed in the correct order and that the transformed files are used properly. To allow users to extend the behavior for their own build process, this document outlines all the native targets for SlowCheetah, including properties and items that can be modified to alter existing target behavior.
## Main
### Targets
**ScCollectTransformFiles**: Collects all the files with *TransformOnBuild* true and adds them to *ScFilesToTransform*, with the necessary metadata for transformation. Runs before *ScApplyTransforms*.
**ScApplyTransforms**: First creates the destination directory for all the transformations that will occur. Then, applies the transform task to each item of *ScFilesToTransform* per their metadata. Runs after *CopyFilesToOutputDirectory*.
### Properties
**ScAllowReferencedConfig**: Whether config files from referenced projects are allowed when resolving references. Defaults to true.
**BuildDependsOn**: List of targets that should be run as part of the build process. *ScApplyTransforms* get appended to this.
### ItemGroups
**ScFilesToTransform**: Populated in ScCollectTransformationFiles. Contains all the data for files that should be transformed. Metadata:
- *SourceFile*: Transformation source.
- *TransformFile*: Transformation input.
- *DestinationFile*: Output file of transformation. The directory for this file is created in case it does not previously exist.
## App
### Targets
**ScCollectAppFiles**: Removes the app.config file from *ScFilesToTransform* and adds it to ScAppConfigToTransform for separate transformation. Copies the original app.config to *ScIntermediateAppConfig*. Depends on *ScCollectTransformFiles*. Runs before *ScApplyTransforms*.
**ScTransformAppConfig**: Performs transformations on *ScIntermediateAppConfig*. Replaces the app config location before it is copied to the output. Depends on *ScCollectAppFiles*. Runs before *_CopyAppConfig*.
### Properties
**ScIsApp**: Whether the project is an application. Used in *SetupProject* and *ClickOnce* targets. If *ScIsWap* is true, sets to false. Defaults to true.
**ScAppConfigName**: Name of the application configuration file that should be especially transformed. Defaults to “app.config”.
### Item Groups
**ScAppConfigToTransform**: Populated in *ScCollectAppFiles*. Contains data for application configuration files that should be transformed. For metadata, see *ScFilesToTransform*.
## Web
### Targets
**ScCollectWebFiles**: Gets the publish configuration and adds publish transformation data to ScFilesToTransform. Depends on *ScCollectTransformFiles*. Runs before *ScApplyWebTransforms*.
**ScApplyWebTransforms**: Inserted into the deploy pipeline. Depends on *ScApplyTransforms*.
### Properties
**ScIsWap**: Whether the project is a web application. Verifies the project GUIDs. Defaults to false.
**ScAppConfigName**: Changed to “web.config”.
### ItemGroups
**ScFilesToTransform**: Adds publish transform metadata:
- *PublishDestinationFile*: Location of the temporary directory used to publish from
- *PublishTransformFile*: Location of the publish profile transform file.
## Additional Targets
### SetupProject
Ensures a Setup Project uses the correct location for copying output files. Enabled if *ScEnableSetupProjects* is true (default is true).
### ClickOnce
Ensures that the published files are extracted from the correct location for Click Once publishing.
================================================
FILE: doc/transforming_files.md
================================================
# Transforming Files with SlowCheetah
## Summary
The [SlowCheetah Visual Studio extension](https://marketplace.visualstudio.com/items?itemName=vscps.SlowCheetah-XMLTransforms) allows you to add and preview transformation to files in your project.
The [SlowCheetah NuGet package](https://www.nuget.org/packages/Microsoft.VisualStudio.SlowCheetah) is required for build-time transformations, which are discussed in more detail below.
## Getting Started
Once the SlowCheetah extension has been installed, transformations are added by right-clicking a file. If the file type is supported, the `Add Transform` option should be visible.

Selecting this option will add transform files according to your project's [build configurations](https://docs.microsoft.com/en-us/visualstudio/ide/understanding-build-configurations). If the project has any publish profiles, transform files are also created for them.

To quickly preview the transformations, right-click any of the transform files and select the `Preview Transform` option.


## Executing Build-Time Transformations
The SlowCheetah NuGet package adds transformations logic to the build process of the project. By adding transforms using the extension and having the package installed to the project, transformations will be executed on build.
It is possible to perform build-time transformation using only the NuGet package. Files that should be transformed require the `TransformOnBuild` metadata set to true. Files that specify the transformations should have the `IsTransformFile` metadata set to true. If your project supports the `DependentUpon` metadata, add that to the transform files, specifying the original file. The resulting project file would look similar to this:
``` xml
<None Include="App.config">
<TransformOnBuild>true</TransformOnBuild>
</None>
<None Include="App.Debug.config">
<DependentUpon>App.config</DependentUpon>
<IsTransformFile>True</IsTransformFile>
</None>
<None Include="App.Release.config">
<DependentUpon>App.config</DependentUpon>
<IsTransformFile>True</IsTransformFile>
</None>
```
================================================
FILE: doc/update.md
================================================
# SlowCheetah in VS 2017
We have made significant changes to the SlowCheetah extension and NuGet package. This is because the old version had the following limitations:
- Installation methods were inconsistent throughout versions, mixing VS extensions with NuGet packages
- Build tools were installed directly to the local app data
- Users' project files were manually edited to include SC files
- Unnecessary files were imported into the project
To fix these issues, the new version includes the following:
- Support for Visual Studio 2015 and 2017
- A VS extension that assists with adding and previewing transform
- A NuGet package that handles all the build and transformation logic
To use this new version, the older one must be manually removed from your project before installing the new version. From here on, all updates to the extension and NuGet packages will be handled by their respective platform.
## Instructions
If SlowCheetah has never been installed on your computer or used in any of your projects, simply install the latest Nuget package [here](https://www.nuget.org/packages/Microsoft.VisualStudio.SlowCheetah/).
Version 3.0.61 and higher of the SlowCheetah Extension should prompt the user to automatically remove any present older installations. If you have issues with this, the following instructions guide you through manually updating your project.
If you have used SlowCheetah before, remove the following lines from your project file.
First, a PropertyGroup that looks like this:
``` XML
<PropertyGroup Label="SlowCheetah">
<SlowCheetahToolsPath>$([System.IO.Path]::GetFullPath( $(MSBuildProjectDirectory)\..\packages\SlowCheetah.2.5.15\tools\))</SlowCheetahToolsPath>
<SlowCheetah_EnableImportFromNuGet Condition=" '$(SlowCheetah_EnableImportFromNuGet)'=='' ">true</SlowCheetah_EnableImportFromNuGet>
<SlowCheetah_NuGetImportPath Condition=" '$(SlowCheetah_NuGetImportPath)'=='' ">$([System.IO.Path]::GetFullPath( $(MSBuildProjectDirectory)\Properties\SlowCheetah\SlowCheetah.Transforms.targets ))</SlowCheetah_NuGetImportPath>
<SlowCheetahTargets Condition=" '$(SlowCheetah_EnableImportFromNuGet)'=='true' and Exists('$(SlowCheetah_NuGetImportPath)') ">$(SlowCheetah_NuGetImportPath)</SlowCheetahTargets>
</PropertyGroup>
```
Then, remove an import that looks like this:
``` XML
<Import Project="$(SlowCheetahTargets)" Condition="Exists('$(SlowCheetahTargets)')" Label="SlowCheetah" />
```
Lastly, remove the following includes:
``` XML
<None Include="packageRestore.proj" />
<None Include="Properties\SlowCheetah\SlowCheetah.Transforms.targets" />
```
Also, delete the `Properties\SlowCheetah` folder and the `packageRestore.proj` file from your project if they are present. If there are any other lines in the project file or any items in the project tree related to SlowCheetah, those should also be removed. All SlowCheetah related lines that should be present are the transformation files which are marked with `<IsTransformFile>true</IsTransformFile>` on the project file.
Now, install or update to the latest SlowCheetah package through the NuGet package manager and download the latest extension from the Visual Studio extension gallery.
Optionally, if you no longer plan on using the older version of SlowCheetah on any projects, you may safely delete the `%LocalAppData%\Microsoft\MSBuild\SlowCheetah` folder.
================================================
FILE: docfx/.gitignore
================================================
_site/
api/
================================================
FILE: docfx/docfx.json
================================================
{
"metadata": [
{
"src": [
{
"src": "../src/Library",
"files": [
"**/*.csproj"
]
}
],
"dest": "api"
}
],
"build": {
"content": [
{
"files": [
"**/*.{md,yml}"
],
"exclude": [
"_site/**"
]
}
],
"resource": [
{
"files": [
"images/**"
]
}
],
"xref": [
"https://learn.microsoft.com/en-us/dotnet/.xrefmap.json"
],
"output": "_site",
"template": [
"default",
"modern"
],
"globalMetadata": {
"_appName": "Library",
"_appTitle": "Library",
"_enableSearch": true,
"pdf": false
}
}
}
================================================
FILE: docfx/docs/features.md
================================================
# Features
TODO
================================================
FILE: docfx/docs/getting-started.md
================================================
# Getting Started
## Installation
Consume this library via its NuGet Package.
Click on the badge to find its latest version and the instructions for consuming it that best apply to your project.
[](https://nuget.org/packages/Library)
## Usage
TODO
================================================
FILE: docfx/docs/toc.yml
================================================
items:
- name: Features
href: features.md
- name: Getting Started
href: getting-started.md
================================================
FILE: docfx/index.md
================================================
---
_layout: landing
---
# Overview
This is your docfx landing page.
Click "Docs" across the top to get started.
================================================
FILE: docfx/toc.yml
================================================
items:
- name: Docs
href: docs/
- name: API
href: api/
================================================
FILE: global.json
================================================
{
"sdk": {
"version": "10.0.204",
"rollForward": "patch",
"allowPrerelease": false
},
"msbuild-sdks": {
"Microsoft.Build.NoTargets": "3.7.56",
"Microsoft.Build.Traversal": "3.1.6"
}
}
================================================
FILE: init.cmd
================================================
@echo off
SETLOCAL
set PS1UnderCmd=1
:: Get the datetime in a format that can go in a filename.
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%
set CmdEnvScriptPath=%temp%\envvarscript_%_my_datetime%.cmd
powershell.exe -NoProfile -NoLogo -ExecutionPolicy bypass -Command "try { & '%~dpn0.ps1' %*; exit $LASTEXITCODE } catch { write-host $_; exit 1 }"
:: Set environment variables in the parent cmd.exe process.
IF EXIST "%CmdEnvScriptPath%" (
ENDLOCAL
CALL "%CmdEnvScriptPath%"
DEL "%CmdEnvScriptPath%"
)
================================================
FILE: init.ps1
================================================
#!/usr/bin/env pwsh
<#
.SYNOPSIS
Installs dependencies required to build and test the projects in this repository.
.DESCRIPTION
This MAY not require elevation, as the SDK and runtimes are installed to a per-user location,
unless the `-InstallLocality` switch is specified directing to a per-repo or per-machine location.
See detailed help on that switch for more information.
The CmdEnvScriptPath environment variable may be optionally set to a path to a cmd shell script to be created (or appended to if it already exists) that will set the environment variables in cmd.exe that are set within the PowerShell environment.
This is used by init.cmd in order to reapply any new environment variables to the parent cmd.exe process that were set in the powershell child process.
.PARAMETER InstallLocality
A value indicating whether dependencies should be installed locally to the repo or at a per-user location.
Per-user allows sharing the installed dependencies across repositories and allows use of a shared expanded package cache.
Visual Studio will only notice and use these SDKs/runtimes if VS is launched from the environment that runs this script.
Per-repo allows for high isolation, allowing for a more precise recreation of the environment within an Azure Pipelines build.
When using 'repo', environment variables are set to cause the locally installed dotnet SDK to be used.
Per-repo can lead to file locking issues when dotnet.exe is left running as a build server and can be mitigated by running `dotnet build-server shutdown`.
Per-machine requires elevation and will download and install all SDKs and runtimes to machine-wide locations so all applications can find it.
.PARAMETER NoPrerequisites
Skips the installation of prerequisite software (e.g. SDKs, tools).
.PARAMETER NoNuGetCredProvider
Skips the installation of the NuGet credential provider. Useful in pipelines with the `NuGetAuthenticate` task, as a workaround for https://github.com/microsoft/artifacts-credprovider/issues/244.
This switch is ignored and installation is skipped when -NoPrerequisites is specified.
.PARAMETER UpgradePrerequisites
Takes time to install prerequisites even if they are already present in case they need to be upgraded.
No effect if -NoPrerequisites is specified.
.PARAMETER NoRestore
Skips the package restore step.
.PARAMETER NoToolRestore
Skips the dotnet tool restore step.
.PARAMETER Signing
Install the MicroBuild signing plugin for building test-signed builds on desktop machines.
.PARAMETER Localization
Install the MicroBuild localization plugin for building loc builds on desktop machines.
The environment is configured to build pseudo-loc for JPN only, but may be used to build
all languages with shipping-style loc by using the `/p:loctype=full,loclanguages=vs`
when building.
.PARAMETER Setup
Install the MicroBuild setup plugin for building VSIXv3 packages.
.PARAMETER OptProf
Install the MicroBuild OptProf plugin for building optimized assemblies on desktop machines.
.PARAMETER Sbom
Install the MicroBuild SBOM plugin.
.PARAMETER AccessToken
An optional access token for authenticating to Azure Artifacts authenticated feeds.
.PARAMETER Interactive
Runs NuGet restore in interactive mode. This can turn authentication failures into authentication challenges.
#>
[CmdletBinding(SupportsShouldProcess = $true)]
Param (
[ValidateSet('repo', 'user', 'machine')]
[string]$InstallLocality = 'user',
[Parameter()]
[switch]$NoPrerequisites,
[Parameter()]
[switch]$NoNuGetCredProvider,
[Parameter()]
[switch]$UpgradePrerequisites,
[Parameter()]
[switch]$NoRestore,
[Parameter()]
[switch]$NoToolRestore,
[Parameter()]
[switch]$Signing,
[Parameter()]
[switch]$Localization,
[Parameter()]
[switch]$Setup,
[Parameter()]
[switch]$OptProf,
[Parameter()]
[switch]$SBOM,
[Parameter()]
[string]$AccessToken,
[Parameter()]
[switch]$Interactive
)
$EnvVars = @{}
$PrependPath = @()
if (!$NoPrerequisites) {
if (!$NoNuGetCredProvider) {
& "$PSScriptRoot\tools\Install-NuGetCredProvider.ps1" -AccessToken $AccessToken -Force:$UpgradePrerequisites
}
& "$PSScriptRoot\tools\Install-DotNetSdk.ps1" -InstallLocality $InstallLocality
if ($LASTEXITCODE -eq 3010) {
Exit 3010
}
# The procdump tool and env var is required for dotnet test to collect hang/crash dumps of tests.
# But it only works on Windows.
if ($env:OS -eq 'Windows_NT') {
$EnvVars['PROCDUMP_PATH'] = & "$PSScriptRoot\tools\Get-ProcDump.ps1"
}
}
# Workaround nuget credential provider bug that causes very unreliable package restores on Azure Pipelines
$env:NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS = 20
$env:NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS = 20
Push-Location $PSScriptRoot
try {
$HeaderColor = 'Green'
$RestoreArguments = @()
if ($Interactive) {
$RestoreArguments += '--interactive'
}
if (!$NoRestore -and $PSCmdlet.ShouldProcess("NuGet packages", "Restore")) {
Write-Host "Restoring NuGet packages" -ForegroundColor $HeaderColor
dotnet restore @RestoreArguments src
if ($lastexitcode -ne 0) {
throw "Failure while restoring packages."
}
}
if (!$NoToolRestore -and $PSCmdlet.ShouldProcess("dotnet tool", "restore")) {
dotnet tool restore @RestoreArguments
if ($lastexitcode -ne 0) {
throw "Failure while restoring dotnet CLI tools."
}
}
$InstallNuGetPkgScriptPath = "$PSScriptRoot\tools\Install-NuGetPackage.ps1"
$nugetVerbosity = 'quiet'
if ($Verbose) { $nugetVerbosity = 'normal' }
$MicroBuildPackageSource = 'https://pkgs.dev.azure.com/devdiv/_packaging/MicroBuildToolset%40Local/nuget/v3/index.json'
if ($Signing) {
Write-Host "Installing MicroBuild signing plugin" -ForegroundColor $HeaderColor
& $InstallNuGetPkgScriptPath MicroBuild.Plugins.Signing -source $MicroBuildPackageSource -Verbosity $nugetVerbosity
$EnvVars['SignType'] = "Test"
}
if ($Setup) {
Write-Host "Installing MicroBuild SwixBuild plugin..." -ForegroundColor $HeaderColor
& $InstallNuGetPkgScriptPath Microsoft.VisualStudioEng.MicroBuild.Plugins.SwixBuild -source $MicroBuildPackageSource -Verbosity $nugetVerbosity
}
if ($OptProf) {
Write-Host "Installing MicroBuild OptProf plugin" -ForegroundColor $HeaderColor
& $InstallNuGetPkgScriptPath MicroBuild.Plugins.OptProf -source $MicroBuildPackageSource -Verbosity $nugetVerbosity
$EnvVars['OptProfEnabled'] = '1'
}
if ($Localization) {
Write-Host "Installing MicroBuild localization plugin" -ForegroundColor $HeaderColor
& $InstallNuGetPkgScriptPath MicroBuild.Plugins.Localization -source $MicroBuildPackageSource -Verbosity $nugetVerbosity
$EnvVars['LocType'] = "Pseudo"
$EnvVars['LocLanguages'] = "JPN"
}
if ($SBOM) {
Write-Host "Installing MicroBuild SBOM plugin" -ForegroundColor $HeaderColor
& $InstallNuGetPkgScriptPath MicroBuild.Plugins.Sbom -source $MicroBuildPackageSource -Verbosity $nugetVerbosity
# The feed with the latest versions of the tool is at 'https://1essharedassets.pkgs.visualstudio.com/1esPkgs/_packaging/SBOMTool/nuget/v3/index.json',
# but we'll use the feed that the SBOM task itself uses to install the tool for consistency.
$PkgMicrosoft_ManifestTool_CrossPlatform = & $InstallNuGetPkgScriptPath Microsoft.ManifestTool.CrossPlatform -source $MicroBuildPackageSource -Verbosity $nugetVerbosity
$EnvVars['GenerateSBOM'] = "true"
$EnvVars['PkgMicrosoft_ManifestTool_CrossPlatform'] = $PkgMicrosoft_ManifestTool_CrossPlatform
}
& "$PSScriptRoot/tools/Set-EnvVars.ps1" -Variables $EnvVars -PrependPath $PrependPath | Out-Null
}
catch {
Write-Error $error[0]
exit $lastexitcode
}
finally {
Pop-Location
}
================================================
FILE: nuget.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="repositorypath" value="packages" />
</config>
<packageSources>
<!--To inherit the global NuGet package sources remove the <clear/> line below -->
<clear />
<add key="msft_consumption" value="https://pkgs.dev.azure.com/azure-public/vside/_packaging/msft_consumption/nuget/v3/index.json" />
<!-- <add key="msft_consumption" value="https://pkgs.dev.azure.com/devdiv/DevDiv/_packaging/VS-Platform/nuget/v3/index.json" /> -->
</packageSources>
<disabledPackageSources>
<!-- Defend against user or machine level disabling of sources that we list in this file. -->
<clear />
</disabledPackageSources>
</configuration>
================================================
FILE: samples/FSharpDemo/FSharpDemo.fsproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{85361198-db0e-4528-a513-80e025de74a0}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>FSharpDemo</RootNamespace>
<AssemblyName>FSharpDemo</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
<Name>FSharpDemo</Name>
<SccProjectName>
</SccProjectName>
<SccProvider>
</SccProvider>
<SccAuxPath>
</SccAuxPath>
<SccLocalPath>
</SccLocalPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<Tailcalls>false</Tailcalls>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<WarningLevel>3</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<DocumentationFile>bin\Debug\FSharpDemo.XML</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<Tailcalls>true</Tailcalls>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<WarningLevel>3</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<DocumentationFile>bin\Release\FSharpDemo.XML</DocumentationFile>
</PropertyGroup>
<PropertyGroup>
<SlowCheetahTargets Condition=" '$(SlowCheetahTargets)'=='' ">$(LOCALAPPDATA)\Microsoft\MSBuild\SlowCheetah\v1\SlowCheetah.Transforms.targets</SlowCheetahTargets>
</PropertyGroup>
<PropertyGroup>
<MinimumVisualStudioVersion Condition="'$(MinimumVisualStudioVersion)' == ''">11</MinimumVisualStudioVersion>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets" Condition="Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets')" />
<Import Project="$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets" Condition="(!Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets')) And (Exists('$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets'))" />
<Import Project="$(MSBuildExtensionsPath32)\FSharp\1.0\Microsoft.FSharp.Targets" Condition="(!Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets')) And (!Exists('$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets')) And (Exists('$(MSBuildExtensionsPath32)\FSharp\1.0\Microsoft.FSharp.Targets'))" />
<ItemGroup>
<Compile Include="Program.fs" />
<None Include="app.config">
<TransformOnBuild>true</TransformOnBuild>
</None>
<None Include="app.Debug.config">
<IsTransformFile>True</IsTransformFile>
</None>
<None Include="app.Release.config">
<IsTransformFile>True</IsTransformFile>
</None>
</ItemGroup>
<ItemGroup>
<Reference Include="mscorlib" />
<Reference Include="FSharp.Core" />
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Numerics" />
</ItemGroup>
<Import Project="$(SlowCheetahTargets)" Condition="Exists('$(SlowCheetahTargets)')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
================================================
FILE: samples/FSharpDemo/Program.fs
================================================
// Learn more about F# at http://fsharp.net
let settingOne = System.Configuration.ConfigurationManager.AppSettings.["settingOne"];
let settingTwo = System.Configuration.ConfigurationManager.AppSettings.["settingTwo"];
let settingthree = System.Configuration.ConfigurationManager.AppSettings.["settingThree"];
printfn "settingOne: %s" settingOne
printfn "settingTwo: %s" settingTwo
printfn "settingThree: %s" settingthree
printfn " "
printfn "Press any key to close"
System.Console.ReadKey(true)
================================================
FILE: samples/FSharpDemo/app.Debug.config
================================================
<?xml version="1.0" encoding="utf-8" ?>
<!-- For more information on using transformations
see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="settingOne" value="one Debug"
xdt:Locator="Match(key)" xdt:Transform="Replace" />
<add key="settingTwo" value="two Debug"
xdt:Locator="Match(key)" xdt:Transform="Replace" />
<add key="settingThree" value="three Debug"
xdt:Locator="Match(key)" xdt:Transform="Replace" />
</appSettings>
</configuration>
================================================
FILE: samples/FSharpDemo/app.Release.config
================================================
<?xml version="1.0" encoding="utf-8" ?>
<!-- For more information on using transformations
see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="settingOne" value="one Release"
xdt:Locator="Match(key)" xdt:Transform="Replace" />
<add key="settingTwo" value="two Release"
xdt:Locator="Match(key)" xdt:Transform="Replace" />
<add key="settingThree" value="three Release"
xdt:Locator="Match(key)" xdt:Transform="Replace" />
</appSettings>
</configuration>
================================================
FILE: samples/FSharpDemo/app.config
================================================
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="settingOne" value="one default value"/>
<add key="settingTwo" value="two default value"/>
<add key="settingThree" value="three default value"/>
</appSettings>
</configuration>
================================================
FILE: samples/Linked-files/connectionStrings.Debug.config
================================================
<?xml version="1.0" encoding="utf-8" ?>
<!-- For more information on using transformations
see the we
gitextract_7_2kiagc/ ├── .azuredevops/ │ └── dependabot.yml ├── .config/ │ └── dotnet-tools.json ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── .editorconfig │ ├── Prime-ForCopilot.ps1 │ ├── actions/ │ │ └── publish-artifacts/ │ │ └── action.yaml │ ├── copilot-instructions.md │ ├── renovate.json │ ├── skills/ │ │ └── update-library-template/ │ │ ├── SKILL.md │ │ └── template-release-notes.md │ └── workflows/ │ ├── copilot-setup-steps.yml │ ├── docs.yml │ ├── docs_validate.yml │ └── libtemplate-update.yml ├── .gitignore ├── .vscode/ │ ├── extensions.json │ ├── launch.json │ ├── mcp.json │ ├── settings.json │ └── tasks.json ├── .vsts-ci.yml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── CodeQL.yml ├── Directory.Build.props ├── Directory.Build.rsp ├── Directory.Build.targets ├── Directory.Packages.props ├── LICENSE ├── README.md ├── Restore.cmd ├── SECURITY.md ├── SUPPORT.md ├── ThirdPartyNotices.txt ├── appveyor.yml ├── azure-pipelines/ │ ├── Archive-SourceCode.ps1 │ ├── BuildStageVariables.yml │ ├── Get-InsertionPRId.ps1 │ ├── GlobalVariables.yml │ ├── Merge-CodeCoverage.ps1 │ ├── NuGetSbom.props │ ├── PoliCheckExclusions.xml │ ├── PostPRMessage.ps1 │ ├── TSAOptions.json │ ├── WIFtoPATauth.yml │ ├── apiscan.yml │ ├── archive-sourcecode.yml │ ├── build.yml │ ├── dotnet.yml │ ├── falsepositives.gdnsuppress │ ├── install-dependencies.yml │ ├── libtemplate-update.yml │ ├── microbuild.after.yml │ ├── microbuild.before.yml │ ├── no_authenticode.txt │ ├── no_strongname.txt │ ├── official.yml │ ├── prepare-insertion-stages.yml │ ├── publish-codecoverage.yml │ ├── publish-symbols.yml │ ├── publish_artifacts.ps1 │ ├── release-deployment-prep.yml │ ├── release.yml │ ├── unofficial.yml │ ├── vs-insertion-script.ps1 │ ├── vs-insertion.yml │ └── vs-validation.yml ├── azure-pipelines.yml ├── doc/ │ ├── targets.md │ ├── transforming_files.md │ └── update.md ├── docfx/ │ ├── .gitignore │ ├── docfx.json │ ├── docs/ │ │ ├── features.md │ │ ├── getting-started.md │ │ └── toc.yml │ ├── index.md │ └── toc.yml ├── global.json ├── init.cmd ├── init.ps1 ├── nuget.config ├── samples/ │ ├── FSharpDemo/ │ │ ├── FSharpDemo.fsproj │ │ ├── Program.fs │ │ ├── app.Debug.config │ │ ├── app.Release.config │ │ └── app.config │ ├── Linked-files/ │ │ ├── connectionStrings.Debug.config │ │ ├── connectionStrings.Release.config │ │ └── connectionStrings.config │ ├── SlowCheetah.Samples.sln │ ├── TransformSetupProject/ │ │ ├── .gitignore │ │ └── TransformSetupProject.vdproj │ ├── WebDemo/ │ │ ├── Default.aspx │ │ ├── Default.aspx.cs │ │ ├── Default.aspx.designer.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Web.Debug.config │ │ ├── Web.Release.config │ │ ├── Web.config │ │ ├── WebDemo.csproj │ │ ├── connectionStrings.Debug.config │ │ ├── connectionStrings.Release.config │ │ ├── connectionStrings.ToPkg.config │ │ └── connectionStrings.config │ ├── WindowsAzure1/ │ │ ├── ServiceConfiguration.Cloud.cscfg │ │ ├── ServiceConfiguration.Local.cscfg │ │ ├── ServiceDefinition.csdef │ │ └── WindowsAzure1.ccproj │ ├── WorkerRole1/ │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── WorkerRole.cs │ │ ├── WorkerRole1.csproj │ │ ├── XMLFile1.xml │ │ ├── app.Debug.config │ │ ├── app.Release.config │ │ ├── app.config │ │ ├── contacts.Debug.xml │ │ ├── contacts.Release.xml │ │ ├── contacts.xml │ │ └── packages.config │ └── Wpf.Transform/ │ ├── App.xaml │ ├── App.xaml.cs │ ├── Assets/ │ │ └── BureauBlue.xaml │ ├── MainWindow.xaml │ ├── MainWindow.xaml.cs │ ├── Properties/ │ │ ├── AssemblyInfo.cs │ │ ├── Resources.Designer.cs │ │ ├── Resources.resx │ │ ├── Settings.Designer.cs │ │ └── Settings.settings │ ├── TransformModel.cs │ ├── Wpf.Transform.csproj │ ├── app.Debug.config │ ├── app.Release.config │ ├── app.config │ ├── connectionStrings.Debug.config │ ├── connectionStrings.Release.config │ ├── connectionStrings.config │ ├── contacts.Debug.xml │ ├── contacts.Release.xml │ └── contacts.xml ├── src/ │ ├── .editorconfig │ ├── AssemblyInfo.cs │ ├── AssemblyInfo.vb │ ├── Directory.Build.props │ ├── Directory.Build.targets │ ├── Microsoft.VisualStudio.SlowCheetah/ │ │ ├── Build/ │ │ │ ├── Microsoft.VisualStudio.SlowCheetah.App.targets │ │ │ ├── Microsoft.VisualStudio.SlowCheetah.ClickOnce.targets │ │ │ ├── Microsoft.VisualStudio.SlowCheetah.SetupProject.targets │ │ │ ├── Microsoft.VisualStudio.SlowCheetah.Web.targets │ │ │ ├── Microsoft.VisualStudio.SlowCheetah.targets │ │ │ ├── TransformTask.cs │ │ │ └── readme.txt │ │ ├── Exceptions/ │ │ │ └── TransformFailedException.cs │ │ ├── Logging/ │ │ │ ├── ITransformationLogger.cs │ │ │ ├── JsonShimLogger.cs │ │ │ ├── TransformationTaskLogger.cs │ │ │ └── XmlShimLogger.cs │ │ ├── Microsoft.VisualStudio.SlowCheetah.csproj │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Resources/ │ │ │ ├── Resources.Designer.cs │ │ │ └── Resources.resx │ │ └── Transformer/ │ │ ├── ITransformer.cs │ │ ├── JsonTransformer.cs │ │ ├── TransformUtilities.cs │ │ ├── TransformerFactory.cs │ │ └── XmlTransformer.cs │ ├── Microsoft.VisualStudio.SlowCheetah.Tests/ │ │ ├── App.config │ │ ├── BaseTest.cs │ │ ├── BuildTests/ │ │ │ ├── ConfigTransformTestsBase.cs │ │ │ ├── ConsoleAppTests.cs │ │ │ ├── TestProjects/ │ │ │ │ ├── ConsoleApp/ │ │ │ │ │ ├── App.Debug.config │ │ │ │ │ ├── App.Release.config │ │ │ │ │ ├── App.config │ │ │ │ │ ├── ConsoleApp.csproj │ │ │ │ │ ├── Other.Debug.config │ │ │ │ │ ├── Other.Release.config │ │ │ │ │ ├── Other.config │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ ├── Directory.Build.props │ │ │ │ ├── Directory.Build.targets │ │ │ │ └── WebApplication/ │ │ │ │ ├── Other.Debug.config │ │ │ │ ├── Other.Release.config │ │ │ │ ├── Other.config │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ ├── Web.Debug.config │ │ │ │ ├── Web.Release.config │ │ │ │ ├── Web.config │ │ │ │ └── WebApplication.csproj │ │ │ └── WebAppTests.cs │ │ ├── Microsoft.VisualStudio.SlowCheetah.Tests.csproj │ │ ├── TestUtilities.cs │ │ ├── TransformTest.cs │ │ └── example.txt │ ├── Microsoft.VisualStudio.SlowCheetah.VS/ │ │ ├── Directory.Build.targets │ │ ├── Microsoft.VisualStudio.SlowCheetah.VS.csproj │ │ ├── Microsoft.VisualStudio.SlowCheetah.VS.pkgdef │ │ ├── NugetHandler/ │ │ │ ├── PackageHandlers/ │ │ │ │ ├── BackgroundInstallationHandler.cs │ │ │ │ ├── BasePackageHandler.cs │ │ │ │ ├── DialogInstallationHandler.cs │ │ │ │ ├── EmptyHandler.cs │ │ │ │ ├── IPackageHandler.cs │ │ │ │ ├── NuGetUninstaller.cs │ │ │ │ ├── NugetInstaller.cs │ │ │ │ ├── TargetsUninstaller.cs │ │ │ │ └── UserInstallationHandler.cs │ │ │ ├── SlowCheetahNuGetManager.cs │ │ │ └── VsProjectTypes.cs │ │ ├── Options/ │ │ │ ├── AdvancedOptionsDialogPage.cs │ │ │ ├── AdvancedOptionsUserControl.Designer.cs │ │ │ ├── AdvancedOptionsUserControl.cs │ │ │ ├── AdvancedOptionsUserControl.resx │ │ │ ├── BaseOptionsDialogPage.cs │ │ │ ├── OptionsDialogPage.cs │ │ │ ├── OptionsUserControl.Designer.cs │ │ │ ├── OptionsUserControl.cs │ │ │ └── OptionsUserControl.resx │ │ ├── Package/ │ │ │ ├── AddTransformCommand.cs │ │ │ ├── BaseCommand.cs │ │ │ ├── PackageSolutionEvents.cs │ │ │ ├── PreviewTransformCommand.cs │ │ │ └── SlowCheetahPackageLogger.cs │ │ ├── Resources/ │ │ │ ├── Guids.cs │ │ │ ├── PkgCmdID.cs │ │ │ ├── Resources.Designer.cs │ │ │ └── Resources.resx │ │ ├── SlowCheetah.vsct │ │ ├── SlowCheetahPackage.cs │ │ ├── TransformationPreviewLogger.cs │ │ ├── Utilities/ │ │ │ ├── PackageUtilities.cs │ │ │ └── ProjectUtilities.cs │ │ ├── VSPackage.Designer.cs │ │ ├── VSPackage.resx │ │ └── source.extension.vsixmanifest │ ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests/ │ │ ├── App.config │ │ ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests.csproj │ │ ├── PackageUtilitiesTest.cs │ │ └── xunit.runner.json │ ├── Microsoft.VisualStudio.SlowCheetah.Vsix/ │ │ └── Microsoft.VisualStudio.SlowCheetah.Vsix.csproj │ ├── OptProf.targets │ ├── SlowCheetah.sln │ └── build/ │ ├── no_authenticode.txt │ └── no_strongname.txt ├── stylecop.json ├── test/ │ ├── .editorconfig │ ├── Directory.Build.props │ ├── Directory.Build.targets │ ├── Microsoft.VisualStudio.SlowCheetah.Tests/ │ │ ├── App.config │ │ ├── BaseTest.cs │ │ ├── BuildTests/ │ │ │ ├── ConfigTransformTestsBase.cs │ │ │ ├── ConsoleAppTests.cs │ │ │ ├── TestProjects/ │ │ │ │ ├── ConsoleApp/ │ │ │ │ │ ├── App.Debug.config │ │ │ │ │ ├── App.Release.config │ │ │ │ │ ├── App.config │ │ │ │ │ ├── ConsoleApp.csproj │ │ │ │ │ ├── Other.Debug.config │ │ │ │ │ ├── Other.Release.config │ │ │ │ │ ├── Other.config │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ ├── Directory.Build.props │ │ │ │ ├── Directory.Build.targets │ │ │ │ └── WebApplication/ │ │ │ │ ├── Other.Debug.config │ │ │ │ ├── Other.Release.config │ │ │ │ ├── Other.config │ │ │ │ ├── Web.Debug.config │ │ │ │ ├── Web.Release.config │ │ │ │ ├── Web.config │ │ │ │ └── WebApplication.csproj │ │ │ └── WebAppTests.cs │ │ ├── Microsoft.VisualStudio.SlowCheetah.Tests.csproj │ │ ├── TestUtilities.cs │ │ ├── TransformTest.cs │ │ └── example.txt │ ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests/ │ │ ├── App.config │ │ ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests.csproj │ │ └── PackageUtilitiesTest.cs │ └── dirs.proj ├── tools/ │ ├── Check-DotNetRuntime.ps1 │ ├── Check-DotNetSdk.ps1 │ ├── Convert-PDB.ps1 │ ├── Download-NuGetPackage.ps1 │ ├── Get-ArtifactsStagingDirectory.ps1 │ ├── Get-CodeCovTool.ps1 │ ├── Get-ExternalSymbolFiles.ps1 │ ├── Get-LibTemplateBasis.ps1 │ ├── Get-NuGetTool.ps1 │ ├── Get-ProcDump.ps1 │ ├── Get-SymbolFiles.ps1 │ ├── Get-TempToolsPath.ps1 │ ├── Install-DotNetSdk.ps1 │ ├── Install-NuGetCredProvider.ps1 │ ├── Install-NuGetPackage.ps1 │ ├── MergeFrom-Template.ps1 │ ├── Prepare-Legacy-Symbols.ps1 │ ├── Set-EnvVars.ps1 │ ├── artifacts/ │ │ ├── APIScanInputs.ps1 │ │ ├── LocBin.ps1 │ │ ├── VSInsertion.ps1 │ │ ├── Variables.ps1 │ │ ├── _all.ps1 │ │ ├── _stage_all.ps1 │ │ ├── build_logs.ps1 │ │ ├── coverageResults.ps1 │ │ ├── deployables.ps1 │ │ ├── projectAssetsJson.ps1 │ │ ├── symbols.ps1 │ │ ├── testResults.ps1 │ │ └── test_symbols.ps1 │ ├── dotnet-test-cloud.ps1 │ ├── publish-CodeCov.ps1 │ ├── test.runsettings │ └── variables/ │ ├── BusinessGroupName.ps1 │ ├── DotNetSdkVersion.ps1 │ ├── InsertJsonValues.ps1 │ ├── InsertPropsValues.ps1 │ ├── InsertTargetBranch.ps1 │ ├── InsertVersionsValues.ps1 │ ├── LocLanguages.ps1 │ ├── ProfilingInputsDropName.ps1 │ ├── ProfilingInputsPropsName.ps1 │ ├── SymbolsFeatureName.ps1 │ ├── VstsDropNames.ps1 │ ├── _all.ps1 │ └── _define.ps1 └── version.json
SYMBOL INDEX (297 symbols across 67 files)
FILE: samples/WebDemo/Default.aspx.cs
class Default (line 10) | public partial class Default : System.Web.UI.Page
method Page_Load (line 12) | protected void Page_Load(object sender, EventArgs e)
FILE: samples/WebDemo/Default.aspx.designer.cs
class Default (line 13) | public partial class Default {
FILE: samples/WorkerRole1/WorkerRole.cs
class WorkerRole (line 14) | public class WorkerRole : RoleEntryPoint {
method Run (line 15) | public override void Run() {
method OnStart (line 29) | public override bool OnStart() {
FILE: samples/Wpf.Transform/App.xaml.cs
class App (line 12) | public partial class App : Application {
FILE: samples/Wpf.Transform/MainWindow.xaml.cs
class MainWindow (line 19) | public partial class MainWindow : Window {
method MainWindow (line 20) | public MainWindow() {
method WindowOnLoad (line 25) | private void WindowOnLoad(object sender, RoutedEventArgs e) {
method ApplyTransformModel (line 29) | private void ApplyTransformModel(TransformModel transformModel) {
method BuildStringFrom (line 39) | private string BuildStringFrom(IDictionary<string, string> dictionary) {
method ButtonCloseClick (line 50) | private void ButtonCloseClick(object sender, RoutedEventArgs e) {
FILE: samples/Wpf.Transform/Properties/Resources.Designer.cs
class Resources (line 21) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
method Resources (line 30) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...
FILE: samples/Wpf.Transform/Properties/Settings.Designer.cs
class Settings (line 14) | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
FILE: samples/Wpf.Transform/TransformModel.cs
class TransformModel (line 9) | public class TransformModel {
method TransformModel (line 10) | public TransformModel() {
method BuildFromCurrent (line 19) | public static TransformModel BuildFromCurrent() {
FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/BaseTest.cs
class BaseTest (line 18) | public class BaseTest : IDisposable
method Dispose (line 28) | public void Dispose()
method WriteTextToTempFile (line 53) | protected virtual string WriteTextToTempFile(string content)
method GetTempFilename (line 70) | protected virtual string GetTempFilename(bool ensureFileDoesntExist)
FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConfigTransformTestsBase.cs
class ConfigTransformTestsBase (line 22) | public abstract class ConfigTransformTestsBase : IDisposable
method BuildProject (line 65) | public void BuildProject(string projectName)
method GetAppSettingValue (line 126) | public string GetAppSettingValue(string configFilePath, string appSett...
method GetConfigNodeValue (line 141) | public string GetConfigNodeValue(string configFilePath, string nodeName)
method Dispose (line 150) | public void Dispose()
FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConsoleAppTests.cs
class ConsoleAppTests (line 17) | [Collection("BuildTests")]
method ConsoleApp_AppConfig_IsTransformed (line 23) | [Fact]
method ConsoleApp_OtherConfig_IsTransformed (line 39) | [Fact]
FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Program.cs
class Program (line 9) | class Program
method Main (line 11) | static void Main(string[] args)
FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/WebAppTests.cs
class WebAppTests (line 17) | [Collection("BuildTests")]
method WebApp_OtherConfig_IsTransformed (line 23) | [Fact]
FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/TestUtilities.cs
class TestUtilities (line 14) | public static class TestUtilities
FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/TransformTest.cs
class TransformTest (line 17) | public class TransformTest : BaseTest
method TestXmlTransform (line 22) | [Fact]
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS.Tests/PackageUtilitiesTest.cs
class PackageUtilitiesTest (line 12) | public class PackageUtilitiesTest
method IsFileTransformWithNullArguments (line 22) | [Theory]
method IsFileTransformWithValidArguments (line 39) | [Theory]
method IsFileTransformWithInvalidArguments (line 54) | [Theory]
method IsFileTransformWithDottedConfigsAndValidNames (line 69) | [Theory]
method IsFileTransformWithDottedConfigsAndInvalidNames (line 87) | [Theory]
method IsFileGenericTransformWithInvalidArguments (line 105) | [Theory]
method IsFileGenericTransformWithValidArguments (line 121) | [Theory]
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/BackgroundInstallationHandler.cs
class BackgroundInstallationHandler (line 18) | internal class BackgroundInstallationHandler : UserInstallationHandler
method BackgroundInstallationHandler (line 27) | public BackgroundInstallationHandler(IPackageHandler successor)
method ExecuteAsync (line 38) | public override async TPL.Task ExecuteAsync(Project project)
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/BasePackageHandler.cs
class BasePackageHandler (line 14) | internal abstract class BasePackageHandler : IPackageHandler
method BasePackageHandler (line 20) | protected BasePackageHandler(IPackageHandler successor)
method ExecuteAsync (line 42) | public abstract TPL.Task ExecuteAsync(Project project);
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/DialogInstallationHandler.cs
class DialogInstallationHandler (line 13) | internal class DialogInstallationHandler : UserInstallationHandler
method DialogInstallationHandler (line 19) | public DialogInstallationHandler(IPackageHandler successor)
method ExecuteAsync (line 25) | public override async TPL.Task ExecuteAsync(Project project)
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/EmptyHandler.cs
class EmptyHandler (line 14) | internal class EmptyHandler : IPackageHandler
method EmptyHandler (line 20) | public EmptyHandler(AsyncPackage package)
method ExecuteAsync (line 29) | public TPL.Task ExecuteAsync(Project project)
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/IPackageHandler.cs
type IPackageHandler (line 13) | internal interface IPackageHandler
method ExecuteAsync (line 25) | TPL.Task ExecuteAsync(Project project);
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/NuGetUninstaller.cs
class NuGetUninstaller (line 15) | internal class NuGetUninstaller : BasePackageHandler
method NuGetUninstaller (line 21) | public NuGetUninstaller(IPackageHandler successor)
method ExecuteAsync (line 27) | public override async TPL.Task ExecuteAsync(Project project)
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/NugetInstaller.cs
class NugetInstaller (line 14) | internal class NugetInstaller : BasePackageHandler
method NugetInstaller (line 20) | public NugetInstaller(IPackageHandler successor)
method ExecuteAsync (line 26) | public override async TPL.Task ExecuteAsync(Project project)
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/TargetsUninstaller.cs
class TargetsUninstaller (line 14) | internal class TargetsUninstaller : BasePackageHandler
method TargetsUninstaller (line 20) | public TargetsUninstaller(IPackageHandler successor)
method ExecuteAsync (line 26) | public override async TPL.Task ExecuteAsync(Project project)
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/UserInstallationHandler.cs
class UserInstallationHandler (line 14) | internal abstract class UserInstallationHandler : BasePackageHandler
method UserInstallationHandler (line 20) | public UserInstallationHandler(IPackageHandler successor)
method HasUserAcceptedWarningMessageAsync (line 31) | protected async Task<bool> HasUserAcceptedWarningMessageAsync(string t...
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/SlowCheetahNuGetManager.cs
class SlowCheetahNuGetManager (line 19) | public class SlowCheetahNuGetManager
method SlowCheetahNuGetManager (line 62) | public SlowCheetahNuGetManager(AsyncPackage package)
method ProjectSupportsNuget (line 75) | public bool ProjectSupportsNuget(IVsHierarchy hierarchy)
method CheckSlowCheetahInstallationAsync (line 116) | public async TPL.Task CheckSlowCheetahInstallationAsync(IVsHierarchy h...
method GetInstallerServices (line 170) | private static IVsPackageInstallerServices GetInstallerServices(IServi...
method IsOldSlowCheetahInstalled (line 177) | private static bool IsOldSlowCheetahInstalled(IVsBuildPropertyStorage ...
method SupportsINugetProjectSystem (line 194) | private static bool SupportsINugetProjectSystem(IVsHierarchy hierarchy)
method IsPackageInstalled (line 217) | private bool IsPackageInstalled(Project project, string packageName)
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/VsProjectTypes.cs
class VsProjectTypes (line 9) | [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.Docume...
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/AdvancedOptionsDialogPage.cs
class AdvancedOptionsDialogPage (line 16) | internal class AdvancedOptionsDialogPage : BaseOptionsDialogPage
method AdvancedOptionsDialogPage (line 25) | public AdvancedOptionsDialogPage()
method SaveSettingsToXml (line 52) | public override void SaveSettingsToXml(IVsSettingsWriter writer)
method LoadSettingsFromXml (line 69) | public override void LoadSettingsFromXml(IVsSettingsReader reader)
method LoadSettingsFromStorage (line 94) | public override void LoadSettingsFromStorage()
method SaveSettingsToStorage (line 127) | public override void SaveSettingsToStorage()
method InitializeDefaults (line 148) | private void InitializeDefaults()
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/AdvancedOptionsUserControl.Designer.cs
class AdvancedOptionsUserControl (line 3) | partial class AdvancedOptionsUserControl
method Dispose (line 14) | protected override void Dispose(bool disposing)
method InitializeComponent (line 29) | private void InitializeComponent()
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/AdvancedOptionsUserControl.cs
class AdvancedOptionsUserControl (line 12) | public partial class AdvancedOptionsUserControl : UserControl
method AdvancedOptionsUserControl (line 19) | public AdvancedOptionsUserControl()
method Initialize (line 28) | internal void Initialize(AdvancedOptionsDialogPage advancedOptionsPage)
method PreviewToolPathTextbox_Leave (line 35) | private void PreviewToolPathTextbox_Leave(object sender, System.EventA...
method PreviewToolCommandLineTextbox_Leave (line 43) | private void PreviewToolCommandLineTextbox_Leave(object sender, System...
method OpenToolFileDialogButton_Click (line 51) | private void OpenToolFileDialogButton_Click(object sender, System.Even...
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/BaseOptionsDialogPage.cs
class BaseOptionsDialogPage (line 11) | internal abstract class BaseOptionsDialogPage : DialogPage
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/OptionsDialogPage.cs
class OptionsDialogPage (line 17) | [System.Runtime.InteropServices.Guid("01B6BAC2-0BD6-4ead-95AE-6D6DE30A62...
method OptionsDialogPage (line 27) | public OptionsDialogPage()
method SaveSettingsToXml (line 54) | public override void SaveSettingsToXml(IVsSettingsWriter writer)
method LoadSettingsFromXml (line 71) | public override void LoadSettingsFromXml(IVsSettingsReader reader)
method LoadSettingsFromStorage (line 97) | public override void LoadSettingsFromStorage()
method SaveSettingsToStorage (line 130) | public override void SaveSettingsToStorage()
method OnDeactivate (line 153) | protected override void OnDeactivate(CancelEventArgs e)
method InitializeDefaults (line 160) | private void InitializeDefaults()
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/OptionsUserControl.Designer.cs
class OptionsUserControl (line 3) | partial class OptionsUserControl
method Dispose (line 14) | protected override void Dispose(bool disposing)
method InitializeComponent (line 29) | private void InitializeComponent()
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/OptionsUserControl.cs
class OptionsUserControl (line 12) | public partial class OptionsUserControl : UserControl
method OptionsUserControl (line 19) | public OptionsUserControl()
method Initialize (line 28) | internal void Initialize(OptionsDialogPage optionsPage)
method EnablePreviewCheckbox_CheckedChanged (line 35) | private void EnablePreviewCheckbox_CheckedChanged(object sender, Event...
method AddDepentUponCheckbox_CheckedChanged (line 43) | private void AddDepentUponCheckbox_CheckedChanged(object sender, Event...
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Package/AddTransformCommand.cs
class AddTransformCommand (line 23) | public class AddTransformCommand : BaseCommand
method AddTransformCommand (line 35) | public AddTransformCommand(SlowCheetahPackage package, SlowCheetahNuGe...
method OnChange (line 47) | protected override void OnChange(object sender, EventArgs e)
method OnBeforeQueryStatus (line 52) | protected override void OnBeforeQueryStatus(object sender, EventArgs e)
method OnInvoke (line 84) | protected override void OnInvoke(object sender, EventArgs e)
method AddTransformFile (line 187) | private void AddTransformFile(
method ItemSupportsTransforms (line 246) | private bool ItemSupportsTransforms(IVsProject project, uint itemid)
method GetPublishProfileTransforms (line 280) | private IEnumerable<string> GetPublishProfileTransforms(IVsHierarchy h...
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Package/BaseCommand.cs
class BaseCommand (line 13) | public abstract class BaseCommand
method BaseCommand (line 19) | public BaseCommand(AsyncPackage package)
method RegisterCommandAsync (line 38) | public async System.Threading.Tasks.Task RegisterCommandAsync()
method OnChange (line 57) | protected abstract void OnChange(object sender, EventArgs e);
method OnBeforeQueryStatus (line 65) | protected abstract void OnBeforeQueryStatus(object sender, EventArgs e);
method OnInvoke (line 72) | protected abstract void OnInvoke(object sender, EventArgs e);
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Package/PackageSolutionEvents.cs
class PackageSolutionEvents (line 13) | public class PackageSolutionEvents : IVsUpdateSolutionEvents, IDisposable
method PackageSolutionEvents (line 22) | public PackageSolutionEvents(AsyncPackage asyncPackage, ErrorListProvi...
method UpdateSolution_Begin (line 33) | public int UpdateSolution_Begin(ref int pfCancelUpdate)
method UpdateSolution_Done (line 39) | public int UpdateSolution_Done(int fSucceeded, int fModified, int fCan...
method UpdateSolution_StartUpdate (line 45) | public int UpdateSolution_StartUpdate(ref int pfCancelUpdate)
method UpdateSolution_Cancel (line 53) | public int UpdateSolution_Cancel()
method OnActiveProjectCfgChange (line 59) | public int OnActiveProjectCfgChange(IVsHierarchy pIVsHierarchy)
method RegisterEventsAsync (line 68) | public async System.Threading.Tasks.Task RegisterEventsAsync()
method Dispose (line 79) | public void Dispose()
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Package/PreviewTransformCommand.cs
class PreviewTransformCommand (line 24) | public class PreviewTransformCommand : BaseCommand, IDisposable
method PreviewTransformCommand (line 33) | public PreviewTransformCommand(
method Dispose (line 61) | public void Dispose()
method OnChange (line 80) | protected override void OnChange(object sender, EventArgs e)
method OnBeforeQueryStatus (line 85) | protected override void OnBeforeQueryStatus(object sender, EventArgs e)
method OnInvoke (line 118) | protected override void OnInvoke(object sender, EventArgs e)
method PreviewTransform (line 178) | private void PreviewTransform(IVsHierarchy hier, string sourceFile, st...
method TryGetFileToTransform (line 282) | private bool TryGetFileToTransform(IVsHierarchy hierarchy, uint parent...
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Package/SlowCheetahPackageLogger.cs
class SlowCheetahPackageLogger (line 14) | public class SlowCheetahPackageLogger
method SlowCheetahPackageLogger (line 22) | public SlowCheetahPackageLogger(IServiceProvider package)
method LogMessage (line 32) | public void LogMessage(string message, params object[] args)
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Resources/Guids.cs
class Guids (line 16) | public static class Guids
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Resources/PkgCmdID.cs
class PkgCmdID (line 14) | public static class PkgCmdID
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Resources/Resources.Designer.cs
class Resources (line 22) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
method Resources (line 31) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/SlowCheetahPackage.cs
class SlowCheetahPackage (line 38) | [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoa...
method SlowCheetahPackage (line 71) | public SlowCheetahPackage()
method ProjectSupportsTransforms (line 102) | public bool ProjectSupportsTransforms(IVsProject project)
method IsItemTransformItem (line 113) | public bool IsItemTransformItem(IVsProject vsProject, uint itemid)
method InitializeAsync (line 143) | protected override async System.Threading.Tasks.Task InitializeAsync(C...
method Dispose (line 162) | protected override void Dispose(bool disposing)
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/TransformationPreviewLogger.cs
class TransformationPreviewLogger (line 20) | public class TransformationPreviewLogger : ITransformationLogger
method TransformationPreviewLogger (line 30) | public TransformationPreviewLogger(ErrorListProvider errorListProvider...
method LogError (line 37) | public void LogError(string message, params object[] messageArgs)
method LogError (line 43) | public void LogError(string file, int lineNumber, int linePosition, st...
method LogErrorFromException (line 49) | public void LogErrorFromException(Exception ex)
method LogErrorFromException (line 55) | public void LogErrorFromException(Exception ex, string file, int lineN...
method LogMessage (line 61) | public void LogMessage(LogMessageImportance importance, string message...
method LogWarning (line 70) | public void LogWarning(string message, params object[] messageArgs)
method LogWarning (line 76) | public void LogWarning(string file, int lineNumber, int linePosition, ...
method AddError (line 81) | private void AddError(TaskErrorCategory errorCategory, string text, st...
method AddError (line 86) | private void AddError(Exception ex, TaskErrorCategory errorCategory, s...
method ShowError (line 91) | private void ShowError(ErrorTask newError, TaskErrorCategory errorCate...
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Utilities/PackageUtilities.cs
class PackageUtilities (line 22) | public class PackageUtilities
method IsExtensionSupportedForFile (line 70) | public static bool IsExtensionSupportedForFile(string filePath)
method GetTempFilename (line 91) | public static string GetTempFilename(bool ensureFileDoesntExist, strin...
method IsFileTransformForBuildConfiguration (line 125) | public static bool IsFileTransformForBuildConfiguration(string documen...
method IsGenericFileTransform (line 149) | public static bool IsGenericFileTransform(string documentName, string ...
method IsPathValid (line 159) | public static bool IsPathValid(string path)
method GetAutomationFromHierarchy (line 177) | public static T GetAutomationFromHierarchy<T>(IVsHierarchy pHierarchy,...
method TryGetFileTransform (line 186) | private static bool TryGetFileTransform(string documentName, string tr...
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Utilities/ProjectUtilities.cs
class ProjectUtilities (line 22) | public static class ProjectUtilities
method GetDTE (line 34) | public static DTE GetDTE()
method IsSingleProjectItemSelection (line 45) | public static bool IsSingleProjectItemSelection(out IVsHierarchy hiera...
method GetProjectConfigurations (line 119) | public static IEnumerable<string> GetProjectConfigurations(Project pro...
method GetProjectConfigurations (line 143) | public static IEnumerable<string> GetProjectConfigurations(IVsHierarch...
method GetSupportedProjectExtensions (line 154) | public static IEnumerable<string> GetSupportedProjectExtensions(IVsSet...
method GetSupportedItemExtensions (line 169) | public static IEnumerable<string> GetSupportedItemExtensions(IVsSettin...
method IsProjectWebApp (line 185) | public static bool IsProjectWebApp(IVsProject project)
method GetSupportedExtensions (line 211) | private static IEnumerable<string> GetSupportedExtensions(IVsSettingsM...
FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/VSPackage.Designer.cs
class VSPackage (line 22) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
method VSPackage (line 31) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...
FILE: src/Microsoft.VisualStudio.SlowCheetah/Build/TransformTask.cs
class TransformTask (line 11) | public class TransformTask : Microsoft.Build.Utilities.Task
method Execute (line 32) | public override bool Execute()
FILE: src/Microsoft.VisualStudio.SlowCheetah/Exceptions/TransformFailedException.cs
class TransformFailedException (line 16) | [Serializable]
method TransformFailedException (line 23) | public TransformFailedException(string message)
method TransformFailedException (line 33) | public TransformFailedException(string message, Exception inner)
method TransformFailedException (line 43) | protected TransformFailedException(
FILE: src/Microsoft.VisualStudio.SlowCheetah/Logging/ITransformationLogger.cs
type LogMessageImportance (line 11) | public enum LogMessageImportance
type ITransformationLogger (line 32) | public interface ITransformationLogger
method LogError (line 39) | void LogError(string message, params object[] messageArgs);
method LogError (line 49) | void LogError(string file, int lineNumber, int linePosition, string me...
method LogErrorFromException (line 55) | void LogErrorFromException(Exception ex);
method LogErrorFromException (line 64) | void LogErrorFromException(Exception ex, string file, int lineNumber, ...
method LogMessage (line 72) | void LogMessage(LogMessageImportance importance, string message, param...
method LogWarning (line 79) | void LogWarning(string message, params object[] messageArgs);
method LogWarning (line 89) | void LogWarning(string file, int lineNumber, int linePosition, string ...
FILE: src/Microsoft.VisualStudio.SlowCheetah/Logging/JsonShimLogger.cs
class JsonShimLogger (line 12) | public class JsonShimLogger : IJsonTransformationLogger
method JsonShimLogger (line 20) | public JsonShimLogger(ITransformationLogger logger)
method LogError (line 26) | public void LogError(string message)
method LogError (line 32) | public void LogError(string message, string fileName, int lineNumber, ...
method LogErrorFromException (line 38) | public void LogErrorFromException(Exception ex)
method LogErrorFromException (line 44) | public void LogErrorFromException(Exception ex, string fileName, int l...
method LogMessage (line 50) | public void LogMessage(string message)
method LogMessage (line 56) | public void LogMessage(string message, string fileName, int lineNumber...
method LogWarning (line 62) | public void LogWarning(string message)
method LogWarning (line 68) | public void LogWarning(string message, string fileName)
method LogWarning (line 74) | public void LogWarning(string message, string fileName, int lineNumber...
FILE: src/Microsoft.VisualStudio.SlowCheetah/Logging/TransformationTaskLogger.cs
class TransformationTaskLogger (line 14) | public class TransformationTaskLogger : ITransformationLogger
method TransformationTaskLogger (line 22) | public TransformationTaskLogger(TaskLoggingHelper logger)
method LogError (line 28) | public void LogError(string message, params object[] messageArgs)
method LogError (line 34) | public void LogError(string file, int lineNumber, int linePosition, st...
method LogErrorFromException (line 40) | public void LogErrorFromException(Exception ex)
method LogErrorFromException (line 46) | public void LogErrorFromException(Exception ex, string file, int lineN...
method LogMessage (line 52) | public void LogMessage(LogMessageImportance type, string message, para...
method LogWarning (line 76) | public void LogWarning(string message, params object[] messageArgs)
method LogWarning (line 82) | public void LogWarning(string file, int lineNumber, int linePosition, ...
FILE: src/Microsoft.VisualStudio.SlowCheetah/Logging/XmlShimLogger.cs
class XmlShimLogger (line 14) | public class XmlShimLogger : IXmlTransformationLogger
method XmlShimLogger (line 29) | public XmlShimLogger(ITransformationLogger logger, bool useSections)
method LogError (line 50) | public void LogError(string message, params object[] messageArgs)
method LogError (line 56) | public void LogError(string file, string message, params object[] mess...
method LogError (line 62) | public void LogError(string file, int lineNumber, int linePosition, st...
method LogErrorFromException (line 68) | public void LogErrorFromException(Exception ex)
method LogErrorFromException (line 74) | public void LogErrorFromException(Exception ex, string file)
method LogErrorFromException (line 80) | public void LogErrorFromException(Exception ex, string file, int lineN...
method LogMessage (line 86) | public void LogMessage(string message, params object[] messageArgs)
method LogMessage (line 97) | public void LogMessage(MessageType type, string message, params object...
method LogWarning (line 123) | public void LogWarning(string message, params object[] messageArgs)
method LogWarning (line 129) | public void LogWarning(string file, string message, params object[] me...
method LogWarning (line 135) | public void LogWarning(string file, int lineNumber, int linePosition, ...
method StartSection (line 141) | public void StartSection(string message, params object[] messageArgs)
method StartSection (line 147) | public void StartSection(MessageType type, string message, params obje...
method EndSection (line 157) | public void EndSection(string message, params object[] messageArgs)
method EndSection (line 163) | public void EndSection(MessageType type, string message, params object...
FILE: src/Microsoft.VisualStudio.SlowCheetah/Resources/Resources.Designer.cs
class Resources (line 22) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
method Resources (line 31) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...
FILE: src/Microsoft.VisualStudio.SlowCheetah/Transformer/ITransformer.cs
type ITransformer (line 9) | public interface ITransformer
method WithLogger (line 16) | ITransformer WithLogger(ITransformationLogger logger);
method Transform (line 25) | bool Transform(string sourcePath, string transformPath, string destina...
method IsFileSupported (line 32) | bool IsFileSupported(string filePath);
method CreateTransformFile (line 40) | void CreateTransformFile(string sourcePath, string transformPath, bool...
FILE: src/Microsoft.VisualStudio.SlowCheetah/Transformer/JsonTransformer.cs
class JsonTransformer (line 13) | public class JsonTransformer : ITransformer
method JsonTransformer (line 23) | public JsonTransformer()
method JsonTransformer (line 31) | public JsonTransformer(ITransformationLogger logger)
method CreateTransformFile (line 42) | public void CreateTransformFile(string sourcePath, string transformPat...
method IsFileSupported (line 68) | public bool IsFileSupported(string filePath)
method Transform (line 84) | public bool Transform(string sourcePath, string transformPath, string ...
method WithLogger (line 128) | public ITransformer WithLogger(ITransformationLogger logger)
method TrySaveToFile (line 144) | private bool TrySaveToFile(Stream result, string sourceFile, string de...
FILE: src/Microsoft.VisualStudio.SlowCheetah/Transformer/TransformUtilities.cs
class TransformUtilities (line 13) | public static class TransformUtilities
method GetEncoding (line 21) | public static Encoding GetEncoding(string filename)
method GetEncoding (line 40) | public static Encoding GetEncoding(Stream stream)
FILE: src/Microsoft.VisualStudio.SlowCheetah/Transformer/TransformerFactory.cs
class TransformerFactory (line 15) | public static class TransformerFactory
method GetTransformer (line 29) | public static ITransformer GetTransformer(string source, ITransformati...
method IsSupportedFile (line 45) | public static bool IsSupportedFile(string filePath)
FILE: src/Microsoft.VisualStudio.SlowCheetah/Transformer/XmlTransformer.cs
class XmlTransformer (line 14) | public class XmlTransformer : ITransformer
method XmlTransformer (line 24) | public XmlTransformer()
method XmlTransformer (line 32) | public XmlTransformer(ITransformationLogger logger)
method CreateTransformFile (line 43) | public void CreateTransformFile(string sourcePath, string transformPat...
method IsFileSupported (line 80) | public bool IsFileSupported(string filePath)
method Transform (line 110) | public bool Transform(string sourcePath, string transformPath, string ...
method WithLogger (line 155) | public ITransformer WithLogger(ITransformationLogger logger)
FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/BaseTest.cs
class BaseTest (line 18) | public class BaseTest : IDisposable
method Dispose (line 28) | public void Dispose()
method WriteTextToTempFile (line 53) | protected virtual string WriteTextToTempFile(string content)
method GetTempFilename (line 70) | protected virtual string GetTempFilename(bool ensureFileDoesntExist)
FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConfigTransformTestsBase.cs
class ConfigTransformTestsBase (line 22) | public abstract class ConfigTransformTestsBase : IDisposable
method BuildProject (line 53) | public void BuildProject(string projectName)
method GetAppSettingValue (line 103) | public string GetAppSettingValue(string configFilePath, string appSett...
method GetConfigNodeValue (line 118) | public string GetConfigNodeValue(string configFilePath, string nodeName)
method Dispose (line 127) | public void Dispose()
method ResolveMSBuildExePath (line 135) | private static string ResolveMSBuildExePath()
FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConsoleAppTests.cs
class ConsoleAppTests (line 17) | [Collection("BuildTests")]
method ConsoleApp_AppConfig_IsTransformed (line 23) | [Fact]
method ConsoleApp_OtherConfig_IsTransformed (line 39) | [Fact]
FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Program.cs
class Program (line 9) | class Program
method Main (line 11) | static void Main(string[] args)
FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/WebAppTests.cs
class WebAppTests (line 17) | [Collection("BuildTests")]
method WebApp_OtherConfig_IsTransformed (line 23) | [Fact]
FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/TestUtilities.cs
class TestUtilities (line 14) | public static class TestUtilities
FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/TransformTest.cs
class TransformTest (line 17) | public class TransformTest : BaseTest
method TestXmlTransform (line 22) | [Fact]
FILE: test/Microsoft.VisualStudio.SlowCheetah.VS.Tests/PackageUtilitiesTest.cs
class PackageUtilitiesTest (line 12) | public class PackageUtilitiesTest
method IsFileTransformWithNullArguments (line 22) | [Theory]
method IsFileTransformWithValidArguments (line 39) | [Theory]
method IsFileTransformWithInvalidArguments (line 54) | [Theory]
method IsFileTransformWithDottedConfigsAndValidNames (line 69) | [Theory]
method IsFileTransformWithDottedConfigsAndInvalidNames (line 87) | [Theory]
method IsFileGenericTransformWithInvalidArguments (line 105) | [Theory]
method IsFileGenericTransformWithValidArguments (line 121) | [Theory]
Condensed preview — 328 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,093K chars).
[
{
"path": ".azuredevops/dependabot.yml",
"chars": 231,
"preview": "# Please see the documentation for all configuration options:\n# https://eng.ms/docs/products/dependabot/configuration/ve"
},
{
"path": ".config/dotnet-tools.json",
"chars": 839,
"preview": "{\n \"version\": 1,\n \"isRoot\": true,\n \"tools\": {\n \"powershell\": {\n \"version\": \"7.6.1\",\n \"commands\": [\n "
},
{
"path": ".editorconfig",
"chars": 7237,
"preview": "# EditorConfig is awesome:http://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Don't use tabs for indent"
},
{
"path": ".gitattributes",
"chars": 2700,
"preview": "###############################################################################\n# Set default behavior to automatically "
},
{
"path": ".github/.editorconfig",
"chars": 36,
"preview": "[renovate.json*]\nindent_style = tab\n"
},
{
"path": ".github/Prime-ForCopilot.ps1",
"chars": 205,
"preview": "if ((git -C $PSScriptRoot rev-parse --is-shallow-repository) -eq 'true')\n{\n Write-Host \"Shallow clone detected, disab"
},
{
"path": ".github/actions/publish-artifacts/action.yaml",
"chars": 2188,
"preview": "name: Publish artifacts\ndescription: Publish artifacts\n\nruns:\n using: composite\n steps:\n - name: 📥 Collect artifacts\n"
},
{
"path": ".github/copilot-instructions.md",
"chars": 3646,
"preview": "# Copilot instructions for this repository\n\n## High level guidance\n\n* Review the `CONTRIBUTING.md` file for instructions"
},
{
"path": ".github/renovate.json",
"chars": 222,
"preview": "{\n\t\"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n\t\"extends\": [\n\t\t\"github>microsoft/vs-renovate-presets"
},
{
"path": ".github/skills/update-library-template/SKILL.md",
"chars": 4231,
"preview": "---\nname: update-library-template\ndescription: Merges the latest Library.Template into this repo (at position of HEAD) a"
},
{
"path": ".github/skills/update-library-template/template-release-notes.md",
"chars": 1112,
"preview": "# Template release notes\n\nThis file will describe significant changes in Library.Template as they are introduced, especi"
},
{
"path": ".github/workflows/copilot-setup-steps.yml",
"chars": 1609,
"preview": "name: 💪🏼 Copilot Setup Steps\n\n# Automatically run the setup steps when they are changed to allow for easy validation, an"
},
{
"path": ".github/workflows/docs.yml",
"chars": 1272,
"preview": "name: 📚 Docs\n\non:\n push:\n branches:\n - main\n\n# Allow only one concurrent deployment, skipping runs queued between"
},
{
"path": ".github/workflows/docs_validate.yml",
"chars": 1068,
"preview": "name: 📃 Docfx Validate\n\non:\n push:\n branches:\n - main\n - microbuild\n workflow_dispatch:\n\njobs:\n build:\n n"
},
{
"path": ".github/workflows/libtemplate-update.yml",
"chars": 3829,
"preview": "name: ⛜ Library.Template update\n\n# PREREQUISITE: This workflow requires the repo to be configured to allow workflows to "
},
{
"path": ".gitignore",
"chars": 6200,
"preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
},
{
"path": ".vscode/extensions.json",
"chars": 797,
"preview": "{\n // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.\n // Extension ident"
},
{
"path": ".vscode/launch.json",
"chars": 485,
"preview": "{\n // Use IntelliSense to find out which attributes exist for C# debugging\n // Use hover for the description of the "
},
{
"path": ".vscode/mcp.json",
"chars": 484,
"preview": "{\n \"servers\": {\n \"github\": {\n \"type\": \"http\",\n \"url\": \"https://api.githubcopilot.com/mcp"
},
{
"path": ".vscode/settings.json",
"chars": 927,
"preview": "{\n \"files.trimTrailingWhitespace\": true,\n \"files.insertFinalNewline\": true,\n \"files.trimFinalNewlines\": true,\n \"azur"
},
{
"path": ".vscode/tasks.json",
"chars": 411,
"preview": "{\n \"version\": \"2.0.0\",\n \"tasks\": [\n {\n \"label\": \"build\",\n \"command\": \"dotnet\",\n "
},
{
"path": ".vsts-ci.yml",
"chars": 9331,
"preview": "trigger:\n branches:\n include:\n - main\n paths:\n exclude:\n - .github\n - doc\n - '*.md'\nschedules:\n- cro"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 444,
"preview": "# Microsoft Open Source Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://op"
},
{
"path": "CONTRIBUTING.md",
"chars": 5519,
"preview": "# Microsoft.VisualStudio.SlowCheetah\n\nThis project welcomes contributions and suggestions. Most contributions require yo"
},
{
"path": "CodeQL.yml",
"chars": 45,
"preview": "path_classifiers:\n library:\n - 'test/**'\n"
},
{
"path": "Directory.Build.props",
"chars": 3829,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n <PropertyGroup>\n <Configuration Condition=\" '$(Configuration)' == "
},
{
"path": "Directory.Build.rsp",
"chars": 776,
"preview": "#------------------------------------------------------------------------------\n# This file contains command-line option"
},
{
"path": "Directory.Build.targets",
"chars": 314,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n <ItemGroup>\n <!-- Avoid compile error about missing namespace when"
},
{
"path": "Directory.Packages.props",
"chars": 3055,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n <!-- https://learn.microsoft.com/nuget/consume-packages/central-packa"
},
{
"path": "LICENSE",
"chars": 1129,
"preview": "Microsoft.VisualStudio.SlowCheetah\nCopyright (c) Microsoft Corporation\nAll rights reserved.\n\nMIT License\n\nPermission is "
},
{
"path": "README.md",
"chars": 2361,
"preview": "# slow-cheetah\n[](https://nuget.o"
},
{
"path": "Restore.cmd",
"chars": 204,
"preview": "@echo off\nWHERE /q msbuild\nIF ERRORLEVEL 1 (\n ECHO Error: Could not find msbuild. Make sure msbuild is in the PATH an"
},
{
"path": "SECURITY.md",
"chars": 2763,
"preview": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.5 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products an"
},
{
"path": "SUPPORT.md",
"chars": 440,
"preview": "# Support\n\n## How to file issues and get help\n\nThis project uses GitHub Issues to track bugs and feature requests.\nPleas"
},
{
"path": "ThirdPartyNotices.txt",
"chars": 11476,
"preview": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties.\nMicrosoft "
},
{
"path": "appveyor.yml",
"chars": 1474,
"preview": "# Notes:\n# - Minimal appveyor.yml file is an empty file. All sections are optional.\n# - Indent each level of configu"
},
{
"path": "azure-pipelines/Archive-SourceCode.ps1",
"chars": 8306,
"preview": "#Requires -PSEdition Core -Version 7\n<#\n.SYNOPSIS\n Submits a source archival request for this repo.\n.PARAMETER Reques"
},
{
"path": "azure-pipelines/BuildStageVariables.yml",
"chars": 141,
"preview": "variables:\n DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true\n BuildConfiguration: Release\n NUGET_PACKAGES: $(Agent.TempDirecto"
},
{
"path": "azure-pipelines/Get-InsertionPRId.ps1",
"chars": 787,
"preview": "<#\n.SYNOPSIS\n Look up the pull request URL of the insertion PR.\n#>\n$stagingFolder = $env:BUILD_STAGINGDIRECTORY\nif (!"
},
{
"path": "azure-pipelines/GlobalVariables.yml",
"chars": 280,
"preview": "variables:\n # These variables are required for MicroBuild tasks\n TeamName: VS IDE\n TeamEmail: vsidemicrobuild@microso"
},
{
"path": "azure-pipelines/Merge-CodeCoverage.ps1",
"chars": 2219,
"preview": "#!/usr/bin/env pwsh\n\n<#\n.SYNOPSIS\n Merges code coverage reports.\n.PARAMETER Path\n The path(s) to search for Cobert"
},
{
"path": "azure-pipelines/NuGetSbom.props",
"chars": 189,
"preview": "<Project>\n <PropertyGroup>\n <GenerateSBOMThisProject>true</GenerateSBOMThisProject>\n <UseMicroBuildSbomPluginVers"
},
{
"path": "azure-pipelines/PoliCheckExclusions.xml",
"chars": 725,
"preview": "<PoliCheckExclusions>\n <!--Each of these exclusions is a folder name -if \\[name]\\exists in the file path, it will be "
},
{
"path": "azure-pipelines/PostPRMessage.ps1",
"chars": 1936,
"preview": "[CmdletBinding(SupportsShouldProcess = $true)]\nparam(\n [Parameter(Mandatory=$true)]\n $AccessToken,\n [Parameter("
},
{
"path": "azure-pipelines/TSAOptions.json",
"chars": 500,
"preview": "{\n \"tsaVersion\": \"TsaV2\",\n \"codebase\": \"NewOrUpdate\",\n \"codebaseName\": \"SlowCheetah\",\n \"tsaStamp\": \"DevDiv\",\n \"tsaE"
},
{
"path": "azure-pipelines/WIFtoPATauth.yml",
"chars": 1152,
"preview": "parameters:\n- name: deadPATServiceConnectionId # The GUID of the PAT-based service connection whose access token must be"
},
{
"path": "azure-pipelines/apiscan.yml",
"chars": 2187,
"preview": "parameters:\n- name: windowsPool\n type: object\n- name: RealSign\n type: boolean\n\njobs:\n- job: apiscan\n displayName: API"
},
{
"path": "azure-pipelines/archive-sourcecode.yml",
"chars": 3154,
"preview": "trigger: none # We only want to trigger manually or based on resources\npr: none\n\n# Source archival requirements come fro"
},
{
"path": "azure-pipelines/build.yml",
"chars": 15798,
"preview": "parameters:\n##### The following parameters are not set by other YAML files that import this one,\n##### but we use parame"
},
{
"path": "azure-pipelines/dotnet.yml",
"chars": 1923,
"preview": "parameters:\n- name: RunTests\n- name: Is1ESPT\n type: boolean\n- name: BuildRequiresAccessToken\n type: boolean\n default:"
},
{
"path": "azure-pipelines/falsepositives.gdnsuppress",
"chars": 229,
"preview": "{\n \"version\": \"latest\",\n \"suppressionSets\": {\n \"falsepositives\": {\n \"name\": \"falsepositives\",\n \"createdDa"
},
{
"path": "azure-pipelines/install-dependencies.yml",
"chars": 1476,
"preview": "parameters:\n- name: initArgs\n type: string\n default: ''\n- name: needsAzurePublicFeeds\n type: boolean\n default: true "
},
{
"path": "azure-pipelines/libtemplate-update.yml",
"chars": 7238,
"preview": "# This pipeline schedules regular merges of Library.Template into a repo that is based on it.\n# Only Azure Repos are sup"
},
{
"path": "azure-pipelines/microbuild.after.yml",
"chars": 549,
"preview": "parameters:\n- name: SkipCodesignVerify\n type: boolean\n\nsteps:\n- ${{ if not(parameters.SkipCodesignVerify) }}:\n - task:"
},
{
"path": "azure-pipelines/microbuild.before.yml",
"chars": 906,
"preview": "parameters:\n- name: EnableLocalization\n type: boolean\n default: false\n- name: ShouldSkipOptimize\n type: boolean\n def"
},
{
"path": "azure-pipelines/no_authenticode.txt",
"chars": 131,
"preview": "bin\\packages\\release\\vsix\\_manifest\\manifest.cat,sbom signed\nbin\\packages\\release\\vsix\\_manifest\\spdx_2.2\\manifest.cat,s"
},
{
"path": "azure-pipelines/no_strongname.txt",
"chars": 0,
"preview": ""
},
{
"path": "azure-pipelines/official.yml",
"chars": 3420,
"preview": "trigger:\n branches:\n include:\n - main\n\nschedules:\n# Monthly compliance sweep: runs at 03:00 UTC (8 PM PST previou"
},
{
"path": "azure-pipelines/prepare-insertion-stages.yml",
"chars": 3427,
"preview": "parameters:\n- name: ArchiveSymbols\n type: boolean\n default: true\n- name: RealSign\n displayName: Real sign?\n type: bo"
},
{
"path": "azure-pipelines/publish-codecoverage.yml",
"chars": 991,
"preview": "parameters:\n- name: EnableMacOSBuild\n type: boolean\n- name: EnableLinuxBuild\n type: boolean\n\nsteps:\n- download: curren"
},
{
"path": "azure-pipelines/publish-symbols.yml",
"chars": 2039,
"preview": "parameters:\n- name: EnableMacOSBuild\n type: boolean\n- name: EnableLinuxBuild\n type: boolean\n\nsteps:\n- task: DownloadPi"
},
{
"path": "azure-pipelines/publish_artifacts.ps1",
"chars": 1777,
"preview": "<#\n.SYNOPSIS\n This script translates all the artifacts described by _all.ps1\n into commands that instruct Azure Pi"
},
{
"path": "azure-pipelines/release-deployment-prep.yml",
"chars": 234,
"preview": "steps:\n- download: CI\n artifact: Variables-Windows\n displayName: 🔻 Download Variables-Windows artifact\n- powershell: $"
},
{
"path": "azure-pipelines/release.yml",
"chars": 3460,
"preview": "trigger: none # We only want to trigger manually or based on resources\npr: none\n\nresources:\n repositories:\n - reposito"
},
{
"path": "azure-pipelines/unofficial.yml",
"chars": 3270,
"preview": "trigger:\n batch: true\n branches:\n include:\n - main\n - microbuild\n - 'validate/*'\n paths:\n exclude:\n "
},
{
"path": "azure-pipelines/vs-insertion-script.ps1",
"chars": 682,
"preview": "# List of build artifact files [Source => Destination] to be committed into the VS repo.\n$FilesToCommit = @{\n \"$env:P"
},
{
"path": "azure-pipelines/vs-insertion.yml",
"chars": 3516,
"preview": "trigger: none # We only want to trigger manually or based on resources\npr: none\n\nresources:\n repositories:\n - reposito"
},
{
"path": "azure-pipelines/vs-validation.yml",
"chars": 5209,
"preview": "# This is a top-level pipeline file, which is designed to be added as an optional PR build policy\n# so that a VS inserti"
},
{
"path": "azure-pipelines.yml",
"chars": 687,
"preview": "trigger:\n batch: true\n branches:\n include:\n - main\n - 'v*.*'\n - microbuild\n - 'validate/*'\n paths:\n "
},
{
"path": "doc/targets.md",
"chars": 3542,
"preview": "# SlowCheetah Build Targets\n\n### Summary\nSlowCheetah alters the build process for projects to ensure that the transforma"
},
{
"path": "doc/transforming_files.md",
"chars": 2251,
"preview": "# Transforming Files with SlowCheetah\n\n## Summary\nThe [SlowCheetah Visual Studio extension](https://marketplace.visualst"
},
{
"path": "doc/update.md",
"chars": 3384,
"preview": "# SlowCheetah in VS 2017 \n\nWe have made significant changes to the SlowCheetah extension and NuGet package. This is beca"
},
{
"path": "docfx/.gitignore",
"chars": 12,
"preview": "_site/\napi/\n"
},
{
"path": "docfx/docfx.json",
"chars": 1033,
"preview": "{\n \"metadata\": [\n {\n \"src\": [\n {\n \"src\": \"../src/Library\",\n "
},
{
"path": "docfx/docs/features.md",
"chars": 17,
"preview": "# Features\n\nTODO\n"
},
{
"path": "docfx/docs/getting-started.md",
"chars": 313,
"preview": "# Getting Started\n\n## Installation\n\nConsume this library via its NuGet Package.\nClick on the badge to find its latest ve"
},
{
"path": "docfx/docs/toc.yml",
"chars": 95,
"preview": "items:\n- name: Features\n href: features.md\n- name: Getting Started\n href: getting-started.md\n"
},
{
"path": "docfx/index.md",
"chars": 116,
"preview": "---\n_layout: landing\n---\n\n# Overview\n\nThis is your docfx landing page.\n\nClick \"Docs\" across the top to get started.\n"
},
{
"path": "docfx/toc.yml",
"chars": 59,
"preview": "items:\n- name: Docs\n href: docs/\n- name: API\n href: api/\n"
},
{
"path": "global.json",
"chars": 212,
"preview": "{\n \"sdk\": {\n \"version\": \"10.0.204\",\n \"rollForward\": \"patch\",\n \"allowPrerelease\": false\n },\n \"msbuild-sdks\": "
},
{
"path": "init.cmd",
"chars": 646,
"preview": "@echo off\nSETLOCAL\nset PS1UnderCmd=1\n\n:: Get the datetime in a format that can go in a filename.\nset _my_datetime=%date%"
},
{
"path": "init.ps1",
"chars": 8067,
"preview": "#!/usr/bin/env pwsh\n\n<#\n.SYNOPSIS\n Installs dependencies required to build and test the projects in this repository.\n"
},
{
"path": "nuget.config",
"chars": 725,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n <config>\n <add key=\"repositorypath\" value=\"packages\" />\n <"
},
{
"path": "samples/FSharpDemo/FSharpDemo.fsproj",
"chars": 4049,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
},
{
"path": "samples/FSharpDemo/Program.fs",
"chars": 498,
"preview": "// Learn more about F# at http://fsharp.net\nlet settingOne = System.Configuration.ConfigurationManager.AppSettings.[\"se"
},
{
"path": "samples/FSharpDemo/app.Debug.config",
"chars": 637,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/FSharpDemo/app.Release.config",
"chars": 635,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/FSharpDemo/app.config",
"chars": 273,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n <appSettings>\n <add key=\"settingOne\" value=\"one default va"
},
{
"path": "samples/Linked-files/connectionStrings.Debug.config",
"chars": 465,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/Linked-files/connectionStrings.Release.config",
"chars": 647,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/Linked-files/connectionStrings.config",
"chars": 209,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<connectionStrings>\n <clear />\n <add name=\"RecordsDb\" connectionString=\".\\SQLE"
},
{
"path": "samples/SlowCheetah.Samples.sln",
"chars": 6999,
"preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 2012\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C"
},
{
"path": "samples/TransformSetupProject/.gitignore",
"chars": 32,
"preview": "# Folders\nDebug\nRelease\n\n# Files"
},
{
"path": "samples/TransformSetupProject/TransformSetupProject.vdproj",
"chars": 28534,
"preview": "\"DeployProject\"\n{\n\"VSVersion\" = \"3:800\"\n\"ProjectType\" = \"8:{978C614F-708E-4E1A-B201-565925725DBA}\"\n\"IsWebType\" = \"8:FAL"
},
{
"path": "samples/WebDemo/Default.aspx",
"chars": 348,
"preview": "<%@ Page Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Default.aspx.cs\" Inherits=\"WebDemo.Default\" %>\n\n<!DOCTYPE htm"
},
{
"path": "samples/WebDemo/Default.aspx.cs",
"chars": 310,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System."
},
{
"path": "samples/WebDemo/Default.aspx.designer.cs",
"chars": 433,
"preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n// This code w"
},
{
"path": "samples/WebDemo/Properties/AssemblyInfo.cs",
"chars": 1347,
"preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
},
{
"path": "samples/WebDemo/Web.Debug.config",
"chars": 1255,
"preview": "<?xml version=\"1.0\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlin"
},
{
"path": "samples/WebDemo/Web.Release.config",
"chars": 1315,
"preview": "<?xml version=\"1.0\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlin"
},
{
"path": "samples/WebDemo/Web.config",
"chars": 294,
"preview": "<?xml version=\"1.0\"?>\n\n<!--\n For more information on how to configure your ASP.NET application, please visit\n http://"
},
{
"path": "samples/WebDemo/WebDemo.csproj",
"chars": 6040,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
},
{
"path": "samples/WebDemo/connectionStrings.Debug.config",
"chars": 465,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/WebDemo/connectionStrings.Release.config",
"chars": 647,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/WebDemo/connectionStrings.ToPkg.config",
"chars": 568,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations\n see the web.config examp"
},
{
"path": "samples/WebDemo/connectionStrings.config",
"chars": 209,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<connectionStrings>\n <clear />\n <add name=\"RecordsDb\" connectionString=\".\\SQLE"
},
{
"path": "samples/WindowsAzure1/ServiceConfiguration.Cloud.cscfg",
"chars": 492,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ServiceConfiguration serviceName=\"WindowsAzure1\" xmlns=\"http://schemas.microsoft"
},
{
"path": "samples/WindowsAzure1/ServiceConfiguration.Local.cscfg",
"chars": 492,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ServiceConfiguration serviceName=\"WindowsAzure1\" xmlns=\"http://schemas.microsoft"
},
{
"path": "samples/WindowsAzure1/ServiceDefinition.csdef",
"chars": 343,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ServiceDefinition name=\"WindowsAzure1\" xmlns=\"http://schemas.microsoft.com/Serv"
},
{
"path": "samples/WindowsAzure1/WindowsAzure1.ccproj",
"chars": 2751,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
},
{
"path": "samples/WorkerRole1/Properties/AssemblyInfo.cs",
"chars": 1395,
"preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
},
{
"path": "samples/WorkerRole1/WorkerRole.cs",
"chars": 1315,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Net;\nusing Sys"
},
{
"path": "samples/WorkerRole1/WorkerRole1.csproj",
"chars": 4284,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
},
{
"path": "samples/WorkerRole1/XMLFile1.xml",
"chars": 42,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?> \n"
},
{
"path": "samples/WorkerRole1/app.Debug.config",
"chars": 378,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/WorkerRole1/app.Release.config",
"chars": 383,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/WorkerRole1/app.config",
"chars": 580,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n <appSettings>\n <add key=\"one\" value=\"default\"/>\n </appSet"
},
{
"path": "samples/WorkerRole1/contacts.Debug.xml",
"chars": 335,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/WorkerRole1/contacts.Release.xml",
"chars": 337,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/WorkerRole1/contacts.xml",
"chars": 113,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<Contacts>\n <Contact FirstName=\"Sayed\" LastName=\"Hashimi\"/>\n</Contacts>"
},
{
"path": "samples/WorkerRole1/packages.config",
"chars": 249,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n <package id=\"Microsoft.WindowsAzure.ConfigurationManager\" version=\""
},
{
"path": "samples/Wpf.Transform/App.xaml",
"chars": 367,
"preview": "<Application x:Class=\"Wpf.Transform.App\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\""
},
{
"path": "samples/Wpf.Transform/App.xaml.cs",
"chars": 293,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing"
},
{
"path": "samples/Wpf.Transform/Assets/BureauBlue.xaml",
"chars": 279148,
"preview": "<!--\n// (c) Copyright Microsoft Corporation.\n// This source is subject to Microsoft Public License (Ms-PL).\n// Please s"
},
{
"path": "samples/Wpf.Transform/MainWindow.xaml",
"chars": 3311,
"preview": "<Window\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n xmlns:x=\"http://schemas.micro"
},
{
"path": "samples/Wpf.Transform/MainWindow.xaml.cs",
"chars": 1898,
"preview": "namespace Wpf.Transform {\n using System;\n using System.Collections.Generic;\n using System.Linq;\n using Syst"
},
{
"path": "samples/Wpf.Transform/Properties/AssemblyInfo.cs",
"chars": 2241,
"preview": "using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropSer"
},
{
"path": "samples/Wpf.Transform/Properties/Resources.Designer.cs",
"chars": 2701,
"preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n// This code w"
},
{
"path": "samples/Wpf.Transform/Properties/Resources.resx",
"chars": 5494,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "samples/Wpf.Transform/Properties/Settings.Designer.cs",
"chars": 1042,
"preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n// This code w"
},
{
"path": "samples/Wpf.Transform/Properties/Settings.settings",
"chars": 193,
"preview": "<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n <Profiles>\n "
},
{
"path": "samples/Wpf.Transform/TransformModel.cs",
"chars": 1278,
"preview": "namespace Wpf.Transform {\n using System;\n using System.Collections.Generic;\n using System.Linq;\n using Syst"
},
{
"path": "samples/Wpf.Transform/Wpf.Transform.csproj",
"chars": 9071,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
},
{
"path": "samples/Wpf.Transform/app.Debug.config",
"chars": 610,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.comfig exam"
},
{
"path": "samples/Wpf.Transform/app.Release.config",
"chars": 609,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.comfig exam"
},
{
"path": "samples/Wpf.Transform/app.config",
"chars": 348,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n <appSettings>\n <add key=\"appName\" value=\"WPF Demo-Debug-de"
},
{
"path": "samples/Wpf.Transform/connectionStrings.Debug.config",
"chars": 465,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/Wpf.Transform/connectionStrings.Release.config",
"chars": 647,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/Wpf.Transform/connectionStrings.config",
"chars": 209,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<connectionStrings>\n <clear />\n <add name=\"RecordsDb\" connectionString=\".\\SQLE"
},
{
"path": "samples/Wpf.Transform/contacts.Debug.xml",
"chars": 594,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/Wpf.Transform/contacts.Release.xml",
"chars": 600,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "samples/Wpf.Transform/contacts.xml",
"chars": 236,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<contacts>\n <default>\n <add firstName=\"one\" value=\"one-default\" />\n <add"
},
{
"path": "src/.editorconfig",
"chars": 0,
"preview": ""
},
{
"path": "src/AssemblyInfo.cs",
"chars": 280,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the "
},
{
"path": "src/AssemblyInfo.vb",
"chars": 279,
"preview": "' Copyright (c) Microsoft Corporation. All rights reserved.\n' Licensed under the MIT license. See LICENSE file in the pr"
},
{
"path": "src/Directory.Build.props",
"chars": 510,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n <!-- Include and reference README in nuget package, if a README is in"
},
{
"path": "src/Directory.Build.targets",
"chars": 403,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n <ItemGroup>\n <Compile Include=\"$(MSBuildThisFileDirectory)Assembly"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.App.targets",
"chars": 4938,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n**************************************************************************"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.ClickOnce.targets",
"chars": 1374,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n**************************************************************************"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.SetupProject.targets",
"chars": 3497,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n**************************************************************************"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.Web.targets",
"chars": 4680,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n**************************************************************************"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.targets",
"chars": 6941,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n**************************************************************************"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Build/TransformTask.cs",
"chars": 1612,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Build/readme.txt",
"chars": 367,
"preview": "SlowCheetah\n===========\n\nTransformations for XML files (such as app.config) and JSON files.\n\n## Visual Studio Extension\n"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Exceptions/TransformFailedException.cs",
"chars": 2148,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Logging/ITransformationLogger.cs",
"chars": 3598,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Logging/JsonShimLogger.cs",
"chars": 2489,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Logging/TransformationTaskLogger.cs",
"chars": 3185,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Logging/XmlShimLogger.cs",
"chars": 5774,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Microsoft.VisualStudio.SlowCheetah.csproj",
"chars": 2935,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>library</OutputType>\n <TargetFramework>net472</T"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Properties/AssemblyInfo.cs",
"chars": 236,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Resources/Resources.Designer.cs",
"chars": 4986,
"preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n// This code w"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Resources/Resources.resx",
"chars": 6830,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/ITransformer.cs",
"chars": 2018,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/JsonTransformer.cs",
"chars": 5686,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/TransformUtilities.cs",
"chars": 2698,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/TransformerFactory.cs",
"chars": 2101,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/XmlTransformer.cs",
"chars": 5759,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/App.config",
"chars": 156,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n <appSettings>\n <add key=\"xunit.shadowCopy\" value=\"false\" /"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BaseTest.cs",
"chars": 2883,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE fil"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConfigTransformTestsBase.cs",
"chars": 6230,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE fil"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConsoleAppTests.cs",
"chars": 1717,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE fil"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/App.Debug.config",
"chars": 407,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/App.Release.config",
"chars": 409,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/App.config",
"chars": 253,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n <appSettings>\n <add key=\"TestSetting\" value=\"Default\"/>\n "
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/ConsoleApp.csproj",
"chars": 3140,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbui"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Other.Debug.config",
"chars": 319,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Other.Release.config",
"chars": 321,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Other.config",
"chars": 95,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<SomeNode>\n <TestNode>default</TestNode>\n</SomeNode>\n"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Program.cs",
"chars": 233,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Properties/AssemblyInfo.cs",
"chars": 1388,
"preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/Directory.Build.props",
"chars": 11,
"preview": "<Project />"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/Directory.Build.targets",
"chars": 11,
"preview": "<Project />"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Other.Debug.config",
"chars": 319,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Other.Release.config",
"chars": 321,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n see the web.config exam"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Other.config",
"chars": 95,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<SomeNode>\n <TestNode>default</TestNode>\n</SomeNode>\n"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Properties/AssemblyInfo.cs",
"chars": 1361,
"preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Web.Debug.config",
"chars": 1272,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit https://go.mi"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Web.Release.config",
"chars": 1332,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit https://go.mi"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Web.config",
"chars": 1366,
"preview": "<?xml version=\"1.0\"?>\n<!--\n For more information on how to configure your ASP.NET application, please visit\n https://"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/WebApplication.csproj",
"chars": 5981,
"preview": "<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n <Imp"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/WebAppTests.cs",
"chars": 1200,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE fil"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/Microsoft.VisualStudio.SlowCheetah.Tests.csproj",
"chars": 2739,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>net472</TargetFramework>\n <IsPackable>fals"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/TestUtilities.cs",
"chars": 2090,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE fil"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/TransformTest.cs",
"chars": 1607,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE fil"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/example.txt",
"chars": 479,
"preview": "Running msbuild.exe C:\\src\\libtempslowcheetah\\bin\\Microsoft.VisualStudio.SlowCheetah.Tests\\Debug\\net472\\..\\..\\..\\..\\test"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Directory.Build.targets",
"chars": 812,
"preview": "<Project>\n <Import Project=\"$(VSToolsPath)\\VSSDK\\Microsoft.VsSDK.targets\" Condition=\"Exists('$(VSToolsPath)\\VSSDK\\Micro"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Microsoft.VisualStudio.SlowCheetah.VS.csproj",
"chars": 4356,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <OutputType>Library</OutputType>\n <TargetFramework>net472</"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/BackgroundInstallationHandler.cs",
"chars": 4103,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
},
{
"path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/BasePackageHandler.cs",
"chars": 1434,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
}
]
// ... and 128 more files (download for full content)
About this extraction
This page contains the full source code of the Microsoft/slow-cheetah GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 328 files (999.6 KB), approximately 243.6k tokens, and a symbol index with 297 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.