From 942265730ba326740f05829343f587de118b2a37 Mon Sep 17 00:00:00 2001 From: Sergey Opivalov Date: Fri, 21 Mar 2025 19:14:33 +0300 Subject: [PATCH] Support ETV for `SubtractingFileCollection` --- .../file/SubtractingFileCollection.java | 24 +++++++ ...ileCollectionExecutionTimeValueTest.groovy | 62 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 platforms/core-configuration/file-collections/src/test/groovy/org/gradle/api/internal/file/SubtractingFileCollectionExecutionTimeValueTest.groovy diff --git a/platforms/core-configuration/file-collections/src/main/java/org/gradle/api/internal/file/SubtractingFileCollection.java b/platforms/core-configuration/file-collections/src/main/java/org/gradle/api/internal/file/SubtractingFileCollection.java index e64c2205ea98..a07d53ab64d4 100644 --- a/platforms/core-configuration/file-collections/src/main/java/org/gradle/api/internal/file/SubtractingFileCollection.java +++ b/platforms/core-configuration/file-collections/src/main/java/org/gradle/api/internal/file/SubtractingFileCollection.java @@ -21,6 +21,7 @@ import java.io.File; import java.util.LinkedHashSet; +import java.util.Optional; import java.util.Set; public class SubtractingFileCollection extends AbstractOpaqueFileCollection { @@ -58,8 +59,31 @@ protected Set getIntrinsicFiles() { return files; } + @Override + public Optional calculateExecutionTimeValue() { + return left.calculateExecutionTimeValue() + .flatMap(leftEtv -> ((FileCollectionInternal) right).calculateExecutionTimeValue() + .map(rightEtv -> new SubtractingExecutionTimeValue(leftEtv, rightEtv))); + } + @Override public boolean contains(File file) { return left.contains(file) && !right.contains(file); } + + private static class SubtractingExecutionTimeValue implements FileCollectionExecutionTimeValue { + private final FileCollectionExecutionTimeValue left; + private final FileCollectionExecutionTimeValue right; + + private SubtractingExecutionTimeValue(FileCollectionExecutionTimeValue left, FileCollectionExecutionTimeValue right) { + this.left = left; + this.right = right; + } + + @Override + public FileCollectionInternal toFileCollection(FileCollectionFactory fileCollectionFactory) { + return (FileCollectionInternal) left.toFileCollection(fileCollectionFactory) + .minus(right.toFileCollection(fileCollectionFactory)); + } + } } diff --git a/platforms/core-configuration/file-collections/src/test/groovy/org/gradle/api/internal/file/SubtractingFileCollectionExecutionTimeValueTest.groovy b/platforms/core-configuration/file-collections/src/test/groovy/org/gradle/api/internal/file/SubtractingFileCollectionExecutionTimeValueTest.groovy new file mode 100644 index 000000000000..39f013041c13 --- /dev/null +++ b/platforms/core-configuration/file-collections/src/test/groovy/org/gradle/api/internal/file/SubtractingFileCollectionExecutionTimeValueTest.groovy @@ -0,0 +1,62 @@ +/* + * Copyright 2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gradle.api.internal.file + + +import spock.lang.Specification + +import static org.gradle.api.internal.file.TestFiles.fileCollectionFactory + +class SubtractingFileCollectionExecutionTimeValueTest extends Specification { + def "SubtractingFileCollection supports execution time value"() { + given: + def left = fileCollectionFactory().fixed(new File("foo.txt"), new File("bar.txt")) + def right = fileCollectionFactory().fixed(new File("bar.txt")) + def collection = new SubtractingFileCollection(left, right) + + when: + def executionTimeValue = collection.calculateExecutionTimeValue() + + then: + executionTimeValue.present + + and: + def newCollection = executionTimeValue.get().toFileCollection(fileCollectionFactory()) + + then: + newCollection.files == [new File("foo.txt")] as Set + } + + def "SubtractingFileCollection supports absence of execution time value"() { + given: + def collection = new SubtractingFileCollection(left, right) + + when: + def executionTimeValue = collection.calculateExecutionTimeValue() + + then: + executionTimeValue.present == isPresent + + where: + left | right | isPresent + new EmptyExecutionTimeValueFileCollection() | fileCollectionFactory().fixed(new File("foo.txt")) | false + fileCollectionFactory().fixed(new File("foo.txt")) | new EmptyExecutionTimeValueFileCollection() | false + new EmptyExecutionTimeValueFileCollection() | new EmptyExecutionTimeValueFileCollection() | false + fileCollectionFactory().fixed(new File("foo.txt")) | fileCollectionFactory().fixed(new File("bar.txt")) | true + } +} +