Skip to content

Commit 11de8e7

Browse files
committed
Perform full build in case the output directory was deleted
Signed-off-by: Christoph Läubrich <[email protected]>
1 parent db42af8 commit 11de8e7

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/MavenBuilderImpl.java

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import java.util.Map;
2929
import java.util.Set;
3030
import java.util.concurrent.ConcurrentHashMap;
31-
import java.util.concurrent.atomic.AtomicBoolean;
31+
import java.util.concurrent.atomic.AtomicReference;
3232
import java.util.function.Predicate;
3333

3434
import org.slf4j.Logger;
@@ -86,6 +86,10 @@ public class MavenBuilderImpl {
8686

8787
private final Map<IProject, ProjectBuildState> deltaState = new ConcurrentHashMap<>();
8888

89+
private enum DeltaType {
90+
INCREMENTAL, IRRELEVANT, FULL_BUILD, UNKOWN;
91+
}
92+
8993
public MavenBuilderImpl(DeltaProvider deltaProvider) {
9094
this.deltaProvider = deltaProvider;
9195
this.incrementalBuildFrameworks = loadIncrementalBuildFrameworks();
@@ -118,13 +122,14 @@ public Set<IProject> build(MavenSession session, IMavenProjectFacade projectFaca
118122

119123
DeltaProvider deltaProvider = getDeltaProvider();
120124
IResourceDelta delta = deltaProvider.getDelta(project);
121-
if(!hasRelevantDelta(projectFacade, delta)) {
125+
DeltaType deltaType = hasRelevantDelta(projectFacade, delta);
126+
if(deltaType == DeltaType.IRRELEVANT) {
122127
return Set.of(project);
123128
}
124129
ProjectBuildState buildState = deltaState.computeIfAbsent(project, ProjectBuildState::new);
125130
final BuildResultCollector participantResults = new BuildResultCollector();
126131
List<BuildContext> incrementalContexts = setupProjectBuildContext(project, kind, delta, participantResults,
127-
buildState);
132+
buildState, deltaType);
128133

129134
debugBuildStart(debugHooks, projectFacade, kind, args, participants, delta, monitor);
130135

@@ -200,15 +205,15 @@ public Set<IProject> build(MavenSession session, IMavenProjectFacade projectFaca
200205
return dependencies;
201206
}
202207

203-
private boolean hasRelevantDelta(IMavenProjectFacade projectFacade, IResourceDelta resourceDelta)
208+
private DeltaType hasRelevantDelta(IMavenProjectFacade projectFacade, IResourceDelta resourceDelta)
204209
throws CoreException {
205210
if(resourceDelta == null) {
206-
return true;
211+
return DeltaType.FULL_BUILD;
207212
}
208213
IProject project = projectFacade.getProject();
209214
IPath buildOutputLocation = projectFacade.getBuildOutputLocation();
210215
if(project == null || buildOutputLocation == null) {
211-
return true;
216+
return DeltaType.UNKOWN;
212217
}
213218

214219
Predicate<IPath> isOutput = toPrefixPredicate(projectFacade.getOutputLocation());
@@ -218,7 +223,7 @@ private boolean hasRelevantDelta(IMavenProjectFacade projectFacade, IResourceDel
218223
IPath projectPath = project.getFullPath();
219224
List<IPath> moduleLocations = projectFacade.getMavenProjectModules().stream()
220225
.map(module -> projectPath.append(module)).toList();
221-
AtomicBoolean hasRelevantDelta = new AtomicBoolean();
226+
AtomicReference<DeltaType> deltaType = new AtomicReference<>(DeltaType.IRRELEVANT);
222227
resourceDelta.accept(delta -> {
223228
IResource resource = delta.getResource();
224229
if(resource instanceof IFile) {
@@ -227,7 +232,8 @@ private boolean hasRelevantDelta(IMavenProjectFacade projectFacade, IResourceDel
227232
//anything in the build output is not interesting for a change as it is produced by the build
228233
// ... unless a classpath resource that existed before has been deleted, possibly by another builder
229234
if(isOutputOrTestOutput.test(fullPath) && !resource.exists()) {
230-
hasRelevantDelta.set(true);
235+
//in this case we should perform a full build as we can't know what mojo has placed data possible here...
236+
deltaType.set(DeltaType.FULL_BUILD);
231237
return false;
232238
}
233239
return true;
@@ -239,12 +245,12 @@ private boolean hasRelevantDelta(IMavenProjectFacade projectFacade, IResourceDel
239245
}
240246
}
241247
//anything else has changed, so mark this as relevant an leave the loop
242-
hasRelevantDelta.set(true);
248+
deltaType.set(DeltaType.INCREMENTAL);
243249
return false;
244250
}
245251
return true;
246252
});
247-
return hasRelevantDelta.get();
253+
return deltaType.get();
248254
}
249255

250256
private static Predicate<IPath> toPrefixPredicate(IPath location) {
@@ -255,12 +261,13 @@ private static Predicate<IPath> toPrefixPredicate(IPath location) {
255261
}
256262

257263
private List<IIncrementalBuildFramework.BuildContext> setupProjectBuildContext(IProject project, int kind,
258-
IResourceDelta delta, IIncrementalBuildFramework.BuildResultCollector results, ProjectBuildState buildState)
264+
IResourceDelta delta, IIncrementalBuildFramework.BuildResultCollector results, ProjectBuildState buildState,
265+
DeltaType deltaType)
259266
throws CoreException {
260267
List<IIncrementalBuildFramework.BuildContext> contexts = new ArrayList<>();
261268

262-
BuildDelta buildDelta = delta != null ? new ProjectBuildStateDelta(buildState, new EclipseResourceBuildDelta(delta))
263-
: null;
269+
BuildDelta buildDelta = deltaType == DeltaType.FULL_BUILD || delta == null ? null
270+
: new ProjectBuildStateDelta(buildState, new EclipseResourceBuildDelta(delta));
264271
for(IIncrementalBuildFramework framework : incrementalBuildFrameworks) {
265272
contexts.add(framework.setupProjectBuildContext(project, kind, buildDelta, results));
266273
}
@@ -438,7 +445,7 @@ public void clean(MavenSession session, IMavenProjectFacade projectFacade,
438445

439446
final BuildResultCollector participantResults = new BuildResultCollector();
440447
List<BuildContext> incrementalContexts = setupProjectBuildContext(project, IncrementalProjectBuilder.CLEAN_BUILD,
441-
null, participantResults, null);
448+
null, participantResults, null, DeltaType.UNKOWN);
442449

443450
Map<Throwable, MojoExecutionKey> buildErrors = new LinkedHashMap<>();
444451
try {

0 commit comments

Comments
 (0)