@@ -654,6 +654,115 @@ def map_each(x, expander):
654654 .isNotEqualTo (fingerprintAfter .hexDigestAndReset ());
655655 }
656656
657+ @ Test
658+ public void
659+ vectorArgArguments_expandDirectoriesDisabled_noMapEach_expansionDoesNotAffectActionKey (
660+ @ TestParameter boolean useNestedSet ) throws Exception {
661+ SpecialArtifact tree = createTreeArtifact ("tree" );
662+ TreeFileArtifact child1 = TreeFileArtifact .createTreeOutput (tree , "child1" );
663+ TreeFileArtifact child2 = TreeFileArtifact .createTreeOutput (tree , "child2" );
664+ // The files won't be read so MISSING_FILE_MARKER will do
665+ TreeArtifactValue treeArtifactValueBefore =
666+ TreeArtifactValue .newBuilder (tree )
667+ .putChild (child1 , FileArtifactValue .MISSING_FILE_MARKER )
668+ .putChild (child2 , FileArtifactValue .MISSING_FILE_MARKER )
669+ .build ();
670+ TreeArtifactValue treeArtifactValueAfter =
671+ TreeArtifactValue .newBuilder (tree )
672+ .putChild (child1 , FileArtifactValue .MISSING_FILE_MARKER )
673+ .build ();
674+ var vectorArg =
675+ useNestedSet
676+ ? new VectorArg .Builder (
677+ NestedSetBuilder .wrap (Order .STABLE_ORDER , ImmutableList .of (tree )), Artifact .class )
678+ : new VectorArg .Builder (Tuple .of (tree ));
679+ CommandLine commandLine =
680+ builder
681+ .add (vectorArg .setExpandDirectories (false ).setLocation (Location .BUILTIN ))
682+ .build (/* flagPerLine= */ false , RepositoryMapping .ALWAYS_FALLBACK );
683+
684+ var expanderBefore =
685+ createArtifactExpander (
686+ ImmutableMap .of (tree , treeArtifactValueBefore .getChildren ()), ImmutableMap .of ());
687+ var argumentsBefore = commandLine .arguments (expanderBefore , PathMapper .NOOP );
688+ var fingerprintBefore = new Fingerprint ();
689+ commandLine .addToFingerprint (
690+ new ActionKeyContext (), expanderBefore , CoreOptions .OutputPathsMode .OFF , fingerprintBefore );
691+ assertThat (argumentsBefore ).containsExactly ("bin/tree" );
692+
693+ var expanderAfter =
694+ createArtifactExpander (
695+ ImmutableMap .of (tree , treeArtifactValueAfter .getChildren ()), ImmutableMap .of ());
696+ var argumentsAfter = commandLine .arguments (expanderAfter , PathMapper .NOOP );
697+ var fingerprintAfter = new Fingerprint ();
698+ commandLine .addToFingerprint (
699+ new ActionKeyContext (), expanderAfter , CoreOptions .OutputPathsMode .OFF , fingerprintAfter );
700+ assertThat (argumentsAfter ).containsExactly ("bin/tree" );
701+
702+ assertThat (fingerprintBefore .hexDigestAndReset ())
703+ .isEqualTo (fingerprintAfter .hexDigestAndReset ());
704+ }
705+
706+ @ Test
707+ public void
708+ vectorArgArguments_expandDirectoriesDisabled_noManualExpansion_expansionDoesNotAffectActionKey (
709+ @ TestParameter boolean useNestedSet ) throws Exception {
710+ SpecialArtifact tree = createTreeArtifact ("tree" );
711+ TreeFileArtifact child1 = TreeFileArtifact .createTreeOutput (tree , "child1" );
712+ TreeFileArtifact child2 = TreeFileArtifact .createTreeOutput (tree , "child2" );
713+ // The files won't be read so MISSING_FILE_MARKER will do
714+ TreeArtifactValue treeArtifactValueBefore =
715+ TreeArtifactValue .newBuilder (tree )
716+ .putChild (child1 , FileArtifactValue .MISSING_FILE_MARKER )
717+ .putChild (child2 , FileArtifactValue .MISSING_FILE_MARKER )
718+ .build ();
719+ TreeArtifactValue treeArtifactValueAfter =
720+ TreeArtifactValue .newBuilder (tree )
721+ .putChild (child1 , FileArtifactValue .MISSING_FILE_MARKER )
722+ .build ();
723+ var vectorArg =
724+ useNestedSet
725+ ? new VectorArg .Builder (
726+ NestedSetBuilder .wrap (Order .STABLE_ORDER , ImmutableList .of (tree )), Artifact .class )
727+ : new VectorArg .Builder (Tuple .of (tree ));
728+ CommandLine commandLine =
729+ builder
730+ .add (
731+ vectorArg
732+ .setExpandDirectories (false )
733+ .setLocation (Location .BUILTIN )
734+ .setMapEach (
735+ (StarlarkFunction )
736+ execStarlark (
737+ """
738+ def map_each(x):
739+ return x.path
740+ map_each
741+ """ )))
742+ .build (/* flagPerLine= */ false , RepositoryMapping .ALWAYS_FALLBACK );
743+
744+ var expanderBefore =
745+ createArtifactExpander (
746+ ImmutableMap .of (tree , treeArtifactValueBefore .getChildren ()), ImmutableMap .of ());
747+ var argumentsBefore = commandLine .arguments (expanderBefore , PathMapper .NOOP );
748+ var fingerprintBefore = new Fingerprint ();
749+ commandLine .addToFingerprint (
750+ new ActionKeyContext (), expanderBefore , CoreOptions .OutputPathsMode .OFF , fingerprintBefore );
751+ assertThat (argumentsBefore ).containsExactly ("bin/tree" );
752+
753+ var expanderAfter =
754+ createArtifactExpander (
755+ ImmutableMap .of (tree , treeArtifactValueAfter .getChildren ()), ImmutableMap .of ());
756+ var argumentsAfter = commandLine .arguments (expanderAfter , PathMapper .NOOP );
757+ var fingerprintAfter = new Fingerprint ();
758+ commandLine .addToFingerprint (
759+ new ActionKeyContext (), expanderAfter , CoreOptions .OutputPathsMode .OFF , fingerprintAfter );
760+ assertThat (argumentsAfter ).containsExactly ("bin/tree" );
761+
762+ assertThat (fingerprintBefore .hexDigestAndReset ())
763+ .isEqualTo (fingerprintAfter .hexDigestAndReset ());
764+ }
765+
657766 private static VectorArg .Builder vectorArg (Object ... elems ) {
658767 return new VectorArg .Builder (Tuple .of (elems )).setLocation (Location .BUILTIN );
659768 }
0 commit comments