Class: ODisk::Planner
- Inherits:
-
Opee::Collector
- Object
- Opee::Collector
- ODisk::Planner
- Defined in:
- lib/odisk/planner.rb
Overview
The Planner collects input in the form of Digests from a Digester and a Fetcher and then determines what actions are necessary to synchronize a directory. The Planner then asks Copiers and Crypters to perform the synchronization operations.
Defined Under Namespace
Classes: Step
Class Method Summary collapse
-
.sync_steps(pd, ld, rd, master = nil) ⇒ Object
master can be Step::LOCAL or Step::REMOTE and forces direction.
Instance Method Summary collapse
-
#initialize(options = {}) ⇒ Planner
constructor
A new instance of Planner.
- #set_options(options) ⇒ Object
Constructor Details
#initialize(options = {}) ⇒ Planner
Returns a new instance of Planner.
11 12 13 |
# File 'lib/odisk/planner.rb', line 11 def initialize(={}) super() end |
Class Method Details
.sync_steps(pd, ld, rd, master = nil) ⇒ Object
master can be Step::LOCAL or Step::REMOTE and forces direction
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/odisk/planner.rb', line 25 def self.sync_steps(pd, ld, rd, master=nil) steps = {} lh = {} rh = {} ph = {} ld.entries.each { |e| lh[e.name] = e } rd.entries.each { |e| rh[e.name] = e } pd.entries.each { |e| ph[e.name] = e } unless pd.nil? keys = lh.keys | rh.keys keys.each do |name| le = lh[name] re = rh[name] if re.nil? if Step::REMOTE == master steps[name] = Step.new(name, Step::LOCAL, Step::REMOVE) elsif le.is_a?(::ODisk::File) steps[name] = Step.new(name, Step::LOCAL, Step::COPY) elsif le.is_a?(::ODisk::Dir) steps[name] = Step.new(name, Step::LOCAL, Step::DIGEST) end elsif le.nil? if Step::LOCAL == master steps[name] = Step.new(name, Step::REMOTE, Step::REMOVE) elsif re.is_a?(::ODisk::File) steps[name] = Step.new(name, Step::REMOTE, Step::COPY) elsif re.is_a?(::ODisk::Dir) steps[name] = Step.new(name, Step::REMOTE, Step::DIGEST) end elsif le != re # both exist but are different if le.class != re.class ::Opee::Env.error("Conflict syncing #{ld.top_path}/#{name}. Local and remote types do not match.") steps[name] = Step.new(name, Step::LOCAL, Step::ERROR) elsif le.is_a?(::ODisk::File) || le.is_a?(::ODisk::Link) op = le.is_a?(::ODisk::File) ? Step::COPY : Step::LINK if Step::LOCAL == master steps[name] = Step.new(name, Step::LOCAL, op) if le.is_a?(::ODisk::File) elsif Step::REMOTE == master steps[name] = Step.new(name, Step::REMOTE, op) if re.is_a?(::ODisk::File) elsif le.removed # TBD elsif re.removed # TBD elsif le.mtime > re.mtime pe = ph[name] if pe.nil? || pe.mtime == re.mtime # Don't know if the content or the stats changed so copy it. steps[name] = Step.new(name, Step::LOCAL, op) if le.is_a?(::ODisk::File) else ::Opee::Env.error("Conflict syncing #{ld.top_path}/#{name}. Both local and remote have changed.") steps[name] = Step.new(name, Step::LOCAL, Step::ERROR) end elsif le.mtime < re.mtime # Don't know if the content or the stats changed so copy it. steps[name] = Step.new(name, Step::REMOTE, op) if re.is_a?(::ODisk::File) else # same times but different can't be good ::Opee::Env.error("Conflict syncing #{ld.top_path}/#{name}. Both local and remote have changed.") steps[name] = Step.new(name, Step::LOCAL, Step::ERROR) end end end end steps.empty? ? nil : steps end |
Instance Method Details
#set_options(options) ⇒ Object
15 16 17 18 19 20 21 22 |
# File 'lib/odisk/planner.rb', line 15 def () super() @dir_queue = [:dir_queue] @copy_queue = [:copy_queue] @crypt_queue = [:crypt_queue] @inputs = [:inputs] @fixer = [:fixer] end |