View | Details | Raw Unified | Return to bug 206540 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/core/internal/events/BuildManager.java (-6 / +26 lines)
Lines 135-146 Link Here
135
			// Figure out want kind of build is needed
135
			// Figure out want kind of build is needed
136
			boolean clean = trigger == IncrementalProjectBuilder.CLEAN_BUILD;
136
			boolean clean = trigger == IncrementalProjectBuilder.CLEAN_BUILD;
137
			currentLastBuiltTree = currentBuilder.getLastBuiltTree();
137
			currentLastBuiltTree = currentBuilder.getLastBuiltTree();
138
			// If no tree is available we have to do a full build
138
			
139
			if (!clean && currentLastBuiltTree == null)
139
			// check if the builder responds to the given trigger
140
				trigger = IncrementalProjectBuilder.FULL_BUILD;
140
			boolean doesRespond = builder.getCommand().isBuilding(trigger);
141
			//don't build if this builder doesn't respond to the given trigger
141
			
142
			if (!builder.getCommand().isBuilding(trigger))
142
			if (clean) {
143
				return;
143
				// don't build if the builder doesn't respond to the clean trigger
144
				// and a clean is requested, just make sure that the build tree 
145
				// will be cleared during a clean
146
				if (!doesRespond) {
147
					currentBuilder.setLastBuiltTree(null);
148
					return;
149
				}
150
			} else {
151
				// if the builder doesn't respond to the given trigger 
152
				// and no tree is available, try to trigger a full build
153
				if (!doesRespond && currentLastBuiltTree == null) {
154
					trigger = IncrementalProjectBuilder.FULL_BUILD;
155
					doesRespond = builder.getCommand().isBuilding(trigger);
156
				} else if (doesRespond && currentLastBuiltTree == null) {
157
					currentBuilder.setLastBuiltTree(new ElementTree());
158
				}
159
				// don't build if the builder doesn't respond to the given triggers,
160
				if (!doesRespond)
161
					return;
162
			}
163
			
144
			// For incremental builds, grab a pointer to the current state before computing the delta
164
			// For incremental builds, grab a pointer to the current state before computing the delta
145
			currentTree = ((trigger == IncrementalProjectBuilder.FULL_BUILD) || clean) ? null : workspace.getElementTree();
165
			currentTree = ((trigger == IncrementalProjectBuilder.FULL_BUILD) || clean) ? null : workspace.getElementTree();
146
			int depth = -1;
166
			int depth = -1;
(-)src/org/eclipse/core/tests/internal/builders/CustomBuildTriggerTest.java (+147 lines)
Lines 333-336 Link Here
333
		assertTrue("3.0", builder.wasIncrementalBuild());
333
		assertTrue("3.0", builder.wasIncrementalBuild());
334
334
335
	}
335
	}
336
	
337
	
338
	
339
	
340
	
341
	
342
	/**
343
	 * Tests that a builder that responds only to the "full" trigger will be called
344
	 * on the first and only first build after a clean. 
345
	 * See bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=206540.
346
	 */
347
	public void testCleanBuild_AfterCleanBuilder() throws CoreException {
348
		IWorkspace workspace = getWorkspace();
349
		IProject project = workspace.getRoot().getProject("PROJECT" + 1);
350
		ICommand command = null;
351
		
352
		// Create some resources
353
		project.create(getMonitor());
354
		project.open(getMonitor());
355
		
356
		// Create and set a build specs for project 
357
		IProjectDescription desc = project.getDescription();
358
		command = createCommand(desc, CustomTriggerBuilder.BUILDER_NAME, "Build0");
359
		command.setBuilding(IncrementalProjectBuilder.AUTO_BUILD, false);
360
		command.setBuilding(IncrementalProjectBuilder.FULL_BUILD, true);
361
		command.setBuilding(IncrementalProjectBuilder.INCREMENTAL_BUILD, false);
362
		command.setBuilding(IncrementalProjectBuilder.CLEAN_BUILD, false);
363
		desc.setBuildSpec(new ICommand[] {command});
364
		project.setDescription(desc, getMonitor());
365
		command = project.getDescription().getBuildSpec()[0];
366
367
		// turn auto-building off
368
		setAutoBuilding(false);
369
		
370
		// do an initial build to get the builder instance
371
		try {
372
			project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, getMonitor());
373
		} catch (CoreException e) {
374
			fail("1.0", e);
375
		}
376
		waitForBuild();
377
		CustomTriggerBuilder builder = CustomTriggerBuilder.getInstance();
378
		assertNotNull("2.0", builder);
379
		assertTrue("2.1", builder.wasFullBuild());
380
381
		// do a clean - builder should not be called
382
		builder.clearBuildTrigger();
383
		builder.reset();
384
		workspace.build(IncrementalProjectBuilder.CLEAN_BUILD, getMonitor());
385
		assertTrue("3.0",!builder.wasCleanBuild());
386
		assertTrue("3.1",!builder.wasFullBuild());
387
		
388
		// do an incremental build - FULL_BUILD should be triggered
389
		builder.clearBuildTrigger();
390
		builder.reset();
391
		workspace.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, getMonitor());
392
		waitForBuild();
393
		assertTrue("4.0",!builder.wasCleanBuild());
394
		assertTrue("4.1",builder.wasFullBuild());
395
		
396
		// add a file in the project before an incremental build is triggered again
397
		IFile file = project.getFile("a.txt");
398
		try {
399
			file.create(getRandomContents(), IResource.NONE, getMonitor());
400
		} catch (CoreException e) {
401
			fail("5.00", e);
402
		}
403
		
404
		// do an incremental build - build should NOT be triggered
405
		builder.clearBuildTrigger();
406
		builder.reset();
407
		workspace.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, getMonitor());
408
		waitForBuild();
409
		assertTrue("6.0",!builder.wasCleanBuild());
410
		assertTrue("6.1",!builder.wasFullBuild());
411
	}
412
	
413
	/**
414
	 * Tests that a builder that responds only to the "full" trigger will be called
415
	 * on the first and only first build after a clean. 
416
	 * See bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=206540.
417
	 */
418
	public void testCleanAutoBuild_AfterCleanBuilder() throws CoreException {
419
		IWorkspace workspace = getWorkspace();
420
		IProject project = workspace.getRoot().getProject("PROJECT" + 1);
421
		ICommand command = null;
422
		
423
		// Create some resources
424
		project.create(getMonitor());
425
		project.open(getMonitor());
426
		
427
		// Create and set a build specs for project 
428
		IProjectDescription desc = project.getDescription();
429
		command = createCommand(desc, CustomTriggerBuilder.BUILDER_NAME, "Build0");
430
		command.setBuilding(IncrementalProjectBuilder.AUTO_BUILD, false);
431
		command.setBuilding(IncrementalProjectBuilder.FULL_BUILD, true);
432
		command.setBuilding(IncrementalProjectBuilder.INCREMENTAL_BUILD, false);
433
		command.setBuilding(IncrementalProjectBuilder.CLEAN_BUILD, false);
434
		desc.setBuildSpec(new ICommand[] {command});
435
		project.setDescription(desc, getMonitor());
436
		command = project.getDescription().getBuildSpec()[0];
437
438
		// turn auto-building on
439
		setAutoBuilding(true);
440
		waitForBuild();
441
		CustomTriggerBuilder builder = CustomTriggerBuilder.getInstance();
442
		assertNotNull("1.0", builder);
443
		assertTrue("1.1", builder.wasFullBuild());
444
445
		// do a clean - builder should not be called
446
		builder.clearBuildTrigger();
447
		builder.reset();
448
		workspace.build(IncrementalProjectBuilder.CLEAN_BUILD, getMonitor());
449
		assertTrue("2.0",!builder.wasCleanBuild());
450
		assertTrue("2.1",!builder.wasFullBuild());
451
452
		
453
		// add a file in the project to trigger an auto-build - FULL_BUILD should be triggered
454
		builder.clearBuildTrigger();
455
		builder.reset();
456
		
457
		IFile file = project.getFile("a.txt");
458
		try {
459
			file.create(getRandomContents(), IResource.NONE, getMonitor());
460
		} catch (CoreException e) {
461
			fail("3.00", e);
462
		}
463
464
		waitForBuild();
465
		assertTrue("4.0",!builder.wasCleanBuild());
466
		assertTrue("4.1",builder.wasFullBuild());
467
		
468
		// add another file in the project to trigger an auto-build - build should NOT be triggered
469
		builder.clearBuildTrigger();
470
		builder.reset();
471
		
472
		file = project.getFile("b.txt");
473
		try {
474
			file.create(getRandomContents(), IResource.NONE, getMonitor());
475
		} catch (CoreException e) {
476
			fail("5.00", e);
477
		}
478
479
		waitForBuild();
480
		assertTrue("6.0",!builder.wasCleanBuild());
481
		assertTrue("6.1",!builder.wasFullBuild());
482
	}
336
}
483
}

Return to bug 206540