middleman-s3_sync 3.0.9 → 3.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/middleman-s3_sync.rb +105 -79
- data/lib/middleman-s3_sync/commands.rb +6 -1
- data/lib/middleman-s3_sync/version.rb +1 -1
- metadata +4 -4
data/lib/middleman-s3_sync.rb
CHANGED
@@ -14,92 +14,49 @@ module Middleman
|
|
14
14
|
module S3Sync
|
15
15
|
class << self
|
16
16
|
def sync
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
.map { |f| f.gsub(/^#{options.build_dir}\//, '') }
|
22
|
-
puts "Gathering remote files from #{options.bucket}"
|
23
|
-
remote_files = bucket.files.map { |f| f.key }
|
24
|
-
|
25
|
-
if options.force
|
26
|
-
files_to_push = local_files
|
27
|
-
else
|
28
|
-
# First pass on the set of files to work with.
|
29
|
-
puts "Determine files to add to #{options.bucket}."
|
30
|
-
files_to_push = local_files - remote_files
|
31
|
-
if options.delete
|
32
|
-
puts "Determine which files to delete from #{options.bucket}"
|
33
|
-
files_to_delete = remote_files - local_files
|
34
|
-
end
|
35
|
-
files_to_evaluate = local_files - files_to_push
|
36
|
-
|
37
|
-
# No need to evaluate the files that are newer on S3 than the local files.
|
38
|
-
puts "Determine which local files are newer than their S3 counterparts"
|
39
|
-
files_to_reject = []
|
40
|
-
Parallel.each(files_to_evaluate, :in_threads => 4) do |f|
|
41
|
-
print '.'
|
42
|
-
local_mtime = File.mtime("#{options.build_dir}/#{f}")
|
43
|
-
remote_mtime = s3_files.get(f).last_modified
|
44
|
-
files_to_reject << f if remote_mtime >= local_mtime
|
45
|
-
end
|
17
|
+
if files_to_create.empty? && files_to_update.empty? && files_to_delete.empty?
|
18
|
+
puts "\nAll S3 files are up to date."
|
19
|
+
return
|
20
|
+
end
|
46
21
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
22
|
+
puts "\nReady to apply updates to #{options.bucket}."
|
23
|
+
|
24
|
+
files_to_create.each do |f|
|
25
|
+
puts "Creating #{f}"
|
26
|
+
file_hash = {
|
27
|
+
:key => f,
|
28
|
+
:body => File.open(local_path(f)),
|
29
|
+
:public => true,
|
30
|
+
:acl => 'public-read',
|
31
|
+
:content_type => MIME::Types.of(f).first
|
32
|
+
}
|
33
|
+
|
34
|
+
# Add cache-control headers
|
35
|
+
if policy = options.caching_policy_for(file_hash[:content_type])
|
36
|
+
file_hash[:cache_control] = policy.cache_control if policy.cache_control
|
37
|
+
file_hash[:expires] = policy.expires if policy.expires
|
58
38
|
end
|
39
|
+
|
40
|
+
bucket.files.create(file_hash)
|
59
41
|
end
|
60
42
|
|
61
|
-
|
62
|
-
puts "
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
if policy = options.caching_policy_for(file.content_type)
|
71
|
-
file.cache_control = policy.cache_control if policy.cache_control
|
72
|
-
file.expires = policy.expires if policy.expires
|
73
|
-
end
|
74
|
-
|
75
|
-
file.save
|
76
|
-
else
|
77
|
-
puts "Creating #{f}"
|
78
|
-
file_hash = {
|
79
|
-
:key => f,
|
80
|
-
:body => File.open("#{options.build_dir}/#{f}"),
|
81
|
-
:public => true,
|
82
|
-
:acl => 'public-read',
|
83
|
-
:content_type => MIME::Types.of(f).first
|
84
|
-
}
|
85
|
-
|
86
|
-
# Add cache-control headers
|
87
|
-
if policy = options.caching_policy_for(file_hash[:content_type])
|
88
|
-
file_hash[:cache_control] = policy.cache_control if policy.cache_control
|
89
|
-
file_hash[:expires] = policy.expires if policy.expires
|
90
|
-
end
|
91
|
-
|
92
|
-
file = bucket.files.create(file_hash)
|
93
|
-
end
|
43
|
+
files_to_update.each do |f|
|
44
|
+
puts "Updating #{f}"
|
45
|
+
file = s3_files.get(f)
|
46
|
+
file.body = File.open(local_path(f))
|
47
|
+
file.public = true
|
48
|
+
file.content_type = MIME::Types.of(f).first
|
49
|
+
if policy = options.caching_policy_for(file.content_type)
|
50
|
+
file.cache_control = policy.cache_control if policy.cache_control
|
51
|
+
file.expires = policy.expires if policy.expires
|
94
52
|
end
|
95
|
-
|
96
|
-
|
53
|
+
|
54
|
+
file.save
|
97
55
|
end
|
98
56
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
file = s3_files.get(f)
|
57
|
+
files_to_delete.each do |f|
|
58
|
+
puts "Deleting #{f}"
|
59
|
+
if file = s3_files.get(f)
|
103
60
|
file.destroy
|
104
61
|
end
|
105
62
|
end
|
@@ -122,6 +79,75 @@ module Middleman
|
|
122
79
|
def s3_files
|
123
80
|
@s3_files ||= bucket.files
|
124
81
|
end
|
82
|
+
|
83
|
+
def remote_files
|
84
|
+
@remote_files ||= begin
|
85
|
+
puts "Gathering remote files from #{options.bucket}"
|
86
|
+
bucket.files.map { |f| f.key }
|
87
|
+
end
|
88
|
+
end
|
89
|
+
def local_files
|
90
|
+
@local_files ||= begin
|
91
|
+
puts "Gathering local files."
|
92
|
+
(Dir[build_dir + "/**/*"] + Dir[build_dir + "/**/.*"])
|
93
|
+
.reject { |f| File.directory?(f) }
|
94
|
+
.map { |f| f.gsub(/^#{build_dir}\//, '') }
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def files_to_delete
|
99
|
+
@files_to_delete ||= begin
|
100
|
+
if options.delete
|
101
|
+
puts "\nDetermine which files to delete from #{options.bucket}"
|
102
|
+
remote_files - local_files
|
103
|
+
else
|
104
|
+
[]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def files_to_create
|
110
|
+
@files_to_create ||= begin
|
111
|
+
puts "Determine files to add to #{options.bucket}."
|
112
|
+
local_files - remote_files
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def files_to_evaluate
|
117
|
+
@files_to_evaluate ||= begin
|
118
|
+
local_files - files_to_create
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def files_to_update
|
123
|
+
return files_to_evaluate if options.force
|
124
|
+
|
125
|
+
@files_to_update ||= begin
|
126
|
+
puts "Determine which local files to update their S3 counterparts"
|
127
|
+
files_to_update = []
|
128
|
+
Parallel.each(files_to_evaluate, :in_threads => 4) do |f|
|
129
|
+
print '.'
|
130
|
+
remote_file = s3_files.get(f)
|
131
|
+
local_mtime = File.mtime(local_path(f))
|
132
|
+
remote_mtime = remote_file.last_modified
|
133
|
+
if remote_mtime < local_mtime
|
134
|
+
local_md5 = Digest::MD5.hexdigest(File.read(local_path(f)))
|
135
|
+
remote_md5 = remote_file.etag
|
136
|
+
files_to_update << f if local_md5 != remote_md5
|
137
|
+
end
|
138
|
+
end
|
139
|
+
puts ""
|
140
|
+
files_to_update
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def local_path(f)
|
145
|
+
"#{build_dir}/#{f}"
|
146
|
+
end
|
147
|
+
|
148
|
+
def build_dir
|
149
|
+
@build_dir ||= options.build_dir
|
150
|
+
end
|
125
151
|
end
|
126
152
|
end
|
127
153
|
end
|
@@ -11,10 +11,14 @@ module Middleman
|
|
11
11
|
true
|
12
12
|
end
|
13
13
|
|
14
|
-
desc "s3_sync", "
|
14
|
+
desc "s3_sync", "Pushes the minimum set of files needed to S3"
|
15
15
|
option :force, type: :boolean,
|
16
16
|
desc: "Push all local files to the server",
|
17
17
|
aliases: :f
|
18
|
+
option :bucket, type: :string,
|
19
|
+
desc: "Specify which bucket to use, overrides the configured bucket.",
|
20
|
+
aliases: :b
|
21
|
+
|
18
22
|
def s3_sync
|
19
23
|
shared_inst = ::Middleman::Application.server.inst
|
20
24
|
bucket = shared_inst.options.bucket
|
@@ -23,6 +27,7 @@ module Middleman
|
|
23
27
|
end
|
24
28
|
|
25
29
|
shared_inst.options.force = options[:force] if options[:force]
|
30
|
+
shared_inst.options.bucket = options[:bucket] if options[:bucket]
|
26
31
|
|
27
32
|
::Middleman::S3Sync.sync
|
28
33
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: middleman-s3_sync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 3.0.
|
5
|
+
version: 3.0.10
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Frederic Jean
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-04-
|
13
|
+
date: 2013-04-17 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -155,7 +155,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
155
155
|
- !ruby/object:Gem::Version
|
156
156
|
segments:
|
157
157
|
- 0
|
158
|
-
hash:
|
158
|
+
hash: 2846065098887891118
|
159
159
|
version: '0'
|
160
160
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
161
161
|
none: false
|
@@ -164,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
164
|
- !ruby/object:Gem::Version
|
165
165
|
segments:
|
166
166
|
- 0
|
167
|
-
hash:
|
167
|
+
hash: 2846065098887891118
|
168
168
|
version: '0'
|
169
169
|
requirements: []
|
170
170
|
rubyforge_project:
|