Copy `--experimental_override_name_platform_in_output_dir` to exec config

PiperOrigin-RevId: 623570382
Change-Id: Ia0892125e1312ffe29f60f51a69d281636ccbbd3
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactory.java
index 51f93be..0c44911 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactory.java
@@ -242,6 +242,8 @@
           options.underlying().get(CoreOptions.class).affectedByStarlarkTransition;
       coreOptions.executionInfoModifier =
           options.underlying().get(CoreOptions.class).executionInfoModifier;
+      coreOptions.overrideNamePlatformInOutputDirEntries =
+          options.underlying().get(CoreOptions.class).overrideNamePlatformInOutputDirEntries;
       return result;
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationFunctionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationFunctionTest.java
index c8be510..a078f10 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationFunctionTest.java
@@ -534,4 +534,63 @@
         .isEqualTo(CppConfiguration.DynamicMode.OFF);
     assertThat(getConfiguration(dep).getFragment(JavaConfiguration.class).getUseIjars()).isTrue();
   }
+
+  @Test
+  public void testPlatformExplicitInOutputDirAndDynamicBaseline_withExecConfigDep()
+      throws Exception {
+    writeAllowlistFile();
+    scratch.file(
+        "test/rules.bzl",
+        """
+        load("//myinfo:myinfo.bzl", "MyInfo")
+
+        def _impl(ctx):
+            return MyInfo(dep = ctx.attr.dep)
+
+        my_rule = rule(
+            implementation = _impl,
+            attrs = {
+                "dep": attr.label(cfg = 'exec'),
+            },
+        )
+        """);
+    scratch.file(
+        "test/BUILD",
+        """
+        load("//test:rules.bzl", "my_rule")
+
+        my_rule(
+            name = "test",
+            dep = ":dep",
+        )
+
+        my_rule(
+            name = "dep",
+        )
+        """);
+    scratch.file(
+        "platforms/BUILD",
+        """
+        platform(name = "alpha")
+        """);
+
+    useConfiguration(
+        "--compilation_mode=fastbuild",
+        "--platforms=//platforms:alpha",
+        "--host_platform=//platforms:alpha",
+        "--experimental_platform_in_output_dir",
+        "--noexperimental_use_platforms_in_output_dir_legacy_heuristic",
+        "--experimental_override_name_platform_in_output_dir=//platforms:alpha=alpha-override",
+        "--experimental_output_directory_naming_scheme=diff_against_dynamic_baseline");
+    ConfiguredTarget test = getConfiguredTarget("//test");
+
+    assertThat(getMnemonic(test)).contains("alpha-override-fastbuild");
+    assertThat(getMnemonic(test)).doesNotContain("-ST-");
+
+    ConfiguredTarget dep = (ConfiguredTarget) getMyInfoFromTarget(test).getValue("dep");
+
+    // The platform name override is used in dep with exec config
+    assertThat(getMnemonic(dep)).contains("alpha-override-opt-exec");
+    assertThat(getMnemonic(dep)).doesNotContain("-ST-");
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactoryTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactoryTest.java
index 4e80fef..c222a50 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactoryTest.java
@@ -71,9 +71,9 @@
     assertThat(result).isNotNull();
     assertThat(result).isNotSameInstanceAs(options);
 
-    assertThat(result.contains(CoreOptions.class)).isNotNull();
+    assertThat(result.contains(CoreOptions.class)).isTrue();
     assertThat(result.get(CoreOptions.class).isExec).isTrue();
-    assertThat(result.contains(PlatformOptions.class)).isNotNull();
+    assertThat(result.contains(PlatformOptions.class)).isTrue();
     assertThat(result.get(PlatformOptions.class).platforms).containsExactly(EXECUTION_PLATFORM);
   }
 
@@ -280,4 +280,44 @@
     assertThat(missingMetadataTagOptions).isEmpty();
     assertThat(unpreservedOptions.build()).isEmpty();
   }
+
+  @Test
+  public void platformInOutputPathWorksInExecMode() throws Exception {
+    scratch.file(
+        "platforms/BUILD",
+        """
+        platform(name = "mock_platform")
+        """);
+    scratch.file(
+        "test/lib.bzl",
+        """
+        my_rule = rule(
+            implementation = lambda ctx: [],
+            attrs = {
+                "exec_deps": attr.label_list(cfg = "exec"),
+            },
+        )
+        """);
+    scratch.file(
+        "test/BUILD",
+        """
+        load(":lib.bzl", "my_rule")
+        my_rule(
+            name = "parent",
+            exec_deps = [":child"]
+        )
+        my_rule(name = "child")
+        """);
+
+    useConfiguration(
+        "--experimental_platform_in_output_dir",
+        "--extra_execution_platforms=//platforms:mock_platform",
+        "--experimental_override_name_platform_in_output_dir=//platforms:mock_platform=mock_platform_path_string");
+    BuildConfigurationValue execConfig =
+        getConfiguration(
+            getDirectPrerequisite(getConfiguredTarget("//test:parent"), "//test:child"));
+
+    assertThat(execConfig.isExecConfiguration()).isTrue();
+    assertThat(execConfig.getOutputDirectoryName()).isEqualTo("mock_platform_path_string-opt-exec");
+  }
 }