Fix SimpleLogHandler's symbolic link creation. Ensure we delete the previously existing symbolic link even if it's invalid. RELNOTES: None. PiperOrigin-RevId: 210582854
diff --git a/src/main/java/com/google/devtools/build/lib/util/SimpleLogHandler.java b/src/main/java/com/google/devtools/build/lib/util/SimpleLogHandler.java index d26a1bf..65862b4 100644 --- a/src/main/java/com/google/devtools/build/lib/util/SimpleLogHandler.java +++ b/src/main/java/com/google/devtools/build/lib/util/SimpleLogHandler.java
@@ -30,6 +30,7 @@ import java.lang.management.ManagementFactory; import java.nio.file.DirectoryStream; import java.nio.file.Files; +import java.nio.file.LinkOption; import java.nio.file.Path; import java.text.ParseException; import java.text.ParsePosition; @@ -758,7 +759,7 @@ // as fatal. try { checkState(symlinkPath.getParent().equals(output.getPath().getParent())); - if (Files.exists(symlinkPath)) { + if (Files.exists(symlinkPath, LinkOption.NOFOLLOW_LINKS)) { Files.delete(symlinkPath); } Files.createSymbolicLink(symlinkPath, output.getPath().getFileName());
diff --git a/src/test/java/com/google/devtools/build/lib/util/SimpleLogHandlerTest.java b/src/test/java/com/google/devtools/build/lib/util/SimpleLogHandlerTest.java index 4b88950..33a96f5 100644 --- a/src/test/java/com/google/devtools/build/lib/util/SimpleLogHandlerTest.java +++ b/src/test/java/com/google/devtools/build/lib/util/SimpleLogHandlerTest.java
@@ -224,6 +224,22 @@ } @Test + public void testSymbolicLinkInitiallyInvalidReplaced() throws Exception { + Path symlinkPath = Paths.get(tmp.getRoot().toString(), "hello"); + Files.createSymbolicLink(symlinkPath, Paths.get("no-such-file")); + + // Expected to delete the (invalid) symlink and replace with a symlink to the log + SimpleLogHandler handler = + SimpleLogHandler.builder().setPrefix(symlinkPath.toString()).build(); + handler.publish(new LogRecord(Level.SEVERE, "Hello world")); // To open the log file. + + assertThat(handler.getSymbolicLinkPath().toString()).isEqualTo(symlinkPath.toString()); + assertThat(Files.isSymbolicLink(handler.getSymbolicLinkPath())).isTrue(); + assertThat(Files.readSymbolicLink(handler.getSymbolicLinkPath()).toString()) + .isEqualTo(handler.getCurrentLogFilePath().get().getFileName().toString()); + } + + @Test public void testLogLevelEqualPublished() throws Exception { SimpleLogHandler handler = SimpleLogHandler.builder()