diff --git a/eng/Versions.props b/eng/Versions.props index 3f1c9d0102f..a9a08670fa3 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -3,7 +3,7 @@ 13 3 - 4 + 5 $(MajorVersion).$(MinorVersion).$(PatchVersion) preview.1 net8.0 diff --git a/eng/pipelines/azure-pipelines-unofficial.yml b/eng/pipelines/azure-pipelines-unofficial.yml index 910bd23d3bf..890115d9db4 100644 --- a/eng/pipelines/azure-pipelines-unofficial.yml +++ b/eng/pipelines/azure-pipelines-unofficial.yml @@ -334,7 +334,11 @@ extends: enableMicrobuild: false enablePublishUsingPipelines: false enablePublishBuildAssets: false - enablePublishBuildArtifacts: true + # WinGet and Homebrew jobs only consume previously-built CLI archives; + # they don't run the repo build, so artifacts/log/$(_BuildConfig) is + # never created. Leaving this 'true' makes the 1ES Publish Logs output + # fail because its targetPath doesn't exist. + enablePublishBuildArtifacts: false enableTelemetry: true workspace: clean: all diff --git a/eng/pipelines/azure-pipelines.yml b/eng/pipelines/azure-pipelines.yml index ad0824a1d13..9657ce37517 100644 --- a/eng/pipelines/azure-pipelines.yml +++ b/eng/pipelines/azure-pipelines.yml @@ -449,7 +449,11 @@ extends: enableMicrobuild: false enablePublishUsingPipelines: false enablePublishBuildAssets: false - enablePublishBuildArtifacts: true + # WinGet and Homebrew jobs only consume previously-built CLI archives; + # they don't run the repo build, so artifacts/log/$(_BuildConfig) is + # never created. Leaving this 'true' makes the 1ES Publish Logs output + # fail because its targetPath doesn't exist. + enablePublishBuildArtifacts: false enableTelemetry: true workspace: clean: all diff --git a/src/Aspire.Cli/DotNet/DotNetCliRunner.cs b/src/Aspire.Cli/DotNet/DotNetCliRunner.cs index 50520d8b070..608ae882950 100644 --- a/src/Aspire.Cli/DotNet/DotNetCliRunner.cs +++ b/src/Aspire.Cli/DotNet/DotNetCliRunner.cs @@ -77,11 +77,6 @@ internal sealed class DotNetCliRunner( private const int MaxSearchRetries = 3; private static readonly TimeSpan[] s_searchRetryDelays = [TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2)]; - private string GetMsBuildServerValue() - { - return configuration["DOTNET_CLI_USE_MSBUILD_SERVER"] ?? "true"; - } - internal static string GetBackchannelSocketPath() { return CliPathHelper.CreateUnixDomainSocketPath("cli.sock"); @@ -520,12 +515,6 @@ public async Task RunAsync(FileInfo projectFile, bool watch, bool noBuild, // We copy the dictionary here because we don't want to mutate the input. var finalEnv = env?.ToDictionary() ?? new Dictionary(); - // Inject DOTNET_CLI_USE_MSBUILD_SERVER when noBuild == false - if (!noBuild) - { - finalEnv["DOTNET_CLI_USE_MSBUILD_SERVER"] = GetMsBuildServerValue(); - } - // Check if update notifications are disabled and set version check environment variable if (!features.IsFeatureEnabled(KnownFeatures.UpdateNotificationsEnabled, defaultValue: true)) { @@ -808,15 +797,9 @@ public async Task BuildAsync(FileInfo projectFilePath, bool noRestore, Proc string[] cliArgs = ["build", noRestoreSwitch, projectFilePath.FullName]; cliArgs = [.. cliArgs.Where(arg => !string.IsNullOrWhiteSpace(arg))]; - // Always inject DOTNET_CLI_USE_MSBUILD_SERVER for apphost builds - var env = new Dictionary - { - ["DOTNET_CLI_USE_MSBUILD_SERVER"] = GetMsBuildServerValue() - }; - return await ExecuteAsync( args: cliArgs, - env: env, + env: null, projectFile: projectFilePath, workingDirectory: projectFilePath.Directory!, backchannelCompletionSource: null, diff --git a/src/Aspire.Dashboard/Model/Interaction/InputViewModel.cs b/src/Aspire.Dashboard/Model/Interaction/InputViewModel.cs index 0dda8bfd8e9..acb7a2b9d81 100644 --- a/src/Aspire.Dashboard/Model/Interaction/InputViewModel.cs +++ b/src/Aspire.Dashboard/Model/Interaction/InputViewModel.cs @@ -17,24 +17,9 @@ public InputViewModel(InteractionInput input) public void SetInput(InteractionInput input) { - string value; - if (Input == null) - { - value = input.Value; - } - else - { - // Only overwrite the local value if the input was loading and is no longer loading (update could have come from server) - // This avoids changes in local values being overwritten by a dynamic server update. - if (Input.Loading && !input.Loading) - { - value = input.Value; - } - else - { - value = Input.Value; - } - } + var value = Input is null || ShouldUseIncomingValue(Input, input) + ? input.Value + : Input.Value; input.Value = value; Input = input; @@ -137,4 +122,11 @@ private static bool OptionsEqual(List> existing, List { Assert.NotNull(env); - Assert.True(env.ContainsKey("DOTNET_CLI_USE_MSBUILD_SERVER")); - Assert.Equal("true", env["DOTNET_CLI_USE_MSBUILD_SERVER"]); + Assert.False(env.ContainsKey("DOTNET_CLI_USE_MSBUILD_SERVER")); }, 0); @@ -123,14 +122,13 @@ public async Task RestoreAsyncRunsDotnetRestoreCommand() } [Fact] - public async Task BuildAsyncUsesConfigurationValueForDotnetCliUseMsBuildServer() + public async Task BuildAsyncDoesNotInjectConfiguredDotnetCliUseMsBuildServer() { using var workspace = TemporaryWorkspace.Create(outputHelper); var projectFile = new FileInfo(Path.Combine(workspace.WorkspaceRoot.FullName, "AppHost.csproj")); await File.WriteAllTextAsync(projectFile.FullName, "Not a real project file."); var services = CliTestHelper.CreateServiceCollection(workspace, outputHelper); - // Add a configuration value that overrides the default services.AddSingleton(sp => { var configBuilder = new ConfigurationBuilder(); @@ -151,8 +149,7 @@ public async Task BuildAsyncUsesConfigurationValueForDotnetCliUseMsBuildServer() (args, env, _, _) => { Assert.NotNull(env); - Assert.True(env.ContainsKey("DOTNET_CLI_USE_MSBUILD_SERVER")); - Assert.Equal("false", env["DOTNET_CLI_USE_MSBUILD_SERVER"]); + Assert.False(env.ContainsKey("DOTNET_CLI_USE_MSBUILD_SERVER")); }, 0); @@ -220,7 +217,7 @@ public async Task BuildAsyncDoesNotIncludeNoRestoreFlagWhenNoRestoreIsFalse() } [Fact] - public async Task RunAsyncInjectsDotnetCliUseMsBuildServerWhenNoBuildIsFalse() + public async Task RunAsyncDoesNotInjectDotnetCliUseMsBuildServerWhenNoBuildIsFalse() { using var workspace = TemporaryWorkspace.Create(outputHelper); var projectFile = new FileInfo(Path.Combine(workspace.WorkspaceRoot.FullName, "AppHost.csproj")); @@ -238,15 +235,14 @@ public async Task RunAsyncInjectsDotnetCliUseMsBuildServerWhenNoBuildIsFalse() (args, env, _, _) => { Assert.NotNull(env); - Assert.True(env.ContainsKey("DOTNET_CLI_USE_MSBUILD_SERVER")); - Assert.Equal("true", env["DOTNET_CLI_USE_MSBUILD_SERVER"]); + Assert.False(env.ContainsKey("DOTNET_CLI_USE_MSBUILD_SERVER")); }, 0); var exitCode = await runner.RunAsync( projectFile: projectFile, watch: false, - noBuild: false, // This should inject the environment variable + noBuild: false, noRestore: false, args: ["--operation", "inspect"], env: new Dictionary(), @@ -317,8 +313,7 @@ public async Task RunAsyncPreservesExistingEnvironmentVariables() (args, env, _, _) => { Assert.NotNull(env); - Assert.True(env.ContainsKey("DOTNET_CLI_USE_MSBUILD_SERVER")); - Assert.Equal("true", env["DOTNET_CLI_USE_MSBUILD_SERVER"]); + Assert.False(env.ContainsKey("DOTNET_CLI_USE_MSBUILD_SERVER")); // Verify existing environment variable is preserved Assert.True(env.ContainsKey("EXISTING_VAR")); Assert.Equal("existing_value", env["EXISTING_VAR"]); diff --git a/tests/Aspire.Dashboard.Tests/Model/InputViewModelTests.cs b/tests/Aspire.Dashboard.Tests/Model/InputViewModelTests.cs index d001afa8dd0..54022be2e1a 100644 --- a/tests/Aspire.Dashboard.Tests/Model/InputViewModelTests.cs +++ b/tests/Aspire.Dashboard.Tests/Model/InputViewModelTests.cs @@ -259,4 +259,54 @@ public void ChoiceVersion_NotIncrementedWhenOptionsUnchanged() Assert.Equal(initialVersion, viewModel.ChoiceVersion); } + + [Fact] + public void SetInput_DisabledInputUsesIncomingValue() + { + var input = new InteractionInput + { + Label = "Location", + InputType = InputType.Choice, + Placeholder = "Select a location", + Disabled = true + }; + var viewModel = new InputViewModel(input); + + var updatedInput = new InteractionInput + { + Label = "Location", + InputType = InputType.Choice, + Placeholder = "Select a location", + Disabled = true, + Value = "westus" + }; + updatedInput.Options.Add("westus", "West US"); + + viewModel.SetInput(updatedInput); + + Assert.Equal("westus", viewModel.Value); + } + + [Fact] + public void SetInput_EnabledInputPreservesLocalValue() + { + var input = new InteractionInput + { + Label = "Name", + InputType = InputType.Text, + Value = "local" + }; + var viewModel = new InputViewModel(input); + + var updatedInput = new InteractionInput + { + Label = "Name", + InputType = InputType.Text, + Value = "server" + }; + + viewModel.SetInput(updatedInput); + + Assert.Equal("local", viewModel.Value); + } } diff --git a/tests/Shared/RepoTesting/Aspire.RepoTesting.targets b/tests/Shared/RepoTesting/Aspire.RepoTesting.targets index f6f470526c6..678b1c058f6 100644 --- a/tests/Shared/RepoTesting/Aspire.RepoTesting.targets +++ b/tests/Shared/RepoTesting/Aspire.RepoTesting.targets @@ -33,7 +33,7 @@ `AspireProjectOrPackageReference` - maps to projects in `src/` or `src/Components/` --> - + @@ -165,6 +165,6 @@ $(MajorVersion).$(MinorVersion).$(PatchVersion) - + diff --git a/tests/Shared/RepoTesting/Directory.Packages.Helix.props b/tests/Shared/RepoTesting/Directory.Packages.Helix.props index 792db8dcdcd..b10dcf7cd59 100644 --- a/tests/Shared/RepoTesting/Directory.Packages.Helix.props +++ b/tests/Shared/RepoTesting/Directory.Packages.Helix.props @@ -3,81 +3,81 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + +