This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-filtering.git


The following commit(s) were added to refs/heads/master by this push:
     new 442b63e  [MSHARED-1330] Always overwrite files (#97)
442b63e is described below

commit 442b63ec58074c3bfa50ddbe6d9cfee30934f4a1
Author: Guillaume Nodet <gno...@gmail.com>
AuthorDate: Sat Mar 2 09:52:12 2024 +0100

    [MSHARED-1330] Always overwrite files (#97)
---
 .../maven/shared/filtering/FilteringUtils.java      | 21 +++++++++++++++++++++
 .../maven/shared/filtering/FilteringUtilsTest.java  | 17 +++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git 
a/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java 
b/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java
index 3d4fa86..6c1f3d3 100644
--- a/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java
+++ b/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java
@@ -26,6 +26,8 @@ import java.io.Writer;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.NoSuchFileException;
+import java.nio.file.attribute.PosixFilePermission;
+import java.util.EnumSet;
 import java.util.StringTokenizer;
 import java.util.regex.Pattern;
 
@@ -305,6 +307,8 @@ public final class FilteringUtils {
      * @throws IOException if an IO error occurs during copying or filtering
      */
     public static void copyFile(File from, File to, String encoding, 
FilterWrapper[] wrappers) throws IOException {
+        setReadWritePermissions(to);
+
         if (wrappers == null || wrappers.length == 0) {
             try (OutputStream os = new CachingOutputStream(to.toPath())) {
                 Files.copy(from.toPath(), os);
@@ -371,6 +375,23 @@ public final class FilteringUtils {
         }
     }
 
+    @SuppressWarnings("ResultOfMethodCallIgnored")
+    private static void setReadWritePermissions(File file) throws IOException {
+        if (file.exists()) {
+            try {
+                Files.setPosixFilePermissions(
+                        file.toPath(),
+                        EnumSet.of(
+                                PosixFilePermission.OWNER_READ, 
PosixFilePermission.OWNER_WRITE,
+                                PosixFilePermission.GROUP_READ, 
PosixFilePermission.GROUP_WRITE,
+                                PosixFilePermission.OTHERS_READ, 
PosixFilePermission.OTHERS_WRITE));
+            } catch (UnsupportedOperationException e) {
+                file.setReadable(true);
+                file.setWritable(true);
+            }
+        }
+    }
+
     private static Charset charset(String encoding) {
         if (encoding == null || encoding.isEmpty()) {
             return Charset.defaultCharset();
diff --git 
a/src/test/java/org/apache/maven/shared/filtering/FilteringUtilsTest.java 
b/src/test/java/org/apache/maven/shared/filtering/FilteringUtilsTest.java
index d6a64a7..5392b3d 100644
--- a/src/test/java/org/apache/maven/shared/filtering/FilteringUtilsTest.java
+++ b/src/test/java/org/apache/maven/shared/filtering/FilteringUtilsTest.java
@@ -30,6 +30,7 @@ import org.junit.jupiter.api.Test;
 
 import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 
 /**
  * @author John Casey
@@ -148,4 +149,20 @@ class FilteringUtilsTest {
                 "jdbc:derby:C:\\\\Users\\\\Administrator/test;create=true",
                 
FilteringUtils.escapeWindowsPath("jdbc:derby:C:\\Users\\Administrator/test;create=true"));
     }
+
+    // MSHARED-1330
+    @Test
+    void copyReadOnlyFileTwice() throws Exception {
+        File temp = File.createTempFile("pre-", ".txt");
+        temp.setReadOnly();
+
+        File out = File.createTempFile("out-", ".txt");
+        out.delete();
+
+        FilteringUtils.copyFile(temp, out, "UTF-8", new FilterWrapper[0]);
+        assertFalse(out.canWrite());
+
+        FilteringUtils.copyFile(temp, out, "UTF-8", new FilterWrapper[0]);
+        assertFalse(out.canWrite());
+    }
 }

Reply via email to