Search in sources :

Example 1 with CacheableOutputFilePropertySpec

use of org.gradle.api.internal.tasks.properties.CacheableOutputFilePropertySpec in project gradle by gradle.

the class DefaultTaskCacheabilityResolver method shouldDisableCaching.

@Override
public Optional<CachingDisabledReason> shouldDisableCaching(TaskInternal task, TaskProperties taskProperties, Collection<SelfDescribingSpec<TaskInternal>> cacheIfSpecs, Collection<SelfDescribingSpec<TaskInternal>> doNotCacheIfSpecs, @Nullable OverlappingOutputs overlappingOutputs) {
    if (cacheIfSpecs.isEmpty()) {
        if (task.getClass().isAnnotationPresent(DisableCachingByDefault.class)) {
            DisableCachingByDefault doNotCacheAnnotation = task.getClass().getAnnotation(DisableCachingByDefault.class);
            String reason = doNotCacheAnnotation.because();
            if (reason.isEmpty()) {
                return Optional.of(CACHING_DISABLED);
            } else {
                return Optional.of(new CachingDisabledReason(CachingDisabledReasonCategory.NOT_CACHEABLE, reason));
            }
        }
        return Optional.of(CACHING_NOT_ENABLED);
    }
    if (!taskProperties.hasDeclaredOutputs()) {
        return Optional.of(NO_OUTPUTS_DECLARED);
    }
    if (overlappingOutputs != null) {
        String relativePath = relativeFilePathResolver.resolveForDisplay(overlappingOutputs.getOverlappedFilePath());
        return Optional.of(new CachingDisabledReason(CachingDisabledReasonCategory.OVERLAPPING_OUTPUTS, "Gradle does not know how file '" + relativePath + "' was created (output property '" + overlappingOutputs.getPropertyName() + "'). Task output caching requires exclusive access to output paths to guarantee correctness (i.e. multiple tasks are not allowed to produce output in the same location)."));
    }
    Optional<String> reasonNotToTrackState = task.getReasonNotToTrackState();
    if (reasonNotToTrackState.isPresent()) {
        return Optional.of(new CachingDisabledReason(CachingDisabledReasonCategory.DISABLE_CONDITION_SATISFIED, "Task is untracked because: " + reasonNotToTrackState.get()));
    }
    for (OutputFilePropertySpec spec : taskProperties.getOutputFileProperties()) {
        if (!(spec instanceof CacheableOutputFilePropertySpec)) {
            return Optional.of(new CachingDisabledReason(CachingDisabledReasonCategory.NON_CACHEABLE_OUTPUT, "Output property '" + spec.getPropertyName() + "' contains a file tree"));
        }
    }
    for (SelfDescribingSpec<TaskInternal> cacheIfSpec : cacheIfSpecs) {
        if (!cacheIfSpec.isSatisfiedBy(task)) {
            return Optional.of(new CachingDisabledReason(CachingDisabledReasonCategory.ENABLE_CONDITION_NOT_SATISFIED, "'" + cacheIfSpec.getDisplayName() + "' not satisfied"));
        }
    }
    for (SelfDescribingSpec<TaskInternal> doNotCacheIfSpec : doNotCacheIfSpecs) {
        if (doNotCacheIfSpec.isSatisfiedBy(task)) {
            return Optional.of(new CachingDisabledReason(CachingDisabledReasonCategory.DISABLE_CONDITION_SATISFIED, "'" + doNotCacheIfSpec.getDisplayName() + "' satisfied"));
        }
    }
    return Optional.empty();
}
Also used : CachingDisabledReason(org.gradle.internal.execution.caching.CachingDisabledReason) OutputFilePropertySpec(org.gradle.api.internal.tasks.properties.OutputFilePropertySpec) CacheableOutputFilePropertySpec(org.gradle.api.internal.tasks.properties.CacheableOutputFilePropertySpec) DisableCachingByDefault(org.gradle.work.DisableCachingByDefault) TaskInternal(org.gradle.api.internal.TaskInternal) CacheableOutputFilePropertySpec(org.gradle.api.internal.tasks.properties.CacheableOutputFilePropertySpec)

Aggregations

TaskInternal (org.gradle.api.internal.TaskInternal)1 CacheableOutputFilePropertySpec (org.gradle.api.internal.tasks.properties.CacheableOutputFilePropertySpec)1 OutputFilePropertySpec (org.gradle.api.internal.tasks.properties.OutputFilePropertySpec)1 CachingDisabledReason (org.gradle.internal.execution.caching.CachingDisabledReason)1 DisableCachingByDefault (org.gradle.work.DisableCachingByDefault)1