s3_meta_sync 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4f29dd0019e474ba1364be76ebfd587faff17782
4
- data.tar.gz: a849c0d899cc4165741cda9c222ff8c817bd54c2
3
+ metadata.gz: b2ae988de36b8fabaa5dfa6f19726fc971b46133
4
+ data.tar.gz: 50e7f0a149cb5ed3bd3d6c09c9b32e2998118996
5
5
  SHA512:
6
- metadata.gz: a0e544f47de061d2acb397f36474d2c91c69688ec1588b818a93c16b592c0862f906f9cb4f749c348008f15a1eacb534d8d549c6d30fee077983296f5fde0cd3
7
- data.tar.gz: 317dd76fb942a58c8f60ccd41f2d27fe2a2bb2cd7acf54b7dca3ac21c7a60fa738dbbaa3162efdfb2368de3423f215134fc2c1275f825828463e4784c35fa157
6
+ metadata.gz: fa22acee1c5ecac7af983b52fa856948fb7c98f8b66bd374f5f869b24d08d725f6c083ebd89c6c440df3cd14ec50cfa0603546c8bfe899cf3bf1e5ddd09428fb
7
+ data.tar.gz: c6e7d3927654ec728757431865ced2cd2a08db8f5b78e9fe9a306f55a9b4c3527af8d114dffd5c2d3aa1fb92d5efdef22682787597bbf3a62270dcc71d3b42de
checksums.yaml.gz.sig CHANGED
Binary file
@@ -1,3 +1,3 @@
1
1
  module S3MetaSync
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
3
3
  end
data/lib/s3_meta_sync.rb CHANGED
@@ -34,31 +34,33 @@ module S3MetaSync
34
34
  remote_info = begin
35
35
  download_meta(destination)
36
36
  rescue RemoteWithoutMeta
37
+ log "Remote has no .s3-meta-sync, uploading everything"
37
38
  {}
38
39
  end
39
40
  generate_meta(source)
40
41
  local_info = read_meta(source)
42
+ upload = local_info.select { |path, md5| remote_info[path] != md5 }.map(&:first)
43
+ delete = remote_info.keys - local_info.keys
41
44
 
42
- in_multiple_processes(local_info) do |path, md5|
43
- next if remote_info[path] == md5
44
- upload_file(source, path, destination)
45
- end
46
-
47
- delete_remote_files(destination, remote_info.keys - local_info.keys)
48
-
45
+ upload_files(source, destination, upload)
46
+ delete_remote_files(destination, delete)
49
47
  upload_file(source, META_FILE, destination)
50
48
  end
51
49
 
52
50
  def upload_file(source, path, destination)
51
+ log "Uploading #{path}"
53
52
  s3.objects["#{destination}/#{path}"].write File.read("#{source}/#{path}"), :acl => :public_read
54
53
  end
55
54
 
56
55
  def delete_remote_files(remote, paths)
56
+ paths.each { |path| log "Deleting #{@bucket}:#{remote}/#{path}" }
57
57
  s3.objects.delete paths.map { |path| "#{remote}/#{path}" }
58
58
  end
59
59
 
60
60
  def delete_local_files(local, paths)
61
- File.delete(*paths.map { |path| "#{local}/#{path}" })
61
+ paths = paths.map { |path| "#{local}/#{path}" }
62
+ paths.each { |path| log "Deleting #{path}" }
63
+ File.delete(*paths)
62
64
  end
63
65
 
64
66
  def s3
@@ -94,6 +96,7 @@ module S3MetaSync
94
96
  end
95
97
 
96
98
  def download_content(path)
99
+ log "Downloading #{path}"
97
100
  url = "https://s3#{"-#{region}" if region}.amazonaws.com/#{@bucket}/#{path}"
98
101
  open(url).read
99
102
  rescue OpenURI::HTTPError
@@ -103,27 +106,39 @@ module S3MetaSync
103
106
  def download(source, destination)
104
107
  remote_info = download_meta(source)
105
108
  generate_meta(destination)
106
- local_info = read_meta(destination) # TODO maybe generate !?
107
-
108
- in_multiple_processes(remote_info) do |path, md5|
109
- next if local_info[path] == md5
110
- download_file(source, path, destination)
111
- end
112
-
113
- delete_local_files(destination, local_info.keys - remote_info.keys)
109
+ local_info = read_meta(destination)
110
+ download = remote_info.select { |path, md5| local_info[path] != md5 }.map(&:first)
111
+ delete = local_info.keys - remote_info.keys
114
112
 
113
+ download_files(source, destination, download)
114
+ delete_local_files(destination, delete)
115
115
  download_file(source, META_FILE, destination)
116
+ delete_empty_folders(destination)
117
+ end
116
118
 
119
+ def delete_empty_folders(destination)
117
120
  `find #{destination} -depth -empty -delete`
118
121
  end
119
122
 
123
+ def download_files(source, destination, paths)
124
+ in_parallel(:threads, paths) { |path| download_file(source, path, destination) }
125
+ end
126
+
127
+ def upload_files(source, destination, paths)
128
+ in_parallel(:processes, paths) { |path| upload_file(source, path, destination) }
129
+ end
130
+
120
131
  def region
121
132
  @config[:region] unless @config[:region].to_s.empty?
122
133
  end
123
134
 
124
- def in_multiple_processes(data, &block)
135
+ def in_parallel(way, data, &block)
125
136
  processes = [@config[:parallel] || 10, data.size].min
126
- Parallel.each(data, :in_processes => processes, &block) # we tried threads but that blew up with weird errors when having lot's of uploads :/
137
+ Parallel.each(data, :"in_#{way}" => processes, &block) # we tried threads but that blew up with weird errors when having lot's of uploads :/
138
+ end
139
+
140
+ def log(text)
141
+ $stderr.puts text if @config[:verbose]
127
142
  end
128
143
  end
129
144
 
@@ -157,6 +172,7 @@ module S3MetaSync
157
172
  opts.on("-s", "--secret SECRET", "AWS secret key") { |c| options[:secret] = c }
158
173
  opts.on("-r", "--region REGION", "AWS region if not us-standard") { |c| options[:region] = c }
159
174
  opts.on("-p", "--parallel COUNT", Integer, "Use COUNT processes for download/upload default: 10") { |c| options[:parallel] = c }
175
+ opts.on("-V", "--verbose", "Verbose mode"){ options[:verbose] = true }
160
176
  opts.on("-h", "--help", "Show this.") { puts opts; exit }
161
177
  opts.on("-v", "--version", "Show Version"){ puts VERSION; exit}
162
178
  end.parse!(argv)
data.tar.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
- f�1]a��Q�׭I������u}��X��fƍ[$iG�(D=�e�`J,ږN]
2
- #�:��v�N���Ciu(����Qx_Ǹ��s%�S���/�$���K`+�у�I4
1
+
2
+ l�.N�!�hD��j���������N���7$u+�D��=��ݤ&Hl��$6���^���/vq<�n�L����rj0�^����6*:2 �\��Ѿe� �An�{��-f^<��������uUe��f�0����V�g�_�&(w˦���(JGU���,�(�=O������6��!�*3_+rr��.�������}GT�Ԯ0����w��R���z!�cB��%G�M����ɿ��r�2a�heV���8�
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: s3_meta_sync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
@@ -29,7 +29,7 @@ cert_chain:
29
29
  y0kCSWmK6D+x/SbfS6r7Ke07MRqziJdB9GuE1+0cIRuFh8EQ+LN6HXCKM5pon/GU
30
30
  ycwMXfl0
31
31
  -----END CERTIFICATE-----
32
- date: 2013-09-26 00:00:00.000000000 Z
32
+ date: 2013-09-27 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: aws-sdk
metadata.gz.sig CHANGED
Binary file