Method: Fuzz.update_file_object

Defined in:
lib/fuzz/fuzz.rb

.update_file_object(fo) ⇒ Object



278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
# File 'lib/fuzz/fuzz.rb', line 278

def self.update_file_object(fo)
  if File.writable?(fo.fullpath)
    log_verbose(%Q{Updating #{fo}...})
    ftmp = Tempfile.new(fo.name)
    log_verbose(%Q{+ Writing temp file #{ftmp.path}...})
    fo.lines.each { |ln| ftmp.print ln }
    ftmp.close(false) # close but do NOT unlink
    log_verbose(%Q{+ Replacing #{fo} with #{ftmp.path}})
    # create temporary backup
    ftmp2 = Tempfile.new(fo.name)
    ftmp2_name = ftmp2.path.dup
    ftmp2.close(true)
    mv(fo.fullpath, ftmp2_name)
    # replace original
    begin
      mv(ftmp.path, fo.fullpath)
      # preserve file mode
      chmod(File.lstat(ftmp2_name).mode, fo.fullpath)
    rescue
      log_error(%Q{FAILED updating #{fo}: #{$!}})
      # restore backup
      mv(ftmp2_name, fo.fullpath)
      raise
    end
    # remove backup
    File.unlink(ftmp2_name)
    log_verbose(%Q{Finished updating #{fo}.})
    return true
  else
    log_error(%Q{NO_ACCESS - cannot update #{fo}})
    return false
  end
end