alcapon 0.2.0 → 0.3.0
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/README.md +24 -2
- data/bin/capezit +34 -8
- data/lib/capez.rb +260 -37
- data/lib/ext/spinner.rb +26 -0
- metadata +17 -3
data/README.md
CHANGED
@@ -1,8 +1,30 @@
|
|
1
1
|
# AlCapON : Enable Capistrano for your eZ Publish installations
|
2
2
|
|
3
|
-
AlCapON is a simple recipe for Capistrano, the well-known deployment toolbox.
|
3
|
+
AlCapON is a simple recipe for Capistrano, the well-known deployment toolbox.
|
4
|
+
It helps you dealing with simple task such as pushing your code to your
|
5
|
+
webserver(s), clearing cache, etc.
|
4
6
|
|
5
|
-
IMPORTANT: this package is currently under development, please consider testing
|
7
|
+
IMPORTANT: this package is currently under development, please consider testing
|
8
|
+
it on a preproduction environment before going further. Please also do read the
|
9
|
+
"Known bugs" section carefully.
|
10
|
+
|
11
|
+
## Changelog
|
12
|
+
|
13
|
+
### 0.3.x
|
14
|
+
|
15
|
+
- added the possibility to trigger rename and in-file replace operations
|
16
|
+
during the deployment (see the generated file
|
17
|
+
config/deploy/production.rb after running the capezit command)
|
18
|
+
|
19
|
+
- major changes in permissions management for the var/ folders. Previous
|
20
|
+
versions tried to manage different cases by using sudo commands but I'm
|
21
|
+
convinced that it is not the right place to do that. Permissions have to be
|
22
|
+
handled by sysadmin, not Capistrano.
|
23
|
+
This will be improved, maybe simplified again, in next versions.
|
24
|
+
In consequence, you might experienced some issues, but please, let me know.
|
25
|
+
|
26
|
+
- usage of siteaccess_list in ezpublish.rb is deprecated as of 0.3.0. Please
|
27
|
+
use storage_directories instead (see issue #2)
|
6
28
|
|
7
29
|
## Requirements, installation & co
|
8
30
|
|
data/bin/capezit
CHANGED
@@ -69,6 +69,14 @@ files = {
|
|
69
69
|
# Need if you want to deploy somewhere where sudo is needed
|
70
70
|
default_run_options[:pty] = true
|
71
71
|
|
72
|
+
# Set debug level to IMPORTANT only
|
73
|
+
# Comment if you want to get more debug outputs
|
74
|
+
logger.level = Logger::IMPORTANT
|
75
|
+
|
76
|
+
# Override default feature (not needed for eZ Publish)
|
77
|
+
# If turned on, you will get a warning during deployment but it should not be aborted
|
78
|
+
set :normalize_asset_timestamps, false
|
79
|
+
|
72
80
|
# Use this to use your ssh keys
|
73
81
|
# (you might need to run ssh-add /path/to/your/deploy_key before)
|
74
82
|
ssh_options[:forward_agent] = true
|
@@ -99,8 +107,9 @@ files = {
|
|
99
107
|
# This file contains eZ Publish adjustable variables depending on your custom setup
|
100
108
|
|
101
109
|
# Your webserver user and group, used to chmod directories just after deploy:setup
|
102
|
-
|
103
|
-
set :
|
110
|
+
# By default, this is the user as the one used to connect via SSH
|
111
|
+
set :webserver_user, :user
|
112
|
+
set :webserver_group, :user
|
104
113
|
|
105
114
|
# If true, will always turn your webserver offline
|
106
115
|
# Requires a specific rewrite rule (see documentation)
|
@@ -117,15 +126,22 @@ files = {
|
|
117
126
|
# your var directory (2012.5 for instance)
|
118
127
|
set :cache_purge, false
|
119
128
|
|
120
|
-
#
|
121
|
-
#
|
129
|
+
# A list of var directories which will handle siteaccess's specific assets, such as
|
130
|
+
# the storage
|
131
|
+
#set :storage_directories, [ "ezflow_site" ]
|
122
132
|
|
123
133
|
# Set this to tell Capistrano with which host you want to sync your local storage dir
|
124
134
|
#set :shared_host, "domain.com"
|
125
135
|
|
136
|
+
# Changes the group of shared_children items (by default, webserver_group is used)
|
137
|
+
# If not set, permissions remain unchanged
|
138
|
+
#set :shared_children_group, "#{webserver_group}"
|
139
|
+
|
126
140
|
# Which autoloads to generate. By default, regenerates extensions and
|
127
141
|
# kernel-override autoloads
|
128
142
|
# Possible values : see bin/php/ezpgenerateautoloads.php --help
|
143
|
+
# Feature can be disabled by using :
|
144
|
+
#set :autoload_list, []
|
129
145
|
set :autoload_list, [ "extension", "kernel-override" ]
|
130
146
|
|
131
147
|
# TODO : use yml files to manage database credentials securely
|
@@ -161,8 +177,8 @@ files = {
|
|
161
177
|
#set :admin_runner, "sudouser"
|
162
178
|
|
163
179
|
# This is used for permissions related tasks
|
164
|
-
#set :webserver_user,
|
165
|
-
#set :webserver_group,
|
180
|
+
#set :webserver_user, :user
|
181
|
+
#set :webserver_group, :user
|
166
182
|
FILE
|
167
183
|
|
168
184
|
"#{alcapon_path}/config/deploy/production.rb" => unindent(<<-FILE)
|
@@ -175,8 +191,18 @@ files = {
|
|
175
191
|
#set :admin_runner, "sudouser"
|
176
192
|
|
177
193
|
# This is used for permissions related tasks
|
178
|
-
#set :webserver_user,
|
179
|
-
#set :webserver_group,
|
194
|
+
#set :webserver_user, :user
|
195
|
+
#set :webserver_group, :user
|
196
|
+
|
197
|
+
#set :file_changes, {
|
198
|
+
# 'settings/override/site.ini.append.dist' => {
|
199
|
+
# 'rename' => 'settings/override/site.ini.append.php',
|
200
|
+
# 'replace' => {
|
201
|
+
# '@tokens_database_host@' => 'prod-dbs',
|
202
|
+
# },
|
203
|
+
# }
|
204
|
+
#}
|
205
|
+
|
180
206
|
FILE
|
181
207
|
}
|
182
208
|
|
data/lib/capez.rb
CHANGED
@@ -1,16 +1,60 @@
|
|
1
1
|
load_paths.push File.expand_path('../', __FILE__)
|
2
2
|
load 'db.rb'
|
3
|
+
require 'colored'
|
3
4
|
|
4
5
|
# This will simply do chmod g+w on all dir
|
5
6
|
# See task :setup
|
6
7
|
set :group_writable, true
|
7
8
|
|
9
|
+
# triggered after all recipes have loaded
|
10
|
+
on :load do
|
11
|
+
if( fetch( :siteaccess_list, nil ) != nil )
|
12
|
+
abort "The usage of siteaccess_list in ezpublish.rb is deprecated as of 0.3.0.\nPlease use storage_directories instead".red
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
before "deploy:setup" do
|
17
|
+
print_dotted( "--> Creating default directories" )
|
18
|
+
end
|
19
|
+
|
8
20
|
after "deploy:setup", :roles => :web do
|
21
|
+
puts( " OK".green )
|
22
|
+
print_dotted( "--> Fixing permissions on deployment directory" )
|
23
|
+
try_sudo( "chown -R #{user} #{deploy_to}" ) # if not code checkout cannot be done :/
|
24
|
+
puts( " OK".green )
|
9
25
|
capez.var.init_shared
|
10
26
|
end
|
11
27
|
|
12
|
-
|
13
|
-
|
28
|
+
before "deploy:update_code" do
|
29
|
+
puts( "\n*** Building release ***" )
|
30
|
+
puts( "Started at " + Time.now.utc.strftime("%H:%M:%S") )
|
31
|
+
print_dotted( "--> Updating code", :sol => true )
|
32
|
+
end
|
33
|
+
|
34
|
+
after "deploy:update_code" do
|
35
|
+
puts( "\n*** Release ready ***".green )
|
36
|
+
puts( "Finished at " + Time.now.utc.strftime("%H:%M:%S") )
|
37
|
+
end
|
38
|
+
|
39
|
+
before "deploy:finalize_update" do
|
40
|
+
puts( " OK".green )
|
41
|
+
# Needed if you want to create extra shared directories under var/ with
|
42
|
+
# set :shared_children, [ "var/something",
|
43
|
+
# "var/something_else" ]
|
44
|
+
# Note that :shared_children creates a folder within shared which name is
|
45
|
+
# the last path element (ie: something or something_else) => that's why
|
46
|
+
# we cannot use it to create siteaccess storages (var/siteaccess/storage)
|
47
|
+
run( "mkdir #{latest_release}/var" )
|
48
|
+
end
|
49
|
+
|
50
|
+
after "deploy:finalize_update" do
|
51
|
+
if fetch( :shared_children_group, false )
|
52
|
+
shared_children.map { |d| run( "chgrp -R #{shared_children_group} #{shared_path}/#{d.split('/').last}") }
|
53
|
+
end
|
54
|
+
capez.var.init_release
|
55
|
+
capez.var.link
|
56
|
+
capez.settings.deploy
|
57
|
+
capez.autoloads.generate
|
14
58
|
#capez.cache.clear
|
15
59
|
end
|
16
60
|
|
@@ -23,15 +67,16 @@ after "deploy", :roles => :web do
|
|
23
67
|
deploy.web.enable
|
24
68
|
end
|
25
69
|
|
26
|
-
|
70
|
+
before "deploy:create_symlink" do
|
71
|
+
print_dotted( "--> Going live (symlink)", :sol => true )
|
72
|
+
end
|
27
73
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
74
|
+
after "deploy:create_symlink" do
|
75
|
+
puts( " OK".green )
|
76
|
+
end
|
77
|
+
|
78
|
+
# Default behavior overrides
|
79
|
+
namespace :deploy do
|
35
80
|
|
36
81
|
namespace :web do
|
37
82
|
desc <<-DESC
|
@@ -61,6 +106,116 @@ end
|
|
61
106
|
|
62
107
|
|
63
108
|
namespace :capez do
|
109
|
+
namespace :settings do
|
110
|
+
|
111
|
+
def make_file_changes( options={} )
|
112
|
+
|
113
|
+
default_options = { :locally => false }
|
114
|
+
options = default_options.merge( options )
|
115
|
+
|
116
|
+
puts( "\n--> File operations" )
|
117
|
+
|
118
|
+
unless !(file_changes = get_file_changes) then
|
119
|
+
|
120
|
+
path = options[:locally] ? "" : "#{latest_release}/"
|
121
|
+
|
122
|
+
changes = 0
|
123
|
+
renames = 0
|
124
|
+
errors = []
|
125
|
+
messages = []
|
126
|
+
|
127
|
+
print_dotted( "execution", :eol_msg => (options[:locally] ? "local" : "distant" ), :eol => true, :max_length => 25 )
|
128
|
+
print_dotted( "files count", :eol_msg => "#{file_changes.count}", :eol => true, :max_length => 25 )
|
129
|
+
|
130
|
+
# process each files
|
131
|
+
print( "progress " )
|
132
|
+
file_changes.each { |filename,operations|
|
133
|
+
|
134
|
+
print( "." )
|
135
|
+
|
136
|
+
target_filename = filename
|
137
|
+
renamed = false
|
138
|
+
|
139
|
+
# rename operation is caught and executed at first
|
140
|
+
if operations.has_key?("rename")
|
141
|
+
if( target_filename != operations['rename'] )
|
142
|
+
target_filename = operations['rename']
|
143
|
+
cmd = "if [ -f #{path}#{filename} ]; then cp #{path}#{filename} #{path}#{target_filename}; fi;"
|
144
|
+
options[:locally] ? run_locally( "#{cmd}" ) : run( "#{cmd}" )
|
145
|
+
renames += 1
|
146
|
+
else
|
147
|
+
target_filename = operations['rename']
|
148
|
+
errors += ["target and original name are the same (#{target_filename})"]
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
operations.each { |operation,value|
|
153
|
+
case operation
|
154
|
+
when 'rename'
|
155
|
+
when 'replace'
|
156
|
+
|
157
|
+
if( value.count > 0 )
|
158
|
+
|
159
|
+
# download file if necessary
|
160
|
+
if options[:locally]
|
161
|
+
tmp_filename = target_filename
|
162
|
+
else
|
163
|
+
tmp_filename = target_filename+".tmp"
|
164
|
+
get "#{path}#{target_filename}", tmp_filename
|
165
|
+
end
|
166
|
+
|
167
|
+
text = File.read(tmp_filename)
|
168
|
+
value.each { |search,replace|
|
169
|
+
changes += 1
|
170
|
+
text = text.gsub( "#{search}", "#{replace}" )
|
171
|
+
}
|
172
|
+
File.open(tmp_filename, "w") {|file| file.write(text) }
|
173
|
+
|
174
|
+
# upload and remove temporary file
|
175
|
+
if !options[:locally]
|
176
|
+
run( "if [ -f #{target_filename} ]; then rm #{target_filename}; fi;" )
|
177
|
+
upload( tmp_filename, "#{path}#{target_filename}" )
|
178
|
+
run_locally( "rm #{tmp_filename}" )
|
179
|
+
end
|
180
|
+
end
|
181
|
+
else
|
182
|
+
errors += ( "operation '#{operation}' supported" )
|
183
|
+
end
|
184
|
+
}
|
185
|
+
}
|
186
|
+
puts " done".green
|
187
|
+
|
188
|
+
# stats
|
189
|
+
print_dotted( "files renamed", :eol_msg => "#{renames}", :eol => true, :max_length => 25 )
|
190
|
+
print_dotted( "changes count", :eol_msg => "#{changes}", :eol => true, :max_length => 25 )
|
191
|
+
print_dotted( "changes avg / file", :max_length => 25, :eol_msg => ( file_changes.count > 0 ? "#{changes/file_changes.count}" : "" ), :eol => true )
|
192
|
+
messages.each { |msg| puts( "#{msg}") }
|
193
|
+
puts( "errors : ".red ) unless errors.count == 0
|
194
|
+
errors.each { |msg| puts( "- #{msg}".red ) }
|
195
|
+
else
|
196
|
+
puts( "No file changes needs to be applied. Please set :file_changes".blue )
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
desc <<-DESC
|
201
|
+
Makes some file level operations if needed (rename, replace)
|
202
|
+
DESC
|
203
|
+
task :deploy, :roles => :web do
|
204
|
+
make_file_changes
|
205
|
+
end
|
206
|
+
|
207
|
+
desc <<-DESC
|
208
|
+
[local] Makes some file level operations if needed (rename, replace)
|
209
|
+
DESC
|
210
|
+
task :deploy_locally, :roles => :web do
|
211
|
+
make_file_changes( :locally => true )
|
212
|
+
end
|
213
|
+
|
214
|
+
def get_file_changes
|
215
|
+
return fetch( :file_changes, false )
|
216
|
+
end
|
217
|
+
|
218
|
+
end
|
64
219
|
|
65
220
|
namespace :cache do
|
66
221
|
desc <<-DESC
|
@@ -70,10 +225,12 @@ namespace :capez do
|
|
70
225
|
# Multiple server platform are supposed to use a cluster configuration (eZDFS/eZDBFS)
|
71
226
|
# and cache management is done via expiry.php which is managed by the cluster API
|
72
227
|
task :clear, :roles => :web, :only => { :primary => true } do
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
228
|
+
puts( "\n--> Clearing caches #{'with --purge'.red if cache_purge}" )
|
229
|
+
cache_list.each { |cache_tag|
|
230
|
+
print_dotted( "#{cache_tag}" )
|
231
|
+
capture "cd #{current_path} && sudo -u #{webserver_user} php bin/php/ezcache.php --clear-tag=#{cache_tag}#{' --purge' if cache_purge}"
|
232
|
+
puts( " OK".green )
|
233
|
+
}
|
77
234
|
end
|
78
235
|
end
|
79
236
|
|
@@ -82,29 +239,65 @@ namespace :capez do
|
|
82
239
|
Creates the needed folder within your remote(s) var directories
|
83
240
|
DESC
|
84
241
|
task :init_shared, :roles => :web do
|
242
|
+
puts( "--> Creating eZ Publish var directories" )
|
243
|
+
print_dotted( "var " )
|
244
|
+
run( "mkdir -p #{shared_path}/var" )
|
245
|
+
puts( " OK".green )
|
246
|
+
|
247
|
+
print_dotted( "var/storage" )
|
85
248
|
run( "mkdir -p #{shared_path}/var/storage" )
|
86
|
-
|
87
|
-
|
249
|
+
puts( " OK".green )
|
250
|
+
|
251
|
+
storage_directories.each{ |sd|
|
252
|
+
print_dotted( "var/#{sd}/storage" )
|
253
|
+
run( "mkdir -p #{shared_path}/var/#{sd}/storage" )
|
254
|
+
puts( " OK".green )
|
255
|
+
}
|
256
|
+
run( "chmod -R g+w #{shared_path}/var")
|
257
|
+
run( "chown -R #{fetch(:webserver_group,:user)} #{shared_path}/var")
|
258
|
+
end
|
259
|
+
|
260
|
+
|
261
|
+
|
262
|
+
desc <<-DESC
|
263
|
+
[internal] Creates release directories
|
264
|
+
DESC
|
265
|
+
task :init_release, :roles => :web do
|
266
|
+
puts( "\n--> Release directories" )
|
267
|
+
|
268
|
+
# creates a storage dir for elements specified by :storage_directories
|
269
|
+
storage_directories.each{ |sd|
|
270
|
+
print_dotted( "var/#{sd}/storage" )
|
271
|
+
run( "mkdir #{latest_release}/var/#{sd}" )
|
272
|
+
puts( " OK".green )
|
88
273
|
}
|
89
274
|
|
90
|
-
|
275
|
+
# makes sure the webserver can write into var/
|
276
|
+
run( "chmod -R g+w #{latest_release}/var")
|
277
|
+
run( "chown -R #{fetch(:webserver_user,:user)}:#{fetch(:webserver_group,:user)} #{latest_release}/var")
|
278
|
+
# needed even if we just want to run 'bin/php/ezpgenerateautoloads.php' with --extension
|
279
|
+
run( "chown -R #{fetch(:webserver_user,:user)}:#{fetch(:webserver_group,:user)} #{latest_release}/autoload")
|
91
280
|
end
|
92
281
|
|
93
282
|
desc <<-DESC
|
94
283
|
Link .../shared/var into ../releases/[latest_release]/var
|
95
284
|
DESC
|
96
285
|
task :link, :roles => :web do
|
97
|
-
|
98
|
-
siteaccess_list.each{ |siteaccess_identifier|
|
99
|
-
run( "mkdir #{latest_release}/var/#{siteaccess_identifier}" )
|
100
|
-
}
|
286
|
+
puts( "\n--> Symlinks" )
|
101
287
|
|
102
|
-
|
288
|
+
print_dotted( "var/storage" )
|
289
|
+
run( "ln -s #{shared_path}/var/storage #{latest_release}/var/storage" )
|
290
|
+
puts( " OK".green )
|
103
291
|
|
104
|
-
|
105
|
-
|
106
|
-
|
292
|
+
storage_directories.each{ |sd|
|
293
|
+
print_dotted( "var/#{sd}/storage" )
|
294
|
+
run( "ln -s #{shared_path}/var/#{sd}/storage #{latest_release}/var/#{sd}/storage", :as => webserver_user )
|
295
|
+
#run( "chmod -h g+w #{latest_release}/var/#{sd}/storage")
|
296
|
+
puts( " OK".green )
|
107
297
|
}
|
298
|
+
|
299
|
+
run( "chmod -R g+w #{latest_release}/var")
|
300
|
+
run( "chown -R #{fetch(:webserver_user,:user)}:#{fetch(:webserver_group,:user)} #{shared_path}/var")
|
108
301
|
end
|
109
302
|
|
110
303
|
desc <<-DESC
|
@@ -159,12 +352,17 @@ namespace :capez do
|
|
159
352
|
Generates autoloads (extensions and kernel overrides)
|
160
353
|
DESC
|
161
354
|
task :generate do
|
162
|
-
|
163
|
-
|
355
|
+
if autoload_list.count == 0
|
356
|
+
print_dotted( "--> eZ Publish autoloads (disabled)", :sol => true )
|
357
|
+
puts( " OK".green )
|
358
|
+
else
|
359
|
+
puts( "\n--> eZ Publish autoloads " )
|
360
|
+
autoload_list.each { |autoload|
|
361
|
+
print_dotted( "#{autoload}" )
|
362
|
+
capture( "cd #{latest_release} && sudo -u #{webserver_user} php bin/php/ezpgenerateautoloads.php --#{autoload}" )
|
363
|
+
puts( " OK".green )
|
364
|
+
}
|
164
365
|
end
|
165
|
-
autoload_list.each { |autoload|
|
166
|
-
capture( "cd #{latest_release} && sudo -u #{webserver_user} php bin/php/ezpgenerateautoloads.php --#{autoload}" )
|
167
|
-
}
|
168
366
|
end
|
169
367
|
end
|
170
368
|
# End of namespace :capez:autoloads
|
@@ -172,7 +370,7 @@ namespace :capez do
|
|
172
370
|
# Should be transformed in a simple function (not aimed to be called as a Cap task...)
|
173
371
|
namespace :dev do
|
174
372
|
desc <<-DESC
|
175
|
-
Checks
|
373
|
+
Checks changes on your local installation
|
176
374
|
Considers that your main git repo is at the top of your eZ Publish install
|
177
375
|
If changes are detected, then ask the user to continue or not
|
178
376
|
DESC
|
@@ -184,26 +382,26 @@ namespace :capez do
|
|
184
382
|
ezroot_path = fetch( :ezpublish_path, false )
|
185
383
|
abort "Please set a correct path to your eZ Publish root (:ezpublish_path) or add 'set :ezpublish_path, File.expand_path( File.dirname( __FILE__ ) )' in your Capfile" unless ezroot_path != false and File.exists?(ezroot_path)
|
186
384
|
|
385
|
+
puts( "\n--> Local installation check with git status" )
|
187
386
|
git_status = git_status_result( ezroot_path )
|
188
387
|
|
189
388
|
ask_to_abort = false
|
190
|
-
puts "Checking your local git..."
|
191
389
|
if git_status['has_local_changes']
|
192
390
|
ask_to_abort = true
|
193
|
-
puts "You have local changes"
|
391
|
+
puts( " - You have local changes" )
|
194
392
|
end
|
195
393
|
if git_status['has_new_files']
|
196
394
|
ask_to_abort = true
|
197
|
-
puts "You have
|
395
|
+
puts( " - You have untracked files (not under git control)" )
|
198
396
|
end
|
199
397
|
|
200
398
|
if ask_to_abort
|
201
|
-
user_abort = Capistrano::CLI.ui.ask "Abort ? y/n (n)"
|
202
|
-
abort "Deployment aborted to commit/add local changes" unless user_abort == "n" or user_abort == ""
|
399
|
+
user_abort = Capistrano::CLI.ui.ask " Abort ? y/n (n)"
|
400
|
+
abort "Deployment aborted to commit/add local changes".red unless user_abort == "n" or user_abort == ""
|
203
401
|
end
|
204
402
|
|
205
403
|
if git_status['tracked_branch_status'] == 'ahead'
|
206
|
-
|
404
|
+
print " - You have #{git_status['tracked_branch_commits']} commits that need to be pushed"
|
207
405
|
push_before = Capistrano::CLI.ui.ask "Push them before deployment ? y/n (y)"
|
208
406
|
if push_before == "" or push_before == "y"
|
209
407
|
system "git push"
|
@@ -248,4 +446,29 @@ namespace :capez do
|
|
248
446
|
end
|
249
447
|
end
|
250
448
|
|
449
|
+
|
450
|
+
end
|
451
|
+
|
452
|
+
def print_dotted( message, options={} )
|
453
|
+
defaults_options = { :eol => false,
|
454
|
+
:sol => false,
|
455
|
+
:max_length => 40,
|
456
|
+
:eol_msg => false }
|
457
|
+
|
458
|
+
options = defaults_options.merge( options )
|
459
|
+
message = "#{message} " + "." * [0,options[:max_length]-message.length-1].max
|
460
|
+
|
461
|
+
if options[:sol]
|
462
|
+
message = "\n#{message}"
|
463
|
+
end
|
464
|
+
|
465
|
+
if options[:eol_msg]
|
466
|
+
message += " #{options[:eol_msg]}"
|
467
|
+
end
|
468
|
+
|
469
|
+
if options[:eol]
|
470
|
+
puts message
|
471
|
+
else
|
472
|
+
print message
|
473
|
+
end
|
251
474
|
end
|
data/lib/ext/spinner.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# spinner stuff
|
2
|
+
# inspired from http://jondavidjohn.com/blog/2012/04/cleaning-up-capistrano-deployment-output
|
3
|
+
@spinner_running = false
|
4
|
+
@chars = ['|', '/', '-', '\\']
|
5
|
+
@spinner = Thread.new do
|
6
|
+
loop do
|
7
|
+
unless @spinner_running
|
8
|
+
Thread.stop
|
9
|
+
end
|
10
|
+
print @chars[0]
|
11
|
+
sleep(0.1)
|
12
|
+
print "\b"
|
13
|
+
@chars.push @chars.shift
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def start_spinner
|
18
|
+
@spinner_running = true
|
19
|
+
@spinner.wakeup
|
20
|
+
end
|
21
|
+
|
22
|
+
# stops the spinner and backspaces over last displayed character
|
23
|
+
def stop_spinner
|
24
|
+
@spinner_running = false
|
25
|
+
print "\b"
|
26
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 3
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Arnaud Lafon
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2012-
|
17
|
+
date: 2012-11-29 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -31,6 +31,19 @@ dependencies:
|
|
31
31
|
version: 2.12.0
|
32
32
|
type: :runtime
|
33
33
|
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: colored
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 2
|
44
|
+
version: "1.2"
|
45
|
+
type: :runtime
|
46
|
+
version_requirements: *id002
|
34
47
|
description: Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH. This package gives you some tools to deploy your eZ Publish projects.
|
35
48
|
email: alcapon@arnaudlafon.com
|
36
49
|
executables:
|
@@ -43,6 +56,7 @@ files:
|
|
43
56
|
- bin/capezit
|
44
57
|
- lib/capez.rb
|
45
58
|
- lib/db.rb
|
59
|
+
- lib/ext/spinner.rb
|
46
60
|
- README.md
|
47
61
|
- LICENSE.md
|
48
62
|
has_rdoc: true
|