Module: RubyLens::AtomicOutput

Defined in:
lib/rubylens/atomic_output.rb

Overview

Owner-only atomic replacement shared by every writer: outputs are staged in a 0600 temporary alongside the target and renamed into place, so a partial write never becomes visible and permissions never loosen mid-write.

Class Method Summary collapse

Class Method Details

.replace(output) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/rubylens/atomic_output.rb', line 13

def replace(output)
  output = File.expand_path(output)
  FileUtils.mkdir_p(File.dirname(output), mode: 0o700)
  temporary = File.join(File.dirname(output), ".#{File.basename(output)}.#{SecureRandom.hex(6)}.tmp")
  File.open(temporary, File::WRONLY | File::CREAT | File::EXCL, 0o600).close
  yield temporary
  File.chmod(0o600, temporary)
  File.rename(temporary, output)
  File.chmod(0o600, output)
  output
ensure
  FileUtils.rm_f(temporary) if temporary && File.exist?(temporary)
end