Sha256: c1878e8b5fb054e751581fd6e25070281f652df787ed246b42ba5a98d8e9e3b4

Contents?: true

Size: 1.33 KB

Versions: 5

Compression:

Stored size: 1.33 KB

Contents

module Autoproj
    module Ops
        # Shamelessly stolen from ActiveSupport
        def self.atomic_write(file_name, temp_dir = Dir.tmpdir)
            require "tempfile" unless defined?(Tempfile)
            require "fileutils" unless defined?(FileUtils)

            temp_file = Tempfile.new(File.basename(file_name), temp_dir)
            yield temp_file
            temp_file.flush
            begin temp_file.fsync
            rescue NotImplementedError
            end
            temp_file.close

            begin
                # Get original file permissions
                old_stat = File.stat(file_name)
            rescue Errno::ENOENT
                # No old permissions, write a temp file to determine the defaults
                check_name = File.join(
                    File.dirname(file_name), ".permissions_check.#{Thread.current.object_id}.#{Process.pid}.#{rand(1000000)}"
                )
                File.open(check_name, "w") {}
                old_stat = File.stat(check_name)
                File.unlink(check_name)
            end

            # Overwrite original file with temp file
            FileUtils.mv(temp_file.path, file_name)

            # Set correct permissions on new file
            File.chown(old_stat.uid, old_stat.gid, file_name)
            File.chmod(old_stat.mode, file_name)
        end
    end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
autoproj-2.16.0 lib/autoproj/ops/atomic_write.rb
autoproj-2.15.3 lib/autoproj/ops/atomic_write.rb
autoproj-2.15.2 lib/autoproj/ops/atomic_write.rb
autoproj-2.15.1 lib/autoproj/ops/atomic_write.rb
autoproj-2.15.0 lib/autoproj/ops/atomic_write.rb