Bug 576736 - try to restart analysis on "resource not found" errors
Change-Id: I233eca934a97ea9d956b676ee1462da67b44bf5c
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
Reviewed-on: https://git.eclipse.org/r/c/pde/eclipse.pde.ui/+/189551
Tested-by: PDE Bot <pde-bot@eclipse.org>
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ApiAnalysisBuilder.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ApiAnalysisBuilder.java
index 0208a70..2084f4b 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ApiAnalysisBuilder.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ApiAnalysisBuilder.java
@@ -34,6 +34,7 @@
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceStatus;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
@@ -577,11 +578,40 @@
try {
work(fullBuild, wbaseline, projects, monitor);
} catch (CoreException e) {
- return e.getStatus();
+ IStatus status = e.getStatus();
+ if (monitor.isCanceled()) {
+ return Status.CANCEL_STATUS;
+ } else {
+ if (status.getCode() == IResourceStatus.RESOURCE_NOT_FOUND && project.isAccessible()) {
+ waitForLockAndReschedule(monitor, e);
+ return Status.OK_STATUS;
+ } else {
+ return status;
+ }
+ }
}
return Status.OK_STATUS;
}
+ /**
+ * In case the analysis job was interrupted by the build, let wait for the build
+ * and start analysis again
+ */
+ private void waitForLockAndReschedule(IProgressMonitor monitor, CoreException e) {
+ try {
+ Job.getJobManager().beginRule(project, monitor);
+ IStatus s = new Status(IStatus.INFO, ApiAnalysisBuilder.class,
+ "Re-scheduling API analysis for " + project.getName(), e); //$NON-NLS-1$
+ ApiPlugin.log(s);
+ schedule();
+ } catch (OperationCanceledException e1) {
+ // nothing to do
+ } finally {
+ // release lock, we don't want to block workspace while analysis
+ Job.getJobManager().endRule(project);
+ }
+ }
+
@Override
public boolean belongsTo(Object family) {
return super.belongsTo(family) || ApiAnalysisJob.class == family;