aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android/java/com/google/devtools/build/android/ScopedTemporaryDirectory.java
diff options
context:
space:
mode:
authorGravatar philwo <philwo@google.com>2017-07-25 13:04:13 +0200
committerGravatar Jakob Buchgraber <buchgr@google.com>2017-07-25 13:17:55 +0200
commit560b0ae4701dd2084160c45bb772396535b31f47 (patch)
tree899b898258e67fc8cdac4d2342849ecdc040386e /src/tools/android/java/com/google/devtools/build/android/ScopedTemporaryDirectory.java
parentcd159bcee72a7f377621b45409807231a636f9e2 (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.java41
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;
}