Add ctx.experimental_new_directory (undocumented) to create tree artifacts in Skylark. RELNOTES: None. PiperOrigin-RevId: 151744710
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java index f0586b3..7c9e921 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -651,6 +651,14 @@ } /** + * Creates a tree artifact in a directory that is unique to the package that contains the rule, + * thus guaranteeing that it never clashes with artifacts created by rules in other packages. + */ + public Artifact getPackageRelativeTreeArtifact(PathFragment relative, Root root) { + return getTreeArtifact(getPackageDirectory().getRelative(relative), root); + } + + /** * Creates an artifact in a directory that is unique to the rule, thus guaranteeing that it never * clashes with artifacts created by other rules. */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java index 3eee895..445716a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
@@ -896,6 +896,32 @@ return ruleContext.getDerivedArtifact(fragment, root); } + // TODO(b/36548861): Document this when it's ready to be made publicly available. + @SkylarkCallable( + name = "experimental_new_directory", + documented = false, + parameters = { + @Param(name = "name", type = String.class), + @Param( + name = "sibling", + type = Artifact.class, + defaultValue = "None", + noneable = true, + named = true + ) + } + ) + public Artifact newDirectory(String name, Object siblingArtifactUnchecked) throws EvalException { + checkMutable("experimental_new_directory"); + if (siblingArtifactUnchecked == Runtime.NONE) { + return ruleContext.getPackageRelativeTreeArtifact(new PathFragment(name), newFileRoot()); + } + Artifact siblingArtifact = (Artifact) siblingArtifactUnchecked; + PathFragment original = siblingArtifact.getRootRelativePath(); + PathFragment fragment = original.replaceName(name); + return ruleContext.getTreeArtifact(fragment, newFileRoot()); + } + @SkylarkCallable(documented = false) public NestedSet<Artifact> middleMan(String attribute) throws EvalException { checkMutable("middle_man");