engineyard-serverside 1.5.35.pre.2 → 1.6.0.pre

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.
Files changed (35) hide show
  1. data/lib/engineyard-serverside.rb +3 -1
  2. data/lib/engineyard-serverside/cli.rb +73 -38
  3. data/lib/engineyard-serverside/configuration.rb +38 -12
  4. data/lib/engineyard-serverside/deploy.rb +63 -51
  5. data/lib/engineyard-serverside/deploy_hook.rb +21 -18
  6. data/lib/engineyard-serverside/deprecation.rb +9 -17
  7. data/lib/engineyard-serverside/lockfile_parser.rb +1 -1
  8. data/lib/engineyard-serverside/rails_asset_support.rb +5 -5
  9. data/lib/engineyard-serverside/server.rb +8 -11
  10. data/lib/engineyard-serverside/shell.rb +101 -0
  11. data/lib/engineyard-serverside/shell/formatter.rb +70 -0
  12. data/lib/engineyard-serverside/shell/helpers.rb +29 -0
  13. data/lib/engineyard-serverside/strategies/git.rb +12 -15
  14. data/lib/engineyard-serverside/task.rb +28 -5
  15. data/lib/engineyard-serverside/version.rb +1 -1
  16. data/lib/vendor/open4/lib/open4.rb +432 -0
  17. data/spec/basic_deploy_spec.rb +9 -9
  18. data/spec/bundler_deploy_spec.rb +1 -1
  19. data/spec/custom_deploy_spec.rb +45 -4
  20. data/spec/deploy_hook_spec.rb +77 -78
  21. data/spec/deprecation_spec.rb +4 -26
  22. data/spec/git_strategy_spec.rb +6 -2
  23. data/spec/nodejs_deploy_spec.rb +2 -2
  24. data/spec/services_deploy_spec.rb +11 -10
  25. data/spec/shell_spec.rb +48 -0
  26. data/spec/spec_helper.rb +48 -25
  27. data/spec/sqlite3_deploy_spec.rb +1 -2
  28. data/spec/support/integration.rb +1 -13
  29. metadata +57 -97
  30. data/lib/engineyard-serverside/logged_output.rb +0 -91
  31. data/lib/vendor/systemu/LICENSE +0 -3
  32. data/lib/vendor/systemu/lib/systemu.rb +0 -363
  33. data/lib/vendor/systemu/systemu.gemspec +0 -45
  34. data/spec/fixtures/gitrepo/bar +0 -0
  35. data/spec/logged_output_spec.rb +0 -55
@@ -1,91 +0,0 @@
1
- require 'systemu'
2
-
3
- module EY
4
- module Serverside
5
- module LoggedOutput
6
-
7
- class Tee
8
- def initialize(*streams)
9
- @streams = streams.flatten
10
- end
11
-
12
- def <<(output)
13
- @streams.each do |s|
14
- s << output
15
- s.flush
16
- end
17
- self
18
- end
19
- end # Tee
20
-
21
- @@logfile = File.join(ENV['HOME'], 'ey.log')
22
- def self.logfile=(filename)
23
- File.unlink filename if File.exist?(filename) # start fresh
24
- @@logfile = filename
25
- end
26
-
27
- def self.logfile
28
- @@logfile
29
- end
30
-
31
- @@verbose = false
32
- def self.verbose=(v)
33
- @@verbose = !!v
34
- end
35
-
36
- def self.verbose?
37
- @@verbose
38
- end
39
-
40
- def verbose?
41
- EY::Serverside::LoggedOutput.verbose?
42
- end
43
-
44
- def warning(msg)
45
- info "WARNING: #{msg}\n".gsub(/^/,'!> ')
46
- end
47
-
48
- def info(msg)
49
- with_logfile do |log|
50
- Tee.new($stdout, log) << ("#{with_timestamp(msg)}\n")
51
- end
52
- end
53
-
54
- def debug(msg)
55
- with_logfile do |log|
56
- log << "#{with_timestamp(msg)}\n"
57
- end
58
- end
59
-
60
- def logged_system(cmd)
61
- with_logfile do |log|
62
- out = verbose? ? Tee.new($stdout, log) : log
63
- err = Tee.new($stderr, log) # we always want to see errors
64
-
65
- cmd = "sh -c #{Escape.shell_command([cmd])}"
66
- puts "running #{cmd}" if ENV['DEBUG']
67
- out << with_timestamp(":: running #{cmd}\n")
68
- status = systemu cmd, 'stdout' => out, 'stderr' => err
69
- puts "exit status= #{status.exitstatus}" if ENV['DEBUG']
70
- status.exitstatus == 0
71
- end
72
- end
73
-
74
- private
75
- def with_logfile
76
- File.open(logfile, 'a') {|f| yield f }
77
- end
78
-
79
- def logfile
80
- EY::Serverside::LoggedOutput.logfile
81
- end
82
-
83
- def with_timestamp(msg)
84
- return msg unless respond_to?(:starting_time)
85
- time_passed = Time.now.to_i - starting_time.to_i
86
- timestamp = "+%2dm %02ds " % time_passed.divmod(60)
87
- msg.gsub(/^/, timestamp)
88
- end
89
- end
90
- end
91
- end
@@ -1,3 +0,0 @@
1
- same as Ruby's
2
-
3
- http://www.ruby-lang.org/en/LICENSE.txt
@@ -1,363 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'tmpdir'
4
- require 'socket'
5
- require 'fileutils'
6
- require 'rbconfig'
7
- require 'thread'
8
-
9
- class Object
10
- def systemu(*a, &b) SystemUniversal.new(*a, &b).systemu end
11
- end
12
-
13
- class SystemUniversal
14
- #
15
- # constants
16
- #
17
- SystemUniversal::VERSION = '2.5.0' unless SystemUniversal.send(:const_defined?, :VERSION)
18
- def SystemUniversal.version() SystemUniversal::VERSION end
19
- def version() SystemUniversal::VERSION end
20
- #
21
- # class methods
22
- #
23
-
24
- @host = Socket.gethostname
25
- @ppid = Process.ppid
26
- @pid = Process.pid
27
- @turd = ENV['SYSTEMU_TURD']
28
-
29
- c = begin; ::RbConfig::CONFIG; rescue NameError; ::Config::CONFIG; end
30
- ruby = File.join(c['bindir'], c['ruby_install_name']) << c['EXEEXT']
31
- @ruby = if system('%s -e 42' % ruby)
32
- ruby
33
- else
34
- system('%s -e 42' % 'ruby') ? 'ruby' : warn('no ruby in PATH/CONFIG')
35
- end
36
-
37
- class << SystemUniversal
38
- %w( host ppid pid ruby turd ).each{|a| attr_accessor a}
39
-
40
- def quote(*words)
41
- words.map{|word| word.inspect}.join(' ')
42
- end
43
- end
44
-
45
- #
46
- # instance methods
47
- #
48
-
49
- def initialize argv, opts = {}, &block
50
- getopt = getopts opts
51
-
52
- @argv = argv
53
- @block = block
54
-
55
- @stdin = getopt[ ['stdin', 'in', '0', 0] ]
56
- @stdout = getopt[ ['stdout', 'out', '1', 1] ]
57
- @stderr = getopt[ ['stderr', 'err', '2', 2] ]
58
- @env = getopt[ 'env' ]
59
- @cwd = getopt[ 'cwd' ]
60
-
61
- @host = getopt[ 'host', self.class.host ]
62
- @ppid = getopt[ 'ppid', self.class.ppid ]
63
- @pid = getopt[ 'pid', self.class.pid ]
64
- @ruby = getopt[ 'ruby', self.class.ruby ]
65
- end
66
-
67
- def systemu
68
- tmpdir do |tmp|
69
- c = child_setup tmp
70
- status = nil
71
-
72
- begin
73
- thread = nil
74
-
75
- quietly{
76
- IO.popen "#{ quote(@ruby) } #{ quote(c['program']) }", 'r+' do |pipe|
77
- line = pipe.gets
78
- case line
79
- when %r/^pid: \d+$/
80
- cid = Integer line[%r/\d+/]
81
- else
82
- begin
83
- buf = pipe.read
84
- buf = "#{ line }#{ buf }"
85
- e = Marshal.load buf
86
- raise unless Exception === e
87
- raise e
88
- rescue
89
- raise "wtf?\n#{ buf }\n"
90
- end
91
- end
92
- thread = new_thread cid, @block if @block
93
- pipe.read rescue nil
94
- end
95
- }
96
- status = $?
97
- ensure
98
- if thread
99
- begin
100
- class << status
101
- attr 'thread'
102
- end
103
- status.instance_eval{ @thread = thread }
104
- rescue
105
- 42
106
- end
107
- end
108
- end
109
-
110
- if @stdout or @stderr
111
- open(c['stdout']){|f| relay f => @stdout} if @stdout
112
- open(c['stderr']){|f| relay f => @stderr} if @stderr
113
- status
114
- else
115
- [status, IO.read(c['stdout']), IO.read(c['stderr'])]
116
- end
117
- end
118
- end
119
-
120
- def quote *args, &block
121
- SystemUniversal.quote(*args, &block)
122
- end
123
-
124
- def new_thread cid, block
125
- q = Queue.new
126
- Thread.new(cid) do |cid|
127
- current = Thread.current
128
- current.abort_on_exception = true
129
- q.push current
130
- block.call cid
131
- end
132
- q.pop
133
- end
134
-
135
- def child_setup tmp
136
- stdin = File.expand_path(File.join(tmp, 'stdin'))
137
- stdout = File.expand_path(File.join(tmp, 'stdout'))
138
- stderr = File.expand_path(File.join(tmp, 'stderr'))
139
- program = File.expand_path(File.join(tmp, 'program'))
140
- config = File.expand_path(File.join(tmp, 'config'))
141
-
142
- if @stdin
143
- open(stdin, 'w'){|f| relay @stdin => f}
144
- else
145
- FileUtils.touch stdin
146
- end
147
- FileUtils.touch stdout
148
- FileUtils.touch stderr
149
-
150
- c = {}
151
- c['argv'] = @argv
152
- c['env'] = @env
153
- c['cwd'] = @cwd
154
- c['stdin'] = stdin
155
- c['stdout'] = stdout
156
- c['stderr'] = stderr
157
- c['program'] = program
158
- open(config, 'w'){|f| Marshal.dump(c, f)}
159
-
160
- open(program, 'w'){|f| f.write child_program(config)}
161
-
162
- c
163
- end
164
-
165
- def quietly
166
- v = $VERBOSE
167
- $VERBOSE = nil
168
- yield
169
- ensure
170
- $VERBOSE = v
171
- end
172
-
173
- def child_program config
174
- <<-program
175
- # encoding: utf-8
176
-
177
- PIPE = STDOUT.dup
178
- begin
179
- config = Marshal.load(IO.read('#{ config }'))
180
-
181
- argv = config['argv']
182
- env = config['env']
183
- cwd = config['cwd']
184
- stdin = config['stdin']
185
- stdout = config['stdout']
186
- stderr = config['stderr']
187
-
188
- Dir.chdir cwd if cwd
189
- env.each{|k,v| ENV[k.to_s] = v.to_s} if env
190
-
191
- STDIN.reopen stdin
192
- STDOUT.reopen stdout
193
- STDERR.reopen stderr
194
-
195
- PIPE.puts "pid: \#{ Process.pid }"
196
- PIPE.flush ### the process is ready yo!
197
- PIPE.close
198
- if RUBY_VERSION >= "1.9"
199
- exec *argv
200
- else
201
- exec argv
202
- end
203
- rescue Exception => e
204
- PIPE.write Marshal.dump(e) rescue nil
205
- exit 42
206
- end
207
- program
208
- end
209
-
210
- def relay srcdst
211
- src, dst, ignored = srcdst.to_a.first
212
- if src.respond_to? 'read'
213
- while((buf = src.read(8192))); dst << buf; end
214
- else
215
- if src.respond_to?(:each_line)
216
- src.each_line{|buf| dst << buf}
217
- else
218
- src.each{|buf| dst << buf}
219
- end
220
- end
221
- end
222
-
223
- def tmpdir d = Dir.tmpdir, max = 42, &b
224
- i = -1 and loop{
225
- i += 1
226
-
227
- tmp = File.join d, "systemu_#{ @host }_#{ @ppid }_#{ @pid }_#{ rand }_#{ i += 1 }"
228
-
229
- begin
230
- Dir.mkdir tmp
231
- rescue Errno::EEXIST
232
- raise if i >= max
233
- next
234
- end
235
-
236
- break(
237
- if b
238
- begin
239
- b.call tmp
240
- ensure
241
- FileUtils.rm_rf tmp unless SystemU.turd
242
- end
243
- else
244
- tmp
245
- end
246
- )
247
- }
248
- end
249
-
250
- def getopts opts = {}
251
- lambda do |*args|
252
- keys, default, ignored = args
253
- catch(:opt) do
254
- [keys].flatten.each do |key|
255
- [key, key.to_s, key.to_s.intern].each do |key|
256
- throw :opt, opts[key] if opts.has_key?(key)
257
- end
258
- end
259
- default
260
- end
261
- end
262
- end
263
- end
264
-
265
- # some monkeypatching for JRuby
266
- if defined? JRUBY_VERSION
267
- require 'jruby'
268
- java_import org.jruby.RubyProcess
269
-
270
- class SystemUniversal
271
- def systemu
272
- split_argv = JRuby::PathHelper.smart_split_command @argv
273
- process = java.lang.Runtime.runtime.exec split_argv.to_java(:string)
274
-
275
- stdout, stderr = [process.input_stream, process.error_stream].map do |stream|
276
- StreamReader.new(stream)
277
- end
278
-
279
- exit_code = process.wait_for
280
- field = process.get_class.get_declared_field("pid")
281
- field.set_accessible(true)
282
- pid = field.get(process)
283
- [
284
- RubyProcess::RubyStatus.new_process_status(JRuby.runtime, exit_code, pid),
285
- stdout.join,
286
- stderr.join
287
- ]
288
- end
289
-
290
- class StreamReader
291
- def initialize(stream)
292
- @data = ""
293
- @thread = Thread.new do
294
- reader = java.io.BufferedReader.new java.io.InputStreamReader.new(stream)
295
-
296
- while line = reader.read_line
297
- @data << line << "\n"
298
- end
299
- end
300
- end
301
-
302
- def join
303
- @thread.join
304
- @data
305
- end
306
- end
307
- end
308
- end
309
-
310
-
311
-
312
- SystemU = SystemUniversal unless defined? SystemU
313
- Systemu = SystemUniversal unless defined? Systemu
314
-
315
-
316
-
317
-
318
-
319
-
320
-
321
-
322
-
323
-
324
-
325
-
326
-
327
- if $0 == __FILE__
328
- #
329
- # date
330
- #
331
- date = %q( ruby -e" t = Time.now; STDOUT.puts t; STDERR.puts t " )
332
-
333
- status, stdout, stderr = systemu date
334
- p [status, stdout, stderr]
335
-
336
- status = systemu date, 1=>(stdout = '')
337
- p [status, stdout]
338
-
339
- status = systemu date, 2=>(stderr = '')
340
- p [status, stderr]
341
- #
342
- # sleep
343
- #
344
- sleep = %q( ruby -e" p(sleep(1)) " )
345
- status, stdout, stderr = systemu sleep
346
- p [status, stdout, stderr]
347
-
348
- sleep = %q( ruby -e" p(sleep(42)) " )
349
- status, stdout, stderr = systemu(sleep){|cid| Process.kill 9, cid}
350
- p [status, stdout, stderr]
351
- #
352
- # env
353
- #
354
- env = %q( ruby -e" p ENV['A'] " )
355
- status, stdout, stderr = systemu env, :env => {'A' => 42}
356
- p [status, stdout, stderr]
357
- #
358
- # cwd
359
- #
360
- env = %q( ruby -e" p Dir.pwd " )
361
- status, stdout, stderr = systemu env, :cwd => Dir.tmpdir
362
- p [status, stdout, stderr]
363
- end