capistrano_multiconfig_parallel 0.5.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/capistrano_multiconfig_parallel.gemspec +1 -0
- data/lib/capistrano_multiconfig_parallel.rb +1 -1
- data/lib/capistrano_multiconfig_parallel/all.rb +5 -1
- data/lib/capistrano_multiconfig_parallel/application.rb +1 -0
- data/lib/capistrano_multiconfig_parallel/base.rb +17 -13
- data/lib/capistrano_multiconfig_parallel/celluloid/celluloid_manager.rb +19 -3
- data/lib/capistrano_multiconfig_parallel/celluloid/celluloid_worker.rb +38 -4
- data/lib/capistrano_multiconfig_parallel/celluloid/child_process.rb +2 -2
- data/lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb +3 -23
- data/lib/capistrano_multiconfig_parallel/cli.rb +0 -1
- data/lib/capistrano_multiconfig_parallel/configuration.rb +0 -1
- data/lib/capistrano_multiconfig_parallel/{initializers → extensions}/rake.rb +0 -0
- data/lib/capistrano_multiconfig_parallel/helpers/base_manager.rb +40 -18
- data/lib/capistrano_multiconfig_parallel/helpers/multi_app_manager.rb +1 -0
- data/lib/capistrano_multiconfig_parallel/helpers/single_app_manager.rb +1 -0
- data/lib/capistrano_multiconfig_parallel/initializers/helper.rb +23 -0
- data/lib/capistrano_multiconfig_parallel/version.rb +2 -2
- metadata +23 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0362dba10934410958b8d42d03252ee5b8126c22
|
4
|
+
data.tar.gz: e407a9d74a97ea09c2a80e5222334204dc106b86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87a31611fb4dc5f10e115e7acb8bd1d580c9afbedb62c0c908d3a2b6be55cedbf3e936a6cffa44ecf5f4925c3a7f903b8536ff0ec3d6765c1cfd131a870d988b
|
7
|
+
data.tar.gz: fea6af3d812cf4ebdbfefee6084d50a640d3dc9d45a713a689e46d8f25bef422c50961c68b12ed4680a6c46ec5445cee67efac1cab15ecdcdb72bc961bb5e94c
|
data/README.md
CHANGED
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
|
|
30
30
|
s.add_runtime_dependency 'activesupport', '~> 4.0','>= 4.0'
|
31
31
|
s.add_runtime_dependency 'configliere', '~> 0.4', '>=0.4'
|
32
32
|
s.add_runtime_dependency 'inquirer', '~> 0.2', '>= 0.2'
|
33
|
+
s.add_runtime_dependency 'devnull','~> 0.1', '>= 0.1'
|
33
34
|
|
34
35
|
s.add_development_dependency 'rspec-rails', '~> 2.0', '>= 2.0'
|
35
36
|
s.add_development_dependency 'guard', '~> 2.6', '>= 2.6.1'
|
@@ -1 +1 @@
|
|
1
|
-
require 'capistrano_multiconfig_parallel/
|
1
|
+
require 'capistrano_multiconfig_parallel/all'
|
@@ -20,6 +20,8 @@ require 'capistrano/all'
|
|
20
20
|
require 'fileutils'
|
21
21
|
require 'logger'
|
22
22
|
require 'pp'
|
23
|
+
require 'devnull'
|
24
|
+
require 'inquirer'
|
23
25
|
# fix error with not files that can not be found
|
24
26
|
Gem.find_files('composable_state_machine/**/*.rb').each { |path| require path }
|
25
27
|
|
@@ -27,5 +29,7 @@ Gem.find_files('capistrano_multiconfig_parallel/initializers/**/*.rb').each { |p
|
|
27
29
|
Gem.find_files('capistrano_multiconfig_parallel/helpers/**/*.rb').each { |path| require path }
|
28
30
|
Gem.find_files('capistrano_multiconfig_parallel/celluloid/**/*.rb').each { |path| require path }
|
29
31
|
|
32
|
+
require_relative './version'
|
33
|
+
require_relative './configuration'
|
30
34
|
require_relative './base'
|
31
|
-
require_relative 'application'
|
35
|
+
require_relative './application'
|
@@ -1,9 +1,3 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bundler'
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'inquirer'
|
5
|
-
require_relative './version'
|
6
|
-
require_relative './configuration'
|
7
1
|
# base module that has the statis methods that this gem is using
|
8
2
|
module CapistranoMulticonfigParallel
|
9
3
|
include CapistranoMulticonfigParallel::Configuration
|
@@ -11,7 +5,8 @@ module CapistranoMulticonfigParallel
|
|
11
5
|
ENV_KEY_JOB_ID = 'multi_cap_job_id'
|
12
6
|
MULTI_KEY = 'multi'
|
13
7
|
SINGLE_KEY = 'single'
|
14
|
-
|
8
|
+
GITFLOW_TAG_STAGING_TASK = "gitflow:tag_staging"
|
9
|
+
|
15
10
|
CUSTOM_COMMANDS = {
|
16
11
|
CapistranoMulticonfigParallel::MULTI_KEY => {
|
17
12
|
stages: 'deploy_multi_stages'
|
@@ -29,7 +24,11 @@ module CapistranoMulticonfigParallel
|
|
29
24
|
end
|
30
25
|
|
31
26
|
def ask_confirm(message, default)
|
27
|
+
begin
|
32
28
|
Ask.input message, default: default
|
29
|
+
rescue
|
30
|
+
return nil
|
31
|
+
end
|
33
32
|
end
|
34
33
|
|
35
34
|
def log_directory
|
@@ -46,14 +45,19 @@ module CapistranoMulticonfigParallel
|
|
46
45
|
|
47
46
|
def enable_logging
|
48
47
|
CapistranoMulticonfigParallel.configuration_valid?
|
49
|
-
return unless CapistranoMulticonfigParallel::CelluloidManager.debug_enabled
|
50
48
|
FileUtils.mkdir_p(log_directory) unless File.directory?(log_directory)
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
49
|
+
if CapistranoMulticonfigParallel::CelluloidManager.debug_enabled.to_s.downcase == 'true'
|
50
|
+
FileUtils.touch(main_log_file) unless File.file?(main_log_file)
|
51
|
+
if ENV[CapistranoMulticonfigParallel::ENV_KEY_JOB_ID].blank?
|
52
|
+
log_file = File.open(main_log_file, 'w')
|
53
|
+
log_file.sync = true
|
54
|
+
end
|
55
|
+
self.logger = ::Logger.new(main_log_file)
|
56
|
+
else
|
57
|
+
self.logger = ::Logger.new(DevNull.new)
|
55
58
|
end
|
56
|
-
|
59
|
+
Celluloid.logger = CapistranoMulticonfigParallel.logger
|
60
|
+
Celluloid.task_class = Celluloid::TaskThread
|
57
61
|
end
|
58
62
|
|
59
63
|
def log_message(message)
|
@@ -63,7 +63,7 @@ module CapistranoMulticonfigParallel
|
|
63
63
|
# a job
|
64
64
|
def delegate(job)
|
65
65
|
job = job.stringify_keys
|
66
|
-
job['id'] = generate_job_id(job)
|
66
|
+
job['id'] = generate_job_id(job) unless job_failed?(job)
|
67
67
|
@jobs[job['id']] = job
|
68
68
|
job['env_options'][CapistranoMulticonfigParallel::ENV_KEY_JOB_ID] = job['id']
|
69
69
|
# debug(@jobs)
|
@@ -198,6 +198,18 @@ module CapistranoMulticonfigParallel
|
|
198
198
|
end
|
199
199
|
end
|
200
200
|
|
201
|
+
def can_tag_staging?
|
202
|
+
@job_manager.is_able_to_tag_staging? &&
|
203
|
+
@jobs.detect{|job_id, job| job['env'] == 'production'}.blank?
|
204
|
+
end
|
205
|
+
|
206
|
+
def dispatch_new_job(job)
|
207
|
+
original_env = job['env_options']
|
208
|
+
env_opts = @job_manager.get_app_additional_env_options(job['app_name'], job['stage'])
|
209
|
+
job['env_options'] = original_env.merge(env_opts)
|
210
|
+
async.delegate(job)
|
211
|
+
end
|
212
|
+
|
201
213
|
def process_job(job)
|
202
214
|
env_options = {}
|
203
215
|
job['env_options'].each do |key, value|
|
@@ -228,14 +240,18 @@ module CapistranoMulticonfigParallel
|
|
228
240
|
end
|
229
241
|
status
|
230
242
|
end
|
243
|
+
|
244
|
+
def job_failed?(job)
|
245
|
+
job['worker_action'].present? && job['worker_action'] == 'worker_died'
|
246
|
+
end
|
231
247
|
|
232
248
|
def worker_died(worker, reason)
|
233
249
|
debug("worker with mailbox #{worker.mailbox.inspect} died for reason: #{reason}") if self.class.debug_enabled?
|
234
250
|
job = @worker_to_job[worker.mailbox.address]
|
235
251
|
@worker_to_job.delete(worker.mailbox.address)
|
236
252
|
debug "restarting #{job} on new worker" if self.class.debug_enabled?
|
237
|
-
return if job.blank? || job
|
238
|
-
return unless job['
|
253
|
+
return if job.blank? || job_failed?(job)
|
254
|
+
return unless job['action_name'] == 'deploy'
|
239
255
|
job = job.merge(:action => 'deploy:rollback', 'worker_action' => 'worker_died')
|
240
256
|
delegate(job)
|
241
257
|
end
|
@@ -88,10 +88,37 @@ module CapistranoMulticonfigParallel
|
|
88
88
|
def rake_tasks
|
89
89
|
@rake_tasks ||= []
|
90
90
|
end
|
91
|
-
|
91
|
+
|
92
|
+
def last_staging_tag
|
93
|
+
last_tag_matching('staging-*')
|
94
|
+
end
|
95
|
+
|
96
|
+
def last_tag_matching(pattern)
|
97
|
+
# search for most recent (chronologically) tag matching the passed pattern, then get the name of that tag.
|
98
|
+
last_tag = `#{cd_working_directory} && git describe --exact-match --tags --match='#{pattern}' $(git log --tags='#{pattern}*' -n1 --pretty='%h')`.chomp
|
99
|
+
debug("LAST TAG is #{last_tag}") if debug_enabled?
|
100
|
+
last_tag == '' ? nil : last_tag
|
101
|
+
end
|
102
|
+
|
103
|
+
def staging_was_tagged?
|
104
|
+
begin
|
105
|
+
current_sha = `#{cd_working_directory} && git log --pretty=format:%H HEAD -1`
|
106
|
+
debug("curent SHA is #{current_sha}") if debug_enabled?
|
107
|
+
last_staging_tag_sha = last_staging_tag ? `#{cd_working_directory} && git log --pretty=format:%H #{last_staging_tag} -1` : nil
|
108
|
+
debug("LAST TAGGING SHA is #{last_staging_tag_sha}") if debug_enabled?
|
109
|
+
last_staging_tag_sha == current_sha
|
110
|
+
rescue
|
111
|
+
return false
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def cd_working_directory
|
116
|
+
"cd #{CapistranoMulticonfigParallel.detect_root.to_s}"
|
117
|
+
end
|
118
|
+
|
92
119
|
def generate_command
|
93
120
|
<<-CMD
|
94
|
-
|
121
|
+
#{cd_working_directory} && RAILS_ENV=#{@env_name} bundle exec multi_cap #{@task_argv.join(' ')}
|
95
122
|
CMD
|
96
123
|
end
|
97
124
|
|
@@ -121,6 +148,9 @@ module CapistranoMulticonfigParallel
|
|
121
148
|
|
122
149
|
def handle_subscription(message)
|
123
150
|
if message_is_about_a_task?(message)
|
151
|
+
if @env_name == 'staging' && @manager.can_tag_staging? && staging_was_tagged? && has_executed_task?(CapistranoMulticonfigParallel::GITFLOW_TAG_STAGING_TASK)
|
152
|
+
@manager.dispatch_new_job(@job.merge('env' => 'production'))
|
153
|
+
end
|
124
154
|
save_tasks_to_be_executed(message)
|
125
155
|
update_machine_state(message['task']) # if message['action'] == 'invoke'
|
126
156
|
debug("worker #{@job_id} state is #{@machine.state}") if debug_enabled?
|
@@ -133,6 +163,10 @@ module CapistranoMulticonfigParallel
|
|
133
163
|
def message_is_about_a_task?(message)
|
134
164
|
message.present? && message.is_a?(Hash) && message['action'].present? && message['job_id'].present? && message['task'].present?
|
135
165
|
end
|
166
|
+
|
167
|
+
def has_executed_task?(task)
|
168
|
+
@rake_tasks.present? && @rake_tasks[task].present?
|
169
|
+
end
|
136
170
|
|
137
171
|
def task_approval(message)
|
138
172
|
if @manager.apply_confirmations? && CapistranoMulticonfigParallel.configuration.task_confirmations.include?(message['task']) && message['action'] == 'invoke'
|
@@ -193,14 +227,14 @@ module CapistranoMulticonfigParallel
|
|
193
227
|
end
|
194
228
|
|
195
229
|
def crashed?
|
196
|
-
@action_name == 'deploy:rollback' || @action_name == 'deploy:failed'
|
230
|
+
@action_name == 'deploy:rollback' || @action_name == 'deploy:failed' || @manager.job_failed?(@job)
|
197
231
|
end
|
198
232
|
|
199
233
|
def finish_worker
|
200
234
|
@manager.mark_completed_remaining_tasks(Actor.current)
|
201
235
|
@worker_state = 'finished'
|
202
236
|
@manager.job_to_worker.each do|_job_id, worker|
|
203
|
-
debug("worker #{worker.job_id}has state #{worker.worker_state}") if worker.alive? &&
|
237
|
+
debug("worker #{worker.job_id}has state #{worker.worker_state}") if worker.alive? && debug_enabled?
|
204
238
|
end
|
205
239
|
end
|
206
240
|
|
@@ -26,9 +26,9 @@ module CapistranoMulticonfigParallel
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def set_worker_log
|
29
|
-
FileUtils.mkdir_p(CapistranoMulticonfigParallel.log_directory)
|
29
|
+
FileUtils.mkdir_p(CapistranoMulticonfigParallel.log_directory) unless File.directory?(CapistranoMulticonfigParallel.log_directory)
|
30
30
|
@filename = File.join(CapistranoMulticonfigParallel.log_directory, "worker_#{@actor.job_id}.log")
|
31
|
-
FileUtils.rm_rf(@filename) if @options[:dry_run] || @actor.executed_dry_run != true
|
31
|
+
FileUtils.rm_rf(@filename) if File.file?(@filename) && !@actor.crashed? && (@options[:dry_run] || @actor.executed_dry_run != true)
|
32
32
|
@worker_log = ::Logger.new(@filename)
|
33
33
|
@worker_log.level = ::Logger::Severity::DEBUG
|
34
34
|
@worker_log.formatter = proc do |severity, datetime, progname, msg|
|
@@ -57,7 +57,7 @@ module CapistranoMulticonfigParallel
|
|
57
57
|
worker = @manager.get_worker_for_job(job_id)
|
58
58
|
if worker.alive?
|
59
59
|
state = worker.machine.state.to_s
|
60
|
-
state =
|
60
|
+
state = worker.crashed? ? state.red : state.green
|
61
61
|
else
|
62
62
|
state = "dead".upcase.red
|
63
63
|
end
|
@@ -98,26 +98,6 @@ module CapistranoMulticonfigParallel
|
|
98
98
|
system('cls') || system('clear') || puts("\e[H\e[2J")
|
99
99
|
end
|
100
100
|
|
101
|
-
def worker_crashed?(worker)
|
102
|
-
worker.crashed?
|
103
|
-
end
|
104
|
-
# rubocop:disable Lint/Eval
|
105
|
-
def capture(stream)
|
106
|
-
stream = stream.to_s
|
107
|
-
captured_stream = Tempfile.new(stream)
|
108
|
-
stream_io = eval("$#{stream}")
|
109
|
-
origin_stream = stream_io.dup
|
110
|
-
stream_io.reopen(captured_stream)
|
111
|
-
|
112
|
-
yield
|
113
|
-
|
114
|
-
stream_io.rewind
|
115
|
-
return captured_stream.read
|
116
|
-
ensure
|
117
|
-
captured_stream.close
|
118
|
-
captured_stream.unlink
|
119
|
-
stream_io.reopen(origin_stream)
|
120
|
-
end
|
121
101
|
|
122
102
|
def worker_progress(worker)
|
123
103
|
tasks = worker.rake_tasks
|
@@ -125,14 +105,14 @@ module CapistranoMulticonfigParallel
|
|
125
105
|
total_tasks = tasks.size
|
126
106
|
task_index = tasks.index(current_task)
|
127
107
|
progress = Formatador::ProgressBar.new(total_tasks, color: 'green', start: task_index.to_i)
|
128
|
-
result = capture(:stdout) do
|
108
|
+
result = CapistranoMulticonfigParallel::Helper.capture(:stdout) do
|
129
109
|
progress.increment
|
130
110
|
end
|
131
111
|
result = result.gsub("\r\n", '')
|
132
112
|
result = result.gsub("\n", '')
|
133
113
|
result = result.gsub('|', '#')
|
134
114
|
result = result.gsub(/\s+/, ' ')
|
135
|
-
if
|
115
|
+
if worker.crashed?
|
136
116
|
return result.red
|
137
117
|
else
|
138
118
|
return result.green
|
File without changes
|
@@ -5,7 +5,7 @@ module CapistranoMulticonfigParallel
|
|
5
5
|
class BaseManager
|
6
6
|
include Celluloid
|
7
7
|
include Celluloid::Logger
|
8
|
-
|
8
|
+
|
9
9
|
attr_accessor :condition, :manager, :deps, :application, :stage, :name, :args, :argv, :jobs, :job_registered_condition, :default_stage
|
10
10
|
|
11
11
|
def initialize(cap_app, top_level_tasks, stages)
|
@@ -58,10 +58,6 @@ module CapistranoMulticonfigParallel
|
|
58
58
|
def check_before_starting
|
59
59
|
@condition = Celluloid::Condition.new
|
60
60
|
@manager = CapistranoMulticonfigParallel::CelluloidManager.new(Actor.current)
|
61
|
-
if CapistranoMulticonfigParallel::CelluloidManager.debug_enabled == true
|
62
|
-
Celluloid.logger = CapistranoMulticonfigParallel.logger
|
63
|
-
Celluloid.task_class = Celluloid::TaskThread
|
64
|
-
end
|
65
61
|
end
|
66
62
|
|
67
63
|
def collect_jobs(options = {}, &block)
|
@@ -79,22 +75,50 @@ module CapistranoMulticonfigParallel
|
|
79
75
|
run_async_jobs
|
80
76
|
end
|
81
77
|
end
|
78
|
+
|
79
|
+
def tag_staging_exists? # check exists task from capistrano-gitflow
|
80
|
+
begin
|
81
|
+
Rake::Task[CapistranoMulticonfigParallel::GITFLOW_TAG_STAGING_TASK].present?
|
82
|
+
rescue
|
83
|
+
return false
|
84
|
+
end
|
85
|
+
end
|
82
86
|
|
83
87
|
def fetch_multi_stages
|
84
88
|
stages = @argv['STAGES'].blank? ? '' : @argv['STAGES']
|
85
89
|
stages = parse_inputted_value(value: stages).split(',').compact if stages.present?
|
86
|
-
stages
|
90
|
+
stages.present? ? stages : [@default_stage]
|
87
91
|
end
|
88
92
|
|
93
|
+
def wants_deploy_production?
|
94
|
+
(!custom_command? && @stage == 'production') || (custom_command? && fetch_multi_stages.include?("production"))
|
95
|
+
end
|
96
|
+
|
97
|
+
def is_able_to_tag_staging?
|
98
|
+
using_git? && wants_deploy_production? && tag_staging_exists?
|
99
|
+
end
|
100
|
+
|
101
|
+
def check_multi_stages(stages)
|
102
|
+
is_able_to_tag_staging? ? stages.reject{|u| u == 'production'} : stages
|
103
|
+
end
|
104
|
+
|
89
105
|
def deploy_app(options = {})
|
90
106
|
options = options.stringify_keys
|
91
107
|
app = options['app'].is_a?(Hash) ? options['app'] : { 'app' => options['app'] }
|
92
108
|
branch = @branch_backup.present? ? @branch_backup : @argv['BRANCH'].to_s
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
109
|
+
call_task_deploy_app({
|
110
|
+
branch: branch,
|
111
|
+
app: app,
|
112
|
+
action: options['action']
|
113
|
+
}.reverse_merge(options))
|
114
|
+
end
|
115
|
+
|
116
|
+
def get_app_additional_env_options(app, app_message)
|
117
|
+
app_name = (app.is_a?(Hash) && app[:app].present?) ? app[:app].camelcase : app
|
118
|
+
app_name = app_name.present? ? app_name : 'current application'
|
119
|
+
message = "Please write additional ENV options for #{app_name} for #{app_message}"
|
120
|
+
set :app_additional_env_options, CapistranoMulticonfigParallel.ask_confirm(message, nil)
|
121
|
+
fetch_app_additional_env_options
|
98
122
|
end
|
99
123
|
|
100
124
|
private
|
@@ -178,15 +202,13 @@ module CapistranoMulticonfigParallel
|
|
178
202
|
return ''
|
179
203
|
end
|
180
204
|
end
|
181
|
-
|
182
|
-
def
|
183
|
-
|
184
|
-
app_name = app_name.present? ? app_name : 'current application'
|
185
|
-
message = "Please write additional ENV options for #{app_name} for #{app_message}"
|
186
|
-
set :app_additional_env_options, CapistranoMulticonfigParallel.ask_confirm(message, nil)
|
187
|
-
fetch_app_additional_env_options
|
205
|
+
|
206
|
+
def using_git?
|
207
|
+
fetch(:scm, :git).to_sym == :git
|
188
208
|
end
|
189
209
|
|
210
|
+
|
211
|
+
|
190
212
|
def fetch_app_additional_env_options
|
191
213
|
options = {}
|
192
214
|
return options if fetch(:app_additional_env_options).blank?
|
@@ -49,6 +49,7 @@ module CapistranoMulticonfigParallel
|
|
49
49
|
def multi_stage_deploy(options)
|
50
50
|
stages = fetch_multi_stages
|
51
51
|
return if stages.blank?
|
52
|
+
stages = check_multi_stages(stages)
|
52
53
|
multi_collect_and_run_jobs(options) do |apps, new_options|
|
53
54
|
apps.each do |app|
|
54
55
|
stages.each do |stage|
|
@@ -29,6 +29,7 @@ module CapistranoMulticonfigParallel
|
|
29
29
|
return unless custom_command?
|
30
30
|
stages = fetch_multi_stages
|
31
31
|
return if stages.blank?
|
32
|
+
stages = check_multi_stages(stages)
|
32
33
|
collect_jobs(options) do |new_options|
|
33
34
|
stages.each do |stage|
|
34
35
|
deploy_app(new_options.merge('stage' => stage, 'action' => 'deploy'))
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module CapistranoMulticonfigParallel
|
2
|
+
# class used to find application dependencies
|
3
|
+
class Helper
|
4
|
+
# rubocop:disable Lint/Eval
|
5
|
+
def self.capture(stream)
|
6
|
+
stream = stream.to_s
|
7
|
+
captured_stream = Tempfile.new(stream)
|
8
|
+
stream_io = eval("$#{stream}")
|
9
|
+
origin_stream = stream_io.dup
|
10
|
+
stream_io.reopen(captured_stream)
|
11
|
+
|
12
|
+
yield
|
13
|
+
|
14
|
+
stream_io.rewind
|
15
|
+
return captured_stream.read
|
16
|
+
ensure
|
17
|
+
captured_stream.close
|
18
|
+
captured_stream.unlink
|
19
|
+
stream_io.reopen(origin_stream)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano_multiconfig_parallel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- bogdanRada
|
@@ -270,6 +270,26 @@ dependencies:
|
|
270
270
|
- - ">="
|
271
271
|
- !ruby/object:Gem::Version
|
272
272
|
version: '0.2'
|
273
|
+
- !ruby/object:Gem::Dependency
|
274
|
+
name: devnull
|
275
|
+
requirement: !ruby/object:Gem::Requirement
|
276
|
+
requirements:
|
277
|
+
- - "~>"
|
278
|
+
- !ruby/object:Gem::Version
|
279
|
+
version: '0.1'
|
280
|
+
- - ">="
|
281
|
+
- !ruby/object:Gem::Version
|
282
|
+
version: '0.1'
|
283
|
+
type: :runtime
|
284
|
+
prerelease: false
|
285
|
+
version_requirements: !ruby/object:Gem::Requirement
|
286
|
+
requirements:
|
287
|
+
- - "~>"
|
288
|
+
- !ruby/object:Gem::Version
|
289
|
+
version: '0.1'
|
290
|
+
- - ">="
|
291
|
+
- !ruby/object:Gem::Version
|
292
|
+
version: '0.1'
|
273
293
|
- !ruby/object:Gem::Dependency
|
274
294
|
name: rspec-rails
|
275
295
|
requirement: !ruby/object:Gem::Requirement
|
@@ -626,13 +646,14 @@ files:
|
|
626
646
|
- lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb
|
627
647
|
- lib/capistrano_multiconfig_parallel/cli.rb
|
628
648
|
- lib/capistrano_multiconfig_parallel/configuration.rb
|
649
|
+
- lib/capistrano_multiconfig_parallel/extensions/rake.rb
|
629
650
|
- lib/capistrano_multiconfig_parallel/helpers/base_manager.rb
|
630
651
|
- lib/capistrano_multiconfig_parallel/helpers/multi_app_manager.rb
|
631
652
|
- lib/capistrano_multiconfig_parallel/helpers/single_app_manager.rb
|
632
653
|
- lib/capistrano_multiconfig_parallel/helpers/standard_deploy.rb
|
633
654
|
- lib/capistrano_multiconfig_parallel/initializers/conf.rb
|
634
655
|
- lib/capistrano_multiconfig_parallel/initializers/default.yml
|
635
|
-
- lib/capistrano_multiconfig_parallel/initializers/
|
656
|
+
- lib/capistrano_multiconfig_parallel/initializers/helper.rb
|
636
657
|
- lib/capistrano_multiconfig_parallel/multi_app_helpers/dependency_tracker.rb
|
637
658
|
- lib/capistrano_multiconfig_parallel/multi_app_helpers/interactive_menu.rb
|
638
659
|
- lib/capistrano_multiconfig_parallel/version.rb
|