capistrano_multiconfig_parallel 0.5.0 → 0.6.1
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.
- 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
|