mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-16 14:23:28 +07:00
provide information about build status for generic Target builders
GitOrigin-RevId: 522adbb48fa0b11a62815d43ff3d615bd874a9cd
This commit is contained in:
committed by
intellij-monorepo-bot
parent
c4fd464e03
commit
d1e73bdc6d
@@ -104,7 +104,7 @@ public abstract class BuildTarget<R extends BuildRootDescriptor> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the list of output directories in which this target is going to produce its output. (The specific
|
* Returns the list of output directories in which this target is going to produce its output. (The specific
|
||||||
* files produced need to be reported by {@link org.jetbrains.jps.incremental.TargetBuilder#build} through
|
* files produced need to be reported by {@link org.jetbrains.jps.incremental.TargetBuilder#buildTarget} through
|
||||||
*
|
*
|
||||||
* {@link BuildOutputConsumer#registerOutputFile}.)
|
* {@link BuildOutputConsumer#registerOutputFile}.)
|
||||||
* @param context the compilation context.
|
* @param context the compilation context.
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import java.util.Collection;
|
|||||||
* Provides list of files under {@link BuildTarget#computeRootDescriptors source roots} of a target which were modified or deleted since the
|
* Provides list of files under {@link BuildTarget#computeRootDescriptors source roots} of a target which were modified or deleted since the
|
||||||
* previous build.
|
* previous build.
|
||||||
*
|
*
|
||||||
* @see org.jetbrains.jps.incremental.TargetBuilder#build
|
* @see org.jetbrains.jps.incremental.TargetBuilder#buildTarget
|
||||||
* @see org.jetbrains.jps.incremental.ModuleLevelBuilder#build
|
* @see org.jetbrains.jps.incremental.ModuleLevelBuilder#build
|
||||||
*/
|
*/
|
||||||
public interface DirtyFilesHolder<R extends BuildRootDescriptor, T extends BuildTarget<R>> {
|
public interface DirtyFilesHolder<R extends BuildRootDescriptor, T extends BuildTarget<R>> {
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||||
|
package org.jetbrains.jps.builders.impl;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jps.builders.BuildOutputConsumer;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
public class OutputTracker implements BuildOutputConsumer {
|
||||||
|
private final BuildOutputConsumer myDelegate;
|
||||||
|
private int myFilesRegistered = 0;
|
||||||
|
private int myDirsRegistered = 0;
|
||||||
|
|
||||||
|
public OutputTracker(BuildOutputConsumer delegate) {
|
||||||
|
myDelegate = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerOutputFile(@NotNull File outputFile, @NotNull Collection<String> sourcePaths) throws IOException {
|
||||||
|
myFilesRegistered++;
|
||||||
|
myDelegate.registerOutputFile(outputFile, sourcePaths);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerOutputDirectory(@NotNull File outputDir, @NotNull Collection<String> sourcePaths) throws IOException {
|
||||||
|
myDirsRegistered++;
|
||||||
|
myDelegate.registerOutputDirectory(outputDir, sourcePaths);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRegisteredFilesCount() {
|
||||||
|
return myFilesRegistered;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRegisteredDirsCount() {
|
||||||
|
return myDirsRegistered;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOutputGenerated() {
|
||||||
|
return myFilesRegistered > 0 || myDirsRegistered > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OutputTracker create(BuildOutputConsumer consumer) {
|
||||||
|
return new OutputTracker(consumer);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1192,12 +1192,13 @@ public final class IncProjectBuilder {
|
|||||||
|
|
||||||
final List<TargetBuilder<?, ?>> builders = BuilderRegistry.getInstance().getTargetBuilders();
|
final List<TargetBuilder<?, ?>> builders = BuilderRegistry.getInstance().getTargetBuilders();
|
||||||
int builderCount = 0;
|
int builderCount = 0;
|
||||||
|
boolean filesGenerated = false;
|
||||||
for (TargetBuilder<?, ?> builder : builders) {
|
for (TargetBuilder<?, ?> builder : builders) {
|
||||||
buildTarget(target, context, builder);
|
filesGenerated |= buildTarget(target, context, builder);
|
||||||
builderCount++;
|
builderCount++;
|
||||||
buildProgress.updateProgress(target, ((double)builderCount)/builders.size(), context);
|
buildProgress.updateProgress(target, ((double)builderCount)/builders.size(), context);
|
||||||
}
|
}
|
||||||
return true;
|
return filesGenerated;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static CompileContext wrapWithModuleInfoAppender(CompileContext context, Collection<ModuleBuildTarget> moduleTargets) {
|
private static CompileContext wrapWithModuleInfoAppender(CompileContext context, Collection<ModuleBuildTarget> moduleTargets) {
|
||||||
@@ -1282,10 +1283,10 @@ public final class IncProjectBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private <R extends BuildRootDescriptor, T extends BuildTarget<R>>
|
private <R extends BuildRootDescriptor, T extends BuildTarget<R>>
|
||||||
void buildTarget(final T target, final CompileContext context, TargetBuilder<?, ?> builder) throws ProjectBuildException, IOException {
|
boolean buildTarget(final T target, final CompileContext context, TargetBuilder<?, ?> builder) throws ProjectBuildException, IOException {
|
||||||
|
|
||||||
if (builder.getTargetTypes().contains(target.getTargetType())) {
|
if (builder.getTargetTypes().contains(target.getTargetType())) {
|
||||||
DirtyFilesHolder<R, T> holder = new DirtyFilesHolderBase<R, T>(context) {
|
DirtyFilesHolder<R, T> holder = new DirtyFilesHolderBase<>(context) {
|
||||||
@Override
|
@Override
|
||||||
public void processDirtyFiles(@NotNull FileProcessor<R, T> processor) throws IOException {
|
public void processDirtyFiles(@NotNull FileProcessor<R, T> processor) throws IOException {
|
||||||
context.getProjectDescriptor().fsState.processFilesToRecompile(context, target, processor);
|
context.getProjectDescriptor().fsState.processFilesToRecompile(context, target, processor);
|
||||||
@@ -1293,11 +1294,19 @@ public final class IncProjectBuilder {
|
|||||||
};
|
};
|
||||||
BuildOutputConsumerImpl outputConsumer = new BuildOutputConsumerImpl(target, context);
|
BuildOutputConsumerImpl outputConsumer = new BuildOutputConsumerImpl(target, context);
|
||||||
long start = System.nanoTime();
|
long start = System.nanoTime();
|
||||||
((TargetBuilder<R, T>)builder).build(target, holder, outputConsumer, context);
|
//noinspection unchecked
|
||||||
|
TargetBuilder.ExitCode exitCode = ((TargetBuilder<R, T>)builder).buildTarget(target, holder, outputConsumer, context);
|
||||||
|
if (exitCode == TargetBuilder.ExitCode.ABORT) {
|
||||||
|
throw new StopBuildException(
|
||||||
|
JpsBuildBundle.message("build.message.builder.0.requested.build.stop", builder.getPresentableName())
|
||||||
|
);
|
||||||
|
}
|
||||||
storeBuilderStatistics(builder, System.nanoTime() - start, outputConsumer.getNumberOfProcessedSources());
|
storeBuilderStatistics(builder, System.nanoTime() - start, outputConsumer.getNumberOfProcessedSources());
|
||||||
outputConsumer.fireFileGeneratedEvent();
|
outputConsumer.fireFileGeneratedEvent();
|
||||||
context.checkCanceled();
|
context.checkCanceled();
|
||||||
|
return exitCode != TargetBuilder.ExitCode.NOTHING_DONE;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <T extends BuildRootDescriptor> void cleanOldOutputs(final CompileContext context, final BuildTarget<T> target) throws ProjectBuildException{
|
private static <T extends BuildRootDescriptor> void cleanOldOutputs(final CompileContext context, final BuildTarget<T> target) throws ProjectBuildException{
|
||||||
|
|||||||
@@ -37,6 +37,17 @@ public abstract class TargetBuilder<R extends BuildRootDescriptor, T extends Bui
|
|||||||
return myTargetTypes;
|
return myTargetTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Implement {@link TargetBuilder#buildTarget(BuildTarget, DirtyFilesHolder, BuildOutputConsumer, CompileContext)} instead
|
||||||
|
*/
|
||||||
|
public void build(@NotNull T target, @NotNull DirtyFilesHolder<R, T> holder, @NotNull BuildOutputConsumer outputConsumer, @NotNull CompileContext context)
|
||||||
|
throws ProjectBuildException, IOException {
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ExitCode {
|
||||||
|
NOTHING_DONE, OK, ABORT
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds a single build target.
|
* Builds a single build target.
|
||||||
*
|
*
|
||||||
@@ -47,8 +58,12 @@ public abstract class TargetBuilder<R extends BuildRootDescriptor, T extends Bui
|
|||||||
* to be reported here.)
|
* to be reported here.)
|
||||||
* @param context compilation context (can be used to report compiler errors/warnings and to check whether the build
|
* @param context compilation context (can be used to report compiler errors/warnings and to check whether the build
|
||||||
* has been cancelled and needs to be stopped).
|
* has been cancelled and needs to be stopped).
|
||||||
|
* @return exit code describing the builder execution status
|
||||||
*/
|
*/
|
||||||
public abstract void build(@NotNull T target, @NotNull DirtyFilesHolder<R, T> holder, @NotNull BuildOutputConsumer outputConsumer,
|
public ExitCode buildTarget(@NotNull T target, @NotNull DirtyFilesHolder<R, T> holder, @NotNull BuildOutputConsumer outputConsumer, @NotNull CompileContext context) throws ProjectBuildException, IOException {
|
||||||
@NotNull CompileContext context) throws ProjectBuildException, IOException;
|
// default implementation to make third-party implementations of the older API work
|
||||||
|
build(target, holder, outputConsumer, context);
|
||||||
|
return ExitCode.OK;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,14 +42,17 @@ public class IncArtifactBuilder extends TargetBuilder<ArtifactRootDescriptor, Ar
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(@NotNull ArtifactBuildTarget target,
|
public ExitCode buildTarget(@NotNull ArtifactBuildTarget target,
|
||||||
@NotNull DirtyFilesHolder<ArtifactRootDescriptor, ArtifactBuildTarget> holder,
|
@NotNull DirtyFilesHolder<ArtifactRootDescriptor, ArtifactBuildTarget> holder,
|
||||||
@NotNull BuildOutputConsumer outputConsumer, @NotNull final CompileContext context) throws ProjectBuildException {
|
@NotNull BuildOutputConsumer outputConsumer, @NotNull final CompileContext context) throws ProjectBuildException {
|
||||||
|
final boolean doneSomething;
|
||||||
try {
|
try {
|
||||||
new IncArtifactBuilderHelper(target, outputConsumer, context).build(holder);
|
doneSomething = new IncArtifactBuilderHelper(target, outputConsumer, context).build(holder);
|
||||||
} catch (IOException e) {
|
}
|
||||||
|
catch (IOException e) {
|
||||||
throw new ProjectBuildException(e);
|
throw new ProjectBuildException(e);
|
||||||
}
|
}
|
||||||
|
return doneSomething? ExitCode.OK : ExitCode.NOTHING_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -84,7 +87,7 @@ public class IncArtifactBuilder extends TargetBuilder<ArtifactRootDescriptor, Ar
|
|||||||
this.outSrcMapping = pd.dataManager.getStorage(target, ArtifactOutToSourceStorageProvider.INSTANCE);
|
this.outSrcMapping = pd.dataManager.getStorage(target, ArtifactOutToSourceStorageProvider.INSTANCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void build(DirtyFilesHolder<ArtifactRootDescriptor, ArtifactBuildTarget> holder) throws ProjectBuildException, IOException {
|
public boolean build(DirtyFilesHolder<ArtifactRootDescriptor, ArtifactBuildTarget> holder) throws ProjectBuildException, IOException {
|
||||||
if (startBuild()) {
|
if (startBuild()) {
|
||||||
createAndRunArtifactTasks(ArtifactBuildTaskProvider.ArtifactBuildPhase.PRE_PROCESSING);
|
createAndRunArtifactTasks(ArtifactBuildTaskProvider.ArtifactBuildPhase.PRE_PROCESSING);
|
||||||
|
|
||||||
@@ -98,7 +101,9 @@ public class IncArtifactBuilder extends TargetBuilder<ArtifactRootDescriptor, Ar
|
|||||||
|
|
||||||
createAndRunArtifactTasks(ArtifactBuildTaskProvider.ArtifactBuildPhase.FINISHING_BUILD);
|
createAndRunArtifactTasks(ArtifactBuildTaskProvider.ArtifactBuildPhase.FINISHING_BUILD);
|
||||||
createAndRunArtifactTasks(ArtifactBuildTaskProvider.ArtifactBuildPhase.POST_PROCESSING);
|
createAndRunArtifactTasks(ArtifactBuildTaskProvider.ArtifactBuildPhase.POST_PROCESSING);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean startBuild() {
|
private boolean startBuild() {
|
||||||
|
|||||||
@@ -32,18 +32,18 @@ public final class ProjectDependenciesResolver extends TargetBuilder<BuildRootDe
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(@NotNull ProjectDependenciesResolvingTarget target,
|
public ExitCode buildTarget(@NotNull ProjectDependenciesResolvingTarget target,
|
||||||
@NotNull DirtyFilesHolder<BuildRootDescriptor, ProjectDependenciesResolvingTarget> holder,
|
@NotNull DirtyFilesHolder<BuildRootDescriptor, ProjectDependenciesResolvingTarget> holder,
|
||||||
@NotNull BuildOutputConsumer outputConsumer,
|
@NotNull BuildOutputConsumer outputConsumer,
|
||||||
@NotNull CompileContext context) {
|
@NotNull CompileContext context) {
|
||||||
context.processMessage(new ProgressMessage(JpsBuildBundle.message("progress.message.resolving.repository.libraries.in.the.project")));
|
context.processMessage(new ProgressMessage(JpsBuildBundle.message("progress.message.resolving.repository.libraries.in.the.project")));
|
||||||
try {
|
try {
|
||||||
DependencyResolvingBuilder.resolveMissingDependencies(context, context.getProjectDescriptor().getProject().getModules(),
|
DependencyResolvingBuilder.resolveMissingDependencies(context, context.getProjectDescriptor().getProject().getModules(), BuildTargetChunk.forSingleTarget(target));
|
||||||
BuildTargetChunk.forSingleTarget(target));
|
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
DependencyResolvingBuilder.reportError(context, "project", e);
|
DependencyResolvingBuilder.reportError(context, "project", e);
|
||||||
}
|
}
|
||||||
|
return ExitCode.OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.jps.builders.BuildOutputConsumer;
|
import org.jetbrains.jps.builders.BuildOutputConsumer;
|
||||||
import org.jetbrains.jps.builders.DirtyFilesHolder;
|
import org.jetbrains.jps.builders.DirtyFilesHolder;
|
||||||
import org.jetbrains.jps.builders.JpsBuildBundle;
|
import org.jetbrains.jps.builders.JpsBuildBundle;
|
||||||
|
import org.jetbrains.jps.builders.impl.OutputTracker;
|
||||||
import org.jetbrains.jps.builders.java.ResourceRootDescriptor;
|
import org.jetbrains.jps.builders.java.ResourceRootDescriptor;
|
||||||
import org.jetbrains.jps.builders.java.ResourcesTargetType;
|
import org.jetbrains.jps.builders.java.ResourcesTargetType;
|
||||||
import org.jetbrains.jps.builders.storage.BuildDataCorruptedException;
|
import org.jetbrains.jps.builders.storage.BuildDataCorruptedException;
|
||||||
@@ -43,14 +44,14 @@ public class ResourcesBuilder extends TargetBuilder<ResourceRootDescriptor, Reso
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(@NotNull ResourcesTarget target,
|
public ExitCode buildTarget(@NotNull ResourcesTarget target,
|
||||||
@NotNull DirtyFilesHolder<ResourceRootDescriptor, ResourcesTarget> holder,
|
@NotNull DirtyFilesHolder<ResourceRootDescriptor, ResourcesTarget> holder,
|
||||||
@NotNull BuildOutputConsumer outputConsumer,
|
@NotNull BuildOutputConsumer outputConsumer,
|
||||||
@NotNull CompileContext context) throws ProjectBuildException, IOException {
|
@NotNull CompileContext context) throws ProjectBuildException, IOException {
|
||||||
if (!isResourceProcessingEnabled(target.getModule())) {
|
if (!isResourceProcessingEnabled(target.getModule())) {
|
||||||
return;
|
return ExitCode.NOTHING_DONE;
|
||||||
}
|
}
|
||||||
|
final OutputTracker out = OutputTracker.create(outputConsumer);
|
||||||
try {
|
try {
|
||||||
final Map<ResourceRootDescriptor, Boolean> skippedRoots = new HashMap<>();
|
final Map<ResourceRootDescriptor, Boolean> skippedRoots = new HashMap<>();
|
||||||
holder.processDirtyFiles((t, f, srcRoot) -> {
|
holder.processDirtyFiles((t, f, srcRoot) -> {
|
||||||
@@ -64,7 +65,7 @@ public class ResourcesBuilder extends TargetBuilder<ResourceRootDescriptor, Reso
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
copyResource(context, srcRoot, f, outputConsumer);
|
copyResource(context, srcRoot, f, out);
|
||||||
return !context.getCancelStatus().isCanceled();
|
return !context.getCancelStatus().isCanceled();
|
||||||
}
|
}
|
||||||
catch (IOException e) {
|
catch (IOException e) {
|
||||||
@@ -86,6 +87,7 @@ public class ResourcesBuilder extends TargetBuilder<ResourceRootDescriptor, Reso
|
|||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
throw new ProjectBuildException(e.getMessage(), e);
|
throw new ProjectBuildException(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
|
return out.isOutputGenerated()? ExitCode.OK : ExitCode.NOTHING_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isResourceProcessingEnabled(JpsModule module) {
|
private static boolean isResourceProcessingEnabled(JpsModule module) {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import com.intellij.openapi.util.io.FileUtil;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jps.builders.BuildOutputConsumer;
|
import org.jetbrains.jps.builders.BuildOutputConsumer;
|
||||||
import org.jetbrains.jps.builders.DirtyFilesHolder;
|
import org.jetbrains.jps.builders.DirtyFilesHolder;
|
||||||
import org.jetbrains.jps.builders.FileProcessor;
|
import org.jetbrains.jps.builders.impl.OutputTracker;
|
||||||
import org.jetbrains.jps.builders.storage.BuildDataPaths;
|
import org.jetbrains.jps.builders.storage.BuildDataPaths;
|
||||||
import org.jetbrains.jps.gradle.GradleJpsBundle;
|
import org.jetbrains.jps.gradle.GradleJpsBundle;
|
||||||
import org.jetbrains.jps.gradle.model.JpsGradleExtensionService;
|
import org.jetbrains.jps.gradle.model.JpsGradleExtensionService;
|
||||||
@@ -21,7 +21,6 @@ import org.jetbrains.jps.incremental.java.JavaBuilder;
|
|||||||
import org.jetbrains.jps.incremental.messages.ProgressMessage;
|
import org.jetbrains.jps.incremental.messages.ProgressMessage;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileFilter;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -36,36 +35,26 @@ public class GradleResourcesBuilder extends TargetBuilder<GradleResourceRootDesc
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(@NotNull final GradleResourcesTarget target,
|
public ExitCode buildTarget(@NotNull final GradleResourcesTarget target,
|
||||||
@NotNull final DirtyFilesHolder<GradleResourceRootDescriptor, GradleResourcesTarget> holder,
|
@NotNull final DirtyFilesHolder<GradleResourceRootDescriptor, GradleResourcesTarget> holder,
|
||||||
@NotNull final BuildOutputConsumer outputConsumer,
|
@NotNull final BuildOutputConsumer outputConsumer,
|
||||||
@NotNull final CompileContext context) throws ProjectBuildException, IOException {
|
@NotNull final CompileContext context) throws ProjectBuildException, IOException {
|
||||||
if (!JavaBuilder.IS_ENABLED.get(context, Boolean.TRUE)) {
|
if (!JavaBuilder.IS_ENABLED.get(context, Boolean.TRUE)) {
|
||||||
return;
|
return ExitCode.NOTHING_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
final BuildDataPaths dataPaths = context.getProjectDescriptor().dataManager.getDataPaths();
|
final BuildDataPaths dataPaths = context.getProjectDescriptor().dataManager.getDataPaths();
|
||||||
final GradleProjectConfiguration projectConfig = JpsGradleExtensionService.getInstance().getGradleProjectConfiguration(dataPaths);
|
final GradleProjectConfiguration projectConfig = JpsGradleExtensionService.getInstance().getGradleProjectConfiguration(dataPaths);
|
||||||
final GradleModuleResourceConfiguration config = target.getModuleResourcesConfiguration(dataPaths);
|
final GradleModuleResourceConfiguration config = target.getModuleResourcesConfiguration(dataPaths);
|
||||||
if (config == null) return;
|
if (config == null) {
|
||||||
|
return ExitCode.NOTHING_DONE;
|
||||||
|
}
|
||||||
|
|
||||||
final Map<GradleResourceRootDescriptor, List<File>> files = new HashMap<>();
|
final Map<GradleResourceRootDescriptor, List<File>> files = new HashMap<>();
|
||||||
|
holder.processDirtyFiles((t, file, rd) -> {
|
||||||
holder.processDirtyFiles(new FileProcessor<GradleResourceRootDescriptor, GradleResourcesTarget>() {
|
assert target == t;
|
||||||
|
files.computeIfAbsent(rd, k -> new ArrayList<>()).add(file);
|
||||||
@Override
|
return true;
|
||||||
public boolean apply(GradleResourcesTarget t, File file, GradleResourceRootDescriptor rd) throws IOException {
|
|
||||||
assert target == t;
|
|
||||||
|
|
||||||
List<File> fileList = files.get(rd);
|
|
||||||
if (fileList == null) {
|
|
||||||
fileList = new ArrayList<>();
|
|
||||||
files.put(rd, fileList);
|
|
||||||
}
|
|
||||||
|
|
||||||
fileList.add(file);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
GradleResourceRootDescriptor[] roots = files.keySet().toArray(new GradleResourceRootDescriptor[0]);
|
GradleResourceRootDescriptor[] roots = files.keySet().toArray(new GradleResourceRootDescriptor[0]);
|
||||||
@@ -92,18 +81,10 @@ public class GradleResourcesBuilder extends TargetBuilder<GradleResourceRootDesc
|
|||||||
}
|
}
|
||||||
catch (Throwable t) {
|
catch (Throwable t) {
|
||||||
LOG.warn("Can not create resource file processor", t);
|
LOG.warn("Can not create resource file processor", t);
|
||||||
fileProcessor = new ResourceFileProcessor() {
|
fileProcessor = (file, targetFileRef, rootConfiguration, ctx, filteringFilter) -> FSOperations.copy(file, targetFileRef.get());
|
||||||
@Override
|
|
||||||
public void copyFile(File file,
|
|
||||||
Ref<File> targetFileRef,
|
|
||||||
ResourceRootConfiguration rootConfiguration,
|
|
||||||
CompileContext context,
|
|
||||||
FileFilter filteringFilter) throws IOException {
|
|
||||||
FSOperations.copy(file, targetFileRef.get());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final OutputTracker out = OutputTracker.create(outputConsumer);
|
||||||
for (GradleResourceRootDescriptor rd : roots) {
|
for (GradleResourceRootDescriptor rd : roots) {
|
||||||
for (File file : files.get(rd)) {
|
for (File file : files.get(rd)) {
|
||||||
|
|
||||||
@@ -118,14 +99,17 @@ public class GradleResourcesBuilder extends TargetBuilder<GradleResourceRootDesc
|
|||||||
|
|
||||||
final Ref<File> fileRef = Ref.create(new File(outputDir, relPath));
|
final Ref<File> fileRef = Ref.create(new File(outputDir, relPath));
|
||||||
fileProcessor.copyFile(file, fileRef, rd.getConfiguration(), context, FileFilters.EVERYTHING);
|
fileProcessor.copyFile(file, fileRef, rd.getConfiguration(), context, FileFilters.EVERYTHING);
|
||||||
outputConsumer.registerOutputFile(fileRef.get(), Collections.singleton(file.getPath()));
|
out.registerOutputFile(fileRef.get(), Collections.singleton(file.getPath()));
|
||||||
|
|
||||||
if (context.getCancelStatus().isCanceled()) return;
|
if (context.getCancelStatus().isCanceled()) {
|
||||||
|
return ExitCode.OK;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
context.checkCanceled();
|
context.checkCanceled();
|
||||||
context.processMessage(new ProgressMessage(""));
|
context.processMessage(new ProgressMessage(""));
|
||||||
|
return out.isOutputGenerated()? ExitCode.OK : ExitCode.NOTHING_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import com.intellij.openapi.util.Key;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jps.ModuleChunk;
|
import org.jetbrains.jps.ModuleChunk;
|
||||||
import org.jetbrains.jps.builders.BuildOutputConsumer;
|
import org.jetbrains.jps.builders.BuildOutputConsumer;
|
||||||
import org.jetbrains.jps.builders.BuildTarget;
|
|
||||||
import org.jetbrains.jps.builders.DirtyFilesHolder;
|
import org.jetbrains.jps.builders.DirtyFilesHolder;
|
||||||
|
import org.jetbrains.jps.builders.impl.OutputTracker;
|
||||||
import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType;
|
import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType;
|
||||||
import org.jetbrains.jps.incremental.*;
|
import org.jetbrains.jps.incremental.*;
|
||||||
import org.jetbrains.jps.model.java.JpsJavaClasspathKind;
|
import org.jetbrains.jps.model.java.JpsJavaClasspathKind;
|
||||||
@@ -38,20 +38,20 @@ public class GroovyResourceChecker extends TargetBuilder<GroovyResourceRootDescr
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(@NotNull final CheckResourcesTarget target,
|
public ExitCode buildTarget(@NotNull final CheckResourcesTarget target,
|
||||||
@NotNull DirtyFilesHolder<GroovyResourceRootDescriptor, CheckResourcesTarget> holder,
|
@NotNull DirtyFilesHolder<GroovyResourceRootDescriptor, CheckResourcesTarget> holder,
|
||||||
@NotNull final BuildOutputConsumer outputConsumer,
|
@NotNull final BuildOutputConsumer outputConsumer,
|
||||||
@NotNull CompileContext context) throws ProjectBuildException, IOException {
|
@NotNull CompileContext context) throws ProjectBuildException, IOException {
|
||||||
if (context.getBuilderParameter(CHECKING_RESOURCES_REBUILD.toString()) == null) {
|
if (context.getBuilderParameter(CHECKING_RESOURCES_REBUILD.toString()) == null) {
|
||||||
return;
|
return ExitCode.NOTHING_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
new ResourceCheckingGroovycRunner(target).doBuild(context, singleModuleChunk(target.getModule()), holder, this, new GroovyOutputConsumer() {
|
final OutputTracker out = OutputTracker.create(outputConsumer);
|
||||||
@Override
|
new ResourceCheckingGroovycRunner(target).doBuild(
|
||||||
public void registerCompiledClass(BuildTarget<?> target, File srcFile, File outputFile, byte[] bytes) throws IOException {
|
context, singleModuleChunk(target.getModule()), holder, this,
|
||||||
outputConsumer.registerOutputFile(outputFile, Collections.singleton(srcFile.getPath()));
|
(tgt, srcFile, outputFile, bytes) -> out.registerOutputFile(outputFile, Collections.singleton(srcFile.getPath()))
|
||||||
}
|
);
|
||||||
});
|
return out.isOutputGenerated()? ExitCode.OK : ExitCode.NOTHING_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.jps.builders.BuildOutputConsumer;
|
import org.jetbrains.jps.builders.BuildOutputConsumer;
|
||||||
import org.jetbrains.jps.builders.DirtyFilesHolder;
|
import org.jetbrains.jps.builders.DirtyFilesHolder;
|
||||||
import org.jetbrains.jps.builders.FileProcessor;
|
import org.jetbrains.jps.builders.FileProcessor;
|
||||||
|
import org.jetbrains.jps.builders.impl.OutputTracker;
|
||||||
import org.jetbrains.jps.builders.storage.BuildDataPaths;
|
import org.jetbrains.jps.builders.storage.BuildDataPaths;
|
||||||
import org.jetbrains.jps.incremental.CompileContext;
|
import org.jetbrains.jps.incremental.CompileContext;
|
||||||
import org.jetbrains.jps.incremental.ProjectBuildException;
|
import org.jetbrains.jps.incremental.ProjectBuildException;
|
||||||
@@ -36,7 +37,7 @@ public class MavenResourcesBuilder extends TargetBuilder<MavenResourceRootDescri
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(@NotNull final MavenResourcesTarget target, @NotNull final DirtyFilesHolder<MavenResourceRootDescriptor, MavenResourcesTarget> holder, @NotNull final BuildOutputConsumer outputConsumer, @NotNull final CompileContext context) throws ProjectBuildException, IOException {
|
public ExitCode buildTarget(@NotNull final MavenResourcesTarget target, @NotNull final DirtyFilesHolder<MavenResourceRootDescriptor, MavenResourcesTarget> holder, @NotNull final BuildOutputConsumer outputConsumer, @NotNull final CompileContext context) throws ProjectBuildException, IOException {
|
||||||
final BuildDataPaths dataPaths = context.getProjectDescriptor().dataManager.getDataPaths();
|
final BuildDataPaths dataPaths = context.getProjectDescriptor().dataManager.getDataPaths();
|
||||||
final MavenProjectConfiguration projectConfig = JpsMavenExtensionService.getInstance().getMavenProjectConfiguration(dataPaths);
|
final MavenProjectConfiguration projectConfig = JpsMavenExtensionService.getInstance().getMavenProjectConfiguration(dataPaths);
|
||||||
if (projectConfig == null) {
|
if (projectConfig == null) {
|
||||||
@@ -47,12 +48,12 @@ public class MavenResourcesBuilder extends TargetBuilder<MavenResourceRootDescri
|
|||||||
|
|
||||||
final MavenModuleResourceConfiguration config = target.getModuleResourcesConfiguration(dataPaths);
|
final MavenModuleResourceConfiguration config = target.getModuleResourcesConfiguration(dataPaths);
|
||||||
if (config == null) {
|
if (config == null) {
|
||||||
return;
|
return ExitCode.NOTHING_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Map<MavenResourceRootDescriptor, List<File>> files = new HashMap<>();
|
final Map<MavenResourceRootDescriptor, List<File>> files = new HashMap<>();
|
||||||
|
|
||||||
holder.processDirtyFiles(new FileProcessor<MavenResourceRootDescriptor, MavenResourcesTarget>() {
|
holder.processDirtyFiles(new FileProcessor<>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(MavenResourcesTarget t, File file, MavenResourceRootDescriptor rd) throws IOException {
|
public boolean apply(MavenResourcesTarget t, File file, MavenResourceRootDescriptor rd) throws IOException {
|
||||||
@@ -89,7 +90,8 @@ public class MavenResourcesBuilder extends TargetBuilder<MavenResourceRootDescri
|
|||||||
return res;
|
return res;
|
||||||
});
|
});
|
||||||
|
|
||||||
MavenResourceFileProcessor fileProcessor = new MavenResourceFileProcessor(projectConfig, target.getModule().getProject(), config);
|
final MavenResourceFileProcessor fileProcessor = new MavenResourceFileProcessor(projectConfig, target.getModule().getProject(), config);
|
||||||
|
final OutputTracker out = OutputTracker.create(outputConsumer);
|
||||||
|
|
||||||
context.processMessage(new ProgressMessage(MavenJpsBundle.message("copying.resources", target.getModule().getName())));
|
context.processMessage(new ProgressMessage(MavenJpsBundle.message("copying.resources", target.getModule().getName())));
|
||||||
for (MavenResourceRootDescriptor rd : roots) {
|
for (MavenResourceRootDescriptor rd : roots) {
|
||||||
@@ -108,7 +110,7 @@ public class MavenResourcesBuilder extends TargetBuilder<MavenResourceRootDescri
|
|||||||
String sourcePath = file.getPath();
|
String sourcePath = file.getPath();
|
||||||
try {
|
try {
|
||||||
fileProcessor.copyFile(file, outputFile, rd.getConfiguration(), context, FileFilters.EVERYTHING);
|
fileProcessor.copyFile(file, outputFile, rd.getConfiguration(), context, FileFilters.EVERYTHING);
|
||||||
outputConsumer.registerOutputFile(outputFile, Collections.singleton(sourcePath));
|
out.registerOutputFile(outputFile, Collections.singleton(sourcePath));
|
||||||
}
|
}
|
||||||
catch (UnsupportedEncodingException e) {
|
catch (UnsupportedEncodingException e) {
|
||||||
context.processMessage(
|
context.processMessage(
|
||||||
@@ -122,14 +124,15 @@ public class MavenResourcesBuilder extends TargetBuilder<MavenResourceRootDescri
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (context.getCancelStatus().isCanceled()) {
|
if (context.getCancelStatus().isCanceled()) {
|
||||||
return;
|
return out.isOutputGenerated()? ExitCode.OK : ExitCode.NOTHING_DONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
context.checkCanceled();
|
context.checkCanceled();
|
||||||
|
|
||||||
context.processMessage(new ProgressMessage(""));
|
context.processMessage(new ProgressMessage(""));
|
||||||
|
|
||||||
|
return out.isOutputGenerated()? ExitCode.OK : ExitCode.NOTHING_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user