bee 0.10.2 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -1
- data/bin/bash_completion_bee +18 -0
- data/bin/bee +1 -1
- data/bin/bee.bat +1 -1
- data/egg/application/build.yml +2 -1
- data/egg/application/gem.spec.erb +1 -0
- data/egg/package/bee_task.erb +1 -1
- data/egg/package/build.erb +1 -0
- data/egg/package/gem_spec.erb +1 -0
- data/egg/package/test.erb +1 -1
- data/egg/package/test_build.rb +1 -1
- data/egg/package/test_build_listener.rb +62 -14
- data/egg/package/test_suite.rb +1 -1
- data/egg/script/build.yml +1 -1
- data/egg/sinatra/build.yml +1 -1
- data/egg/xmlrpc/build.yml +1 -1
- data/lib/{bee.rb → bee_build.rb} +41 -180
- data/lib/bee_console.rb +45 -466
- data/lib/bee_console_formatter.rb +314 -0
- data/lib/bee_console_style.rb +222 -0
- data/lib/bee_context.rb +108 -45
- data/lib/bee_listener.rb +114 -0
- data/lib/bee_properties.rb +47 -76
- data/lib/bee_target.rb +36 -19
- data/lib/bee_targets.rb +147 -0
- data/lib/bee_task_default.rb +78 -60
- data/lib/{bee_task.rb → bee_task_package.rb} +16 -87
- data/lib/bee_task_packagemanager.rb +135 -0
- data/lib/bee_util.rb +58 -56
- data/lib/bee_version.rb +1 -1
- metadata +56 -22
data/lib/bee_console.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2006-
|
1
|
+
# Copyright 2006-2011 Michel Casabianca <michel.casabianca@gmail.com>
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -13,23 +13,24 @@
|
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
15
|
require 'rubygems'
|
16
|
-
require '
|
17
|
-
require 'bee_task'
|
16
|
+
require 'bee_build'
|
18
17
|
require 'bee_util'
|
18
|
+
require 'bee_listener'
|
19
|
+
require 'bee_console_formatter'
|
19
20
|
require 'getoptlong'
|
20
21
|
require 'yaml'
|
21
22
|
|
22
|
-
# Module for Bee stuff.
|
23
23
|
module Bee
|
24
24
|
|
25
25
|
module Console
|
26
26
|
|
27
27
|
# Command line help.
|
28
|
-
HELP = '
|
28
|
+
HELP = <<'EOF'
|
29
|
+
Usage: bee [options] [targets]
|
29
30
|
-V Print version and exit.
|
30
31
|
-h Print help about usage and exit.
|
31
32
|
-b Print help about build and exit.
|
32
|
-
-n Don
|
33
|
+
-n Don't actually run any commands; just print them.
|
33
34
|
-k task Print help about tasks in a package (writing "foo.?") or a
|
34
35
|
given one (writing "foo.bar") and exit.
|
35
36
|
-e egg Print help about templates in a given package (writing
|
@@ -45,7 +46,10 @@ module Bee
|
|
45
46
|
-l Print bee logo on console.
|
46
47
|
-a Print list of available targets.
|
47
48
|
-o Print list of available options.
|
48
|
-
|
49
|
+
-f Print list of available tasks.
|
50
|
+
-g Print list of available templates.
|
51
|
+
targets Targets to run (default target if omitted).
|
52
|
+
EOF
|
49
53
|
# Options descriptions.
|
50
54
|
OPTIONS = [
|
51
55
|
['--version', '-V', GetoptLong::NO_ARGUMENT],
|
@@ -65,6 +69,8 @@ targets Targets to run (default target if omitted).'
|
|
65
69
|
['--logo', '-l', GetoptLong::NO_ARGUMENT],
|
66
70
|
['--targets', '-a', GetoptLong::NO_ARGUMENT],
|
67
71
|
['--options', '-o', GetoptLong::NO_ARGUMENT],
|
72
|
+
['--tasks', '-x', GetoptLong::NO_ARGUMENT],
|
73
|
+
['--templates', '-y', GetoptLong::NO_ARGUMENT],
|
68
74
|
]
|
69
75
|
# Name for default build file.
|
70
76
|
DEFAULT_BUILD_FILE = 'build.yml'
|
@@ -109,6 +115,8 @@ EOF
|
|
109
115
|
logo = false
|
110
116
|
print_targets = false
|
111
117
|
print_options = false
|
118
|
+
print_tasks = false
|
119
|
+
print_templates = false
|
112
120
|
targets = []
|
113
121
|
# read options in BEEOPT environment variable
|
114
122
|
options = ENV[BEE_OPT_ENV]
|
@@ -158,13 +166,18 @@ EOF
|
|
158
166
|
print_targets = true
|
159
167
|
when '--options'
|
160
168
|
print_options = true
|
169
|
+
when '--tasks'
|
170
|
+
print_tasks = true
|
171
|
+
when '--templates'
|
172
|
+
print_templates = true
|
161
173
|
end
|
162
174
|
end
|
163
175
|
targets = Array.new(ARGV)
|
164
176
|
ARGV.replace(old_argv)
|
165
|
-
return
|
166
|
-
|
167
|
-
|
177
|
+
return version, help, help_build, help_task, task, help_template,
|
178
|
+
template, properties, dry_run, verbose, style, color, file,
|
179
|
+
recursive, logo, print_targets, print_options, print_tasks,
|
180
|
+
print_templates, targets
|
168
181
|
end
|
169
182
|
|
170
183
|
# Parse a command line property.
|
@@ -173,7 +186,7 @@ EOF
|
|
173
186
|
def self.parse_property(property)
|
174
187
|
begin
|
175
188
|
index = property.index('=')
|
176
|
-
raise "No = sign" if not index
|
189
|
+
raise "No = sign (should be 'name=value')" if not index
|
177
190
|
name = property[0..index-1]
|
178
191
|
value = YAML::load(property[index+1..-1])
|
179
192
|
return name, value
|
@@ -187,33 +200,28 @@ EOF
|
|
187
200
|
def self.start_command_line(arguments)
|
188
201
|
STDOUT.sync = true
|
189
202
|
begin
|
190
|
-
version, help, help_build, help_task,
|
191
|
-
properties, dry_run,
|
192
|
-
recursive, logo, print_targets, print_options,
|
193
|
-
targets = parse_command_line(arguments)
|
203
|
+
version, help, help_build, help_task, task, help_template,
|
204
|
+
template, properties, dry_run, verbose, style, color, file,
|
205
|
+
recursive, logo, print_targets, print_options, print_tasks,
|
206
|
+
print_templates, targets = parse_command_line(arguments)
|
194
207
|
rescue
|
195
|
-
#
|
196
|
-
puts $!.backtrace
|
197
|
-
puts "ERROR: parsing command line (type 'bee -h' for help)"
|
208
|
+
puts "ERROR: parsing command line: #{$!}"
|
198
209
|
exit(EXIT_PARSING_CMDLINE)
|
199
210
|
end
|
200
211
|
begin
|
201
|
-
formatter = Formatter.new(style, color)
|
212
|
+
formatter = Formatter.new(style, color, verbose)
|
202
213
|
rescue
|
203
214
|
puts "ERROR: bad format string '#{style}'"
|
204
215
|
exit(EXIT_PARSING_CMDLINE)
|
205
216
|
end
|
206
217
|
begin
|
207
|
-
if logo
|
208
|
-
puts BEE_LOGO
|
209
|
-
end
|
218
|
+
puts BEE_LOGO if logo
|
210
219
|
if version
|
211
220
|
puts Bee.version
|
212
221
|
elsif help
|
213
222
|
puts HELP
|
214
223
|
elsif help_build
|
215
224
|
build = Build.load(file, recursive, properties)
|
216
|
-
build.evaluate_properties
|
217
225
|
puts formatter.help_build(build)
|
218
226
|
elsif help_task
|
219
227
|
puts formatter.help_task(task)
|
@@ -221,7 +229,7 @@ EOF
|
|
221
229
|
puts formatter.help_template(template)
|
222
230
|
elsif template
|
223
231
|
file = Bee::Util::find_template(template)
|
224
|
-
listener = Listener.new(formatter
|
232
|
+
listener = Listener.new(formatter)
|
225
233
|
build = Build.load(file, false, properties)
|
226
234
|
build.run(targets, listener, dry_run)
|
227
235
|
elsif print_targets
|
@@ -234,459 +242,30 @@ EOF
|
|
234
242
|
print targets.join(' ')
|
235
243
|
elsif print_options
|
236
244
|
print OPTIONS.map {|o| o[0]}.join(' ')
|
245
|
+
elsif print_tasks
|
246
|
+
print Bee::Task::PackageManager.list_tasks.join(' ')
|
247
|
+
elsif print_templates
|
248
|
+
print Bee::Task::PackageManager.list_templates.join(' ')
|
237
249
|
else
|
238
|
-
listener = Listener.new(formatter
|
250
|
+
listener = Listener.new(formatter)
|
239
251
|
build = Build.load(file, recursive, properties)
|
240
252
|
build.run(targets, listener, dry_run)
|
253
|
+
puts formatter.format_success('OK')
|
241
254
|
end
|
242
|
-
rescue Bee::Util::BuildError
|
243
|
-
puts
|
244
|
-
puts e.backtrace.join("\n") if verbose
|
255
|
+
rescue Bee::Util::BuildError
|
256
|
+
puts formatter.format_error_message($!)
|
245
257
|
exit(EXIT_BUILD_ERROR)
|
246
|
-
rescue Interrupt
|
247
|
-
puts "#{formatter.format_error('ERROR')}: Build was interrupted!"
|
248
|
-
puts
|
258
|
+
rescue Interrupt
|
259
|
+
puts "\n#{formatter.format_error('ERROR')}: Build was interrupted!"
|
260
|
+
puts $!.backtrace.join("\n") if verbose
|
249
261
|
exit(EXIT_INTERRUPT_ERROR)
|
250
|
-
rescue Exception
|
262
|
+
rescue Exception
|
251
263
|
puts "#{formatter.format_error('ERROR')}: #{$!}"
|
252
|
-
puts
|
264
|
+
puts $!.backtrace.join("\n")
|
253
265
|
exit(EXIT_UNKNOWN_ERROR)
|
254
266
|
end
|
255
267
|
end
|
256
268
|
|
257
|
-
# Class to format build output on console.
|
258
|
-
class Formatter
|
259
|
-
|
260
|
-
include Bee::Util::BuildErrorMixin
|
261
|
-
|
262
|
-
# List of colors.
|
263
|
-
COLORS = [:black, :red, :green, :yellow, :blue, :magenta, :cyan, :white]
|
264
|
-
# Foreground color codes.
|
265
|
-
FOREGROUND_COLOR_CODES = {
|
266
|
-
:black => 30,
|
267
|
-
:red => 31,
|
268
|
-
:green => 32,
|
269
|
-
:yellow => 33,
|
270
|
-
:blue => 34,
|
271
|
-
:magenta => 35,
|
272
|
-
:cyan => 36,
|
273
|
-
:white => 37
|
274
|
-
}
|
275
|
-
# Background color codes.
|
276
|
-
BACKGROUND_COLOR_CODES = {
|
277
|
-
:black => 40,
|
278
|
-
:red => 41,
|
279
|
-
:green => 42,
|
280
|
-
:yellow => 43,
|
281
|
-
:blue => 44,
|
282
|
-
:magenta => 45,
|
283
|
-
:cyan => 46,
|
284
|
-
:white => 47
|
285
|
-
}
|
286
|
-
# List of styles.
|
287
|
-
STYLES = [:reset, :bright, :dim, :underscore, :blink, :reverse, :hidden]
|
288
|
-
# Style codes.
|
289
|
-
STYLE_CODES = {
|
290
|
-
:reset => 0,
|
291
|
-
:bright => 1,
|
292
|
-
:dim => 2,
|
293
|
-
:underscore => 4,
|
294
|
-
:blink => 5,
|
295
|
-
:reverse => 7,
|
296
|
-
:hidden => 8
|
297
|
-
}
|
298
|
-
|
299
|
-
# Default style (supposed to work on any configuration).
|
300
|
-
DEFAULT_STYLE = {
|
301
|
-
:line_character => '-'
|
302
|
-
}
|
303
|
-
# Color style (supposed to work on color terminals).
|
304
|
-
COLOR_STYLE = {
|
305
|
-
:line_character => '-',
|
306
|
-
:target_foreground => :yellow,
|
307
|
-
:task_foreground => :blue,
|
308
|
-
:success_style => :bright,
|
309
|
-
:success_foreground => :green,
|
310
|
-
:error_style => :bright,
|
311
|
-
:error_foreground => :red
|
312
|
-
}
|
313
|
-
# Short style keys for command line
|
314
|
-
SHORT_STYLE_KEYS = {
|
315
|
-
'lc' => 'line_character',
|
316
|
-
'll' => 'line_length',
|
317
|
-
'ts' => 'target_style',
|
318
|
-
'tf' => 'target_foreground',
|
319
|
-
'tb' => 'target_background',
|
320
|
-
'ks' => 'task_style',
|
321
|
-
'kf' => 'task_foreground',
|
322
|
-
'kb' => 'task_background',
|
323
|
-
'ss' => 'success_style',
|
324
|
-
'sf' => 'success_foreground',
|
325
|
-
'sb' => 'success_background',
|
326
|
-
'es' => 'error_style',
|
327
|
-
'ef' => 'error_foreground',
|
328
|
-
'eb' => 'error_background'
|
329
|
-
}
|
330
|
-
|
331
|
-
# Constructor.
|
332
|
-
# - style: style as a Hash or a String.
|
333
|
-
# - color: a boolean telling if we use default color scheme.
|
334
|
-
def initialize(style, color=false)
|
335
|
-
# set default or color style
|
336
|
-
if color
|
337
|
-
@style = COLOR_STYLE.clone
|
338
|
-
else
|
339
|
-
@style = DEFAULT_STYLE.clone
|
340
|
-
end
|
341
|
-
# if style is a String, this is command line argument
|
342
|
-
if style.kind_of?(String)
|
343
|
-
@style.merge!(parse_style_from_command_line(style))
|
344
|
-
elsif style.kind_of?(Hash)
|
345
|
-
@style.merge!(style)
|
346
|
-
end
|
347
|
-
end
|
348
|
-
|
349
|
-
# Format a target.
|
350
|
-
# - target: target to format.
|
351
|
-
def format_target(target)
|
352
|
-
name = target.name
|
353
|
-
return format_title(name)
|
354
|
-
end
|
355
|
-
|
356
|
-
# Format a task.
|
357
|
-
# - task: task to format.
|
358
|
-
def format_task(task)
|
359
|
-
if task.kind_of?(String)
|
360
|
-
source = task
|
361
|
-
elsif task.kind_of?(Hash)
|
362
|
-
if task.key?('rb')
|
363
|
-
source = "rb: #{task['rb']}"
|
364
|
-
else
|
365
|
-
source = YAML::dump(task)
|
366
|
-
source = source.sub(/---/, '')
|
367
|
-
end
|
368
|
-
end
|
369
|
-
formatted = '- ' + source.strip.gsub(/\n/, "\n. ")
|
370
|
-
styled = style(formatted,
|
371
|
-
@style[:task_style],
|
372
|
-
@style[:task_foreground],
|
373
|
-
@style[:task_background])
|
374
|
-
return styled
|
375
|
-
end
|
376
|
-
|
377
|
-
# Format a success string.
|
378
|
-
# - string: string to format.
|
379
|
-
def format_success(string)
|
380
|
-
string = style(string,
|
381
|
-
@style[:success_style],
|
382
|
-
@style[:success_foreground],
|
383
|
-
@style[:success_background])
|
384
|
-
return string
|
385
|
-
end
|
386
|
-
|
387
|
-
# Format an error string.
|
388
|
-
# - string: string to format.
|
389
|
-
def format_error(string)
|
390
|
-
string = style(string,
|
391
|
-
@style[:error_style],
|
392
|
-
@style[:error_foreground],
|
393
|
-
@style[:error_background])
|
394
|
-
return string
|
395
|
-
end
|
396
|
-
|
397
|
-
# Return help about build.
|
398
|
-
# - build: running build.
|
399
|
-
def help_build(build)
|
400
|
-
help = ''
|
401
|
-
# print build name and description
|
402
|
-
if build.name
|
403
|
-
help << "build: #{build.name}\n"
|
404
|
-
end
|
405
|
-
if build.extends
|
406
|
-
help << "extends: #{build.extends.map{|b| b.name}.join(', ')}\n"
|
407
|
-
end
|
408
|
-
if build.description
|
409
|
-
help << format_description('description', build.description, 0, false)
|
410
|
-
end
|
411
|
-
# print build properties
|
412
|
-
if build.context.properties.length > 0
|
413
|
-
help << "properties:\n"
|
414
|
-
for property in build.context.properties.sort
|
415
|
-
help << "- #{property}: " +
|
416
|
-
"#{build.context.get_property(property, true).inspect}\n"
|
417
|
-
end
|
418
|
-
end
|
419
|
-
# print build targets
|
420
|
-
description = build.targets.description
|
421
|
-
if description.length > 0
|
422
|
-
help << "targets:\n"
|
423
|
-
for name in description.keys.sort
|
424
|
-
help << format_description(name, description[name], 0)
|
425
|
-
end
|
426
|
-
end
|
427
|
-
# print default target
|
428
|
-
help << "default: #{build.default}\n"
|
429
|
-
return help.strip
|
430
|
-
end
|
431
|
-
|
432
|
-
# Return help about task(s).
|
433
|
-
# - task: task to print help about (all tasks if nil).
|
434
|
-
def help_task(task)
|
435
|
-
task = '?' if task == nil or task.length == 0
|
436
|
-
package_manager = Bee::Task::PackageManager.new(nil)
|
437
|
-
methods = package_manager.help_task(task)
|
438
|
-
help = ''
|
439
|
-
for method in methods.keys.sort
|
440
|
-
text = methods[method].strip
|
441
|
-
help << format_title(method)
|
442
|
-
help << "\n"
|
443
|
-
help << text
|
444
|
-
help << "\n"
|
445
|
-
if text =~ /Alias for \w+/
|
446
|
-
alias_method = text.scan(/Alias for (\w+)/).flatten[0]
|
447
|
-
help << "\n"
|
448
|
-
help << package_manager.help_task(alias_method)[alias_method].strip
|
449
|
-
help << "\n"
|
450
|
-
end
|
451
|
-
end
|
452
|
-
return help
|
453
|
-
end
|
454
|
-
|
455
|
-
# Return help about template(s).
|
456
|
-
# - template: template to print help about (all templates if nil).
|
457
|
-
def help_template(template)
|
458
|
-
templates = Bee::Util::search_templates(template)
|
459
|
-
help = ''
|
460
|
-
for name in templates.keys
|
461
|
-
build = YAML::load(File.read(templates[name]))
|
462
|
-
properties = nil
|
463
|
-
for entry in build
|
464
|
-
properties = entry['properties'] if entry['properties']
|
465
|
-
end
|
466
|
-
description = 'No description found'
|
467
|
-
if properties
|
468
|
-
if properties['description']
|
469
|
-
description = properties['description']
|
470
|
-
end
|
471
|
-
end
|
472
|
-
help << format_title(name)
|
473
|
-
help << "\n"
|
474
|
-
help << description
|
475
|
-
help << "\n"
|
476
|
-
end
|
477
|
-
return help
|
478
|
-
end
|
479
|
-
|
480
|
-
private
|
481
|
-
|
482
|
-
# Apply style to a string:
|
483
|
-
# - string: the string to apply style to.
|
484
|
-
# - style: style to apply on string.
|
485
|
-
# - foreground: foreground color for string.
|
486
|
-
# - background: background color for string.
|
487
|
-
def style(string, style, foreground, background)
|
488
|
-
# check style, foreground and background colors
|
489
|
-
error "Unknown style '#{style}'" unless
|
490
|
-
STYLES.member?(style) or not style
|
491
|
-
error "Unknown color '#{foreground}'" unless
|
492
|
-
COLORS.member?(foreground) or not foreground
|
493
|
-
error "Unknown color '#{background}'" unless
|
494
|
-
COLORS.member?(background) or not background
|
495
|
-
# if no style nor colors, return raw string
|
496
|
-
return string if not foreground and not background and not style
|
497
|
-
# insert style and colors in string
|
498
|
-
colorized = "\e["
|
499
|
-
colorized << "#{STYLE_CODES[style]};" if style
|
500
|
-
colorized << "#{FOREGROUND_COLOR_CODES[foreground]};" if foreground
|
501
|
-
colorized << "#{BACKGROUND_COLOR_CODES[background]};" if background
|
502
|
-
colorized = colorized[0..-2]
|
503
|
-
colorized << "m#{string}\e[#{STYLE_CODES[:reset]}m"
|
504
|
-
return colorized
|
505
|
-
end
|
506
|
-
|
507
|
-
# Parse style from command line.
|
508
|
-
# - string: style to parse.
|
509
|
-
def parse_style_from_command_line(string)
|
510
|
-
return if not string
|
511
|
-
style = {}
|
512
|
-
for pair in string.split(',')
|
513
|
-
key, value = pair.split(':')
|
514
|
-
key = SHORT_STYLE_KEYS[key] || key
|
515
|
-
key = key.to_sym
|
516
|
-
if key == :line_length
|
517
|
-
value = value.to_i
|
518
|
-
elsif key == :line_character
|
519
|
-
value = ' ' if not value or value.length == 0
|
520
|
-
else
|
521
|
-
value = value.to_sym
|
522
|
-
error "Unkown color or style '#{value}'" if
|
523
|
-
not COLORS.member?(value) and not STYLES.member?(value)
|
524
|
-
end
|
525
|
-
style[key] = value
|
526
|
-
end
|
527
|
-
return style
|
528
|
-
end
|
529
|
-
|
530
|
-
# Format a description.
|
531
|
-
# - title: description title (project, property or target name).
|
532
|
-
# - text: description text.
|
533
|
-
# - indent: indentation width.
|
534
|
-
# - bullet: tells if we must put a bullet.
|
535
|
-
def format_description(title, text=nil, indent=0, bullet=true)
|
536
|
-
string = ' '*indent
|
537
|
-
string << '- ' if bullet
|
538
|
-
string << title
|
539
|
-
if text and !text.empty?
|
540
|
-
string << ": "
|
541
|
-
if text.split("\n").length > 1
|
542
|
-
string << "\n"
|
543
|
-
text.split("\n").each do |line|
|
544
|
-
string << ' '*(indent+2) + line.strip + "\n"
|
545
|
-
end
|
546
|
-
else
|
547
|
-
string << text.strip + "\n"
|
548
|
-
end
|
549
|
-
else
|
550
|
-
string << "\n"
|
551
|
-
end
|
552
|
-
return string
|
553
|
-
end
|
554
|
-
|
555
|
-
# Format a title.
|
556
|
-
# - title: title to format.
|
557
|
-
def format_title(title)
|
558
|
-
length = @style[:line_length] || Bee::Util::term_width
|
559
|
-
right = ' ' + @style[:line_character]*2
|
560
|
-
size = length - (title.length + 4)
|
561
|
-
size = 2 if size <= 0
|
562
|
-
left = @style[:line_character]*size + ' '
|
563
|
-
line = left + title + right
|
564
|
-
# apply style
|
565
|
-
formatted = style(line,
|
566
|
-
@style[:target_style],
|
567
|
-
@style[:target_foreground],
|
568
|
-
@style[:target_background])
|
569
|
-
return formatted
|
570
|
-
end
|
571
|
-
|
572
|
-
end
|
573
|
-
|
574
|
-
# Listener when running in a console. Prints messages on the console using
|
575
|
-
# a given formatter.
|
576
|
-
class Listener
|
577
|
-
|
578
|
-
# Formatter used by listener.
|
579
|
-
attr_reader :formatter
|
580
|
-
# Verbosity flag.
|
581
|
-
attr_reader :verbose
|
582
|
-
# Build start time.
|
583
|
-
attr_reader :start_time
|
584
|
-
# Build end time.
|
585
|
-
attr_reader :end_time
|
586
|
-
# Build duration.
|
587
|
-
attr_reader :duration
|
588
|
-
# Build success.
|
589
|
-
attr_reader :success
|
590
|
-
# Last target met.
|
591
|
-
attr_reader :last_target
|
592
|
-
# Last task met.
|
593
|
-
attr_reader :last_task
|
594
|
-
# Minimum duration to print on console even if not verbose (in seconds)
|
595
|
-
AUTO_DURATION = 60
|
596
|
-
|
597
|
-
# Constructor.
|
598
|
-
# - formatter: the formatter to use to output on console.
|
599
|
-
# - verbose: tells if we run in verbose mode.
|
600
|
-
def initialize(formatter, verbose)
|
601
|
-
@formatter = formatter
|
602
|
-
@verbose = verbose
|
603
|
-
end
|
604
|
-
|
605
|
-
# Called when build is started.
|
606
|
-
# - build: the build object.
|
607
|
-
def build_started(build, dry_run)
|
608
|
-
@start_time = Time.now
|
609
|
-
@end_time = nil
|
610
|
-
@duration = nil
|
611
|
-
@success = nil
|
612
|
-
@last_target = nil
|
613
|
-
@last_task = nil
|
614
|
-
build_type = dry_run ? "dry run of" : "build"
|
615
|
-
puts "Starting #{build_type} '#{build.file}'..." if @verbose
|
616
|
-
end
|
617
|
-
|
618
|
-
# Called when a target is met.
|
619
|
-
# - target: the target object.
|
620
|
-
def target(target)
|
621
|
-
@last_target = target
|
622
|
-
@last_task = nil
|
623
|
-
puts @formatter.format_target(target)
|
624
|
-
end
|
625
|
-
|
626
|
-
# Called when a task is met.
|
627
|
-
# - task: task source (shell, Ruby or task).
|
628
|
-
def task(task)
|
629
|
-
@last_task = task
|
630
|
-
puts @formatter.format_task(task) if @verbose
|
631
|
-
end
|
632
|
-
|
633
|
-
# Called when build is finished.
|
634
|
-
# - build: the build object.
|
635
|
-
def build_finished(build, dry_run)
|
636
|
-
duration unless dry_run
|
637
|
-
@success = true
|
638
|
-
puts @formatter.format_success('OK')
|
639
|
-
end
|
640
|
-
|
641
|
-
# Called when an error was raised.
|
642
|
-
# - exception: raised exception.
|
643
|
-
def error(exception)
|
644
|
-
duration
|
645
|
-
@success = false
|
646
|
-
message = ''
|
647
|
-
message << "In target '#{@last_target.name}'" if @last_target
|
648
|
-
message << ", in task:\n#{@formatter.format_task(@last_task)}\n" if
|
649
|
-
@last_task
|
650
|
-
message << ': ' if @last_target and not @last_task
|
651
|
-
message << exception.to_s
|
652
|
-
raise Bee::Util::BuildError.new(message)
|
653
|
-
end
|
654
|
-
|
655
|
-
# Recover from a previous error (catching it for instance).
|
656
|
-
def recover
|
657
|
-
@success = true
|
658
|
-
end
|
659
|
-
|
660
|
-
# Print text on the console.
|
661
|
-
# - text: text to print.
|
662
|
-
def print(text)
|
663
|
-
Kernel.print(text)
|
664
|
-
end
|
665
|
-
|
666
|
-
# Puts text on the console.
|
667
|
-
# - text: text to puts.
|
668
|
-
def puts(text)
|
669
|
-
Kernel.puts(text)
|
670
|
-
end
|
671
|
-
|
672
|
-
# Get input string.
|
673
|
-
# Return string entered by the user.
|
674
|
-
def gets
|
675
|
-
return STDIN.gets
|
676
|
-
end
|
677
|
-
|
678
|
-
private
|
679
|
-
|
680
|
-
# Compute build duration and print it if verbose.
|
681
|
-
def duration
|
682
|
-
@end_time = Time.now
|
683
|
-
@duration = @end_time - @start_time
|
684
|
-
@duration = (@duration * 1000).round / 1000
|
685
|
-
puts "Built in #{@duration} s" if @verbose or @duration >= AUTO_DURATION
|
686
|
-
end
|
687
|
-
|
688
|
-
end
|
689
|
-
|
690
269
|
end
|
691
270
|
|
692
271
|
end
|