From ac023bbcb127884e2c14c5c70848c61f149dfbbe Mon Sep 17 00:00:00 2001 From: Janak Ramakrishnan Date: Tue, 15 Sep 2015 19:37:11 +0000 Subject: Get rid of transient errors during preprocessing and throw IOExceptions instead. Transient errors were only detected on IOExceptions, but preprocessing doesn't actually throw IOExceptions except if it fails before it even opens the main file, so there's no sense in trying to construct a package in that case. -- MOS_MIGRATED_REVID=103119445 --- .../build/lib/packages/PackageFactory.java | 69 +++++++++++----------- .../devtools/build/lib/packages/Preprocessor.java | 38 ++++++------ .../build/lib/skyframe/PackageFunction.java | 19 +++++- 3 files changed, 72 insertions(+), 54 deletions(-) (limited to 'src/main/java/com/google/devtools') 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 1a7c376731..82361f7bbb 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 @@ -1002,10 +1002,17 @@ public final class PackageFactory { prefetchGlobs(packageId, buildFileAST, preprocessingResult.preprocessed, buildFile, globber, defaultVisibility, makeEnv); return evaluateBuildFile( - externalPkg, packageId, buildFileAST, buildFile, globber, + externalPkg, + packageId, + buildFileAST, + buildFile, + globber, Iterables.concat(preprocessingEvents, localReporter.getEvents()), - defaultVisibility, preprocessingResult.containsErrors, - preprocessingResult.containsTransientErrors, makeEnv, imports, skylarkFileDependencies); + defaultVisibility, + preprocessingResult.containsErrors, + makeEnv, + imports, + skylarkFileDependencies); } catch (InterruptedException e) { globber.onInterrupt(); throw e; @@ -1034,8 +1041,14 @@ public final class PackageFactory { } Globber globber = createLegacyGlobber(buildFile.getParentDirectory(), packageId, locator); - Preprocessor.Result preprocessingResult = - preprocess(packageId, buildFile, inputSource, globber); + Preprocessor.Result preprocessingResult; + try { + preprocessingResult = preprocess(packageId, inputSource, globber); + } catch (IOException e) { + eventHandler.handle( + Event.error(Location.fromFile(buildFile), "preprocessing failed: " + e.getMessage())); + throw new BuildFileContainsErrorsException(packageId, "preprocessing failed", e); + } ExternalPackage externalPkg = new ExternalPackage.Builder( buildFile.getRelative("WORKSPACE"), ruleClassProvider.getRunfilesPrefix()).build(); @@ -1060,20 +1073,13 @@ public final class PackageFactory { /** Preprocesses the given BUILD file. */ public Preprocessor.Result preprocess( - PackageIdentifier packageId, - Path buildFile, - CachingPackageLocator locator) throws InterruptedException { + PackageIdentifier packageId, Path buildFile, CachingPackageLocator locator) + throws InterruptedException, IOException { ParserInputSource inputSource; - try { - inputSource = ParserInputSource.create(buildFile); - } catch (IOException e) { - List events = ImmutableList.of( - Event.error(Location.fromFile(buildFile), e.getMessage())); - return Preprocessor.Result.transientError(buildFile.asFragment(), events); - } + inputSource = ParserInputSource.create(buildFile); Globber globber = createLegacyGlobber(buildFile.getParentDirectory(), packageId, locator); try { - return preprocess(packageId, buildFile, inputSource, globber); + return preprocess(packageId, inputSource, globber); } finally { globber.onCompletion(); } @@ -1084,10 +1090,8 @@ public final class PackageFactory { * {@link InterruptedException}. */ public Preprocessor.Result preprocess( - PackageIdentifier packageId, - Path buildFile, - ParserInputSource inputSource, - Globber globber) throws InterruptedException { + PackageIdentifier packageId, ParserInputSource inputSource, Globber globber) + throws InterruptedException, IOException { Preprocessor preprocessor = preprocessorFactory.getPreprocessor(); if (preprocessor == null) { return Preprocessor.Result.noPreprocessing(inputSource); @@ -1099,10 +1103,6 @@ public final class PackageFactory { globber, Environment.BUILD, ruleFactory.getRuleClassNames()); - } catch (IOException e) { - List events = ImmutableList.of(Event.error(Location.fromFile(buildFile), - "preprocessing failed: " + e.getMessage())); - return Preprocessor.Result.transientError(buildFile.asFragment(), events); } catch (InterruptedException e) { globber.onInterrupt(); throw e; @@ -1238,12 +1238,19 @@ public final class PackageFactory { * @see PackageFactory#PackageFactory */ @VisibleForTesting // used by PackageFactoryApparatus - public Package.LegacyBuilder evaluateBuildFile(Package externalPkg, - PackageIdentifier packageId, BuildFileAST buildFileAST, Path buildFilePath, Globber globber, - Iterable pastEvents, RuleVisibility defaultVisibility, boolean containsError, - boolean containsTransientError, MakeEnvironment.Builder pkgMakeEnv, + public Package.LegacyBuilder evaluateBuildFile( + Package externalPkg, + PackageIdentifier packageId, + BuildFileAST buildFileAST, + Path buildFilePath, + Globber globber, + Iterable pastEvents, + RuleVisibility defaultVisibility, + boolean containsError, + MakeEnvironment.Builder pkgMakeEnv, Map imports, - ImmutableList