@Test public void recursiveIgnorePaths() throws IOException, InterruptedException { Path ignoredBuildFile = Paths.get("a", "b", "BUCK"); ImmutableSet<Path> ignore = ImmutableSet.of(ignoredBuildFile.getParent()); ProjectFilesystem filesystem = new ProjectFilesystem(tmp.getRoot().toPath(), ignore); Path buildFile = Paths.get("a", "BUCK"); filesystem.mkdirs(buildFile.getParent()); filesystem.writeContentsToPath("", buildFile); filesystem.mkdirs(ignoredBuildFile.getParent()); filesystem.writeContentsToPath("", ignoredBuildFile); // Test a recursive spec with an ignored dir. BuildFileSpec recursiveSpec = BuildFileSpec.fromRecursivePath(buildFile.getParent()); ImmutableSet<Path> expectedBuildFiles = ImmutableSet.of(filesystem.resolve(buildFile)); Cell cell = new TestCellBuilder().setFilesystem(filesystem).build(); ImmutableSet<Path> actualBuildFiles = recursiveSpec.findBuildFiles(cell); assertEquals(expectedBuildFiles, actualBuildFiles); }
/** * Writes the metadata currently stored in memory to the directory returned by {@link * BuildInfo#getPathToMetadataDirectory(BuildTarget)}. */ public void writeMetadataToDisk(boolean clearExistingMetadata) throws IOException { if (clearExistingMetadata) { projectFilesystem.deleteRecursivelyIfExists(pathToMetadataDirectory); } projectFilesystem.mkdirs(pathToMetadataDirectory); for (Map.Entry<String, String> entry : Iterables.concat(metadataToWrite.entrySet(), getBuildMetadata().entrySet())) { projectFilesystem.writeContentsToPath( entry.getValue(), pathToMetadataDirectory.resolve(entry.getKey())); } }
private int handleGet(Request baseRequest, HttpServletResponse response) throws IOException { if (!artifactCache.isPresent()) { response.getWriter().write("Serving local cache is disabled for this instance."); return HttpServletResponse.SC_INTERNAL_SERVER_ERROR; } String path = baseRequest.getUri().getPath(); String[] pathElements = path.split("/"); if (pathElements.length != 4 || !pathElements[2].equals("key")) { response.getWriter().write("Incorrect url format."); return HttpServletResponse.SC_INTERNAL_SERVER_ERROR; } RuleKey ruleKey = new RuleKey(pathElements[3]); Path temp = null; try { projectFilesystem.mkdirs(projectFilesystem.getBuckPaths().getScratchDir()); temp = projectFilesystem.createTempFile( projectFilesystem.getBuckPaths().getScratchDir(), "outgoing_rulekey", ".tmp"); CacheResult fetchResult = artifactCache.get().fetch(ruleKey, LazyPath.ofInstance(temp)); if (!fetchResult.getType().isSuccess()) { return HttpServletResponse.SC_NOT_FOUND; } final Path tempFinal = temp; HttpArtifactCacheBinaryProtocol.FetchResponse fetchResponse = new HttpArtifactCacheBinaryProtocol.FetchResponse( ImmutableSet.of(ruleKey), fetchResult.getMetadata(), new ByteSource() { @Override public InputStream openStream() throws IOException { return projectFilesystem.newFileInputStream(tempFinal); } }); fetchResponse.write(response.getOutputStream()); response.setContentLengthLong(fetchResponse.getContentLength()); return HttpServletResponse.SC_OK; } finally { if (temp != null) { projectFilesystem.deleteFileAtPathIfExists(temp); } } }
private int handlePut(Request baseRequest, HttpServletResponse response) throws IOException { if (!artifactCache.isPresent()) { response.getWriter().write("Serving local cache is disabled for this instance."); return HttpServletResponse.SC_INTERNAL_SERVER_ERROR; } Path temp = null; try { projectFilesystem.mkdirs(projectFilesystem.getBuckPaths().getScratchDir()); temp = projectFilesystem.createTempFile( projectFilesystem.getBuckPaths().getScratchDir(), "incoming_upload", ".tmp"); StoreResponseReadResult storeRequest; try (DataInputStream requestInputData = new DataInputStream(baseRequest.getInputStream()); OutputStream tempFileOutputStream = projectFilesystem.newFileOutputStream(temp)) { storeRequest = HttpArtifactCacheBinaryProtocol.readStoreRequest( requestInputData, tempFileOutputStream); } if (!storeRequest.getActualHashCode().equals(storeRequest.getExpectedHashCode())) { response.getWriter().write("Checksum mismatch."); return HttpServletResponse.SC_NOT_ACCEPTABLE; } artifactCache .get() .store( ArtifactInfo.builder() .setRuleKeys(storeRequest.getRuleKeys()) .setMetadata(storeRequest.getMetadata()) .build(), BorrowablePath.notBorrowablePath(temp)); return HttpServletResponse.SC_ACCEPTED; } finally { if (temp != null) { projectFilesystem.deleteFileAtPathIfExists(temp); } } }
/** * @param pathRelativeToProjectRoot Must identify a file, not a directory. (Unfortunately, we have * no way to assert this because the path is not expected to exist yet.) */ public void createParentDirs(Path pathRelativeToProjectRoot) throws IOException { Path file = resolve(pathRelativeToProjectRoot); Path directory = file.getParent(); mkdirs(directory); }
/** * // @deprecated Prefer operating on {@code Path}s directly, replaced by {@link * #createParentDirs(java.nio.file.Path)}. */ public void createParentDirs(String pathRelativeToProjectRoot) throws IOException { Path file = getPathForRelativePath(pathRelativeToProjectRoot); mkdirs(file.getParent()); }