Permalink
Browse files

Merge pull request #8027 from daenney/master

Atomic.rb assumes it may chown/chmod a file but doesn't handle the EPERM error.
  • Loading branch information...
2 parents 81679ab + 851f8c1 commit 71abfa511da77109b2bbf913dcee2f9e1606e66a @fxn fxn committed Oct 29, 2012
@@ -2,6 +2,8 @@
* Implement HashWithIndifferentAccess#replace so key? works correctly. *David Graham*
+* Handle the possible Permission Denied errors atomic.rb might trigger due to its chown and chmod calls. *Daniele Sluijters*
+
* Hash#extract! returns only those keys that present in the receiver.
{:a => 1, :b => 2}.extract!(:a, :x) # => {:a => 1}
@@ -36,8 +36,13 @@ def self.atomic_write(file_name, temp_dir = Dir.tmpdir)
FileUtils.mv(temp_file.path, file_name)
# Set correct permissions on new file
- chown(old_stat.uid, old_stat.gid, file_name)
- chmod(old_stat.mode, file_name)
+ begin
+ chown(old_stat.uid, old_stat.gid, file_name)
+ # This operation will affect filesystem ACL's
+ chmod(old_stat.mode, file_name)
+ rescue Errno::EPERM
+ # Changing file ownership failed, moving on.
+ end
end
# Private utility method.
@@ -3716,7 +3716,9 @@ File.atomic_write(joined_asset_path) do |cache|
end
```
-To accomplish this `atomic_write` creates a temporary file. That's the file the code in the block actually writes to. On completion, the temporary file is renamed, which is an atomic operation on POSIX systems. If the target file exists `atomic_write` overwrites it and keeps owners and permissions.
+To accomplish this `atomic_write` creates a temporary file. That's the file the code in the block actually writes to. On completion, the temporary file is renamed, which is an atomic operation on POSIX systems. If the target file exists `atomic_write` overwrites it and keeps owners and permissions. However there are a few cases where `atomic_write` cannot change the file ownership or permissions, this error is caught and skipped over trusting in the user/filesystem to ensure the file is accessible to the processes that need it.
+
+NOTE. Due to the chmod operation `atomic_write` performs, if the target file has an ACL set on it this ACL will be recalculated/modified.
WARNING. Note you can't append with `atomic_write`.

0 comments on commit 71abfa5

Please sign in to comment.