GeneratedPathConflictException(TraversalRequest traversal) { super( String.format( "Generated directory %s conflicts with package under the same path. Additional info: %s", traversal.path.getRelativePath().getPathString(), traversal.errorInfo != null ? traversal.errorInfo : traversal.toString())); }
@Override public SkyValue compute(SkyKey skyKey, Environment env) throws RecursiveFilesystemTraversalFunctionException { TraversalRequest traversal = (TraversalRequest) skyKey.argument(); try { // Stat the traversal root. FileInfo rootInfo = lookUpFileInfo(env, traversal); if (!rootInfo.type.exists()) { // May be a dangling symlink or a non-existent file. Handle gracefully. if (rootInfo.type.isSymlink()) { return resultForDanglingSymlink(traversal.path, rootInfo); } else { return RecursiveFilesystemTraversalValue.EMPTY; } } if (rootInfo.type.isFile()) { if (traversal.pattern == null || traversal .pattern .matcher(rootInfo.realPath.getRelativePath().getPathString()) .matches()) { // The root is a file or a symlink to one. return resultForFileRoot(traversal.path, rootInfo); } else { return RecursiveFilesystemTraversalValue.EMPTY; } } // Otherwise the root is a directory or a symlink to one. PkgLookupResult pkgLookupResult = checkIfPackage(env, traversal, rootInfo); traversal = pkgLookupResult.traversal; if (pkgLookupResult.isConflicting()) { // The traversal was requested for an output directory whose root-relative path conflicts // with a source package. We can't handle that, bail out. throw new RecursiveFilesystemTraversalFunctionException( new GeneratedPathConflictException(traversal)); } else if (pkgLookupResult.isPackage() && !traversal.skipTestingForSubpackage) { // The traversal was requested for a directory that defines a package. String msg = traversal.errorInfo + " crosses package boundary into package rooted at " + traversal.path.getRelativePath().getPathString(); switch (traversal.crossPkgBoundaries) { case CROSS: // We are free to traverse the subpackage but we need to display a warning. env.getListener().handle(new Event(EventKind.WARNING, null, msg)); break; case DONT_CROSS: // We cannot traverse the subpackage and should skip it silently. Return empty results. return RecursiveFilesystemTraversalValue.EMPTY; case REPORT_ERROR: // We cannot traverse the subpackage and should complain loudly (display an error). throw new RecursiveFilesystemTraversalFunctionException( new CannotCrossPackageBoundaryException(msg)); default: throw new IllegalStateException(traversal.toString()); } } // We are free to traverse this directory. Collection<SkyKey> dependentKeys = createRecursiveTraversalKeys(env, traversal); return resultForDirectory(traversal, rootInfo, traverseChildren(env, dependentKeys)); } catch (MissingDepException e) { return null; } }