middleman-deploy 0.1.4 → 0.2.0

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: 9a92c4462b3a7f6a0f178cc76483527330ed5c6e
4
- data.tar.gz: c936ed12a9417db86972c92ddd6c2cf370213f3e
3
+ metadata.gz: da79aac3ca5caa2323d02e0a26fcf478318df56d
4
+ data.tar.gz: 9782924347f997ec71632b730e7ccf8558226b05
5
5
  SHA512:
6
- metadata.gz: 4c8ba6c5094a1c87f909048737504590c4612a14f4f728ef7c6f1f1c1bc8b95059994c61ecdfe765c7e1ab7d4d413094123e8d40db33b5d2710f97de302b1495
7
- data.tar.gz: 84eb414404abf09516beb1803450f8730ca7652649efc11547b792011915596ed893787082f9127e9ccdfd05b1e5cde31a0adc21277f1bd19d03f300e7a3a06b
6
+ metadata.gz: edba921810aa5506b74b9772e730def32db3671fd8cdd3e9843b31ba26577318bb78f736d3aeeb441402870c0c717c5b7a0207db1e8532a77697462adf8acfe2
7
+ data.tar.gz: 5d1c7d977bcf5e4cadc20596b42a67debf2c59fe50beeadaeb28234a6964f27257f815abf72f41476bf5b6a71a6a68c55c00ae33779bc9ea6455a2214ef39bbf
data/README.md CHANGED
@@ -50,7 +50,7 @@ activate :deploy do |deploy|
50
50
  # deploy.user = "tvaughan" # no default
51
51
  # deploy.port = 5309 # ssh port, default: 22
52
52
  # deploy.clean = true # remove orphaned files on remote host, default: false
53
- # deploy.flags = "-rltgoDvzO --no-p --del -e" # add custom flags, default: -avze
53
+ # deploy.flags = "-rltgoDvzO --no-p --del" # add custom flags, default: -avz
54
54
  end
55
55
  ```
56
56
 
@@ -63,8 +63,9 @@ following to `config.rb`:
63
63
  activate :deploy do |deploy|
64
64
  deploy.method = :git
65
65
  # Optional Settings
66
- # deploy.remote = "custom-remote" # remote name or git url, default: origin
67
- # deploy.branch = "custom-branch" # default: gh-pages
66
+ # deploy.remote = "custom-remote" # remote name or git url, default: origin
67
+ # deploy.branch = "custom-branch" # default: gh-pages
68
+ # deploy.strategy = :submodule # commit strategy: can be :force_push or :submodule, default: :force_push
68
69
  end
69
70
  ```
70
71
 
@@ -72,8 +73,12 @@ If you use a remote name, you must first add it using `git remote add`. Run
72
73
  `git remote -v` to see a list of possible remote names. If you use a git url,
73
74
  it must end with '.git'.
74
75
 
75
- Afterwards, the `build` directory will become a git repo. This branch will be
76
- created on the remote if it doesn't already exist.
76
+ Afterwards, the `build` directory will become a git repo.
77
+
78
+ If you use the force push strategy, this branch will be created on the remote if
79
+ it doesn't already exist.
80
+ But if you use the submodule strategy, you must first initialize build folder as
81
+ a submodule. See `git submodule add` documentation.
77
82
 
78
83
  ### FTP
79
84
 
@@ -97,6 +102,7 @@ Activate the extension by adding the following to `config.rb`:
97
102
  activate :deploy do |deploy|
98
103
  deploy.method = :sftp
99
104
  deploy.host = "sftp.example.com"
105
+ deploy.port = 22
100
106
  deploy.path = "/srv/www/site"
101
107
  # Optional Settings
102
108
  # deploy.user = "tvaughan" # no default
@@ -104,6 +110,49 @@ activate :deploy do |deploy|
104
110
  end
105
111
  ```
106
112
 
113
+ ### Multiple Environments
114
+
115
+ Deploy your site to more than one configuration using environment variables.
116
+
117
+ ```ruby
118
+ # config.rb
119
+ case ENV['TARGET'].to_s.downcase
120
+ when 'production'
121
+ activate :deploy do |deploy|
122
+ deploy.method = :rsync
123
+ deploy.host = "www.example.com"
124
+ deploy.path = "/srv/www/production-site"
125
+ end
126
+ else
127
+ activate :deploy do |deploy|
128
+ deploy.method = :rsync
129
+ deploy.host = "staging.example.com"
130
+ deploy.path = "/srv/www/staging-site"
131
+ end
132
+ end
133
+ ```
134
+
135
+ ```ruby
136
+ # Rakefile
137
+ namespace :deploy do
138
+ def deploy(env)
139
+ puts "Deploying to #{env}"
140
+ exec "TARGET=#{env} bundle exec middleman deploy"
141
+ end
142
+
143
+ task :staging do
144
+ deploy :staging
145
+ end
146
+
147
+ task :production do
148
+ deploy :production
149
+ end
150
+ end
151
+ ```
152
+
153
+ $ rake deploy:staging
154
+ $ rake deploy:production
155
+
107
156
  ## Breaking Changes
108
157
 
109
158
  * `v0.1.0`
data/USAGE ADDED
@@ -0,0 +1,56 @@
1
+ You should follow one of the four examples below to setup the deploy
2
+ extension in config.rb.
3
+
4
+ # To deploy the build directory to a remote host via rsync:
5
+ activate :deploy do |deploy|
6
+ deploy.method = :rsync
7
+ # host and path *must* be set
8
+ deploy.host = "www.example.com"
9
+ deploy.path = "/srv/www/site"
10
+ # user is optional (no default)
11
+ deploy.user = "tvaughan"
12
+ # port is optional (default is 22)
13
+ deploy.port = 5309
14
+ # clean is optional (default is false)
15
+ deploy.clean = true
16
+ # flags is optional (default is -avze)
17
+ deploy.flags = "-rltgoDvzO --no-p --del -e"
18
+ end
19
+
20
+ # To deploy to a remote branch via git (e.g. gh-pages on github):
21
+ activate :deploy do |deploy|
22
+ deploy.method = :git
23
+ # remote is optional (default is "origin")
24
+ # run `git remote -v` to see a list of possible remotes
25
+ deploy.remote = "some-other-remote-name"
26
+
27
+ # branch is optional (default is "gh-pages")
28
+ # run `git branch -a` to see a list of possible branches
29
+ deploy.branch = "some-other-branch-name"
30
+
31
+ # strategy is optional (default is :force_push)
32
+ deploy.strategy = :submodule
33
+ end
34
+
35
+ # To deploy the build directory to a remote host via ftp:
36
+ activate :deploy do |deploy|
37
+ deploy.method = :ftp
38
+ # host, user, passwword and path *must* be set
39
+ deploy.host = "ftp.example.com"
40
+ deploy.path = "/srv/www/site"
41
+ deploy.user = "tvaughan"
42
+ deploy.password = "secret"
43
+ end
44
+
45
+ # To deploy the build directory to a remote host via sftp:
46
+ activate :deploy do |deploy|
47
+ deploy.method = :sftp
48
+ # host, user, passwword and path *must* be set
49
+ deploy.host = "sftp.example.com"
50
+ deploy.port = 22
51
+ deploy.path = "/srv/www/site"
52
+ # user is optional (no default)
53
+ deploy.user = "tvaughan"
54
+ # password is optional (no default)
55
+ deploy.password = "secret"
56
+ end
@@ -1,6 +1,8 @@
1
1
  require "middleman-core/cli"
2
2
 
3
3
  require "middleman-deploy/extension"
4
+ require "middleman-deploy/methods"
5
+ require "middleman-deploy/strategies"
4
6
  require "middleman-deploy/pkg-info"
5
7
 
6
8
  module Middleman
@@ -21,274 +23,71 @@ module Middleman
21
23
 
22
24
  desc "deploy [options]", Middleman::Deploy::TAGLINE
23
25
  method_option "build_before",
24
- :type => :boolean,
25
- :aliases => "-b",
26
- :desc => "Run `middleman build` before the deploy step"
27
-
26
+ :type => :boolean,
27
+ :aliases => "-b",
28
+ :desc => "Run `middleman build` before the deploy step"
28
29
  def deploy
29
- if options.has_key? "build_before"
30
- build_before = options.build_before
31
- else
32
- build_before = self.deploy_options.build_before
33
- end
34
- if build_before
35
- # http://forum.middlemanapp.com/t/problem-with-the-build-task-in-an-extension
36
- run("middleman build") || exit(1)
37
- end
38
- send("deploy_#{self.deploy_options.method}")
30
+ build_before(options)
31
+ process
39
32
  end
40
33
 
41
34
  protected
42
35
 
43
- def print_usage_and_die(message)
44
- raise Error, "ERROR: " + message + "\n" + <<EOF
36
+ def build_before(options={})
37
+ build_enabled = options.fetch('build_before', self.deploy_options.build_before)
45
38
 
46
- You should follow one of the four examples below to setup the deploy
47
- extension in config.rb.
39
+ if build_enabled
40
+ # http://forum.middlemanapp.com/t/problem-with-the-build-task-in-an-extension
41
+ run('middleman build') || exit(1)
42
+ end
43
+ end
48
44
 
49
- # To deploy the build directory to a remote host via rsync:
50
- activate :deploy do |deploy|
51
- deploy.method = :rsync
52
- # host and path *must* be set
53
- deploy.host = "www.example.com"
54
- deploy.path = "/srv/www/site"
55
- # user is optional (no default)
56
- deploy.user = "tvaughan"
57
- # port is optional (default is 22)
58
- deploy.port = 5309
59
- # clean is optional (default is false)
60
- deploy.clean = true
61
- # flags is optional (default is -avze)
62
- deploy.flags = "-rltgoDvzO --no-p --del -e"
63
- end
45
+ def print_usage_and_die(message)
46
+ usage_path = File.join(File.dirname(__FILE__), '..', '..', 'USAGE')
47
+ usage_message = File.read(usage_path)
64
48
 
65
- # To deploy to a remote branch via git (e.g. gh-pages on github):
66
- activate :deploy do |deploy|
67
- deploy.method = :git
68
- # remote is optional (default is "origin")
69
- # run `git remote -v` to see a list of possible remotes
70
- deploy.remote = "some-other-remote-name"
71
- # branch is optional (default is "gh-pages")
72
- # run `git branch -a` to see a list of possible branches
73
- deploy.branch = "some-other-branch-name"
74
- end
49
+ raise Error, "ERROR: #{message}\n#{usage_message}"
50
+ end
75
51
 
76
- # To deploy the build directory to a remote host via ftp:
77
- activate :deploy do |deploy|
78
- deploy.method = :ftp
79
- # host, user, passwword and path *must* be set
80
- deploy.host = "ftp.example.com"
81
- deploy.path = "/srv/www/site"
82
- deploy.user = "tvaughan"
83
- deploy.password = "secret"
84
- end
52
+ def process
53
+ server_instance = ::Middleman::Application.server.inst
85
54
 
86
- # To deploy the build directory to a remote host via sftp:
87
- activate :deploy do |deploy|
88
- deploy.method = :sftp
89
- # host, user, passwword and path *must* be set
90
- deploy.host = "sftp.example.com"
91
- deploy.path = "/srv/www/site"
92
- # user is optional (no default)
93
- deploy.user = "tvaughan"
94
- # password is optional (no default)
95
- deploy.password = "secret"
96
- end
97
- EOF
98
- end
55
+ camelized_method = self.deploy_options.method.to_s.split('_').map { |word| word.capitalize}.join
56
+ method_class_name = "Middleman::Deploy::Methods::#{camelized_method}"
57
+ method_instance = method_class_name.constantize.new(server_instance, self.deploy_options)
99
58
 
100
- def inst
101
- ::Middleman::Application.server.inst
59
+ method_instance.process
102
60
  end
103
61
 
104
62
  def deploy_options
105
63
  options = nil
106
64
 
107
65
  begin
108
- options = inst.options
66
+ options = ::Middleman::Application.server.inst.options
109
67
  rescue NoMethodError
110
68
  print_usage_and_die "You need to activate the deploy extension in config.rb."
111
69
  end
112
70
 
113
- if (!options.method)
71
+ unless options.method
114
72
  print_usage_and_die "The deploy extension requires you to set a method."
115
73
  end
116
74
 
117
75
  case options.method
118
76
  when :rsync, :sftp
119
- if (!options.host || !options.path)
77
+ unless options.host && options.path
120
78
  print_usage_and_die "The #{options.method} method requires host and path to be set."
121
79
  end
122
80
  when :ftp
123
- if (!options.host || !options.user || !options.password || !options.path)
81
+ unless options.host && options.user && options.password && options.path
124
82
  print_usage_and_die "The ftp deploy method requires host, path, user, and password to be set."
125
83
  end
126
84
  end
127
85
 
128
86
  options
129
87
  end
130
-
131
- def deploy_rsync
132
- host = self.deploy_options.host
133
- port = self.deploy_options.port
134
- path = self.deploy_options.path
135
-
136
- # Append "@" to user if provided.
137
- user = self.deploy_options.user
138
- user = "#{user}@" if user && !user.empty?
139
-
140
- dest_url = "#{user}#{host}:#{path}"
141
-
142
- puts "## Deploying via rsync to #{dest_url} port=#{port}"
143
-
144
- flags = !self.deploy_options.flags ? '-avze' : self.deploy_options.flags
145
-
146
- command = "rsync " + flags + " '" + "ssh -p #{port}" + "' #{self.inst.build_dir}/ #{dest_url}"
147
-
148
- if self.deploy_options.clean
149
- command += " --delete"
150
- end
151
-
152
- run command
153
- end
154
-
155
- def deploy_git
156
- remote = self.deploy_options.remote
157
- branch = self.deploy_options.branch
158
-
159
- puts "## Deploying via git to remote=\"#{remote}\" and branch=\"#{branch}\""
160
-
161
- #check if remote is not a git url
162
- unless remote =~ /\.git$/
163
- remote = `git config --get remote.#{remote}.url`.chop
164
- end
165
-
166
- #if the remote name doesn't exist in the main repo
167
- if remote == ''
168
- puts "Can't deploy! Please add a remote with the name '#{self.deploy_options.remote}' to your repo."
169
- exit
170
- end
171
-
172
- Dir.chdir(self.inst.build_dir) do
173
- unless File.exists?('.git')
174
- `git init`
175
- `git remote add origin #{remote}`
176
- else
177
- #check if the remote repo has changed
178
- unless remote == `git config --get remote.origin.url`.chop
179
- `git remote rm origin`
180
- `git remote add origin #{remote}`
181
- end
182
- end
183
-
184
- #if there is a branch with that name, switch to it, otherwise create a new one and switch to it
185
- if `git branch`.split("\n").any? { |b| b =~ /#{branch}/i }
186
- `git checkout #{branch}`
187
- else
188
- `git checkout -b #{branch}`
189
- end
190
-
191
- `git add -A`
192
- # '"message"' double quotes to fix windows issue
193
- `git commit --allow-empty -am '"Automated commit at #{Time.now.utc} by #{Middleman::Deploy::PACKAGE} #{Middleman::Deploy::VERSION}"'`
194
- `git push -f origin #{branch}`
195
- end
196
- end
197
-
198
- def deploy_ftp
199
- require 'net/ftp'
200
- require 'ptools'
201
-
202
- host = self.deploy_options.host
203
- user = self.deploy_options.user
204
- pass = self.deploy_options.password
205
- path = self.deploy_options.path
206
-
207
- puts "## Deploying via ftp to #{user}@#{host}:#{path}"
208
-
209
- ftp = Net::FTP.new(host)
210
- ftp.login(user, pass)
211
- ftp.chdir(path)
212
- ftp.passive = true
213
-
214
- Dir.chdir(self.inst.build_dir) do
215
- files = Dir.glob('**/*', File::FNM_DOTMATCH)
216
- files.reject { |a| a =~ Regexp.new('\.$') }.each do |f|
217
- if File.directory?(f)
218
- begin
219
- ftp.mkdir(f)
220
- puts "Created directory #{f}"
221
- rescue
222
- end
223
- else
224
- begin
225
- if File.binary?(f)
226
- ftp.putbinaryfile(f, f)
227
- else
228
- ftp.puttextfile(f, f)
229
- end
230
- rescue Exception => e
231
- reply = e.message
232
- err_code = reply[0,3].to_i
233
- if err_code == 550
234
- if File.binary?(f)
235
- ftp.putbinaryfile(f, f)
236
- else
237
- ftp.puttextfile(f, f)
238
- end
239
- end
240
- end
241
- puts "Copied #{f}"
242
- end
243
- end
244
- end
245
- ftp.close
246
- end
247
-
248
- def deploy_sftp
249
- require 'net/sftp'
250
- require 'ptools'
251
-
252
- host = self.deploy_options.host
253
- user = self.deploy_options.user
254
- pass = self.deploy_options.password
255
- path = self.deploy_options.path
256
-
257
- puts "## Deploying via sftp to #{user}@#{host}:#{path}"
258
-
259
- # `nil` is a valid value for user and/or pass.
260
- Net::SFTP.start(host, user, :password => pass) do |sftp|
261
- sftp.mkdir(path)
262
- Dir.chdir(self.inst.build_dir) do
263
- files = Dir.glob('**/*', File::FNM_DOTMATCH)
264
- files.reject { |a| a =~ Regexp.new('\.$') }.each do |f|
265
- if File.directory?(f)
266
- begin
267
- sftp.mkdir("#{path}/#{f}")
268
- puts "Created directory #{f}"
269
- rescue
270
- end
271
- else
272
- begin
273
- sftp.upload(f, "#{path}/#{f}")
274
- rescue Exception => e
275
- reply = e.message
276
- err_code = reply[0,3].to_i
277
- if err_code == 550
278
- sftp.upload(f, "#{path}/#{f}")
279
- end
280
- end
281
- puts "Copied #{f}"
282
- end
283
- end
284
- end
285
- end
286
- end
287
-
288
88
  end
289
89
 
290
90
  # Alias "d" to "deploy"
291
91
  Base.map({ "d" => "deploy" })
292
-
293
92
  end
294
93
  end
@@ -5,7 +5,7 @@ require "middleman-core"
5
5
  module Middleman
6
6
  module Deploy
7
7
 
8
- class Options < Struct.new(:whatisthis, :method, :host, :port, :user, :password, :path, :clean, :remote, :branch, :build_before, :flags); end
8
+ class Options < Struct.new(:whatisthis, :method, :host, :port, :user, :password, :path, :clean, :remote, :branch, :strategy, :build_before, :flags); end
9
9
 
10
10
  class << self
11
11
 
@@ -22,8 +22,9 @@ module Middleman
22
22
  options.clean ||= false
23
23
 
24
24
  # Default options for the git method.
25
- options.remote ||= "origin"
26
- options.branch ||= "gh-pages"
25
+ options.remote ||= "origin"
26
+ options.branch ||= "gh-pages"
27
+ options.strategy ||= :force_push
27
28
 
28
29
  options.build_before ||= false
29
30
 
@@ -0,0 +1,5 @@
1
+ require 'middleman-deploy/methods/base'
2
+ require 'middleman-deploy/methods/ftp'
3
+ require 'middleman-deploy/methods/git'
4
+ require 'middleman-deploy/methods/rsync'
5
+ require 'middleman-deploy/methods/sftp'
@@ -0,0 +1,19 @@
1
+ module Middleman
2
+ module Deploy
3
+ module Methods
4
+ class Base
5
+ attr_reader :options, :server_instance
6
+
7
+ def initialize(server_instance, options={})
8
+ @options = options
9
+ @server_instance = server_instance
10
+ end
11
+
12
+ def process
13
+ raise NotImplementedError
14
+ end
15
+
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,102 @@
1
+ require 'net/ftp'
2
+ require 'ptools'
3
+
4
+ module Middleman
5
+ module Deploy
6
+ module Methods
7
+ class Ftp < Base
8
+
9
+ attr_reader :host, :pass, :path,:user
10
+
11
+ def initialize(server_instance, options={})
12
+ super(server_instance, options)
13
+
14
+ @host = self.options.host
15
+ @user = self.options.user
16
+ @pass = self.options.password
17
+ @path = self.options.path
18
+ @port = self.options.port
19
+ end
20
+
21
+ def process
22
+ puts "## Deploying via ftp to #{self.user}@#{self.host}:#{self.path}"
23
+
24
+ ftp = open_connection
25
+
26
+ Dir.chdir(self.server_instance.build_dir) do
27
+ filtered_files.each do |filename|
28
+ if File.directory?(filename)
29
+ upload_directory(ftp, filename)
30
+ elsif File.binary?(filename)
31
+ upload_binary(ftp, filename)
32
+ else
33
+ upload_file(ftp, filename)
34
+ end
35
+ end
36
+ end
37
+
38
+ ftp.close
39
+ end
40
+
41
+ protected
42
+
43
+ def filtered_files
44
+ files = Dir.glob('**/*', File::FNM_DOTMATCH)
45
+
46
+ files.reject { |filename| filename =~ Regexp.new('\.$') }
47
+ end
48
+
49
+ def handle_exception(exception, ftp, filename)
50
+ reply = exception.message
51
+ err_code = reply[0,3].to_i
52
+
53
+ if err_code == 550
54
+ if File.binary?(filename)
55
+ ftp.putbinaryfile(filename, filename)
56
+ else
57
+ ftp.puttextfile(filename, filename)
58
+ end
59
+ end
60
+ end
61
+
62
+ def open_connection
63
+ ftp = Net::FTP.new(self.host)
64
+ ftp.login(self.user, self.pass)
65
+ ftp.chdir(self.path)
66
+ ftp.passive = true
67
+
68
+ ftp
69
+ end
70
+
71
+ def upload_binary(ftp, filename)
72
+ begin
73
+ ftp.putbinaryfile(filename, filename)
74
+ rescue Exception => exception
75
+ handle_exception(exception, ftp, filename)
76
+ end
77
+
78
+ puts "Copied #{filename}"
79
+ end
80
+
81
+ def upload_directory(ftp, filename)
82
+ begin
83
+ ftp.mkdir(filename)
84
+ puts "Created directory #{filename}"
85
+ rescue
86
+ end
87
+ end
88
+
89
+ def upload_file(ftp, filename)
90
+ begin
91
+ ftp.puttextfile(filename, filename)
92
+ rescue Exception => exception
93
+ handle_exception(exception, ftp, filename)
94
+ end
95
+
96
+ puts "Copied #{filename}"
97
+ end
98
+
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,19 @@
1
+ module Middleman
2
+ module Deploy
3
+ module Methods
4
+ class Git < Base
5
+
6
+ def process
7
+ puts "## Deploying via git to remote=\"#{self.options.remote}\" and branch=\"#{self.options.branch}\""
8
+
9
+ camelized_strategy = self.options.strategy.to_s.split('_').map { |word| word.capitalize}.join
10
+ strategy_class_name = "Middleman::Deploy::Strategies::Git::#{camelized_strategy}"
11
+ strategy_instance = strategy_class_name.constantize.new(self.server_instance.build_dir, self.options.remote, self.options.branch)
12
+
13
+ strategy_instance.process
14
+ end
15
+
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,38 @@
1
+ module Middleman
2
+ module Deploy
3
+ module Methods
4
+ class Rsync < Base
5
+
6
+ attr_reader :clean, :flags, :host, :path, :port, :user
7
+
8
+ def initialize(server_instance, options={})
9
+ super(server_instance, options)
10
+
11
+ @clean = self.options.clean
12
+ @flags = self.options.flags
13
+ @host = self.options.host
14
+ @path = self.options.path
15
+ @port = self.options.port
16
+ @user = self.options.user
17
+ end
18
+
19
+ def process
20
+ # Append "@" to user if provided.
21
+ user = "#{self.user}@" if self.user && !self.user.empty?
22
+
23
+ dest_url = "#{user}#{self.host}:#{self.path}"
24
+ flags = self.flags || '-avz'
25
+ command = "rsync #{flags} '-e ssh -p #{self.port}' #{self.server_instance.build_dir}/ #{dest_url}"
26
+
27
+ if self.clean
28
+ command += " --delete"
29
+ end
30
+
31
+ puts "## Deploying via rsync to #{dest_url} port=#{self.port}"
32
+ run command
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,65 @@
1
+ require 'net/sftp'
2
+ require 'ptools'
3
+
4
+ module Middleman
5
+ module Deploy
6
+ module Methods
7
+ class Sftp < Ftp
8
+
9
+ def process
10
+ puts "## Deploying via sftp to #{self.user}@#{self.host}:#{path}"
11
+
12
+ # `nil` is a valid value for user and/or pass.
13
+ Net::SFTP.start(self.host, self.user, :password => self.pass, :port => self.port) do |sftp|
14
+ sftp.mkdir(self.path)
15
+
16
+ Dir.chdir(self.server_instance.build_dir) do
17
+ filtered_files.each do |filename|
18
+ if File.directory?(filename)
19
+ upload_directory(sftp, filename)
20
+ else
21
+ upload_file(sftp, filename)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ protected
29
+
30
+ def handle_exception(exception)
31
+ reply = exception.message
32
+ err_code = reply[0,3].to_i
33
+
34
+ if err_code == 550
35
+ sftp.upload(filename, file_path)
36
+ end
37
+ end
38
+
39
+ def upload_directory(sftp, filename)
40
+ file_path = "#{self.path}/#{filename}"
41
+
42
+ begin
43
+ sftp.mkdir(file_path)
44
+ puts "Created directory #{filename}"
45
+ rescue
46
+ end
47
+ end
48
+
49
+ def upload_file(sftp, filename)
50
+ file_path = "#{self.path}/#{filename}"
51
+
52
+ begin
53
+ sftp.upload(filename, file_path)
54
+ rescue Exception => exception
55
+ handle_exception(exception, file_path)
56
+ end
57
+
58
+ puts "Copied #{filename}"
59
+ end
60
+
61
+ end
62
+ end
63
+ end
64
+ end
65
+
@@ -1,7 +1,7 @@
1
1
  module Middleman
2
2
  module Deploy
3
3
  PACKAGE = "middleman-deploy"
4
- VERSION = "0.1.4"
4
+ VERSION = "0.2.0"
5
5
  TAGLINE = "Deploy a middleman built site over rsync, ftp, sftp, or git (e.g. gh-pages on github)."
6
6
  end
7
7
  end
@@ -0,0 +1,3 @@
1
+ require 'middleman-deploy/strategies/git/base'
2
+ require 'middleman-deploy/strategies/git/force_push'
3
+ require 'middleman-deploy/strategies/git/submodule'
@@ -0,0 +1,48 @@
1
+ module Middleman
2
+ module Deploy
3
+ module Strategies
4
+ module Git
5
+ class Base
6
+ attr_accessor :branch, :build_dir, :remote
7
+
8
+ def initialize(build_dir, remote, branch)
9
+ self.branch = branch
10
+ self.build_dir = build_dir
11
+ self.remote = remote
12
+ end
13
+
14
+ def process
15
+ raise NotImplementedError
16
+ end
17
+
18
+ protected
19
+
20
+ def add_signature_to_commit_message(base_message)
21
+ signature = "#{Middleman::Deploy::PACKAGE} #{Middleman::Deploy::VERSION}"
22
+ time = "#{Time.now.utc}"
23
+
24
+ "#{base_message} at #{time} by #{signature}"
25
+ end
26
+
27
+ def checkout_branch
28
+ # if there is a branch with that name, switch to it, otherwise create a new one and switch to it
29
+ if `git branch`.split("\n").any? { |b| b =~ /#{self.branch}/i }
30
+ `git checkout #{self.branch}`
31
+ else
32
+ `git checkout -b #{self.branch}`
33
+ end
34
+ end
35
+
36
+ def commit_branch(options='')
37
+ message = add_signature_to_commit_message('Automated commit')
38
+
39
+ `git add -A`
40
+ `git commit --allow-empty -am "#{message}"`
41
+ `git push #{options} origin #{self.branch}`
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,54 @@
1
+ module Middleman
2
+ module Deploy
3
+ module Strategies
4
+ module Git
5
+ class ForcePush < Base
6
+
7
+ def process
8
+ Dir.chdir(self.build_dir) do
9
+ add_remote_url
10
+ checkout_branch
11
+ commit_branch('-f')
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def add_remote_url
18
+ url = get_remote_url
19
+
20
+ unless File.exists?('.git')
21
+ `git init`
22
+ `git remote add origin #{url}`
23
+ else
24
+ # check if the remote repo has changed
25
+ unless url == `git config --get remote.origin.url`.chop
26
+ `git remote rm origin`
27
+ `git remote add origin #{url}`
28
+ end
29
+ end
30
+ end
31
+
32
+ def get_remote_url
33
+ remote = self.remote
34
+ url = remote
35
+
36
+ # check if remote is not a git url
37
+ unless remote =~ /\.git$/
38
+ url = `git config --get remote.#{url}.url`.chop
39
+ end
40
+
41
+ # if the remote name doesn't exist in the main repo
42
+ if url == ''
43
+ puts "Can't deploy! Please add a remote with the name '#{remote}' to your repo."
44
+ exit
45
+ end
46
+
47
+ url
48
+ end
49
+
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,44 @@
1
+ module Middleman
2
+ module Deploy
3
+ module Strategies
4
+ module Git
5
+ class Submodule < Base
6
+
7
+ def process
8
+ Dir.chdir(self.build_dir) do
9
+ checkout_branch
10
+ pull_submodule
11
+ commit_branch
12
+ end
13
+
14
+ commit_submodule
15
+ end
16
+
17
+ private
18
+
19
+ def commit_submodule
20
+ current_branch = `git rev-parse --abbrev-ref HEAD`
21
+ message = add_signature_to_commit_message('Deployed')
22
+
23
+ `git add #{self.build_dir}`
24
+ `git commit --allow-empty -m "#{message}"`
25
+ `git push origin #{current_branch}`
26
+ end
27
+
28
+ def pull_submodule
29
+ `git fetch`
30
+ `git stash`
31
+ `git rebase #{self.remote}/#{self.branch}`
32
+ `git stash pop`
33
+
34
+ if $?.exitstatus == 1
35
+ puts "Can't deploy! Please resolve conflicts. Then process to manual commit and push on #{self.branch} branch."
36
+ exit
37
+ end
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: middleman-deploy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Vaughan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-23 00:00:00.000000000 Z
11
+ date: 2014-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: middleman-core
@@ -65,11 +65,22 @@ files:
65
65
  - Gemfile
66
66
  - README.md
67
67
  - Rakefile
68
+ - USAGE
68
69
  - features/support/env.rb
69
70
  - lib/middleman-deploy.rb
70
71
  - lib/middleman-deploy/commands.rb
71
72
  - lib/middleman-deploy/extension.rb
73
+ - lib/middleman-deploy/methods.rb
74
+ - lib/middleman-deploy/methods/base.rb
75
+ - lib/middleman-deploy/methods/ftp.rb
76
+ - lib/middleman-deploy/methods/git.rb
77
+ - lib/middleman-deploy/methods/rsync.rb
78
+ - lib/middleman-deploy/methods/sftp.rb
72
79
  - lib/middleman-deploy/pkg-info.rb
80
+ - lib/middleman-deploy/strategies.rb
81
+ - lib/middleman-deploy/strategies/git/base.rb
82
+ - lib/middleman-deploy/strategies/git/force_push.rb
83
+ - lib/middleman-deploy/strategies/git/submodule.rb
73
84
  - lib/middleman_extension.rb
74
85
  - middleman-deploy.gemspec
75
86
  homepage: http://github.com/tvaughan/middleman-deploy