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
|
# File 'lib/hem/lib/s3/sync.rb', line 31
def sync source, dest, opts = {}
delta = {:add => [], :remove => []}
handle_s3_error do
opts = {
:delete => true,
:dry => false,
:progress => Hem.method(:progress)
}.merge(opts)
source_io = io_handler(source)
destination_io = io_handler(dest)
logger.debug("s3sync: Synchronzing (#{source_io.class.name} -> #{destination_io.class.name}")
raise "S3 -> S3 synchronisation not supported" if source_io.is_a? Remote and destination_io.is_a? Remote
source_listing = source_io.ls
destination_listing = destination_io.ls
logger.debug("s3sync: Source listing - #{source_listing}")
logger.debug("s3sync: Destination listing - #{destination_listing}")
delta = delta(source_listing, destination_listing)
logger.debug("s3sync: Delta #{delta}")
break if opts[:dry]
delta[:add].each do |file|
logger.debug("s3sync: Synchronizing #{file}")
source_file = source_io.open(file, "r")
destination_file = destination_io.open(file, "wb+")
source_file.buffer
size = source_file.size
destination_file.copy_from(source_file.read_io, :content_length => size) do |chunk|
opts[:progress].call(file, (chunk || '').length, size, :update)
end
destination_file.close
source_file.close
opts[:progress].call(file, 0, size, :finish)
end
break unless opts[:delete]
delta[:remove].each do |file|
logger.debug("s3sync: Removing #{file}")
destination_io.rm(file)
end
end
return delta
end
|