autobuild 1.7.4.rc2 → 1.7.4

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/Manifest.txt CHANGED
@@ -5,6 +5,7 @@ Rakefile
5
5
  TODO
6
6
  bin/autobuild
7
7
  lib/autobuild.rb
8
+ lib/autobuild/build_logfile.rb
8
9
  lib/autobuild/config.rb
9
10
  lib/autobuild/configurable.rb
10
11
  lib/autobuild/environment.rb
@@ -0,0 +1,58 @@
1
+ require 'time'
2
+
3
+ module Autobuild
4
+ # Parse and manipulate the information stored in a build log file (usually
5
+ # in prefix/log/stats.log)
6
+ class BuildLogfile
7
+ Entry = Struct.new :package, :phase, :start_time, :duration
8
+
9
+ attr_reader :by_package
10
+ attr_reader :by_phase
11
+
12
+ def initialize(entries = Array.new)
13
+ @entries = entries.dup
14
+ @by_package = Hash.new
15
+ entries.each do |e|
16
+ package = (by_package[e.package] ||= Hash.new(0))
17
+ package[e.phase] += e.duration
18
+ end
19
+
20
+ @by_phase = Hash.new
21
+ entries.each do |e|
22
+ package = (by_phase[e.phase] ||= Hash.new(0))
23
+ package[e.package] += e.duration
24
+ end
25
+ end
26
+
27
+ def diff(other)
28
+ result = []
29
+ by_package.each do |pkg_name, phases|
30
+ other_phases = other.by_package[pkg_name]
31
+ next if !other_phases
32
+ phases.each do |phase, duration|
33
+ next if !other_phases.has_key?(phase)
34
+ other_duration = other_phases[phase]
35
+ result << Entry.new(pkg_name, phase, nil, other_duration - duration)
36
+ end
37
+ end
38
+ BuildLogfile.new(result)
39
+ end
40
+
41
+ def self.parse(file)
42
+ entries = File.readlines(file).map do |line|
43
+ line = line.strip
44
+ next if line.empty?
45
+
46
+ cols = line.split(/\s+/)
47
+ date, time = cols.shift, cols.shift
48
+ start_time = Time.parse("#{date} #{time}")
49
+ duration = Float(cols.pop)
50
+ phase = cols.pop
51
+ package = cols.join(" ")
52
+ Entry.new(package, phase, start_time, duration)
53
+ end
54
+ new(entries)
55
+ end
56
+ end
57
+ end
58
+
@@ -9,7 +9,7 @@ module Autobuild
9
9
  # and branch. +source+ is [repository, branch]
10
10
  #
11
11
  # This importer uses the 'git' tool to perform the
12
- # import. It defaults to 'svn' and can be configured by
12
+ # import. It defaults to 'git' and can be configured by
13
13
  # doing
14
14
  # Autobuild.programs['git'] = 'my_git_tool'
15
15
  def initialize(repository, branch = nil, options = {})
@@ -469,7 +469,7 @@ module Autobuild
469
469
  end
470
470
 
471
471
  # Creates a git importer which gets the source for the given repository and branch
472
- # URL +source+. The allowed values in +options+ are described in SVN.new.
472
+ # URL +source+.
473
473
  def self.git(repository, branch = nil, options = {})
474
474
  Git.new(repository, branch, options)
475
475
  end
@@ -36,9 +36,24 @@ module Autobuild
36
36
  private
37
37
 
38
38
  def update(package) # :nodoc:
39
- Dir.chdir(package.importdir) {
39
+ Dir.chdir(package.importdir) do
40
40
  old_lang, ENV['LC_ALL'] = ENV['LC_ALL'], 'C'
41
- svninfo = IO.popen("svn info") { |io| io.readlines }
41
+ svninfo = []
42
+ begin
43
+ Subprocess.run(package, :import, @program, 'info') do |line|
44
+ svninfo << line
45
+ end
46
+ rescue SubcommandFailed => e
47
+ if svninfo.find { |l| l =~ /svn upgrade/ }
48
+ # Try svn upgrade and info again
49
+ Subprocess.run(package, :import, @program, 'upgrade')
50
+ svninfo.clear
51
+ Subprocess.run(package, :import, @program, 'info') do |line|
52
+ svninfo << line
53
+ end
54
+ else raise
55
+ end
56
+ end
42
57
  ENV['LC_ALL'] = old_lang
43
58
  unless url = svninfo.grep(/^URL: /).first
44
59
  if svninfo.grep(/is not a working copy/).empty?
@@ -53,7 +68,7 @@ module Autobuild
53
68
  raise ConfigException.new(package, 'import'), "current checkout found at #{package.importdir} is from #{source}, was expecting #{@source}"
54
69
  end
55
70
  Subprocess.run(package, :import, @program, 'up', "--non-interactive", *@options_up)
56
- }
71
+ end
57
72
  end
58
73
 
59
74
  def checkout(package) # :nodoc:
@@ -348,35 +348,40 @@ module Autobuild
348
348
  # Do the build in builddir
349
349
  def build
350
350
  in_dir(builddir) do
351
- progress_start "building %s", :done_message => "built %s" do
351
+ progress_start "building %s" do
352
352
  if always_reconfigure || !File.file?('Makefile')
353
353
  Subprocess.run(self, 'build', Autobuild.tool(:cmake), '.')
354
354
  end
355
355
 
356
+ current_message = String.new
357
+ warning_count = 0
356
358
  Autobuild.make_subcommand(self, 'build') do |line|
357
- if line =~ /\[\s+(\d+)%\]/
359
+ needs_display = false
360
+ if line =~ /\[\s*(\d+)%\]/
358
361
  progress "building %s (#{Integer($1)}%)"
359
- end
360
- end
361
-
362
- if show_make_messages?
363
- warning = String.new
364
- Autobuild.make_subcommand(self, 'build') do |line|
365
- iswarning = false
366
- if line =~ /\[\s*(\d+)%\]/
367
- progress "building %s (#{Integer($1)}%)"
368
- elsif (line =~
369
- /^(Linking)|^(Scanning)|^(Building)|^(Built)/) == nil
370
- warning += line
371
- iswarning = true
362
+ elsif line !~ /^(?:Linking|Scanning|Building|Built)/
363
+ if line =~ /warning/
364
+ warning_count += 1
372
365
  end
373
- if(!iswarning && !warning.empty?)
374
- warning.split("\n").each do |l|
375
- message "%s: #{l}", :magenta
376
- end
377
- warning = ""
366
+ if show_make_messages?
367
+ current_message += line
368
+ needs_display = true
378
369
  end
379
370
  end
371
+ if !needs_display && !current_message.empty?
372
+ current_message.split("\n").each do |l|
373
+ message "%s: #{l}", :magenta
374
+ end
375
+ current_message.clear
376
+ end
377
+ end
378
+ current_message.split("\n").each do |l|
379
+ message "%s: #{l}", :magenta
380
+ end
381
+ if warning_count > 0
382
+ progress_done "built %s (#{warning_count} warnings)"
383
+ else
384
+ progress_done "built %s"
380
385
  end
381
386
  end
382
387
  end
@@ -42,10 +42,17 @@ module Autobuild
42
42
  available_workers << w
43
43
  if error
44
44
  if available_workers.size != workers.size
45
- Autobuild.error "got an error doing parallel processing, waiting for pending jobs to end"
45
+ if finished_task.respond_to?(:package) && finished_task.package
46
+ Autobuild.error "got an error processing #{finished_task.package.name}, waiting for pending jobs to end"
47
+ else
48
+ Autobuild.error "got an error doing parallel processing, waiting for pending jobs to end"
49
+ end
50
+ end
51
+ begin
52
+ finish_pending_work
53
+ ensure
54
+ raise error
46
55
  end
47
- finish_pending_work
48
- raise error
49
56
  end
50
57
 
51
58
  state.process_finished_task(finished_task)
@@ -67,29 +74,25 @@ module Autobuild
67
74
  attr_reader :started_packages
68
75
  attr_reader :active_packages
69
76
  attr_reader :queue
77
+ attr_reader :priorities
70
78
 
71
79
  def initialize(reverse_dependencies, initial_queue = Array.new)
72
80
  @reverse_dependencies = reverse_dependencies
73
81
  @processed = Set.new
74
82
  @active_packages = Set.new
75
- @started_packages = Set.new
76
- @queue = initial_queue.to_set
83
+ @priorities = Hash.new
84
+ @started_packages = Hash.new
85
+ @queue = Hash.new
86
+ initial_queue.each do |t|
87
+ queue[t] = 1
88
+ end
77
89
  end
78
90
 
79
91
  def find_task
80
- possible_task = nil
81
- queue.each do |task|
82
- if task.respond_to?(:package)
83
- if !active_packages.include?(task.package)
84
- if started_packages.include?(task.package)
85
- return task
86
- end
87
- possible_task ||= task
88
- end
89
- else possible_task ||= task
90
- end
92
+ if task = queue.sort_by { |t, p| p }.first
93
+ priorities[task.first] = task.last
94
+ task.first
91
95
  end
92
- possible_task
93
96
  end
94
97
 
95
98
  def pop
@@ -99,9 +102,9 @@ module Autobuild
99
102
  end
100
103
 
101
104
  def mark_as_active(pending_task)
102
- if pending_task.respond_to?(:package)
105
+ if pending_task.respond_to?(:package) && !pending_task.kind_of?(Autobuild::SourceTreeTask)
103
106
  active_packages << pending_task.package
104
- started_packages << pending_task.package
107
+ started_packages[pending_task.package] ||= -started_packages.size
105
108
  end
106
109
  end
107
110
 
@@ -111,11 +114,18 @@ module Autobuild
111
114
  end
112
115
  processed << task
113
116
  reverse_dependencies[task].each do |candidate|
114
- if candidate.prerequisite_tasks.all? { |t| processed.include?(t) }
115
- queue << candidate
117
+ if !processed.include?(candidate) && candidate.prerequisite_tasks.all? { |t| processed.include?(t) }
118
+ if candidate.respond_to?(:package)
119
+ queue[candidate] = started_packages[candidate.package] || priorities[task]
120
+ else queue[candidate] = priorities[task]
121
+ end
116
122
  end
117
123
  end
118
124
  end
125
+
126
+ def trivial_task?(task)
127
+ (task.kind_of?(Autobuild::SourceTreeTask) || task.kind_of?(Rake::FileTask)) && task.actions.empty?
128
+ end
119
129
  end
120
130
 
121
131
  # Invokes the provided tasks. Unlike the rake code, this is a toplevel
@@ -155,7 +165,11 @@ module Autobuild
155
165
  end
156
166
  end
157
167
 
158
- if pending_task.instance_variable_get(:@already_invoked) || !pending_task.needed?
168
+ if state.trivial_task?(pending_task)
169
+ Worker.execute_task(pending_task)
170
+ state.process_finished_task(pending_task)
171
+ next
172
+ elsif pending_task.instance_variable_get(:@already_invoked) || !pending_task.needed?
159
173
  state.process_finished_task(pending_task)
160
174
  next
161
175
  end
@@ -201,11 +215,15 @@ module Autobuild
201
215
  end
202
216
  end
203
217
 
204
- def do_task(task)
205
- @last_error = nil
218
+ def self.execute_task(task)
206
219
  task_args = Rake::TaskArguments.new(task.arg_names, [])
207
220
  task.instance_variable_set(:@already_invoked, true)
208
221
  task.send(:execute, task_args)
222
+ end
223
+
224
+ def do_task(task)
225
+ @last_error = nil
226
+ Worker.execute_task(task)
209
227
  @last_finished_task = task
210
228
  rescue ::Exception => e
211
229
  @last_finished_task = task
@@ -1,5 +1,5 @@
1
1
  module Autobuild
2
- VERSION = "1.7.4.rc2" unless defined? Autobuild::VERSION
2
+ VERSION = "1.7.4" unless defined? Autobuild::VERSION
3
3
  end
4
4
 
5
5
 
metadata CHANGED
@@ -1,111 +1,109 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: autobuild
3
- version: !ruby/object:Gem::Version
4
- hash: 165251369
5
- prerelease: 6
6
- segments:
7
- - 1
8
- - 7
9
- - 4
10
- - rc
11
- - 2
12
- version: 1.7.4.rc2
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.7.4
5
+ prerelease:
13
6
  platform: ruby
14
- authors:
7
+ authors:
15
8
  - Sylvain Joyeux
16
9
  autorequire:
17
10
  bindir: bin
18
11
  cert_chain: []
19
-
20
- date: 2013-07-26 00:00:00 Z
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
12
+ date: 2013-09-18 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
23
15
  name: rake
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
26
17
  none: false
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- hash: 59
31
- segments:
32
- - 0
33
- - 9
34
- - 0
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
35
21
  version: 0.9.0
36
22
  type: :runtime
37
- version_requirements: *id001
38
- - !ruby/object:Gem::Dependency
39
- name: utilrb
40
23
  prerelease: false
41
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.9.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: utilrb
32
+ requirement: !ruby/object:Gem::Requirement
42
33
  none: false
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- hash: 15
47
- segments:
48
- - 1
49
- - 6
50
- - 0
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
51
37
  version: 1.6.0
52
38
  type: :runtime
53
- version_requirements: *id002
54
- - !ruby/object:Gem::Dependency
55
- name: highline
56
39
  prerelease: false
57
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
58
41
  none: false
59
- requirements:
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- hash: 3
63
- segments:
64
- - 0
65
- version: "0"
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.6.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: highline
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
66
54
  type: :runtime
67
- version_requirements: *id003
68
- - !ruby/object:Gem::Dependency
69
- name: rdoc
70
55
  prerelease: false
71
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rdoc
64
+ requirement: !ruby/object:Gem::Requirement
72
65
  none: false
73
- requirements:
66
+ requirements:
74
67
  - - ~>
75
- - !ruby/object:Gem::Version
76
- hash: 27
77
- segments:
78
- - 4
79
- - 0
80
- version: "4.0"
68
+ - !ruby/object:Gem::Version
69
+ version: '4.0'
81
70
  type: :development
82
- version_requirements: *id004
83
- - !ruby/object:Gem::Dependency
84
- name: hoe
85
71
  prerelease: false
86
- requirement: &id005 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '4.0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: hoe
80
+ requirement: !ruby/object:Gem::Requirement
87
81
  none: false
88
- requirements:
82
+ requirements:
89
83
  - - ~>
90
- - !ruby/object:Gem::Version
91
- hash: 9
92
- segments:
93
- - 3
94
- - 7
95
- version: "3.7"
84
+ - !ruby/object:Gem::Version
85
+ version: '3.7'
96
86
  type: :development
97
- version_requirements: *id005
98
- description: Collection of classes to handle build systems (CMake, autotools, ...) and import mechanisms (tarballs, CVS, SVN, git, ...). It also offers a Rake integration to import and build such software packages. It is the backbone of the autoproj (http://rock-robotics.org/autoproj) integrated software project management tool.
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '3.7'
94
+ description: Collection of classes to handle build systems (CMake, autotools, ...)
95
+ and import mechanisms (tarballs, CVS, SVN, git, ...). It also offers a Rake integration
96
+ to import and build such software packages. It is the backbone of the autoproj (http://rock-robotics.org/autoproj)
97
+ integrated software project management tool.
99
98
  email: rock-dev@dfki.de
100
- executables:
99
+ executables:
101
100
  - autobuild
102
101
  extensions: []
103
-
104
- extra_rdoc_files:
102
+ extra_rdoc_files:
105
103
  - Changes.txt
106
104
  - Manifest.txt
107
105
  - README.txt
108
- files:
106
+ files:
109
107
  - Changes.txt
110
108
  - Manifest.txt
111
109
  - README.txt
@@ -113,6 +111,7 @@ files:
113
111
  - TODO
114
112
  - bin/autobuild
115
113
  - lib/autobuild.rb
114
+ - lib/autobuild/build_logfile.rb
116
115
  - lib/autobuild/config.rb
117
116
  - lib/autobuild/configurable.rb
118
117
  - lib/autobuild/environment.rb
@@ -151,44 +150,35 @@ files:
151
150
  - test/tools.rb
152
151
  - .gemtest
153
152
  homepage: http://rock-robotics.org/stable/documentation/autoproj
154
- licenses:
153
+ licenses:
155
154
  - MIT
156
155
  post_install_message:
157
- rdoc_options:
156
+ rdoc_options:
158
157
  - --main
159
158
  - README.txt
160
- require_paths:
159
+ require_paths:
161
160
  - lib
162
- required_ruby_version: !ruby/object:Gem::Requirement
161
+ required_ruby_version: !ruby/object:Gem::Requirement
163
162
  none: false
164
- requirements:
165
- - - ">="
166
- - !ruby/object:Gem::Version
167
- hash: 3
168
- segments:
169
- - 0
170
- version: "0"
171
- required_rubygems_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
172
168
  none: false
173
- requirements:
174
- - - ">"
175
- - !ruby/object:Gem::Version
176
- hash: 25
177
- segments:
178
- - 1
179
- - 3
180
- - 1
181
- version: 1.3.1
169
+ requirements:
170
+ - - ! '>='
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
182
173
  requirements: []
183
-
184
174
  rubyforge_project: autobuild
185
- rubygems_version: 1.8.24
175
+ rubygems_version: 1.8.23
186
176
  signing_key:
187
177
  specification_version: 3
188
178
  summary: Library to handle build systems and import mechanisms
189
- test_files:
190
- - test/test_reporting.rb
179
+ test_files:
180
+ - test/test_import_tar.rb
191
181
  - test/test_subcommand.rb
182
+ - test/test_reporting.rb
192
183
  - test/test_import_svn.rb
193
184
  - test/test_import_cvs.rb
194
- - test/test_import_tar.rb