autoproj 1.0.0 → 1.1.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/History.txt CHANGED
@@ -1,2 +1,9 @@
1
+ = Version 1.1
2
+ * added some sanity checks, especially w.r.t. an already existing GEM
3
+ installation
4
+ * improved the bootstrap
5
+ * autoproj is now able to track a configuration repository (i.e. a VCS that
6
+ stores both the installation's manifest and the package sets)
7
+
1
8
  = Version 1.0
2
9
  * initial release
data/Rakefile CHANGED
@@ -6,6 +6,8 @@ begin
6
6
  config = Hoe.spec 'autoproj' do
7
7
  self.developer "Sylvain Joyeux", "sylvain.joyeux@dfki.de"
8
8
 
9
+ self.url = ["http://doudou.github.com/autoproj",
10
+ "git://github.com/doudou/autoproj.git"]
9
11
  self.rubyforge_name = 'autobuild'
10
12
  self.summary = 'Easy installation and management of robotics software'
11
13
  self.description = paragraphs_of('README.txt', 0..1).join("\n\n")
data/bin/autoproj CHANGED
@@ -37,15 +37,15 @@ where 'mode' is one of:
37
37
  bootstrap: starts a new autoproj installation. Usage:
38
38
  autoproj bootstrap [manifest_url|source_vcs source_url opt1=value1 opt2=value2 ...]
39
39
 
40
- list-sources: list all available sources
41
- update-sources: update all remote sources, but do not build
40
+ list-sets: list all available sources
41
+ update-sets: update all remote sources, but do not build
42
42
 
43
43
  Additional options:
44
44
  EOBANNER
45
45
  opts.on("--reconfigure", "re-ask all configuration options (build mode only)") do
46
46
  Autoproj.reconfigure = true
47
47
  end
48
- opts.on("--no-update", "do not update already checked-out sources (build mode only)") do
48
+ opts.on("--no-update", "do not update already checked-out packages (build mode only)") do
49
49
  Autobuild.do_update = false
50
50
  end
51
51
 
@@ -95,6 +95,7 @@ args = ARGV.dup
95
95
  parser.parse!(args)
96
96
  mode = args.shift
97
97
  selected_packages = args.dup
98
+ all_env_sh = Array.new
98
99
 
99
100
  def color(*args)
100
101
  Autoproj.console.color(*args)
@@ -177,88 +178,130 @@ end
177
178
 
178
179
 
179
180
  def do_bootstrap(*args)
181
+ if File.exists?(File.join("autoproj", "manifest"))
182
+ raise ConfigError, "this installation is already bootstrapped. Remove the autoproj directory if it is not the case"
183
+ end
184
+
180
185
  if args.empty? # no argument, simply add a manifest template
181
186
  sample_dir = File.expand_path(File.join("..", "samples"), File.dirname(__FILE__))
182
- FileUtils.mkdir_p "autoproj"
183
187
  manifest_data = File.read(File.join(sample_dir, "manifest"))
188
+ FileUtils.mkdir_p "autoproj"
189
+ File.open(File.join(Autoproj.config_dir, "manifest"), "w") do |io|
190
+ io.write(manifest_data)
191
+ end
184
192
 
185
193
  elsif args.size == 1 # must be a manifest file
186
194
  manifest_url = args.first
187
195
  STDERR.puts color("autoproj: downloading manifest file #{manifest_url}", :bold)
188
- manifest_data = open(manifest_url) { |file| file.read }
189
-
190
- else # must be a source definition
191
- manifest_data = <<-EOF
192
- sources:
193
- - type: #{args.shift}
194
- url: #{args.shift}
195
- EOF
196
+ manifest_data =
197
+ begin open(manifest_url) { |file| file.read }
198
+ rescue
199
+ raise ConfigError, "cannot read #{manifest_url}, did you mean 'autoproj bootstrap VCSTYPE #{manifest_url}' ?"
200
+ end
201
+
202
+ FileUtils.mkdir_p "autoproj"
203
+ File.open(File.join(Autoproj.config_dir, "manifest"), "w") do |io|
204
+ io.write(manifest_data)
205
+ end
206
+
207
+ else # is a VCS definition for the manifest itself ...
208
+ vcs_def = Hash.new
209
+ vcs_def[:type] = args.shift
210
+ vcs_def[:url] = args.shift
196
211
  while !args.empty?
197
212
  name, value = args.shift.split("=")
198
- manifest_data << " #{name}: #{value}\n"
213
+ vcs_def[name] = value
214
+ end
215
+ vcs = Autoproj.normalize_vcs_definition(vcs_def)
216
+ Autoproj::Manifest.import_whole_installation(vcs, File.join(Dir.pwd, "autoproj"))
217
+
218
+ # Now write it in the config file
219
+ File.open(File.join(Autoproj.config_dir, "config.yml"), "a") do |io|
220
+ io.puts <<-EOTEXT
221
+ manifest_source:
222
+ type: #{vcs_def.delete(:type)}
223
+ url: #{vcs_def.delete(:url)}
224
+ #{vcs_def.map { |k, v| "#{k}: #{v}" }.join("\n ")}
225
+ EOTEXT
199
226
  end
200
-
201
227
  end
228
+ end
229
+
230
+ # Find the autoproj root dir
231
+ begin
232
+ case mode
233
+ when "bootstrap"
234
+ # If there is no argument, We need one more argument. It is either a VCS type or a path to a
235
+ # manifest.
236
+ #
237
+ # In the first case, we create a new manifest and add the source given on
238
+ # the command line to it. In the second case, we simply use it as a
239
+ # manifest.
240
+ do_bootstrap(*args)
241
+ if args.empty?
242
+ # no package sets defined, we're done
243
+ exit(0)
244
+ end
245
+ only_update_sources = true
202
246
 
203
- File.open(File.join(Autoproj.config_dir, "manifest"), "w") do |io|
204
- io.write(manifest_data)
247
+ when "build"
248
+ when "update"
249
+ Autobuild.do_build = false
250
+ when "status"
251
+ only_do_status = true
252
+ Autobuild.do_update = false
253
+ no_os_deps = true
254
+ when "update-sets"
255
+ only_update_sources = true
256
+ when "list-sets"
257
+ only_update_sources = true
258
+ Autobuild.do_update = false
259
+
260
+ when "doc"
261
+ Autobuild.do_update = false
262
+ Autobuild.do_doc = true
263
+ Autobuild.only_doc = true
264
+ else
265
+ puts parser
266
+ exit(1)
205
267
  end
206
- end
207
268
 
208
- case mode
209
- when "bootstrap"
210
- # If there is no argument, We need one more argument. It is either a VCS type or a path to a
211
- # manifest.
212
- #
213
- # In the first case, we create a new manifest and add the source given on
214
- # the command line to it. In the second case, we simply use it as a
215
- # manifest.
216
- do_bootstrap(*args)
217
- only_update_sources = true
218
-
219
- when "build"
220
- when "update"
221
- Autobuild.do_build = false
222
- when "status"
223
- only_do_status = true
224
- Autobuild.do_update = false
225
- no_os_deps = true
226
- when "update-sources"
227
- only_update_sources = true
228
- when "list-sources"
229
- only_update_sources = true
230
- Autobuild.do_update = false
231
-
232
- when "doc"
233
- Autobuild.do_update = false
234
- Autobuild.do_doc = true
235
- Autobuild.only_doc = true
236
- else
237
- puts parser
238
- exit(1)
239
- end
269
+ root_dir = Autoproj.root_dir
270
+ Dir.chdir(root_dir)
240
271
 
241
- # Find the autoproj root dir
242
- root_dir = Autoproj.root_dir
243
- # Load user configuration
244
- Autoproj.load_config
245
- # Set the initial environment
246
- Autoproj.set_initial_env
247
- # Set up some important autobuild parameters
248
- Autobuild.prefix = Autoproj.build_dir
249
- Autobuild.srcdir = root_dir
250
- Autobuild.doc_errors = false
251
- Autobuild.do_doc = false
252
- Autobuild::Reporting << Autoproj::Reporter.new
253
- if mail_config[:to]
254
- Autobuild::Reporting << MailReporter.new(mail_config)
255
- end
272
+ # Load user configuration
273
+ Autoproj.load_config
274
+ # If we are under rubygems, check that the GEM_HOME is right ...
275
+ if $LOADED_FEATURES.any? { |l| l =~ /rubygems/ }
276
+ if ENV['GEM_HOME'] != Autoproj.gem_home
277
+ raise ConfigError, "RubyGems is already loaded with a different GEM_HOME"
278
+ end
279
+ end
280
+ # Set the initial environment
281
+ Autoproj.set_initial_env
282
+ # Set up some important autobuild parameters
283
+ Autobuild.prefix = Autoproj.build_dir
284
+ Autobuild.srcdir = root_dir
285
+ Autobuild.doc_errors = false
286
+ Autobuild.do_doc = false
287
+ Autobuild::Reporting << Autoproj::Reporter.new
288
+ if mail_config[:to]
289
+ Autobuild::Reporting << MailReporter.new(mail_config)
290
+ end
256
291
 
292
+ manifest_path = File.join(Autoproj.config_dir, 'manifest')
293
+ # Load the installation's manifest a first time, to check if we should
294
+ # update it ... We assume that the OS dependencies for this VCS is already
295
+ # installed (i.e. that the user did not remove it)
296
+ manifest = Manifest.load(manifest_path)
297
+ if manifest.vcs && mode != "bootstrap"
298
+ Autobuild::Reporting.report do
299
+ manifest.update_yourself
300
+ end
301
+ manifest = Manifest.load(manifest_path)
302
+ end
303
+ Autoproj.manifest = manifest
257
304
 
258
- Dir.chdir(root_dir)
259
- begin
260
- # Load the installation's manifest
261
- manifest = Autoproj.manifest = Manifest.load(File.join('autoproj', 'manifest'))
262
305
  source_os_dependencies = manifest.each_remote_source(false).
263
306
  inject(Set.new) do |set, source|
264
307
  set << source.vcs.type if !source.local?
@@ -273,47 +316,23 @@ begin
273
316
 
274
317
  # Update the remote sources if there are any
275
318
  if manifest.has_remote_sources?
276
- STDERR.puts color("autoproj: updating remote sources", :bold)
319
+ STDERR.puts color("autoproj: updating remote definitions of package sets", :bold)
277
320
  Autobuild::Reporting.report do
278
321
  manifest.update_remote_sources
279
322
  end
280
323
  STDERR.puts
281
324
  end
282
325
 
283
- # If in verbose mode, or if we only update sources, list the sources
284
- #
285
- # Note that we can't have the Manifest class load the source.yml file, as it
286
- # cannot resolve all constants. So we need to do it ourselves to get the
287
- # name ...
288
- if Autoproj.verbose || only_update_sources
289
- sources = manifest.each_source(false).to_a
290
-
291
- if sources.empty?
292
- STDERR.puts color("autoproj: no sources defined in autoproj/manifest", :bold, :red)
293
- else
294
- STDERR.puts color("autoproj: available sources", :bold)
295
- manifest.each_source(false) do |source|
296
- source_yml = source.raw_description_file
297
- STDERR.puts " #{source_yml['name']}"
298
- if source.local?
299
- STDERR.puts " local source in #{source.local_dir}"
300
- else
301
- STDERR.puts " vcs: #{source.vcs}, #{source.vcs.options.inspect}"
302
- STDERR.puts " local: #{source.local_dir}"
303
- end
304
- end
305
- end
306
- end
307
- if only_update_sources
308
- exit(0)
309
- end
310
-
311
326
  # Load init.rb files. each_source must not load the source.yml file, as
312
327
  # init.rb may define configuration options that are used there
313
328
  manifest.each_source(false) do |source|
314
329
  init_rb = File.join(source.local_dir, "init.rb")
315
330
  if File.exists?(init_rb)
316
- load init_rb
331
+ begin
332
+ load init_rb
333
+ rescue Exception => e
334
+ Autoproj.filter_load_exception(e, source, init_rb)
335
+ end
317
336
  end
318
337
  end
319
338
 
@@ -341,6 +360,41 @@ begin
341
360
  end
342
361
  end
343
362
 
363
+ # If in verbose mode, or if we only update sources, list the sources
364
+ #
365
+ # Note that we can't have the Manifest class load the source.yml file, as it
366
+ # cannot resolve all constants. So we need to do it ourselves to get the
367
+ # name ...
368
+ if Autoproj.verbose || only_update_sources
369
+ sources = manifest.each_source(false).to_a
370
+
371
+ if sources.empty?
372
+ STDERR.puts color("autoproj: no package sets defined in autoproj/manifest", :bold, :red)
373
+ else
374
+ STDERR.puts color("autoproj: available package sets", :bold)
375
+ manifest.each_source(false) do |source|
376
+ source_yml = source.raw_description_file
377
+ STDERR.puts " #{source_yml['name']}"
378
+ if source.local?
379
+ STDERR.puts " local source in #{source.local_dir}"
380
+ else
381
+ STDERR.puts " vcs: #{source.vcs}, #{source.vcs.options.inspect}"
382
+ STDERR.puts " local: #{source.local_dir}"
383
+ end
384
+
385
+ source.each_package.
386
+ map { |pkg| pkg.name }.
387
+ sort.
388
+ each do |name|
389
+ STDERR.puts " #{name}"
390
+ end
391
+ end
392
+ end
393
+ end
394
+ if only_update_sources
395
+ exit(0)
396
+ end
397
+
344
398
  # Create the build target from the manifest if the user did not provide an
345
399
  # explicit one
346
400
  if selected_packages.empty?
@@ -446,9 +500,22 @@ begin
446
500
  Autobuild.do_update = old_update_flag
447
501
  end
448
502
 
503
+ all_env_sh << name
449
504
  Autoproj.export_env_sh(name)
450
505
  end
451
506
 
507
+ STDERR.puts <<EOTEXT
508
+
509
+
510
+ add the following lines at the bottom of your .bashrc:
511
+ #{all_env_sh.map { |name| "source #{Dir.pwd}#{name}env.sh" }.join("\n ")}
512
+
513
+ WARNING: autoproj will not work until your restart all
514
+ your consoles, or run the following in them:
515
+ #{all_env_sh.map { |name| "$ source #{Dir.pwd}#{name}env.sh" }.join("\n ")}
516
+
517
+ EOTEXT
518
+
452
519
  rescue ConfigError => e
453
520
  STDERR.puts
454
521
  STDERR.puts color(e.message, :red, :bold)
@@ -1,5 +1,14 @@
1
1
  #! /usr/bin/ruby
2
2
 
3
+ ENV['GEM_HOME'] = "#{Dir.pwd}/.gems"
4
+ ENV['PATH'] = "#{ENV['GEM_HOME']}/bin:#{ENV['PATH']}"
5
+ if $LOADED_FEATURES.find { |str| str =~ /bygems/ }
6
+ ENV['RUBYOPT'] = ""
7
+ exec "ruby", __FILE__
8
+ end
9
+
10
+ ENV['RUBYOPT'] = "-rubygems"
11
+
3
12
  require 'yaml'
4
13
  require 'set'
5
14
  require 'rubygems'
@@ -134,8 +143,11 @@ module Autoproj
134
143
  File.open('osdeps.sh', 'w') do |file|
135
144
  file.write shell_script
136
145
  end
137
- Autobuild::Subprocess.run 'autoproj', 'osdeps', 'bash', './osdeps.sh'
138
- FileUtils.rm_f 'osdeps.sh'
146
+ begin
147
+ Autobuild::Subprocess.run 'autoproj', 'osdeps', 'bash', './osdeps.sh'
148
+ ensure
149
+ FileUtils.rm_f 'osdeps.sh'
150
+ end
139
151
 
140
152
  # Don't install gems that are already there ...
141
153
  gems.delete_if do |name|
@@ -190,16 +202,13 @@ STDERR.puts "autoproj: installing autoproj and its dependencies (this can take a
190
202
  osdeps_management.install(packages)
191
203
 
192
204
  if ARGV.first != "dev"
193
- ENV['RUBYOPT'] = "-rubygems"
194
- ENV['GEM_HOME'] = "#{Dir.pwd}/autoproj/gems"
195
- ENV['PATH'] = "#{ENV['GEM_HOME']}/bin:$PATH"
196
205
  Autobuild::Subprocess.run('bootstrap', 'post', 'autoproj', 'bootstrap')
197
206
  end
198
207
 
199
208
  File.open('env.sh', 'w') do |io|
200
209
  io.write <<-EOSHELL
201
210
  export RUBYOPT=-rubygems
202
- export GEM_HOME=#{Dir.pwd}/autoproj/gems
211
+ export GEM_HOME=#{Dir.pwd}/.gems
203
212
  export PATH=$GEM_HOME/bin:$PATH
204
213
  EOSHELL
205
214
  end
@@ -14,7 +14,7 @@ autoproj-related configuration is saved. The contained files are as follows:
14
14
 
15
15
  * autoproj/manifest: list of available package sets, layout of the
16
16
  installation. See "Management" below.
17
- * autoproj/remotes/\*: package sets that are imported from a remote version
17
+ * .remotes/\*: package sets that are imported from a remote version
18
18
  control system
19
19
  * autoproj/\*/: local sets, i.e. sets that have not been imported from a remote
20
20
  version control system.
@@ -100,7 +100,7 @@ autoproj will still have to checkout new packages, though:
100
100
  autoproj build --no-update
101
101
  {.commandline}
102
102
 
103
- If, on the other hand, you only want to update the sources, do
103
+ If, on the other hand, you only want to update the source code, do
104
104
 
105
105
  autoproj update
106
106
  {.commandline}
@@ -44,11 +44,27 @@ module Autoproj
44
44
  end
45
45
 
46
46
  @loaded_autobuild_files = Set.new
47
+ def self.filter_load_exception(error, source, path)
48
+ raise error if Autoproj.verbose
49
+ rx_path = Regexp.quote(path)
50
+ error_line = error.backtrace.find { |l| l =~ /#{rx_path}/ }
51
+ line_number = Integer(/#{rx_path}:(\d+)/.match(error_line)[1])
52
+ if source.local?
53
+ raise ConfigError, "#{path}:#{line_number}: #{error.message}", error.backtrace
54
+ else
55
+ raise ConfigError, "#{File.basename(path)}(source=#{source.name}):#{line_number}: #{error.message}", error.backtrace
56
+ end
57
+ end
58
+
47
59
  def self.import_autobuild_file(source, path)
48
60
  return if @loaded_autobuild_files.include?(path)
49
61
 
50
62
  @file_stack.push([source, File.basename(path)])
51
- load path
63
+ begin
64
+ load path
65
+ rescue Exception => e
66
+ filter_load_exception(e, source, path)
67
+ end
52
68
  @loaded_autobuild_files << path
53
69
 
54
70
  ensure
@@ -119,7 +135,7 @@ def ruby_common(pkg)
119
135
  end
120
136
 
121
137
  pkg.post_install do
122
- Autobuild.progress " setting up Ruby package #{pkg.name}"
138
+ Autobuild.progress "setting up Ruby package #{pkg.name}"
123
139
  Autobuild.update_environment pkg.srcdir
124
140
  if File.file?('Rakefile')
125
141
  if File.directory?('ext')
@@ -144,7 +144,7 @@ module Autoproj
144
144
  # dependencies that are provided by the operating system (.osdeps file).
145
145
  class Source
146
146
  # The VCSDefinition object that defines the version control holding
147
- # information for this source. Local sources (i.e. the ones that are not
147
+ # information for this source. Local package sets (i.e. the ones that are not
148
148
  # under version control) use the 'local' version control name. For them,
149
149
  # local? returns true.
150
150
  attr_accessor :vcs
@@ -166,7 +166,7 @@ module Autoproj
166
166
  if local?
167
167
  vcs.url
168
168
  else
169
- File.join(Autoproj.config_dir, "remotes", automatic_name)
169
+ File.join(Autoproj.remotes_dir, automatic_name)
170
170
  end
171
171
  end
172
172
 
@@ -179,6 +179,8 @@ module Autoproj
179
179
  def name
180
180
  if @source_definition then
181
181
  @source_definition['name'] || automatic_name
182
+ elsif @name
183
+ @name
182
184
  else
183
185
  automatic_name
184
186
  end
@@ -207,6 +209,12 @@ module Autoproj
207
209
  source_definition
208
210
  end
209
211
 
212
+ def load_name
213
+ definition = raw_description_file
214
+ @name = definition['name']
215
+ rescue InternalError
216
+ end
217
+
210
218
  # Load the source.yml file that describes this source, and resolve the
211
219
  # $BLABLA values that are in there. Use #raw_description_file to avoid
212
220
  # resolving those values
@@ -242,7 +250,7 @@ module Autoproj
242
250
  end
243
251
 
244
252
  rescue ConfigError => e
245
- raise ConfigError, "#{e.message} in #{File.join(local_dir, "source.yml")}", e.backtrace
253
+ raise ConfigError, "#{File.join(local_dir, "source.yml")}: #{e.message}", e.backtrace
246
254
  end
247
255
  end
248
256
 
@@ -314,6 +322,18 @@ module Autoproj
314
322
  rescue ConfigError => e
315
323
  raise ConfigError, "#{e.message} in the source.yml file of #{name} (#{File.join(local_dir, "source.yml")})", e.backtrace
316
324
  end
325
+
326
+ def each_package
327
+ if !block_given?
328
+ return enum_for(:each_package)
329
+ end
330
+
331
+ Autoproj.manifest.packages.each do |pkg_name, (pkg, source, file)|
332
+ if source.name == name
333
+ yield(pkg)
334
+ end
335
+ end
336
+ end
317
337
  end
318
338
 
319
339
  class Manifest
@@ -321,6 +341,8 @@ module Autoproj
321
341
  def self.load(file)
322
342
  begin
323
343
  data = YAML.load(File.read(file))
344
+ rescue Errno::ENOENT
345
+ raise ConfigError, "expected an autoproj configuration in #{File.expand_path(File.dirname(file))}, but #{file} does not exist"
324
346
  rescue ArgumentError => e
325
347
  raise ConfigError, "error in #{file}: #{e.message}"
326
348
  end
@@ -344,20 +366,23 @@ module Autoproj
344
366
  @data = data
345
367
  @packages = Hash.new
346
368
  @package_manifests = Hash.new
369
+
370
+ if Autoproj.has_config_key?('manifest_source')
371
+ @vcs = Autoproj.normalize_vcs_definition(Autoproj.user_config('manifest_source'))
372
+ end
347
373
  end
348
374
 
349
- # Lists the autobuild files that are part of the sources listed in this
350
- # manifest
375
+ # Lists the autobuild files that are in the package sets we know of
351
376
  def each_autobuild_file(source_name = nil, &block)
352
377
  if !block_given?
353
378
  return enum_for(:each_source_file, source_name)
354
379
  end
355
380
 
356
- # This looks very inefficient, but it is because source names
357
- # are contained in the source definition file (source.yml) and
358
- # we must therefore load that file to check the source name ...
381
+ # This looks very inefficient, but it is because source names are
382
+ # contained in source.yml and we must therefore load that file to
383
+ # check the package set name ...
359
384
  #
360
- # And honestly I don't think someone will have 20 000 sources
385
+ # And honestly I don't think someone will have 20 000 package sets
361
386
  done_something = false
362
387
  each_source do |source|
363
388
  next if source_name && source.name != source_name
@@ -389,7 +414,7 @@ module Autoproj
389
414
  each_remote_source(false).any? { true }
390
415
  end
391
416
 
392
- # Like #each_source, but filters out local sources
417
+ # Like #each_source, but filters out local package sets
393
418
  def each_remote_source(load_description = true)
394
419
  if !block_given?
395
420
  enum_for(:each_remote_source, load_description)
@@ -405,16 +430,16 @@ module Autoproj
405
430
  # call-seq:
406
431
  # each_source { |source_description| ... }
407
432
  #
408
- # Lists all sources defined in this manifest, by yielding a Source
409
- # object that describes the source.
433
+ # Lists all package sets defined in this manifest, by yielding a Source
434
+ # object that describes it.
410
435
  def each_source(load_description = true)
411
436
  if !block_given?
412
- return enum_for(:each_source)
437
+ return enum_for(:each_source, load_description)
413
438
  end
414
439
 
415
- return if !data['sources']
440
+ return if !data['package_sets']
416
441
 
417
- data['sources'].each do |spec|
442
+ data['package_sets'].each do |spec|
418
443
  # Look up for short notation (i.e. not an explicit hash). It is
419
444
  # either vcs_type:url or just url. In the latter case, we expect
420
445
  # 'url' to be a path to a local directory
@@ -427,6 +452,9 @@ module Autoproj
427
452
  source = Source.new(vcs_def)
428
453
  if source.present? && load_description
429
454
  source.load_description_file
455
+ else
456
+ # Try to load just the name from the source.yml file
457
+ source.load_name
430
458
  end
431
459
 
432
460
  yield(source)
@@ -458,6 +486,21 @@ module Autoproj
458
486
  fake_package = FakePackage.new(source.automatic_name, source.local_dir)
459
487
 
460
488
  importer.import(fake_package)
489
+ rescue Autobuild::ConfigException => e
490
+ raise ConfigError, e.message, e.backtrace
491
+ end
492
+
493
+ attr_reader :vcs
494
+ def self.import_whole_installation(vcs, into)
495
+ importer = vcs.create_autobuild_importer
496
+ fake_package = FakePackage.new('autoproj main configuration', into)
497
+ importer.import(fake_package)
498
+ rescue Autobuild::ConfigException => e
499
+ raise ConfigError, "cannot import autoproj configuration: #{e.message}", e.backtrace
500
+ end
501
+
502
+ def update_yourself
503
+ Manifest.import_whole_installation(vcs, Autoproj.config_dir)
461
504
  end
462
505
 
463
506
  def update_remote_sources
@@ -471,10 +514,10 @@ module Autoproj
471
514
  # Sets up the package importers based on the information listed in
472
515
  # the source's source.yml
473
516
  #
474
- # The priority logic is that we take the sources one by one in the order
475
- # listed in the autoproj main manifest, and first come first used.
517
+ # The priority logic is that we take the package sets one by one in the
518
+ # order listed in the autoproj main manifest, and first come first used.
476
519
  #
477
- # A source that defines a particular package in its autobuild file
520
+ # A set that defines a particular package in its autobuild file
478
521
  # *must* provide the corresponding VCS line in its source.yml file.
479
522
  # However, it is possible for a source that does *not* define a package
480
523
  # to override the VCS
@@ -23,8 +23,8 @@ module Autoproj
23
23
  end
24
24
 
25
25
  def ask(current_value)
26
- default_value = if current_value then current_value
27
- else options[:default]
26
+ default_value = if current_value then current_value.to_s
27
+ else options[:default].to_str
28
28
  end
29
29
 
30
30
  STDERR.print " #{doc} [#{default_value}] "
@@ -82,7 +82,7 @@ module Autoproj
82
82
  if value.nil? || (!seen && Autoproj.reconfigure?)
83
83
  value = configure(key)
84
84
  else
85
- if !seen
85
+ if !seen && @declared_options[key]
86
86
  STDERR.puts " #{@declared_options[key].doc}: #{value}"
87
87
  @user_config[key] = [value, true]
88
88
  end
@@ -119,6 +119,10 @@ module Autoproj
119
119
  end
120
120
  end
121
121
 
122
+ def self.has_config_key?(name)
123
+ @user_config.has_key?(name)
124
+ end
125
+
122
126
  def self.load_config
123
127
  config_file = File.join(Autoproj.config_dir, "config.yml")
124
128
  if File.exists?(config_file)
@@ -110,8 +110,11 @@ module Autoproj
110
110
  File.open('osdeps.sh', 'w') do |file|
111
111
  file.write shell_script
112
112
  end
113
- Autobuild::Subprocess.run 'autoproj', 'osdeps', 'bash', './osdeps.sh'
114
- FileUtils.rm_f 'osdeps.sh'
113
+ begin
114
+ Autobuild::Subprocess.run 'autoproj', 'osdeps', 'bash', './osdeps.sh'
115
+ ensure
116
+ FileUtils.rm_f 'osdeps.sh'
117
+ end
115
118
 
116
119
  # Don't install gems that are already there ...
117
120
  gems.delete_if do |name|
@@ -37,11 +37,17 @@ module Autoproj
37
37
  end
38
38
  end
39
39
 
40
+ def self.remotes_dir
41
+ File.join(root_dir, ".remotes")
42
+ end
43
+ def self.gem_home
44
+ File.join(root_dir, ".gems")
45
+ end
46
+
40
47
  def self.set_initial_env
41
- gem_home = File.join(Autoproj.config_dir, "gems")
42
48
  Autoproj.env_set 'RUBYOPT', "-rubygems"
43
- Autoproj.env_set 'GEM_HOME', gem_home
44
- Autoproj.env_set_path 'PATH', "#{gem_home}/bin", "/usr/local/bin", "/usr/bin", "/bin"
49
+ Autoproj.env_set 'GEM_HOME', Autoproj.gem_home
50
+ Autoproj.env_set_path 'PATH', "#{Autoproj.gem_home}/bin", "/usr/local/bin", "/usr/bin", "/bin"
45
51
  Autoproj.env_set 'PKG_CONFIG_PATH'
46
52
  Autoproj.env_set 'RUBYLIB'
47
53
  Autoproj.env_inherit 'PATH', 'PKG_CONFIG_PATH', 'RUBYLIB'
@@ -1,3 +1,3 @@
1
1
  module Autoproj
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
data/samples/manifest CHANGED
@@ -1,4 +1,4 @@
1
- sources:
1
+ package_sets:
2
2
  # Example source from a git repository
3
3
  # - type: git
4
4
  # url: git://github.com/doudou/autoproj.orocos.git
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: autoproj
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Joyeux
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-14 00:00:00 +02:00
12
+ date: 2009-10-15 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -166,7 +166,7 @@ files:
166
166
  - test/test_debian.rb
167
167
  - test/test_manifest.rb
168
168
  has_rdoc: true
169
- homepage:
169
+ homepage: http://doudou.github.com/autoproj
170
170
  licenses: []
171
171
 
172
172
  post_install_message: