build-tool 0.6.7 → 0.6.8
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/History.rdoc +23 -0
- data/lib/build-tool/application.rb +7 -1
- data/lib/build-tool/build-system/custom.rb +1 -0
- data/lib/build-tool/commands.rb +15 -6
- data/lib/build-tool/commands/history.rb +2 -2
- data/lib/build-tool/commands/modules/info.rb +12 -0
- data/lib/build-tool/commands/modules/status.rb +84 -0
- data/lib/build-tool/model/command_log.rb +1 -1
- data/lib/build-tool/model/module.rb +18 -6
- data/lib/build-tool/vcs/archive.rb +13 -1
- data/lib/build-tool/vcs/base.rb +34 -1
- data/lib/build-tool/vcs/bazar.rb +41 -12
- data/lib/build-tool/vcs/git-svn.rb +36 -7
- data/lib/build-tool/vcs/git.rb +32 -10
- data/lib/build-tool/vcs/mercurial.rb +56 -1
- data/lib/build-tool/vcs/svn.rb +83 -14
- data/lib/build-tool/version.rb +1 -1
- data/lib/mj/logging.rb +24 -17
- metadata +163 -184
data/History.rdoc
CHANGED
@@ -1,3 +1,26 @@
|
|
1
|
+
== Version 0.6.8
|
2
|
+
|
3
|
+
== Features
|
4
|
+
- Implement option --quiet
|
5
|
+
- module status: New command that shows
|
6
|
+
- Local unpushed changes (if vcs supports that)
|
7
|
+
- Local uncommitted changes
|
8
|
+
- Remote changes
|
9
|
+
|
10
|
+
== Enhancements
|
11
|
+
- module history: Print name instead of id
|
12
|
+
- module info:
|
13
|
+
- Show ssh key for svn too
|
14
|
+
- Show timestamp for module state too
|
15
|
+
- Minor Performance improvements
|
16
|
+
- Disable ansi color output for files (logfiles too)
|
17
|
+
- VCS SVN: Do a "switch --relocate" if required
|
18
|
+
- VCS GIT-SVN: Change gitconfig svn-remote.svn.url if required.
|
19
|
+
|
20
|
+
== Bugfixes
|
21
|
+
- VCS Archive: Is Checked out if the source-dir exists, not when the archive is there.
|
22
|
+
- Custom BuildSystem: Is configured is the build dir exists
|
23
|
+
|
1
24
|
== Version 0.6.7
|
2
25
|
=== Bugfix
|
3
26
|
- Fix [#29650] 'could not parse line' when installing recipe
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: UTF-8 -*-
|
2
2
|
|
3
3
|
require 'logging'
|
4
|
-
Logging.init :debug2, :debug, :trace, :verbose, :info, :warn, :error
|
4
|
+
Logging.init :debug2, :debug, :trace, :verbose, :info, :quiet, :warn, :error
|
5
5
|
include Logging.globally
|
6
6
|
|
7
7
|
require 'mj/logging'
|
@@ -10,6 +10,7 @@
|
|
10
10
|
require 'build-tool/singleton'
|
11
11
|
|
12
12
|
require 'active_record'
|
13
|
+
require 'ansi/code'
|
13
14
|
|
14
15
|
$noop = false
|
15
16
|
|
@@ -39,6 +40,11 @@ def initialize( name, application_root )
|
|
39
40
|
@database = nil
|
40
41
|
@name = File.basename( name ).sub( "-build", "" )
|
41
42
|
@local_settings_file_path = local_configuration_dir.join("#{@name}.yaml")
|
43
|
+
|
44
|
+
# If stdout is not a terminal don't use ansi codes
|
45
|
+
if ! STDOUT.tty?
|
46
|
+
$ansi = false
|
47
|
+
end
|
42
48
|
end
|
43
49
|
|
44
50
|
# Load the configuration
|
data/lib/build-tool/commands.rb
CHANGED
@@ -153,7 +153,6 @@ def complete_arguments( args )
|
|
153
153
|
|
154
154
|
def do_complete( args )
|
155
155
|
return complete_arguments( args )
|
156
|
-
do_complete( args )
|
157
156
|
end
|
158
157
|
|
159
158
|
def each_option
|
@@ -296,6 +295,11 @@ def skip_command
|
|
296
295
|
@skip_command = true
|
297
296
|
end
|
298
297
|
|
298
|
+
# Print out a normal message (if enabled)
|
299
|
+
def quiet( *args )
|
300
|
+
logger.quiet( *args )
|
301
|
+
end
|
302
|
+
|
299
303
|
# Print out a normal message (if enabled)
|
300
304
|
def info( *args )
|
301
305
|
logger.info( *args )
|
@@ -367,6 +371,10 @@ def initialize_options
|
|
367
371
|
Logging.appenders['stdout'].level = [ Logging.appenders['stdout'].level - 1, 0 ].max()
|
368
372
|
end
|
369
373
|
|
374
|
+
options.on( "-q", "--quiet", "More quiet output" ) do
|
375
|
+
Logging.appenders['stdout'].level = [ Logging.appenders['stdout'].level + 1, 0 ].max()
|
376
|
+
end
|
377
|
+
|
370
378
|
options.on( nil, "--dry-run", "Enable dry run." ) do
|
371
379
|
$noop = true
|
372
380
|
end
|
@@ -454,9 +462,9 @@ def log_directory
|
|
454
462
|
|
455
463
|
class ModuleProgressbar < MJ::Logging::Progressbar
|
456
464
|
|
457
|
-
def initialize( title,
|
458
|
-
super( title,
|
459
|
-
|
465
|
+
def initialize( title, mods, &block )
|
466
|
+
super( title, mods.size ) do
|
467
|
+
mods.each_with_index do |mod, i|
|
460
468
|
if @pbar
|
461
469
|
@pbar.set( i )
|
462
470
|
@pbar.title= mod.name.split( '/' )[-1]
|
@@ -539,6 +547,7 @@ def do_execute( args )
|
|
539
547
|
# 1. Resolve the modules
|
540
548
|
modules = []
|
541
549
|
args.each do |arg|
|
550
|
+
# :FIXME: what if arg is invalid?
|
542
551
|
complete_modules( arg ).each do |mod|
|
543
552
|
modules << mod
|
544
553
|
end
|
@@ -605,7 +614,7 @@ def do_execute( args )
|
|
605
614
|
begin
|
606
615
|
|
607
616
|
info( "" )
|
608
|
-
|
617
|
+
quiet( "#### Module #{mod.name} (#{index+1}/#{modules.size})" )
|
609
618
|
do_execute_module( mod )
|
610
619
|
rescue Interrupt => e
|
611
620
|
raise e
|
@@ -816,7 +825,7 @@ def do_complete( args )
|
|
816
825
|
end
|
817
826
|
|
818
827
|
def complete_command( cmdname )
|
819
|
-
|
828
|
+
@commands.collect { |com|
|
820
829
|
com.name if com.name.start_with? cmdname
|
821
830
|
}.compact
|
822
831
|
end
|
@@ -94,7 +94,7 @@ def show_module_history( modname )
|
|
94
94
|
last_module=""
|
95
95
|
cmd.module_logs.where( :module => mod.name ).each do |e|
|
96
96
|
if e.module != last_module
|
97
|
-
info( blue { "\t#{e.module}" } )
|
97
|
+
info( blue { "\t#{e.module.name}" } )
|
98
98
|
last_module = e.module
|
99
99
|
end
|
100
100
|
info( "\t\t %s %s (%s) [%s]" % [ e.duration, e.event, e.logfile, e.state_str ] )
|
@@ -119,7 +119,7 @@ def show_detailed_command_history( id )
|
|
119
119
|
last_module=""
|
120
120
|
cmd.module_logs.each do |e|
|
121
121
|
if e.module != last_module
|
122
|
-
info( blue { "\t#{e.module}" } )
|
122
|
+
info( blue { "\t#{e.module.name}" } )
|
123
123
|
last_module = e.module
|
124
124
|
end
|
125
125
|
info( "\t\t %s %s (%s) [%s]" % [ e.duration, e.event, e.logfile, e.state_str ] )
|
@@ -58,15 +58,23 @@ def do_execute_module( mod )
|
|
58
58
|
info( "VCS: #{mod.vcs_configuration ? mod.vcs_configuration.name : 'not configured' }" )
|
59
59
|
if mod.vcs_configuration
|
60
60
|
case mod.vcs_configuration.name
|
61
|
+
|
61
62
|
when 'svn'
|
62
63
|
info( " Repository: %s/%s" % [ mod.vcs_configuration.repository.url, mod.vcs_configuration.remote_path ] )
|
64
|
+
if mod.vcs_configuration.repository and mod.vcs_configuration.repository.sshkey
|
65
|
+
info( " SSH Key: '#{mod.vcs_configuration.repository.sshkey.name}' (#{mod.vcs_configuration.repository.sshkey.file})" )
|
66
|
+
end
|
67
|
+
|
63
68
|
when 'bazar'
|
64
69
|
info( " Branch: %s" % [ mod.vcs_configuration.url ] )
|
70
|
+
|
65
71
|
when 'mercurial'
|
66
72
|
info( " URL: %s" % [ mod.vcs_configuration.url ] )
|
67
73
|
info( " Track: %s" % [ mod.vcs_configuration.track ] )
|
74
|
+
|
68
75
|
when 'archive'
|
69
76
|
info( " URL: %s" % [ mod.vcs.archive_url ] )
|
77
|
+
|
70
78
|
when 'git'
|
71
79
|
mod.vcs_configuration.merged_remote.each do |key, val|
|
72
80
|
if val.push_url
|
@@ -76,6 +84,7 @@ def do_execute_module( mod )
|
|
76
84
|
end
|
77
85
|
end
|
78
86
|
info( " Track branch: #{mod.vcs_configuration.track_remote}/#{mod.vcs_configuration.track_branch}" )
|
87
|
+
|
79
88
|
when 'git-svn'
|
80
89
|
info( " Repository: %s/%s" % [ mod.vcs_configuration.repository.url, mod.vcs_configuration.remote_path ] )
|
81
90
|
mod.vcs_configuration.merged_remote.each do |key, val|
|
@@ -84,9 +93,12 @@ def do_execute_module( mod )
|
|
84
93
|
mod.vcs_configuration.merged_externals.each do |key, val|
|
85
94
|
info( " External: #{key} -> #{val}" )
|
86
95
|
end
|
96
|
+
|
87
97
|
else
|
88
98
|
warn( "Unknown vcs #{mod.vcs_configuration.name}" )
|
89
99
|
end
|
100
|
+
|
101
|
+
|
90
102
|
end # if mod.vcs_configuration
|
91
103
|
|
92
104
|
bs = mod.build_system
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
require 'build-tool/commands'
|
4
|
+
|
5
|
+
module BuildTool; module Commands; module Modules
|
6
|
+
|
7
|
+
#
|
8
|
+
# BuildCommand
|
9
|
+
#
|
10
|
+
class Status < ModuleBasedCommand
|
11
|
+
|
12
|
+
name "status"
|
13
|
+
description "show module status"
|
14
|
+
long_description [ "Show information about the modules status" ]
|
15
|
+
|
16
|
+
def do_execute_module( mod )
|
17
|
+
|
18
|
+
info( "Active: #{mod.active?}" )
|
19
|
+
info( "Status: #{mod.state}" )
|
20
|
+
|
21
|
+
dirty = mod.dirty?
|
22
|
+
if dirty
|
23
|
+
quiet( "Modified: #{dirty}" )
|
24
|
+
else
|
25
|
+
info( "Modified: #{dirty}" )
|
26
|
+
end
|
27
|
+
|
28
|
+
info( "VCS: #{mod.vcs_configuration ? mod.vcs_configuration.name : 'not configured' }" )
|
29
|
+
|
30
|
+
if mod.vcs_configuration
|
31
|
+
|
32
|
+
c = mod.vcs.remote_changes()
|
33
|
+
if c.nil?
|
34
|
+
verbose( "Remote Changes: Not supported." )
|
35
|
+
elsif c.empty?
|
36
|
+
verbose( "Remote Changes: None" )
|
37
|
+
else
|
38
|
+
quiet( "Remote Changes" )
|
39
|
+
c.each do |line|
|
40
|
+
quiet( " " + line )
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
if not @local_only
|
45
|
+
c = mod.vcs.local_changes()
|
46
|
+
if c.nil?
|
47
|
+
verbose( "Local Changes: Not supported." )
|
48
|
+
elsif c.empty?
|
49
|
+
verbose( "Local Changes: None" )
|
50
|
+
else
|
51
|
+
quiet( "Local Changes:" )
|
52
|
+
c.each do |line|
|
53
|
+
quiet( " " + line )
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end # if mod.vcs_configuration
|
59
|
+
|
60
|
+
return 0
|
61
|
+
end
|
62
|
+
|
63
|
+
def initialize_options
|
64
|
+
options.banner = "Usage: #{self.fullname} [OPTIONS]... MODULES..."
|
65
|
+
options.separator( "" )
|
66
|
+
options.separator( "Options" )
|
67
|
+
|
68
|
+
@all = false
|
69
|
+
options.on( "--all", "Include inactive modules." ) {
|
70
|
+
@all = true
|
71
|
+
}
|
72
|
+
|
73
|
+
@local_only = false
|
74
|
+
options.on( "--local-only", "Only show local unpushed changes." ) {
|
75
|
+
@local_only = true
|
76
|
+
}
|
77
|
+
super
|
78
|
+
end
|
79
|
+
|
80
|
+
end # class Info
|
81
|
+
|
82
|
+
end; end; end # module BuildTool::Commands::Modules
|
83
|
+
|
84
|
+
|
@@ -13,7 +13,7 @@ class CommandLog < ActiveRecord::Base
|
|
13
13
|
include StateHelper
|
14
14
|
|
15
15
|
# A command can have many module events
|
16
|
-
has_many :module_logs, :order => :id, :dependent => :destroy
|
16
|
+
has_many :module_logs, :order => :id, :dependent => :destroy, :include => :module
|
17
17
|
|
18
18
|
def duration
|
19
19
|
if self.finished_at
|
@@ -86,6 +86,13 @@ def active?
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
+
def dirty?
|
90
|
+
if vcs
|
91
|
+
return vcs.dirty?
|
92
|
+
end
|
93
|
+
return false
|
94
|
+
end
|
95
|
+
|
89
96
|
# not inherited
|
90
97
|
def build_directory
|
91
98
|
build_prefix_required.join("bld", local_path)
|
@@ -265,13 +272,18 @@ def lastlog
|
|
265
272
|
|
266
273
|
# Returns a current state in string format
|
267
274
|
def state
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
275
|
+
log = lastlog
|
276
|
+
return 'UNKNOWN' if log.empty?
|
277
|
+
|
278
|
+
e = log[0].module_logs.reverse_order.where( :module => name ).first
|
279
|
+
if e.nil?
|
280
|
+
return "UNKNOWN"
|
281
|
+
end
|
282
|
+
if e.state != History::ModuleLog::FINISHED_SUCCESSFUL
|
283
|
+
return "#{e.started_at.strftime("%x %X")}: #{e.state_str} (#{e.event})"
|
284
|
+
else
|
285
|
+
return "#{e.started_at.strftime("%x %X")}: #{e.state_str}"
|
273
286
|
end
|
274
|
-
return History::ModuleLog::state_str( History::ModuleLog::FINISHED_SUCCESSFUL )
|
275
287
|
end
|
276
288
|
|
277
289
|
# Return the current state as one char.
|
@@ -89,7 +89,7 @@ def archive_url
|
|
89
89
|
#
|
90
90
|
|
91
91
|
def checkedout?
|
92
|
-
|
92
|
+
local_path_exist?
|
93
93
|
end
|
94
94
|
|
95
95
|
def apply_patches( patches )
|
@@ -247,6 +247,18 @@ def prepare_for_fetch
|
|
247
247
|
return check_for_sshkey( config.repository.sshkey )
|
248
248
|
end
|
249
249
|
|
250
|
+
def dirty?
|
251
|
+
return nil
|
252
|
+
end
|
253
|
+
|
254
|
+
def do_remote_changes
|
255
|
+
yield nil
|
256
|
+
end
|
257
|
+
|
258
|
+
def do_local_changes
|
259
|
+
yield nil
|
260
|
+
end
|
261
|
+
|
250
262
|
end # class Archive
|
251
263
|
|
252
264
|
end; end
|
data/lib/build-tool/vcs/base.rb
CHANGED
@@ -127,7 +127,10 @@ def recipe
|
|
127
127
|
:rebase,
|
128
128
|
:fetching_supported?,
|
129
129
|
:[]=,
|
130
|
-
:[]
|
130
|
+
:[],
|
131
|
+
:dirty?,
|
132
|
+
:do_remote_changes,
|
133
|
+
:do_local_changes
|
131
134
|
] do
|
132
135
|
class_eval <<-EOS
|
133
136
|
def #{method}
|
@@ -136,6 +139,36 @@ def #{method}
|
|
136
139
|
EOS
|
137
140
|
end
|
138
141
|
|
142
|
+
def remote_changes( &block )
|
143
|
+
if block_given?
|
144
|
+
do_remote_changes( &block )
|
145
|
+
else
|
146
|
+
r = []
|
147
|
+
do_remote_changes() do |c|
|
148
|
+
r << c
|
149
|
+
end
|
150
|
+
if r == [ nil ]
|
151
|
+
return nil
|
152
|
+
end
|
153
|
+
return r
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def local_changes
|
158
|
+
if block_given?
|
159
|
+
do_local_changes( &block )
|
160
|
+
else
|
161
|
+
r = []
|
162
|
+
do_local_changes() do |c|
|
163
|
+
r << c
|
164
|
+
end
|
165
|
+
if r == [ nil ]
|
166
|
+
return nil
|
167
|
+
end
|
168
|
+
return r
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
139
172
|
end # class Base
|
140
173
|
|
141
174
|
end; end # module BuildTool::VCS
|
data/lib/build-tool/vcs/bazar.rb
CHANGED
@@ -81,23 +81,18 @@ def clone
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
-
# Is the git executable available?
|
85
|
-
def self.bzr_available?()
|
86
|
-
return @bzr_available unless @bzr_available.nil?
|
87
|
-
%x( bzr --version 2>&1 )
|
88
|
-
@bzr_available = $?.success?
|
89
|
-
return @bzr_available
|
90
|
-
end
|
91
|
-
|
92
84
|
def ready_for_fetch
|
93
85
|
if not self.class.bzr_available?
|
94
86
|
logger.error( "#{config.module.name}: Calling `bzr` failed!" )
|
95
87
|
return false
|
96
88
|
end
|
89
|
+
return true
|
90
|
+
end
|
97
91
|
|
92
|
+
def ready_for_rebase
|
98
93
|
if checkedout?
|
99
94
|
# Check if the index is dirty.
|
100
|
-
if
|
95
|
+
if dirty?
|
101
96
|
logger.info( "#{config.module.name}: Local changes will prevent the update." )
|
102
97
|
bzr( "status --short --versioned" ) do |line|
|
103
98
|
logger.info line.chomp
|
@@ -105,7 +100,6 @@ def ready_for_fetch
|
|
105
100
|
return false
|
106
101
|
end
|
107
102
|
end
|
108
|
-
|
109
103
|
return true
|
110
104
|
end
|
111
105
|
|
@@ -125,7 +119,9 @@ def fetch( verbose = false )
|
|
125
119
|
end
|
126
120
|
|
127
121
|
rc = bzr( cmd ) do |line|
|
128
|
-
|
122
|
+
if verbose
|
123
|
+
logger.info( line )
|
124
|
+
end
|
129
125
|
end
|
130
126
|
|
131
127
|
if rc != 0
|
@@ -135,7 +131,7 @@ def fetch( verbose = false )
|
|
135
131
|
|
136
132
|
# Execute +command+ in directory +wd+ and yield every line of output.
|
137
133
|
def bzr( command, wd = local_path, &block )
|
138
|
-
|
134
|
+
self.class.execute "bzr #{command}", wd, &block
|
139
135
|
end
|
140
136
|
|
141
137
|
def rebase( verbose = false )
|
@@ -143,6 +139,39 @@ def rebase( verbose = false )
|
|
143
139
|
0
|
144
140
|
end
|
145
141
|
|
142
|
+
def dirty?
|
143
|
+
# Check if the index is dirty.
|
144
|
+
if bzr( "diff" ) != 0
|
145
|
+
return true
|
146
|
+
end
|
147
|
+
return false
|
148
|
+
end
|
149
|
+
|
150
|
+
def do_remote_changes
|
151
|
+
yield nil
|
152
|
+
end
|
153
|
+
|
154
|
+
def do_local_changes
|
155
|
+
yield nil
|
156
|
+
end
|
157
|
+
|
158
|
+
#
|
159
|
+
### CLASS METHODS
|
160
|
+
#
|
161
|
+
class << self
|
162
|
+
|
163
|
+
@bzr_available = nil
|
164
|
+
|
165
|
+
# Is the git executable available?
|
166
|
+
def bzr_available?()
|
167
|
+
return @bzr_available unless @bzr_available.nil?
|
168
|
+
%x( bzr --version 2>&1 )
|
169
|
+
@bzr_available = $?.success?
|
170
|
+
return @bzr_available
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
|
146
175
|
end # class Bazar
|
147
176
|
|
148
177
|
end; end # module BuildTool::VCS
|