Skip to content

Commit 3e19ef6

Browse files
committed
Only set POSIX permissions if needed
Only callers of PathUtils.setPosixPermissions(...) are affected: - PathUtils.setReadOnly(...) - PathUtils.deleteFile(..., DeleteOption...) - CleaningPathVisitor - DeletingPathVisitor
1 parent 4b47b44 commit 3e19ef6

2 files changed

Lines changed: 15 additions & 3 deletions

File tree

src/changes/changes.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ The <action> type attribute can be add,update,fix,remove.
108108
<action dev="ggregory" type="fix" issue="IO-469" due-to="Grigory Fadeev, Kristian Rosenvold, Elliotte Rusty Harold">"Self-suppression not permitted" while using BrokenOutput and BrokenInput streams with try-with-resources.</action>
109109
<action dev="ggregory" type="fix" issue="IO-405" due-to="Elliotte Rusty Harold">Handle zero and negative thresholds #587.</action>
110110
<action dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate CountingInputStream in favor of BoundedInputStream.</action>
111+
<action dev="ggregory" type="fix" due-to="Gary Gregory">PathUtils.setPosixPermissions(...) only sets permissions if needed.</action>
112+
<action dev="ggregory" type="fix" due-to="Gary Gregory">PathUtils.setReadOnly(...) only sets permissions if needed.</action>
113+
<action dev="ggregory" type="fix" due-to="Gary Gregory">PathUtils.deleteFile(..., DeleteOption...) only sets permissions if needed.</action>
114+
<action dev="ggregory" type="fix" due-to="Gary Gregory">CleaningPathVisitor only sets permissions if needed.</action>
115+
<action dev="ggregory" type="fix" due-to="Gary Gregory">DeletingPathVisitor only sets permissions if needed.</action>
111116
<!-- Add -->
112117
<action dev="ggregory" type="add" due-to="Gary Gregory">Add and use PathUtils.getFileName(Path, Function&lt;Path, R&gt;).</action>
113118
<action dev="ggregory" type="add" due-to="Gary Gregory">Add and use PathUtils.getFileNameString().</action>

src/main/java/org/apache/commons/io/file/PathUtils.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import java.util.Collections;
6161
import java.util.Comparator;
6262
import java.util.EnumSet;
63+
import java.util.HashSet;
6364
import java.util.List;
6465
import java.util.Objects;
6566
import java.util.Set;
@@ -1518,6 +1519,9 @@ private static boolean setPosixDeletePermissions(final Path parent, final boolea
15181519

15191520
/**
15201521
* Low-level POSIX permission operation to set permissions.
1522+
* <p>
1523+
* If the permissions to update are already set, then make no additional calls.
1524+
* </p>
15211525
*
15221526
* @param path Set this path's permissions.
15231527
* @param addPermissions true to add, false to remove.
@@ -1530,12 +1534,15 @@ private static boolean setPosixPermissions(final Path path, final boolean addPer
15301534
final LinkOption... linkOptions) throws IOException {
15311535
if (path != null) {
15321536
final Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(path, linkOptions);
1537+
final Set<PosixFilePermission> newPermissions = new HashSet<>(permissions);
15331538
if (addPermissions) {
1534-
permissions.addAll(updatePermissions);
1539+
newPermissions.addAll(updatePermissions);
15351540
} else {
1536-
permissions.removeAll(updatePermissions);
1541+
newPermissions.removeAll(updatePermissions);
1542+
}
1543+
if (!newPermissions.equals(permissions)) {
1544+
Files.setPosixFilePermissions(path, newPermissions);
15371545
}
1538-
Files.setPosixFilePermissions(path, permissions);
15391546
return true;
15401547
}
15411548
return false;

0 commit comments

Comments
 (0)