12
13
14
15
16
17
18
19
20
21
22
23
24
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
|
# File 'lib/cloudinary/static.rb', line 12
def sync(options={})
options = options.clone
delete_missing = options.delete(:delete_missing)
found_paths = Set.new
found_public_paths = {}
found_public_ids = Set.new
metadata = build_metadata
metadata_lines = []
counts = { :not_changed => 0, :uploaded => 0, :deleted => 0, :not_found => 0}
discover_all do |path, public_path|
next if found_paths.include?(path)
if found_public_paths[public_path]
print "Warning: duplicate #{public_path} in #{path} - already taken from #{found_public_paths[public_path]}\n"
next
end
found_paths << path
found_public_paths[public_path] = path
data = root.join(path).read(:mode=>"rb")
ext = path.extname
format = ext[1..-1]
md5 = Digest::MD5.hexdigest(data)
public_id = "#{public_path.basename(ext)}-#{md5}"
found_public_ids << public_id
item_metadata = metadata.delete(public_path.to_s)
if item_metadata && item_metadata["public_id"] == public_id counts[:not_changed] += 1
print "#{public_path} - #{public_id} - Not changed\n"
result = item_metadata
else
counts[:uploaded] += 1
print "#{public_path} - #{public_id} - Uploading\n"
result = Cloudinary::Uploader.upload(Cloudinary::Blob.new(data, :original_filename=>path.to_s),
options.merge(:format=>format, :public_id=>public_id, :type=>:asset, :resource_type=>resource_type(path.to_s))
).merge("upload_time"=>Time.now)
end
metadata_lines << [public_path, public_id, result["upload_time"].to_i, result["version"], result["width"], result["height"]].join("\t")+"\n"
end
File.open(metadata_file_path, "w"){|f| f.print(metadata_lines.join)}
metadata.to_a.each do |path, info|
counts[:not_found] += 1
print "#{path} - #{info["public_id"]} - Not found\n"
end
trash = metadata.to_a + build_metadata(metadata_trash_file_path, false).reject{|public_path, info| found_public_ids.include?(info["public_id"])}
if delete_missing
trash.each do
|path, info|
counts[:deleted] += 1
print "#{path} - #{info["public_id"]} - Deleting\n"
Cloudinary::Uploader.destroy(info["public_id"], options.merge(:type=>:asset))
end
FileUtils.rm_f(metadata_trash_file_path)
else
metadata_lines = trash.map do
|public_path, info|
[public_path, info["public_id"], info["upload_time"].to_i, info["version"], info["width"], info["height"]].join("\t")+"\n"
end
File.open(metadata_trash_file_path, "w"){|f| f.print(metadata_lines.join)}
end
print "\nCompleted syncing static resources to Cloudinary\n"
print counts.sort.reject{|k,v| v == 0}.map{|k,v| "#{v} #{k.to_s.gsub('_', ' ').capitalize}"}.join(", ") + "\n"
end
|