diff options
author | 2017-07-25 13:04:13 +0200 | |
---|---|---|
committer | 2017-07-25 13:17:55 +0200 | |
commit | 560b0ae4701dd2084160c45bb772396535b31f47 (patch) | |
tree | 899b898258e67fc8cdac4d2342849ecdc040386e /src/tools/android/java/com/google/devtools/build/android/ScopedTemporaryDirectory.java | |
parent | cd159bcee72a7f377621b45409807231a636f9e2 (diff) |
Fix ScopedTemporaryDirectory causes crash when filesystem doesn't support xattr.
PiperOrigin-RevId: 163053841
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/ScopedTemporaryDirectory.java')
-rw-r--r-- | src/tools/android/java/com/google/devtools/build/android/ScopedTemporaryDirectory.java | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/ScopedTemporaryDirectory.java b/src/tools/android/java/com/google/devtools/build/android/ScopedTemporaryDirectory.java index 4f6ba1e812..f7bcc88dfb 100644 --- a/src/tools/android/java/com/google/devtools/build/android/ScopedTemporaryDirectory.java +++ b/src/tools/android/java/com/google/devtools/build/android/ScopedTemporaryDirectory.java @@ -13,21 +13,30 @@ // limitations under the License. package com.google.devtools.build.android; +import static java.nio.file.attribute.PosixFilePermission.OWNER_EXECUTE; +import static java.nio.file.attribute.PosixFilePermission.OWNER_READ; +import static java.nio.file.attribute.PosixFilePermission.OWNER_WRITE; + import java.io.Closeable; import java.io.IOException; +import java.nio.file.FileStore; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.DosFileAttributeView; +import java.nio.file.attribute.PosixFileAttributeView; +import java.util.EnumSet; /** * Creates a temporary directory that will be deleted once a scope closes. NOTE: If an error occurs - * during deletion, it will just stop rather than try an continue. + * during deletion, it will just stop rather than try and continue. */ final class ScopedTemporaryDirectory extends SimpleFileVisitor<Path> implements Closeable { + private static final boolean IS_WINDOWS = System.getProperty("os.name").startsWith("Windows"); + private final Path path; public ScopedTemporaryDirectory(String prefix) throws IOException { @@ -38,14 +47,32 @@ final class ScopedTemporaryDirectory extends SimpleFileVisitor<Path> implements return this.path; } + private void makeWritable(Path file) throws IOException { + FileStore fileStore = Files.getFileStore(file); + if (IS_WINDOWS && fileStore.supportsFileAttributeView(DosFileAttributeView.class)) { + DosFileAttributeView dosAttribs = + Files.getFileAttributeView(file, DosFileAttributeView.class); + if (dosAttribs != null) { + dosAttribs.setReadOnly(false); + } + } else if (fileStore.supportsFileAttributeView(PosixFileAttributeView.class)) { + PosixFileAttributeView posixAttribs = + Files.getFileAttributeView(file, PosixFileAttributeView.class); + if (posixAttribs != null) { + posixAttribs.setPermissions(EnumSet.of(OWNER_READ, OWNER_WRITE, OWNER_EXECUTE)); + } + } + } + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + makeWritable(dir); + return FileVisitResult.CONTINUE; + } + @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - // Make the file deletable on Windows. - // Setting this attribute on other platforms than Windows has no effect. - DosFileAttributeView dosAttribs = Files.getFileAttributeView(path, DosFileAttributeView.class); - if (dosAttribs != null) { - dosAttribs.setReadOnly(false); - } + makeWritable(file); Files.delete(file); return FileVisitResult.CONTINUE; } |