From 9c8e2572dc4ca041cf36743e4d563c7c5a3a871a Mon Sep 17 00:00:00 2001 From: Jack Nagel Date: Sat, 22 Mar 2014 10:20:39 -0500 Subject: Preserve permissions when using Pathname#atomic_write --- Library/Homebrew/extend/pathname.rb | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) (limited to 'Library/Homebrew/extend/pathname.rb') diff --git a/Library/Homebrew/extend/pathname.rb b/Library/Homebrew/extend/pathname.rb index 92b51f225..d37122951 100644 --- a/Library/Homebrew/extend/pathname.rb +++ b/Library/Homebrew/extend/pathname.rb @@ -96,12 +96,34 @@ class Pathname # NOTE always overwrites def atomic_write content - require 'tempfile' - tf = Tempfile.new(self.basename.to_s) + require "tempfile" + tf = Tempfile.new(basename.to_s) tf.write(content) tf.close - FileUtils.mv tf.path, self.to_s + + begin + old_stat = stat + rescue Errno::ENOENT + old_stat = default_stat + end + + FileUtils.mv tf.path, self + + begin + chown(old_stat.uid, old_stat.gid) + chmod(old_stat.mode) + rescue Errno::EPERM + end + end + + def default_stat + sentinel = parent.join(".brew.#{Process.pid}.#{rand(Time.now.to_i)}") + sentinel.open("w") { } + sentinel.stat + ensure + sentinel.unlink end + private :default_stat def cp dst if file? -- cgit v1.2.3