class Mclone::Volume

Constants

FILE
VERSION

Attributes

file[R]
id[R]

Public Class Methods

new(session, file) click to toggle source
# File lib/mclone.rb, line 390
def initialize(session, file)
  @loaded_tasks = ObjectSet.new
  @id = SecureRandom.hex(4)
  @session = session
  @file = file
end
restore(session, file) click to toggle source
# File lib/mclone.rb, line 398
def self.restore(session, file)
  obj = allocate
  obj.send(:from_file, session, file)
  obj
end

Public Instance Methods

commit!(force = false) click to toggle source
# File lib/mclone.rb, line 433
def commit!(force = false)
  if force || @session.force? || modified?
    # As a safeguard against malformed volume files generation, first write to a new file
    # and rename it to a real volume file only in case of normal turn of events
    _file = "#{file}~"
    begin
      open(_file, 'w') do |stream|
        stream << JSON.pretty_generate(to_h)
        tasks.commit!
      end
      FileUtils.mv(_file, file, force: true)
    ensure
      FileUtils.rm_f(_file)
    end
  end
  self
end
eql?(other) click to toggle source
# File lib/mclone.rb, line 422
def eql?(other)
  equal?(other) || id == other.id
end
hash() click to toggle source
# File lib/mclone.rb, line 417
def hash
  id.hash
end
modified?() click to toggle source
# File lib/mclone.rb, line 427
def modified?
  # Comparison against the original loaded tasks set allows to account for task removals
  (ts = tasks).modified? || ts != @loaded_tasks
end
root() click to toggle source
# File lib/mclone.rb, line 385
def root
  @root ||= File.realpath(File.dirname(file))
end
tasks() click to toggle source
# File lib/mclone.rb, line 452
def tasks
  TaskSet.new(self).merge!(@session.tasks)
end
to_h() click to toggle source
# File lib/mclone.rb, line 457
def to_h
  { mclone: VERSION, volume: id, tasks: tasks.collect { |task| task.to_h(self) } }
end

Private Instance Methods

from_file(session, file) click to toggle source
# File lib/mclone.rb, line 405
        def from_file(session, file)
  hash = JSON.parse(IO.read(file), symbolize_names: true)
  @loaded_tasks = ObjectSet.new
  @id = hash.extract(:volume)
  @session = session
  @file = file
  raise(Volume::Error, %(unsupported Mclone volume format version "#{version}")) unless hash.extract(:mclone) == VERSION
  hash.dig(:tasks)&.each { |h| session.tasks << (@loaded_tasks << Task.restore(@session, h)) }
  self
end