diff options
Diffstat (limited to 'src/main/java/com/google')
4 files changed, 53 insertions, 26 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java index 4ec65dd3b0..ec5806869a 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Package.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java @@ -39,6 +39,7 @@ import com.google.devtools.build.lib.util.SpellChecker; import com.google.devtools.build.lib.vfs.Canonicalizer; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; +import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.Collection; @@ -751,6 +752,8 @@ public class Package { private List<String> features = new ArrayList<>(); private List<Event> events = Lists.newArrayList(); private List<Postable> posts = Lists.newArrayList(); + @Nullable String ioExceptionMessage = null; + @Nullable private IOException ioException = null; private boolean containsErrors = false; private License defaultLicense = License.NO_LICENSE; @@ -928,6 +931,12 @@ public class Package { return this; } + Builder setIOExceptionAndMessage(IOException e, String message) { + this.ioException = e; + this.ioExceptionMessage = message; + return setContainsErrors(); + } + /** * Declares that errors were encountering while loading this package. */ @@ -1284,11 +1293,15 @@ public class Package { this.registeredToolchainLabels.addAll(toolchains); } - private Builder beforeBuild(boolean discoverAssumedInputFiles) throws InterruptedException { + private Builder beforeBuild(boolean discoverAssumedInputFiles) + throws InterruptedException, NoSuchPackageException { Preconditions.checkNotNull(pkg); Preconditions.checkNotNull(filename); Preconditions.checkNotNull(buildFileLabel); Preconditions.checkNotNull(makeEnv); + if (ioException != null) { + throw new NoSuchPackageException(getPackageIdentifier(), ioExceptionMessage, ioException); + } // Freeze subincludes. subincludes = (subincludes == null) ? Collections.<Label, Path>emptyMap() @@ -1337,7 +1350,7 @@ public class Package { } /** Intended for use by {@link com.google.devtools.build.lib.skyframe.PackageFunction} only. */ - public Builder buildPartial() throws InterruptedException { + public Builder buildPartial() throws InterruptedException, NoSuchPackageException { if (alreadyBuilt) { return this; } @@ -1385,15 +1398,16 @@ public class Package { return externalPackageData; } - public Package build() throws InterruptedException { + public Package build() throws InterruptedException, NoSuchPackageException { return build(/*discoverAssumedInputFiles=*/ true); } /** - * Build the package, optionally adding any labels in the package not already associated with - * a target as an input file. + * Build the package, optionally adding any labels in the package not already associated with a + * target as an input file. */ - public Package build(boolean discoverAssumedInputFiles) throws InterruptedException { + public Package build(boolean discoverAssumedInputFiles) + throws InterruptedException, NoSuchPackageException { if (alreadyBuilt) { return pkg; } diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java index cab4a4f6d6..3eead14e7d 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java @@ -573,11 +573,12 @@ public final class PackageFactory { try { Globber.Token globToken = context.globber.runAsync(includes, excludes, excludeDirs); matches = context.globber.fetch(globToken); - } catch (IOException expected) { - context.eventHandler.handle(Event.error(ast.getLocation(), - "error globbing [" + Joiner.on(", ").join(includes) + "]: " + expected.getMessage())); - context.pkgBuilder.setContainsErrors(); - matches = ImmutableList.<String>of(); + } catch (IOException e) { + String errorMessage = + "error globbing [" + Joiner.on(", ").join(includes) + "]: " + e.getMessage(); + context.eventHandler.handle(Event.error(ast.getLocation(), errorMessage)); + context.pkgBuilder.setIOExceptionAndMessage(e, errorMessage); + matches = ImmutableList.of(); } catch (BadGlobException e) { throw new EvalException(ast.getLocation(), e.getMessage()); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java index 33fb4aa5cb..4a6010faba 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java @@ -567,7 +567,11 @@ public class PackageFunction implements SkyFunction { return null; } Package.Builder pkgBuilder = packageBuilderAndGlobDeps.value; - pkgBuilder.buildPartial(); + try { + pkgBuilder.buildPartial(); + } catch (NoSuchPackageException e) { + throw new PackageFunctionException(e, Transience.TRANSIENT); + } try { // Since the Skyframe dependencies we request below in // markDependenciesAndPropagateFilesystemExceptions are requested independently of diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java index 2372793333..71f2c98ff6 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java @@ -72,13 +72,17 @@ public class WorkspaceFileFunction implements SkyFunction { repoWorkspace, ruleClassProvider.getRunfilesPrefix()); if (workspaceASTValue.getASTs().isEmpty()) { - return new WorkspaceFileValue( - builder.build(), // resulting package - ImmutableMap.<String, Extension>of(), // list of imports - ImmutableMap.<String, Object>of(), // list of symbol bindings - workspaceRoot, // Workspace root - 0, // first fragment, idx = 0 - false); // last fragment + try { + return new WorkspaceFileValue( + builder.build(), // resulting package + ImmutableMap.<String, Extension>of(), // list of imports + ImmutableMap.<String, Object>of(), // list of symbol bindings + workspaceRoot, // Workspace root + 0, // first fragment, idx = 0 + false); // last fragment + } catch (NoSuchPackageException e) { + throw new WorkspaceFileFunctionException(e, Transience.TRANSIENT); + } } WorkspaceFactory parser; try (Mutability mutability = Mutability.create("workspace %s", repoWorkspace)) { @@ -115,13 +119,17 @@ public class WorkspaceFileFunction implements SkyFunction { throw new WorkspaceFileFunctionException(e, Transience.PERSISTENT); } - return new WorkspaceFileValue( - builder.build(), - parser.getImportMap(), - parser.getVariableBindings(), - workspaceRoot, - key.getIndex(), - key.getIndex() < workspaceASTValue.getASTs().size() - 1); + try { + return new WorkspaceFileValue( + builder.build(), + parser.getImportMap(), + parser.getVariableBindings(), + workspaceRoot, + key.getIndex(), + key.getIndex() < workspaceASTValue.getASTs().size() - 1); + } catch (NoSuchPackageException e) { + throw new WorkspaceFileFunctionException(e, Transience.TRANSIENT); + } } @Override |