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