autoproj 2.0.0.rc5 → 2.0.0.rc6

Sign up to get free protection for your applications and to get access to all the features.
@@ -234,7 +234,7 @@ def save_import_state(name, versions)
234
234
  # Ensure that our ref is being logged
235
235
  FileUtils.touch File.join(git_dir, 'logs', *self.class.import_state_log_ref.split("/"))
236
236
  # Create the commit with the versions info
237
- commit_id = Snapshot.create_commit(main, import_state_log_file, name) do |io|
237
+ commit_id = Snapshot.create_commit(main, import_state_log_file, name, real_author: false) do |io|
238
238
  YAML.dump(versions, io)
239
239
  end
240
240
  # And save it in our reflog
@@ -257,7 +257,7 @@ def save_import_state(name, versions)
257
257
  # the root of the git repository
258
258
  # @param [String] the commit message
259
259
  # @return [String] the commit ID
260
- def self.create_commit(pkg, path, message, parent_id = nil)
260
+ def self.create_commit(pkg, path, message, parent_id = nil, real_author: true)
261
261
  importer = pkg.importer
262
262
  object_id = Tempfile.open 'autoproj-versions' do |io|
263
263
  yield(io)
@@ -274,6 +274,14 @@ def self.create_commit(pkg, path, message, parent_id = nil)
274
274
 
275
275
  parent_id ||= importer.rev_parse(pkg, 'HEAD')
276
276
 
277
+ env = Hash.new
278
+ if !real_author
279
+ env['GIT_AUTHOR_NAME'] = 'autoproj'
280
+ env['GIT_AUTHOR_EMAIL'] = 'autoproj'
281
+ env['GIT_COMMITTER_NAME'] = 'autoproj'
282
+ env['GIT_COMMITTER_EMAIL'] = 'autoproj'
283
+ end
284
+
277
285
  # Create the tree using a temporary index in order to not mess with
278
286
  # the user's index state. read-tree initializes the new index and
279
287
  # then we add the overrides file with update-index / write-tree
@@ -294,7 +302,7 @@ def self.create_commit(pkg, path, message, parent_id = nil)
294
302
 
295
303
  importer.run_git_bare(
296
304
  pkg, 'commit-tree',
297
- tree_id, '-p', parent_id, input_streams: [message]).first
305
+ tree_id, '-p', parent_id, env: env, input_streams: [message]).first
298
306
  end
299
307
  end
300
308
  end
@@ -160,7 +160,7 @@ def osdeps_mode_option_supported_os(config)
160
160
  end
161
161
 
162
162
  def define_osdeps_mode_option
163
- if OSPackageResolver.supported_operating_system?
163
+ if os_package_resolver.supported_operating_system?
164
164
  osdeps_mode_option_supported_os(ws.config)
165
165
  else
166
166
  osdeps_mode_option_unsupported_os(ws.config)
@@ -137,7 +137,7 @@ def prefer_indep_over_os_packages=(flag); @prefer_indep_over_os_packages = flag
137
137
  # @return [String]
138
138
  def os_package_manager
139
139
  if !instance_variable_defined?(:@os_package_manager)
140
- os_names, _ = OSPackageResolver.operating_system
140
+ os_names, _ = operating_system
141
141
  os_name = os_names.find { |name| OS_PACKAGE_MANAGERS[name] }
142
142
  @os_package_manager = OS_PACKAGE_MANAGERS[os_name]
143
143
  if !@os_package_manager
@@ -162,6 +162,7 @@ def initialize(defs = Hash.new, file = nil)
162
162
 
163
163
  @sources = Hash.new
164
164
  @installed_packages = Set.new
165
+ @operating_system = self.class.operating_system
165
166
  if file
166
167
  defs.each_key do |package_name|
167
168
  sources[package_name] = file
@@ -246,7 +247,7 @@ def self.verify_definitions(hash, path = [])
246
247
 
247
248
  # Returns true if it is possible to install packages for the operating
248
249
  # system on which we are installed
249
- def self.supported_operating_system?
250
+ def supported_operating_system?
250
251
  if @supported_operating_system.nil?
251
252
  os_names, _ = operating_system
252
253
  @supported_operating_system =
@@ -258,13 +259,6 @@ def self.supported_operating_system?
258
259
  return @supported_operating_system
259
260
  end
260
261
 
261
- # Used mainly during testing to bypass the operating system
262
- # autodetection
263
- def self.operating_system=(values)
264
- @supported_operating_system = nil
265
- @operating_system = values
266
- end
267
-
268
262
  def self.guess_operating_system
269
263
  if File.exists?('/etc/debian_version')
270
264
  versions = [File.read('/etc/debian_version').strip]
@@ -345,6 +339,23 @@ def self.normalize_os_representation(names, versions)
345
339
  return names, versions
346
340
  end
347
341
 
342
+ def operating_system
343
+ @operating_system || self.class.operating_system
344
+ end
345
+
346
+ def operating_system=(values)
347
+ @supported_operating_system = nil
348
+ @operating_system = values
349
+ end
350
+
351
+ def self.operating_system
352
+ @operating_system
353
+ end
354
+
355
+ def self.operating_system=(values)
356
+ @operating_system = values
357
+ end
358
+
348
359
  # Autodetects the operating system name and version
349
360
  #
350
361
  # +osname+ is the operating system name, all in lowercase (e.g. ubuntu,
@@ -355,41 +366,16 @@ def self.normalize_os_representation(names, versions)
355
366
  # one.
356
367
  #
357
368
  # Examples: ['debian', ['sid', 'unstable']] or ['ubuntu', ['lucid lynx', '10.04']]
358
- def self.operating_system(options = Hash.new)
359
- # Validate the options. We check on the availability of
360
- # validate_options as to not break autoproj_bootstrap (in which
361
- # validate_options is not available)
362
- options = validate_options options, force: false, config: Autoproj.config
363
- config = options.fetch(:config)
364
-
369
+ def self.autodetect_operating_system
365
370
  if user_os = ENV['AUTOPROJ_OS']
366
- @operating_system =
367
- if user_os.empty? then false
368
- else
369
- names, versions = user_os.split(':')
370
- normalize_os_representation(names.split(','), versions.split(','))
371
- end
372
- return @operating_system
373
- end
374
-
375
-
376
- if options[:force]
377
- @operating_system = nil
378
- elsif !@operating_system.nil? # @operating_system can be set to false to simulate an unknown OS
379
- return @operating_system
380
- elsif config.has_value_for?('operating_system')
381
- os = config.get('operating_system')
382
- if os.respond_to?(:to_ary)
383
- if os[0].respond_to?(:to_ary) && os[0].all? { |s| s.respond_to?(:to_str) } &&
384
- os[1].respond_to?(:to_ary) && os[1].all? { |s| s.respond_to?(:to_str) }
385
- @operating_system = os
386
- return os
387
- end
371
+ if user_os.empty?
372
+ return false
373
+ else
374
+ names, versions = user_os.split(':')
375
+ return normalize_os_representation(names.split(','), versions.split(','))
388
376
  end
389
- @operating_system = nil # Invalid OS format in the configuration file
390
377
  end
391
378
 
392
- Autobuild.progress :operating_system_autodetection, "autodetecting the operating system"
393
379
  names, versions = os_from_os_release
394
380
 
395
381
  if !names
@@ -415,13 +401,7 @@ def self.operating_system(options = Hash.new)
415
401
 
416
402
  names = ensure_derivatives_refer_to_their_parents(names)
417
403
  names, versions = normalize_os_representation(names, versions)
418
-
419
- @operating_system = [names, versions]
420
- config.set('operating_system', @operating_system, true)
421
- Autobuild.progress :operating_system_autodetection, "operating system: #{(names - ['default']).join(",")} - #{(versions - ['default']).join(",")}"
422
- @operating_system
423
- ensure
424
- Autobuild.progress_done :operating_system_autodetection
404
+ return [names, versions]
425
405
  end
426
406
 
427
407
  def self.os_from_os_release(filename = '/etc/os-release')
@@ -495,7 +475,7 @@ def resolve_package(name)
495
475
  path = self.class.resolve_name(name)
496
476
  name = path.last
497
477
 
498
- os_names, os_versions = self.class.operating_system
478
+ os_names, os_versions = operating_system
499
479
  os_names = os_names.dup
500
480
  if prefer_indep_over_os_packages?
501
481
  os_names.unshift 'default'
@@ -712,7 +692,7 @@ def resolve_os_packages(dependencies)
712
692
 
713
693
  if result.empty?
714
694
  if self.class.supported_operating_system?
715
- os_names, os_versions = self.class.operating_system
695
+ os_names, os_versions = operating_system
716
696
  raise MissingOSDep.new, "there is an osdeps definition for #{name}, but not for this operating system and version (resp. #{os_names.join(", ")} and #{os_versions.join(", ")})"
717
697
  end
718
698
  result = [[os_package_manager, FOUND_PACKAGES, [name]]]
@@ -781,9 +761,9 @@ def availability_of(name)
781
761
  end
782
762
 
783
763
  if resolved.empty?
784
- if !self.class.operating_system
764
+ if !operating_system
785
765
  return UNKNOWN_OS
786
- elsif !self.class.supported_operating_system?
766
+ elsif !supported_operating_system?
787
767
  return AVAILABLE
788
768
  else return WRONG_OS
789
769
  end
@@ -30,13 +30,9 @@ def initialize_environment
30
30
 
31
31
  env.inherit 'GEM_PATH'
32
32
  env.init_from_env 'GEM_PATH'
33
- orig_gem_path = (env['GEM_PATH'] || "").split(File::PATH_SEPARATOR).find_all do |p|
34
- !Workspace.in_autoproj_project?(p)
35
- end
36
33
  env.system_env['GEM_PATH'] = Gem.default_path
37
- env.original_env['GEM_PATH'] = orig_gem_path.join(File::PATH_SEPARATOR)
38
34
 
39
- if Workspace.in_autoproj_project?(env['GEM_HOME'])
35
+ if env.original_env['GEM_HOME'].empty?
40
36
  env.unset('GEM_HOME')
41
37
  end
42
38
 
@@ -44,8 +40,7 @@ def initialize_environment
44
40
  env.inherit 'RUBYLIB'
45
41
  original_rubylib =
46
42
  (env['RUBYLIB'] || "").split(File::PATH_SEPARATOR).find_all do |p|
47
- !Workspace.in_autoproj_project?(p)
48
- !p.start_with?(Bundler.rubygems.gem_dir) &&
43
+ !p.start_with?(Bundler.rubygems.gem_dir) &&
49
44
  !Bundler.rubygems.gem_path.any? { |gem_p| p.start_with?(p) }
50
45
  end
51
46
  if system_rubylib = discover_rubylib
@@ -53,15 +48,7 @@ def initialize_environment
53
48
  env.original_env['RUBYLIB'] = (original_rubylib - system_rubylib).join(File::PATH_SEPARATOR)
54
49
  end
55
50
 
56
- dot_autoproj = ws.dot_autoproj_dir
57
- if ws.config.private_bundler?
58
- env.add_path 'GEM_PATH', File.join(dot_autoproj, 'bundler')
59
- end
60
- if ws.config.private_autoproj?
61
- env.add_path 'GEM_PATH', File.join(dot_autoproj, 'autoproj')
62
- end
63
-
64
- ws.manifest.each_reused_autoproj_installation do |p|
51
+ ws.config.each_reused_autoproj_installation do |p|
65
52
  reused_w = ws.new(p)
66
53
  reused_c = reused_w.load_config
67
54
  if reused_c.private_gems?
@@ -70,7 +57,6 @@ def initialize_environment
70
57
  env.add_path 'PATH', File.join(reused_w.prefix_dir, 'gems', 'bin')
71
58
  end
72
59
 
73
-
74
60
  gem_home = File.join(ws.prefix_dir, "gems")
75
61
  if ws.config.private_gems?
76
62
  env.set 'GEM_HOME', gem_home
@@ -86,9 +72,19 @@ def initialize_environment
86
72
  end
87
73
 
88
74
  env.set 'BUNDLE_GEMFILE', File.join(gem_home, 'Gemfile')
75
+ env.add_path 'PATH', Gem.bindir
89
76
  env.add_path 'PATH', File.join(gem_home, 'bin')
90
- env.add_path 'PATH', File.join(ws.dot_autoproj_dir, 'autoproj', 'bin')
91
- Autobuild.programs['bundler'] = File.join(ws.dot_autoproj_dir, 'autoproj', 'bin', 'bundler')
77
+
78
+ dot_autoproj = ws.dot_autoproj_dir
79
+ if ws.config.private_bundler?
80
+ env.add_path 'PATH', File.join(dot_autoproj, 'bundler', 'bin')
81
+ env.add_path 'GEM_PATH', File.join(dot_autoproj, 'bundler')
82
+ end
83
+ env.add_path 'PATH', File.join(dot_autoproj, 'autoproj', 'bin')
84
+ if ws.config.private_autoproj?
85
+ env.add_path 'GEM_PATH', File.join(dot_autoproj, 'autoproj')
86
+ end
87
+ Autobuild.programs['bundler'] = 'bundler'
92
88
 
93
89
  if bundle_rubylib = discover_bundle_rubylib
94
90
  update_env_rubylib(bundle_rubylib, system_rubylib)
@@ -96,7 +92,7 @@ def initialize_environment
96
92
  end
97
93
 
98
94
  def update_env_rubylib(bundle_rubylib, system_rubylib = discover_rubylib)
99
- current = ws.env.resolved_env['RUBYLIB'].split(File::PATH_SEPARATOR) + system_rubylib
95
+ current = (ws.env.resolved_env['RUBYLIB'] || '').split(File::PATH_SEPARATOR) + system_rubylib
100
96
  (bundle_rubylib - current).each do |p|
101
97
  ws.env.add_path('RUBYLIB', p)
102
98
  end
@@ -148,6 +144,11 @@ def install(gems)
148
144
  # Back up the existing gemfile, we'll restore it if something is
149
145
  # wrong to avoid leaving bundler in an inconsistent state
150
146
  backup_files(backups)
147
+ if !File.file?("#{gemfile_path}.orig")
148
+ File.open("#{gemfile_path}.orig", 'w') do |io|
149
+ io.puts "eval_gemfile \"#{File.join(ws.dot_autoproj_dir, 'autoproj', 'Gemfile')}\""
150
+ end
151
+ end
151
152
 
152
153
  # Generate the gemfile and remove the lockfile
153
154
  gems = gems.sort.map do |name|
@@ -161,16 +162,14 @@ def install(gems)
161
162
  end
162
163
  FileUtils.rm File.join(root_dir, 'Gemfile.lock')
163
164
 
164
- if ws.config.private_gems?
165
- options = ['--path', root_dir]
166
- end
167
-
165
+ binstubs_path = File.join(root_dir, 'bin')
168
166
  Bundler.with_clean_env do
169
167
  connections = Set.new
170
168
  Autobuild::Subprocess.run 'autoproj', 'osdeps',
171
169
  Autobuild.tool('bundler'), 'install',
172
170
  "--gemfile=#{gemfile_path}", *options,
173
- "--binstubs", File.join(root_dir, 'bin'),
171
+ "--binstubs", binstubs_path,
172
+ "--shebang", Gem.ruby,
174
173
  env: Hash['BUNDLE_GEMFILE' => gemfile_path] do |line|
175
174
 
176
175
  case line
@@ -196,6 +195,7 @@ def install(gems)
196
195
  backup_restore(backups)
197
196
  raise
198
197
  ensure
198
+ FileUtils.rm_f File.join(binstubs_path, 'bundler')
199
199
  backup_clean(backups)
200
200
  end
201
201
 
@@ -204,8 +204,8 @@ def discover_rubylib
204
204
  result = Bundler.clean_system(
205
205
  Hash['RUBYLIB' => nil],
206
206
  Autobuild.tool('ruby'), '-e', 'puts $LOAD_PATH',
207
- out: io)
208
- #err: '/dev/null')
207
+ out: io,
208
+ err: '/dev/null')
209
209
  if result
210
210
  io.readlines.map { |l| l.chomp }.find_all { |l| !l.empty? }
211
211
  end
@@ -218,8 +218,8 @@ def discover_bundle_rubylib
218
218
  result = Bundler.clean_system(
219
219
  Hash['BUNDLE_GEMFILE' => gemfile],
220
220
  Autobuild.tool('bundler'), 'exec', 'ruby', '-e', 'puts $LOAD_PATH',
221
- out: io)
222
- #err: '/dev/null')
221
+ out: io,
222
+ err: '/dev/null')
223
223
  if result
224
224
  io.readlines.map { |l| l.chomp }.find_all { |l| !l.empty? }
225
225
  end
@@ -38,7 +38,7 @@ def initialize_environment
38
38
  env.system_env['GEM_PATH'] = Gem.default_path
39
39
  env.original_env['GEM_PATH'] = orig_gem_path.join(File::PATH_SEPARATOR)
40
40
 
41
- ws.manifest.each_reused_autoproj_installation do |p|
41
+ ws.config.each_reused_autoproj_installation do |p|
42
42
  p_gems = File.join(p, '.gems')
43
43
  if File.directory?(p_gems)
44
44
  env.push_path 'GEM_PATH', p_gems
@@ -184,7 +184,7 @@ def osdeps_interaction(os_packages, shell_script)
184
184
  # packages. See the option in {#generate_auto_os_script}
185
185
  # @return [Boolean] true if packages got installed, false otherwise
186
186
  def install(packages, options = Hash.new)
187
- handled_os = OSPackageResolver.supported_operating_system?
187
+ handled_os = ws.supported_operating_system?
188
188
  if handled_os
189
189
  shell_script = generate_auto_os_script(packages, options)
190
190
  user_shell_script = generate_user_os_script(packages, options)
@@ -1,3 +1,3 @@
1
1
  module Autoproj
2
- VERSION = "2.0.0.rc5"
2
+ VERSION = "2.0.0.rc6"
3
3
  end
@@ -18,6 +18,7 @@ def initialize(root_dir)
18
18
  @env = Environment.new
19
19
  env.source_before(File.join(dot_autoproj_dir, 'env.sh'))
20
20
  @manifest = Manifest.new
21
+
21
22
  @os_package_installer = OSPackageInstaller.new(self, os_package_resolver)
22
23
  env.prepare(root_dir)
23
24
  super(root_dir)
@@ -173,6 +174,8 @@ def load_config(reconfigure = false)
173
174
  manifest.vcs = VCSDefinition.from_raw(
174
175
  type: 'local', url: config_dir)
175
176
  end
177
+ os_package_resolver.prefer_indep_over_os_packages = config.prefer_indep_over_os_packages?
178
+ OSPackageResolver.operating_system ||= config.get('operating_system', nil)
176
179
  end
177
180
  @config
178
181
  end
@@ -183,8 +186,43 @@ def load_manifest
183
186
  end
184
187
  end
185
188
 
189
+ def autodetect_operating_system(force: false)
190
+ if force || !os_package_resolver.operating_system
191
+ begin
192
+ Autobuild.progress_start :operating_system_autodetection,
193
+ "autodetecting the operating system"
194
+ names, versions = OSPackageResolver.autodetect_operating_system
195
+ OSPackageResolver.operating_system = [names, versions]
196
+ Autobuild.progress :operating_system_autodetection,
197
+ "operating system: #{(names - ['default']).join(",")} - #{(versions - ['default']).join(",")}"
198
+ ensure
199
+ Autobuild.progress_done :operating_system_autodetection
200
+ end
201
+ config.set('operating_system', os_package_resolver.operating_system, true)
202
+ end
203
+ end
204
+
205
+ def operating_system
206
+ os_package_resolver.operating_system
207
+ end
208
+
209
+ def supported_operating_system?
210
+ os_package_resolver.supported_operating_system?
211
+ end
212
+
213
+ def setup_os_package_installer
214
+ autodetect_operating_system
215
+ os_package_installer.each_manager do |pkg_mng|
216
+ pkg_mng.initialize_environment
217
+ end
218
+ os_package_resolver.load_default
219
+ os_package_installer.define_osdeps_mode_option
220
+ os_package_installer.osdeps_mode
221
+ end
222
+
186
223
  def setup
187
224
  load_config
225
+ autodetect_operating_system
188
226
  config.validate_ruby_executable
189
227
  config.apply_autobuild_configuration
190
228
  load_autoprojrc
@@ -206,14 +244,7 @@ def setup
206
244
  Autobuild::Importer.default_cache_dirs = cache_dir
207
245
  end
208
246
  env.prepare(root_dir)
209
- os_package_installer.each_manager do |pkg_mng|
210
- pkg_mng.initialize_environment
211
- end
212
-
213
- os_package_resolver.load_default
214
- os_package_installer.define_osdeps_mode_option
215
- os_package_installer.osdeps_mode
216
-
247
+ setup_os_package_installer
217
248
  install_ruby_shims
218
249
  end
219
250
 
@@ -333,6 +364,10 @@ def load_osdeps_from_package_sets
333
364
  end
334
365
 
335
366
  def load_package_sets(options = Hash.new)
367
+ if !File.file?(manifest_file_path) # empty install, just return
368
+ return
369
+ end
370
+
336
371
  options = validate_options options,
337
372
  only_local: false,
338
373
  checkout_only: true,
@@ -525,7 +560,9 @@ def finalize_package_setup
525
560
  end
526
561
 
527
562
  manifest.each_package_set do |source|
528
- load_if_present(source, source.local_dir, "overrides.rb")
563
+ if source.local_dir
564
+ load_if_present(source, source.local_dir, "overrides.rb")
565
+ end
529
566
  end
530
567
 
531
568
  Dir.glob(File.join( overrides_dir, "*.rb" ) ).sort.each do |file|