Skip to content

Commit 19c25fd

Browse files
authored
Use -pack switch instead of -allconfigurations to create packages (#110778)
1 parent 27fd292 commit 19c25fd

19 files changed

+223
-218
lines changed

docs/project/library-servicing.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Keep in mind that we still need package authoring in .NET 8 and older versions.
1414

1515
Develop and test your change as normal. For packages, you may want to test them outside the repo infrastructure. To do so, execute the following steps:
1616

17-
1. From a clean copy of your branch, run `build.cmd/sh libs -allconfigurations`
17+
1. From a clean copy of your branch, run `build.cmd/sh libs -pack`
1818

1919
2. Check in `artifacts\bin\packages\Debug` for the existence of your package, with the appropriate package version.
2020

eng/DotNetBuild.props

+1-2
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,13 @@
5050
Properties that control flags from the VMR build, and the expected output for the VMR build should be added to this file. -->
5151

5252
<!-- Enable regular Arcade signing and publishing in VMR build -->
53-
<InnerBuildArgs Condition="'$(DotNetBuildOrchestrator)' == 'true'">$(InnerBuildArgs) $(FlagParameterPrefix)restore $(FlagParameterPrefix)build $(FlagParameterPrefix)publish</InnerBuildArgs>
53+
<InnerBuildArgs Condition="'$(DotNetBuildOrchestrator)' == 'true'">$(InnerBuildArgs) $(FlagParameterPrefix)restore $(FlagParameterPrefix)build $(FlagParameterPrefix)pack $(FlagParameterPrefix)publish</InnerBuildArgs>
5454
<InnerBuildArgs Condition="'$(DotNetBuildOrchestrator)' == 'true' and '$(Sign)' == 'true'">$(InnerBuildArgs) $(FlagParameterPrefix)sign</InnerBuildArgs>
5555

5656
<InnerBuildArgs>$(InnerBuildArgs) $(FlagParameterPrefix)arch $(TargetArch)</InnerBuildArgs>
5757
<InnerBuildArgs Condition="'$(DotNetBuildSourceOnly)' != 'true'">$(InnerBuildArgs) $(FlagParameterPrefix)os $(TargetOS)</InnerBuildArgs>
5858
<InnerBuildArgs Condition="'$(CrossBuild)' == 'true' or ('$(TargetArch)' != '$(_hostArch)' and '$(ShortStack)' != 'true')">$(InnerBuildArgs) $(FlagParameterPrefix)cross</InnerBuildArgs>
5959
<InnerBuildArgs>$(InnerBuildArgs) $(FlagParameterPrefix)configuration $(Configuration)</InnerBuildArgs>
60-
<InnerBuildArgs Condition="'$(ShortStack)' != 'true'">$(InnerBuildArgs) $(FlagParameterPrefix)allconfigurations</InnerBuildArgs>
6160
<InnerBuildArgs>$(InnerBuildArgs) $(FlagParameterPrefix)verbosity $(LogVerbosity)</InnerBuildArgs>
6261
<InnerBuildArgs>$(InnerBuildArgs) $(FlagParameterPrefix)nodereuse $(ArcadeFalseBoolBuildArg)</InnerBuildArgs>
6362
<InnerBuildArgs>$(InnerBuildArgs) $(FlagParameterPrefix)warnAsError $(ArcadeFalseBoolBuildArg)</InnerBuildArgs>

eng/Publishing.props

+2-2
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,14 @@
7777

7878
<!--
7979
Packages that aren't matched above as RID-specific are considered RID-agnostic. Also include
80-
the AllConfigurations packages from the Libraries build.
80+
the packages from the Libraries build.
8181
-->
8282
<RidAgnosticNupkgToPublishFile
8383
Include="
8484
$(DownloadDirectory)**\Microsoft.NET.Workload.Mono.Toolchain.*Manifest-*.nupkg;
8585
$(DownloadDirectory)**\Microsoft.NET.Sdk.WebAssembly.Pack.*.nupkg;
8686
$(DownloadDirectory)*\$(PublishRidAgnosticPackagesFromPlatform)\**\*.nupkg;
87-
$(DownloadDirectory)*\*AllConfigurations\**\*.nupkg"
87+
$(DownloadDirectory)*\Libraries_WithPackages\**\*.nupkg"
8888
Exclude="@(RuntimeNupkgFile);@(DownloadedSymbolNupkgFile)" />
8989

9090
<TransportPackagesToPublishFile

eng/Subsets.props

-1
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@
219219
<ItemDefinitionGroup>
220220
<ProjectToBuild>
221221
<Test>false</Test>
222-
<Pack>false</Pack>
223222
<Publish>false</Publish>
224223
<BuildInParallel>false</BuildInParallel>
225224
</ProjectToBuild>

eng/build.ps1

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
[CmdletBinding(PositionalBinding=$false)]
22
Param(
33
[switch][Alias('h')]$help,
4+
[switch]$pack,
45
[switch][Alias('t')]$test,
56
[ValidateSet("Debug","Release","Checked")][string[]][Alias('c')]$configuration = @("Debug"),
67
[string][Alias('f')]$framework,
78
[string]$vs,
89
[string][Alias('v')]$verbosity = "minimal",
910
[ValidateSet("windows","linux","osx","android","browser","wasi")][string]$os,
10-
[switch]$allconfigurations,
1111
[switch]$coverage,
1212
[string]$testscope,
1313
[switch]$testnobuild,
@@ -77,7 +77,6 @@ function Get-Help() {
7777
Write-Host ""
7878

7979
Write-Host "Libraries settings:"
80-
Write-Host " -allconfigurations Build packages for all build configurations."
8180
Write-Host " -coverage Collect code coverage when testing."
8281
Write-Host " -framework (-f) Build framework: net10.0 or net48."
8382
Write-Host " [Default: net10.0]"
@@ -312,7 +311,7 @@ foreach ($argument in $PSBoundParameters.Keys)
312311
"hostConfiguration" { $arguments += " /p:HostConfiguration=$((Get-Culture).TextInfo.ToTitleCase($($PSBoundParameters[$argument])))" }
313312
"framework" { $arguments += " /p:BuildTargetFramework=$($PSBoundParameters[$argument].ToLowerInvariant())" }
314313
"os" { $arguments += " /p:TargetOS=$($PSBoundParameters[$argument])" }
315-
"allconfigurations" { $arguments += " /p:BuildAllConfigurations=true" }
314+
"pack" { $arguments += " -pack /p:BuildAllConfigurations=true" }
316315
"properties" { $arguments += " " + $properties }
317316
"verbosity" { $arguments += " -$argument " + $($PSBoundParameters[$argument]) }
318317
"cmakeargs" { $arguments += " /p:CMakeArgs=`"$($PSBoundParameters[$argument])`"" }

eng/build.sh

+2-3
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ usage()
6565
echo ""
6666

6767
echo "Libraries settings:"
68-
echo " --allconfigurations Build packages for all build configurations."
6968
echo " --coverage Collect code coverage when testing."
7069
echo " --framework (-f) Build framework: net10.0 or net48."
7170
echo " [Default: net10.0]"
@@ -308,8 +307,8 @@ while [[ $# > 0 ]]; do
308307
shift 2
309308
;;
310309

311-
-allconfigurations)
312-
arguments="$arguments /p:BuildAllConfigurations=true"
310+
-pack)
311+
arguments="$arguments --pack /p:BuildAllConfigurations=true"
313312
shift 1
314313
;;
315314

eng/packaging.targets

+2-7
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,10 @@
2727
<PackageReadmeFilePath Condition="'$(PackageReadmeFilePath)' == '' and '$(EnableDefaultPackageReadmeFile)' == 'true'">PACKAGE.md</PackageReadmeFilePath>
2828
<BeforePack>$(BeforePack);ValidatePackageReadmeExists</BeforePack>
2929

30-
<!-- Generate packages for rid specific projects or for allconfigurations during build. -->
31-
<!-- A package isn't generated if in servicing or in runtimelab. Intended to be overridden at project level. -->
30+
<!-- Generate packages for rid specific projects when not in runtimelab (to avoid binclashes when using the same feed). -->
3231
<IsRIDSpecificProject Condition="$(MSBuildProjectName.StartsWith('runtime.')) and
3332
!$(MSBuildProjectName.StartsWith('runtime.native'))">true</IsRIDSpecificProject>
34-
<GeneratePackageOnBuild Condition="(
35-
'$(BuildAllConfigurations)' == 'true' or
36-
'$(IsRIDSpecificProject)' == 'true'
37-
) and
38-
'$(GitHubRepositoryName)' != 'runtimelab'">true</GeneratePackageOnBuild>
33+
<GeneratePackageOnBuild Condition="'$(IsRIDSpecificProject)' == 'true' and '$(GitHubRepositoryName)' != 'runtimelab'">true</GeneratePackageOnBuild>
3934

4035
<!-- During NoBuild pack invocations, skip project reference build. Necessary for the IncludeProjectReferencesWithPackAttributeInPackage target. -->
4136
<BuildProjectReferences Condition="'$(NoBuild)' == 'true'">false</BuildProjectReferences>

eng/pipelines/global-build.yml

+3-4
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,7 @@ extends:
8282
eq(variables['isRollingBuild'], true))
8383

8484
#
85-
# Build Libraries AllConfigurations. This exercises the code path where we build libraries for all
86-
# configurations on a non Windows operating system.
85+
# Build Libraries (all TFMs) and create packages on a non Windows operating system.
8786
#
8887
- template: /eng/pipelines/common/platform-matrix.yml
8988
parameters:
@@ -92,8 +91,8 @@ extends:
9291
platforms:
9392
- linux_x64_dev_innerloop
9493
jobParameters:
95-
nameSuffix: Libraries_AllConfigurations
96-
buildArgs: -subset libs -allconfigurations
94+
nameSuffix: Libraries_WithPackages
95+
buildArgs: -subset libs -pack
9796
timeoutInMinutes: 120
9897
condition:
9998
or(

eng/pipelines/official/stages/publish.yml

-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
parameters:
22
PublishRidAgnosticPackagesFromPlatform: windows_x64
3-
publishingInfraVersion: 3
43

54
stages:
65

@@ -28,7 +27,6 @@ stages:
2827
# Stages-based publishing entry point
2928
- template: /eng/common/templates-official/post-build/post-build.yml
3029
parameters:
31-
publishingInfraVersion: ${{ parameters.publishingInfraVersion }}
3230
validateDependsOn:
3331
- PrepareForPublish
3432
# The following checks are run after the build in the validation and release pipelines

eng/pipelines/runtime-official.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ extends:
454454
name: MonoRuntimePacks
455455

456456
#
457-
# Build libraries AllConfigurations for packages
457+
# Build libraries (all TFMs) and packages
458458
#
459459
- template: /eng/pipelines/common/platform-matrix.yml
460460
parameters:
@@ -464,13 +464,13 @@ extends:
464464
- windows_x64
465465
jobParameters:
466466
templatePath: 'templates-official'
467-
buildArgs: -s tools+libs -allConfigurations -c $(_BuildConfig) /p:TestAssemblies=false /p:TestPackages=true
468-
nameSuffix: Libraries_AllConfigurations
467+
buildArgs: -s tools+libs -pack -c $(_BuildConfig) /p:TestAssemblies=false /p:TestPackages=true
468+
nameSuffix: Libraries_WithPackages
469469
isOfficialBuild: ${{ variables.isOfficialBuild }}
470470
postBuildSteps:
471471
- template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
472472
parameters:
473-
name: Libraries_AllConfigurations
473+
name: Libraries_WithPackages
474474
timeoutInMinutes: 95
475475
#
476476
# Build SourceBuild packages

eng/pipelines/runtime-richnav.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ extends:
3939
richCodeNavigationLanguage: "csharp"
4040
nameSuffix: Libs
4141
timeoutInMinutes: 240
42-
buildArgs: -s libs.sfx+libs.oob -allConfigurations
42+
buildArgs: -s libs.sfx+libs.oob -pack
4343
preBuildSteps:
4444
- script: dotnet.cmd nuget add source -n richnav "https://pkgs.dev.azure.com/azure-public/vside/_packaging/vs-buildservices/nuget/v3/index.json"
4545
displayName: Add richnav NuGet feed

eng/pipelines/runtime.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -1225,7 +1225,7 @@ extends:
12251225
eq(variables['isRollingBuild'], true))
12261226
12271227
#
1228-
# Build and test libraries AllConfigurations
1228+
# Build and test libraries for all TFMs and create packages
12291229
#
12301230
- template: /eng/pipelines/common/platform-matrix.yml
12311231
parameters:
@@ -1234,8 +1234,8 @@ extends:
12341234
platforms:
12351235
- windows_x64
12361236
jobParameters:
1237-
buildArgs: -test -s tools+libs+libs.tests -allConfigurations -c $(_BuildConfig) /p:TestAssemblies=false /p:TestPackages=true
1238-
nameSuffix: Libraries_AllConfigurations
1237+
buildArgs: -test -s tools+libs+libs.tests -pack -c $(_BuildConfig) /p:TestAssemblies=false /p:TestPackages=true
1238+
nameSuffix: Libraries_WithPackages
12391239
timeoutInMinutes: 150
12401240
condition: >-
12411241
or(

eng/pipelines/runtimelab-official.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ extends:
6464
- windows_x64
6565
jobParameters:
6666
templatePath: 'templates-official'
67-
buildArgs: -s tools+libs -allConfigurations -c $(_BuildConfig) /p:TestAssemblies=false /p:TestPackages=true
67+
buildArgs: -s tools+libs -allConfigurations -c $(_BuildConfig) /p:BuildAllConfigurations=true /p:TestAssemblies=false /p:TestPackages=true
6868
nameSuffix: Libraries_AllConfigurations
6969
isOfficialBuild: true
7070
postBuildSteps:

eng/pipelines/runtimelab.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ extends:
103103
platforms:
104104
- windows_x64
105105
jobParameters:
106-
buildArgs: -test -s tools+libs+libs.tests -allConfigurations -c $(_BuildConfig) /p:TestAssemblies=false /p:TestPackages=true
106+
buildArgs: -test -s tools+libs+libs.tests -c $(_BuildConfig) /p:BuildAllConfigurations=true /p:TestAssemblies=false /p:TestPackages=true
107107
nameSuffix: Libraries_AllConfigurations
108108
timeoutInMinutes: 150
109109
extraVariablesTemplates:

src/libraries/oob-trim.proj

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<Project Sdk="Microsoft.Build.NoTargets">
2+
3+
<PropertyGroup>
4+
<TargetFramework>$(NetCoreAppCurrent)-$(TargetOS)</TargetFramework>
5+
<!-- Import the illink file which contains some of the logic required to illink the out-of-band assemblies. -->
6+
<ExplicitlyImportCustomILLinkTargets>true</ExplicitlyImportCustomILLinkTargets>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<ProjectReference Include="sfx-src.proj" OutputItemType="SharedFrameworkAssembly" />
11+
<ProjectReference Include="oob-src.proj" OutputItemType="OOBAssembly" />
12+
</ItemGroup>
13+
14+
<Target Name="GetTrimOOBAssembliesInputs"
15+
DependsOnTargets="ResolveProjectReferences">
16+
<PropertyGroup>
17+
<OOBAssembliesTrimDir>$([MSBuild]::NormalizeDirectory('$(IntermediateOutputPath)', 'illink-$(TargetArchitecture)'))</OOBAssembliesTrimDir>
18+
<OOBAssembliesTrimMarkerFile>$(OOBAssembliesTrimDir)marker.txt</OOBAssembliesTrimMarkerFile>
19+
</PropertyGroup>
20+
21+
<ItemGroup>
22+
<OOBLibrarySuppressionsXml Include="@(OOBAssembly->Metadata('ILLinkSuppressionsXmls'))" />
23+
24+
<OOBAssemblyToTrim Include="@(OOBAssembly->WithMetadataValue('IsTrimmable', 'true'))" />
25+
<OOBAssemblyReference Include="@(OOBAssembly->WithMetadataValue('IsTrimmable', 'false'));
26+
@(SharedFrameworkAssembly)" />
27+
</ItemGroup>
28+
</Target>
29+
30+
<Target Name="TrimOOBAssemblies"
31+
AfterTargets="Build"
32+
DependsOnTargets="GetTrimOOBAssembliesInputs;PrepareForAssembliesTrim"
33+
Inputs="$(ILLinkTasksAssembly);@(OOBAssemblyToTrim);@(OOBAssemblyReference);@(OOBLibrarySuppressionsXml)"
34+
Outputs="$(OOBAssembliesTrimMarkerFile)">
35+
<Message Text="$(MSBuildProjectName) -> Trimming $(OutputRID) out-of-band assemblies with ILLinker..." Importance="high" />
36+
37+
<PropertyGroup>
38+
<OOBILLinkArgs>$(ILLinkArgs)</OOBILLinkArgs>
39+
<!-- Unnecessary suppressions - disable for now since we didn't clean the runtime yet -->
40+
<OOBILLinkArgs>$(ILLinkArgs) --nowarn IL2121</OOBILLinkArgs>
41+
<OOBILLinkArgs Condition="'@(OOBLibrarySuppressionsXml)' != ''" >$(OOBILLinkArgs) --link-attributes "@(OOBLibrarySuppressionsXml->'%(FullPath)', '" --link-attributes "')"</OOBILLinkArgs>
42+
</PropertyGroup>
43+
44+
<MakeDir Directories="$(OOBAssembliesTrimDir)" />
45+
<ILLink AssemblyPaths=""
46+
RootAssemblyNames="@(OOBAssemblyToTrim)"
47+
ReferenceAssemblyPaths="@(OOBAssemblyReference)"
48+
OutputDirectory="$(OOBAssembliesTrimDir)"
49+
ExtraArgs="$(OOBILLinkArgs)"
50+
ToolExe="$(_DotNetHostFileName)"
51+
ToolPath="$(_DotNetHostDirectory)" />
52+
53+
<!-- Create a marker file which serves as the target's output to enable incremental builds. -->
54+
<Touch Files="$(OOBAssembliesTrimMarkerFile)"
55+
AlwaysCreate="true" />
56+
</Target>
57+
58+
</Project>

src/libraries/oob.proj

+5-50
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
<Project Sdk="Microsoft.Build.NoTargets">
1+
<Project Sdk="Microsoft.Build.Traversal">
22

33
<PropertyGroup>
44
<TargetFramework>$(NetCoreAppCurrent)-$(TargetOS)</TargetFramework>
55
<!-- By default, build the NetCoreAppCurrent vertical only. -->
66
<BuildTargetFramework Condition="'$(BuildAllConfigurations)' != 'true'">$(NetCoreAppCurrent)</BuildTargetFramework>
7-
<!-- Import the illink file which contains some of the logic required to illink the out-of-band assemblies. -->
8-
<ExplicitlyImportCustomILLinkTargets Condition="'$(BuildTargetFramework)' == '$(NetCoreAppCurrent)' or '$(BuildTargetFramework)' == ''">true</ExplicitlyImportCustomILLinkTargets>
97
</PropertyGroup>
108

119
<ItemGroup Condition="'$(BuildTargetFramework)' == '$(NetCoreAppCurrent)' or '$(BuildTargetFramework)' == ''">
12-
<ProjectReference Include="sfx-src.proj" OutputItemType="SharedFrameworkAssembly" />
13-
<ProjectReference Include="oob-src.proj" OutputItemType="OOBAssembly" />
10+
<ProjectReference Include="sfx-src.proj" />
11+
<ProjectReference Include="oob-src.proj" />
1412

1513
<ProjectReference Include="apicompat\ApiCompat.proj"
1614
Condition="'$(DotNetBuildSourceOnly)' != 'true' and '$(ApiCompatValidateAssemblies)' != 'false'" />
15+
16+
<ProjectReference Include="oob-trim.proj" />
1717
</ItemGroup>
1818

1919
<ItemGroup Condition="'$(BuildTargetFramework)' != '$(NetCoreAppCurrent)' or '$(BuildTargetFramework)' == ''">
@@ -22,51 +22,6 @@
2222
<ProjectReference Include="oob-gen.proj" Condition="'$(DotNetBuildSourceOnly)' != 'true'" />
2323
</ItemGroup>
2424

25-
<Target Name="GetTrimOOBAssembliesInputs"
26-
DependsOnTargets="ResolveProjectReferences">
27-
<PropertyGroup>
28-
<OOBAssembliesTrimDir>$([MSBuild]::NormalizeDirectory('$(IntermediateOutputPath)', 'illink-$(TargetArchitecture)'))</OOBAssembliesTrimDir>
29-
<OOBAssembliesTrimMarkerFile>$(OOBAssembliesTrimDir)marker.txt</OOBAssembliesTrimMarkerFile>
30-
</PropertyGroup>
31-
32-
<ItemGroup>
33-
<OOBLibrarySuppressionsXml Include="@(OOBAssembly->Metadata('ILLinkSuppressionsXmls'))" />
34-
35-
<OOBAssemblyToTrim Include="@(OOBAssembly->WithMetadataValue('IsTrimmable', 'true'))" />
36-
<OOBAssemblyReference Include="@(OOBAssembly->WithMetadataValue('IsTrimmable', 'false'));
37-
@(SharedFrameworkAssembly)" />
38-
</ItemGroup>
39-
</Target>
40-
41-
<Target Name="TrimOOBAssemblies"
42-
AfterTargets="Build"
43-
Condition="'@(OOBAssembly)' != ''"
44-
DependsOnTargets="GetTrimOOBAssembliesInputs;PrepareForAssembliesTrim"
45-
Inputs="$(ILLinkTasksAssembly);@(OOBAssemblyToTrim);@(OOBAssemblyReference);@(OOBLibrarySuppressionsXml)"
46-
Outputs="$(OOBAssembliesTrimMarkerFile)">
47-
<Message Text="$(MSBuildProjectName) -> Trimming $(OutputRID) out-of-band assemblies with ILLinker..." Importance="high" />
48-
49-
<PropertyGroup>
50-
<OOBILLinkArgs>$(ILLinkArgs)</OOBILLinkArgs>
51-
<!-- Unnecessary suppressions - disable for now since we didn't clean the runtime yet -->
52-
<OOBILLinkArgs>$(ILLinkArgs) --nowarn IL2121</OOBILLinkArgs>
53-
<OOBILLinkArgs Condition="'@(OOBLibrarySuppressionsXml)' != ''" >$(OOBILLinkArgs) --link-attributes "@(OOBLibrarySuppressionsXml->'%(FullPath)', '" --link-attributes "')"</OOBILLinkArgs>
54-
</PropertyGroup>
55-
56-
<MakeDir Directories="$(OOBAssembliesTrimDir)" />
57-
<ILLink AssemblyPaths=""
58-
RootAssemblyNames="@(OOBAssemblyToTrim)"
59-
ReferenceAssemblyPaths="@(OOBAssemblyReference)"
60-
OutputDirectory="$(OOBAssembliesTrimDir)"
61-
ExtraArgs="$(OOBILLinkArgs)"
62-
ToolExe="$(_DotNetHostFileName)"
63-
ToolPath="$(_DotNetHostDirectory)" />
64-
65-
<!-- Create a marker file which serves as the target's output to enable incremental builds. -->
66-
<Touch Files="$(OOBAssembliesTrimMarkerFile)"
67-
AlwaysCreate="true" />
68-
</Target>
69-
7025
<Target Name="SetAzureDevOpsVariableForBuiltPackages"
7126
Condition="'$(ContinuousIntegrationBuild)' == 'true'"
7227
AfterTargets="Build;Pack">

0 commit comments

Comments
 (0)