autoproj 2.0.0.rc9 → 2.0.0.rc10

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.
@@ -91,14 +91,14 @@ def initialize(manifest, options = Hash.new)
91
91
 
92
92
  def snapshot_package_sets(target_dir = nil, options = Hash.new)
93
93
  options = Kernel.validate_options options,
94
- local: true
94
+ only_local: true
95
95
 
96
96
  result = Array.new
97
97
  manifest.each_package_set do |pkg_set|
98
98
  next if pkg_set.local?
99
99
 
100
100
  vcs_info =
101
- begin pkg_set.snapshot(target_dir, local: options[:local])
101
+ begin pkg_set.snapshot(target_dir, only_local: options[:only_local])
102
102
  rescue Exception => e
103
103
  error_or_warn(pkg_set, e)
104
104
  next
@@ -130,7 +130,7 @@ def error_or_warn(package, error)
130
130
 
131
131
  def snapshot_packages(packages, target_dir = nil, options = Hash.new)
132
132
  options = Kernel.validate_options options,
133
- local: true
133
+ only_local: true
134
134
 
135
135
  result = Array.new
136
136
  packages.each do |package_name|
@@ -148,7 +148,7 @@ def snapshot_packages(packages, target_dir = nil, options = Hash.new)
148
148
  end
149
149
 
150
150
  vcs_info =
151
- begin importer.snapshot(package.autobuild, target_dir, local: options[:local])
151
+ begin importer.snapshot(package.autobuild, target_dir, only_local: options[:only_local])
152
152
  rescue Exception => e
153
153
  error_or_warn(package, e)
154
154
  next
@@ -29,21 +29,34 @@ def self.with_prerelease(*value)
29
29
  def initialize_environment
30
30
  env = ws.env
31
31
 
32
- env.inherit 'GEM_PATH'
33
- env.init_from_env 'GEM_PATH'
34
- env.system_env['GEM_PATH'] = Gem.default_path
32
+ config = ws.config
35
33
 
36
- if (env.original_env['GEM_HOME'] || '').empty?
37
- env.unset('GEM_HOME')
34
+ env.add_path 'PATH', File.join(Gem.user_dir, 'bin')
35
+ env.add_path 'PATH', File.join(ws.prefix_dir, 'gems', 'bin')
36
+ env.add_path 'PATH', File.join(config.bundler_gem_home, 'bin')
37
+ env.add_path 'PATH', File.join(ws.dot_autoproj_dir, 'autoproj', 'bin')
38
+ env.set 'GEM_HOME', config.gems_gem_home
39
+
40
+ if !config.private_bundler? || !config.private_autoproj? || !config.private_gems?
41
+ env.set('GEM_PATH', *Gem.default_path)
42
+ end
43
+ if config.private_bundler?
44
+ Autobuild.programs['bundler'] = File.join(config.bundler_gem_home, 'bin', 'bundler')
45
+ env.add_path 'GEM_PATH', config.bundler_gem_home
46
+ else
47
+ Autobuild.programs['bundler'] = env.find_in_path('bundler')
38
48
  end
39
49
 
40
50
  env.init_from_env 'RUBYLIB'
41
51
  env.inherit 'RUBYLIB'
52
+ # Sanitize the rubylib we get from the environment by removing
53
+ # anything that comes from Gem or Bundler
42
54
  original_rubylib =
43
55
  (env['RUBYLIB'] || "").split(File::PATH_SEPARATOR).find_all do |p|
44
56
  !p.start_with?(Bundler.rubygems.gem_dir) &&
45
57
  !Bundler.rubygems.gem_path.any? { |gem_p| p.start_with?(p) }
46
58
  end
59
+ # And discover the system's rubylib
47
60
  if system_rubylib = discover_rubylib
48
61
  env.system_env['RUBYLIB'] = []
49
62
  env.original_env['RUBYLIB'] = (original_rubylib - system_rubylib).join(File::PATH_SEPARATOR)
@@ -52,42 +65,19 @@ def initialize_environment
52
65
  ws.config.each_reused_autoproj_installation do |p|
53
66
  reused_w = ws.new(p)
54
67
  reused_c = reused_w.load_config
55
- if reused_c.private_gems?
56
- env.add_path 'GEM_PATH', File.join(reused_w.prefix_dir, 'gems')
57
- end
58
68
  env.add_path 'PATH', File.join(reused_w.prefix_dir, 'gems', 'bin')
59
69
  end
60
70
 
61
- gem_home = File.join(ws.prefix_dir, "gems")
62
- if ws.config.private_gems?
63
- env.set 'GEM_HOME', gem_home
64
- env.add_path 'GEM_PATH', gem_home
65
- end
66
-
67
- FileUtils.mkdir_p gem_home
68
- gemfile = File.join(gem_home, 'Gemfile')
71
+ prefix_gems = File.join(ws.prefix_dir, "gems")
72
+ FileUtils.mkdir_p prefix_gems
73
+ gemfile = File.join(prefix_gems, 'Gemfile')
69
74
  if !File.exists?(gemfile)
70
75
  File.open(gemfile, 'w') do |io|
71
76
  io.puts "eval_gemfile \"#{File.join(ws.dot_autoproj_dir, 'autoproj', 'Gemfile')}\""
72
77
  end
73
78
  end
74
79
 
75
- env.set 'BUNDLE_GEMFILE', File.join(gem_home, 'Gemfile')
76
- env.add_path 'PATH', Gem.bindir
77
- env.add_path 'PATH', File.join(gem_home, 'bin')
78
-
79
- dot_autoproj = ws.dot_autoproj_dir
80
- if ws.config.private_bundler?
81
- env.add_path 'PATH', File.join(dot_autoproj, 'bundler', 'bin')
82
- env.add_path 'GEM_PATH', File.join(dot_autoproj, 'bundler')
83
- end
84
- env.add_path 'PATH', File.join(dot_autoproj, 'autoproj', 'bin')
85
- if ws.config.private_autoproj?
86
- env.add_path 'GEM_PATH', File.join(dot_autoproj, 'autoproj')
87
- end
88
- Autobuild.programs['bundler'] = 'bundler'
89
-
90
- if bundle_rubylib = discover_bundle_rubylib
80
+ if bundle_rubylib = discover_bundle_rubylib(silent_errors: true)
91
81
  update_env_rubylib(bundle_rubylib, system_rubylib)
92
82
  end
93
83
  end
@@ -133,6 +123,37 @@ def backup_clean(mapping)
133
123
  end
134
124
  end
135
125
 
126
+ def self.run_bundler_install(ws, gemfile, *options, update: true, binstubs: nil)
127
+ if update && File.file?("#{gemfile}.lock")
128
+ FileUtils.rm "#{gemfile}.lock"
129
+ end
130
+
131
+ options << "--shebang" << Gem.ruby
132
+ if binstubs
133
+ options << "--binstubs" << binstubs
134
+ end
135
+
136
+ Bundler.with_clean_env do
137
+ connections = Set.new
138
+ ws.run 'autoproj', 'osdeps',
139
+ Autobuild.tool('bundler'), 'install',
140
+ *options,
141
+ working_directory: File.dirname(gemfile), env: Hash['BUNDLE_GEMFILE' => nil, 'RUBYOPT' => nil] do |line|
142
+
143
+ case line
144
+ when /Installing (.*)/
145
+ Autobuild.message " bundler: installing #{$1}"
146
+ when /Fetching.*from (.*)/
147
+ host = $1.gsub(/\.+$/, '')
148
+ if !connections.include?(host)
149
+ Autobuild.message " bundler: connected to #{host}"
150
+ connections << host
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
156
+
136
157
  def install(gems)
137
158
  root_dir = File.join(ws.prefix_dir, 'gems')
138
159
  gemfile_path = File.join(root_dir, 'Gemfile')
@@ -151,6 +172,17 @@ def install(gems)
151
172
  end
152
173
  end
153
174
 
175
+ gemfiles = []
176
+ ws.manifest.each_package_set do |source|
177
+ if source.local_dir && File.file?(pkg_set_gemfile = File.join(source.local_dir, 'Gemfile'))
178
+ gemfiles << pkg_set_gemfile
179
+ end
180
+ end
181
+ # In addition, look into overrides.d
182
+ Dir.glob(File.join(ws.config_dir, "*.gemfile")) do |gemfile_path|
183
+ gemfiles << gemfile_path
184
+ end
185
+
154
186
  # Generate the gemfile and remove the lockfile
155
187
  gems = gems.sort.map do |name|
156
188
  name, version = parse_package_entry(name)
@@ -159,40 +191,30 @@ def install(gems)
159
191
  FileUtils.mkdir_p root_dir
160
192
  File.open(gemfile_path, 'w') do |io|
161
193
  io.puts "eval_gemfile \"#{File.join(ws.dot_autoproj_dir, 'autoproj', 'Gemfile')}\""
194
+ gemfiles.each do |gemfile|
195
+ io.puts File.read(gemfile)
196
+ end
162
197
  io.puts gems
163
198
  end
164
- FileUtils.rm File.join(root_dir, 'Gemfile.lock')
165
199
 
166
- binstubs_path = File.join(root_dir, 'bin')
167
- Bundler.with_clean_env do
168
- connections = Set.new
169
- Autobuild::Subprocess.run 'autoproj', 'osdeps',
170
- Autobuild.tool('bundler'), 'install',
171
- "--gemfile=#{gemfile_path}", *options,
172
- "--binstubs", binstubs_path,
173
- "--shebang", Gem.ruby,
174
- env: Hash['BUNDLE_GEMFILE' => gemfile_path] do |line|
175
-
176
- case line
177
- when /Installing (.*)/
178
- Autobuild.message " bundler: installing #{$1}"
179
- when /Fetching.*from (.*)/
180
- host = $1.gsub(/\.+$/, '')
181
- if !connections.include?(host)
182
- Autobuild.message " bundler: connected to #{host}"
183
- connections << host
184
- end
185
- end
186
- end
200
+ options = Array.new
201
+ if ws.config.private_gems?
202
+ options << "--path" << ws.config.gems_gem_home
187
203
  end
188
204
 
205
+ binstubs_path = File.join(root_dir, 'bin')
206
+ self.class.run_bundler_install ws, gemfile_path, *options,
207
+ binstubs: binstubs_path
208
+
189
209
  if bundle_rubylib = discover_bundle_rubylib
190
210
  update_env_rubylib(bundle_rubylib)
191
211
  else
192
- raise NotCleanState, "bundler executed successfully, but the result is not in a clean state"
212
+ raise NotCleanState, "bundler executed successfully, but the result was not in a clean state"
193
213
  end
194
214
 
195
215
  rescue Exception => e
216
+ Autoproj.warn "saved the new Gemfile in #{gemfile_path}.FAILED and restored the last Gemfile version"
217
+ FileUtils.cp gemfile_path, "#{gemfile_path}.FAILED"
196
218
  backup_restore(backups)
197
219
  raise
198
220
  ensure
@@ -214,15 +236,19 @@ def discover_rubylib
214
236
  end
215
237
  end
216
238
 
217
- def discover_bundle_rubylib
239
+ def discover_bundle_rubylib(silent_errors: false)
218
240
  require 'bundler'
219
241
  gemfile = File.join(ws.prefix_dir, 'gems', 'Gemfile')
242
+ silent_redirect = Hash.new
243
+ if silent_errors
244
+ silent_redirect[:err] = '/dev/null'
245
+ end
220
246
  Tempfile.open 'autoproj-rubylib' do |io|
221
247
  result = Bundler.clean_system(
222
248
  Hash['BUNDLE_GEMFILE' => gemfile],
223
249
  Autobuild.tool('bundler'), 'exec', 'ruby', '-e', 'puts $LOAD_PATH',
224
- out: io,
225
- err: '/dev/null')
250
+ out: io, **silent_redirect)
251
+
226
252
  if result
227
253
  io.readlines.map { |l| l.chomp }.find_all { |l| !l.empty? }
228
254
  end
@@ -1,3 +1,3 @@
1
1
  module Autoproj
2
- VERSION = "2.0.0.rc9"
2
+ VERSION = "2.0.0.rc10"
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require 'autoproj/ops/import'
2
+ require 'autoproj/ops/install'
2
3
 
3
4
  module Autoproj
4
5
  class Workspace < Ops::Loader
@@ -277,11 +278,7 @@ def install_ruby_shims
277
278
  end
278
279
  end
279
280
 
280
- def update_autoproj(options = Hash.new)
281
- options = validate_options options,
282
- force: false, restart_on_update: true
283
- return if !options[:force]
284
-
281
+ def update_autoproj(restart_on_update: true)
285
282
  config.validate_ruby_executable
286
283
 
287
284
  # This is a guard to avoid infinite recursion in case the user is
@@ -290,19 +287,29 @@ def update_autoproj(options = Hash.new)
290
287
  return
291
288
  end
292
289
 
293
- did_update =
294
- begin
295
- saved_flag = PackageManagers::GemManager.with_prerelease
296
- PackageManagers::GemManager.with_prerelease = config.use_prerelease?
297
- install_os_packages(%w{autobuild autoproj})
298
- ensure
299
- PackageManagers::GemManager.with_prerelease = saved_flag
300
- end
290
+ gemfile = File.join(dot_autoproj_dir, 'autoproj', 'Gemfile')
291
+ binstubs = File.join(dot_autoproj_dir, 'autoproj', 'bin')
292
+ begin
293
+ PackageManagers::BundlerManager.run_bundler_install(
294
+ self, gemfile, binstubs: binstubs)
295
+ ensure
296
+ Ops::Install.clean_binstubs(binstubs)
297
+ end
298
+
299
+ # Find out what version of autoproj bundler locked on
300
+ autoproj = File.readlines("#{gemfile}.lock").
301
+ find_all { |l| l =~ /^\s+autoproj \(.*\)$/ }
302
+ if autoproj.size == 1
303
+ autoproj[0] =~ /^\s+autoproj \((.*)\)$/
304
+ installed_version = $1
305
+ else
306
+ raise "unexpected format for #{gemfile}.lock, cannot determine installed version of autoproj"
307
+ end
301
308
 
302
309
  # First things first, see if we need to update ourselves
303
- if did_update && options[:restart_on_update]
310
+ if (VERSION != installed_version) && restart_on_update
304
311
  puts
305
- Autoproj.message 'autoproj and/or autobuild has been updated, restarting autoproj'
312
+ Autoproj.message "autoproj has been updated to #{installed_version} (from #{VERSION}), restarting"
306
313
  puts
307
314
 
308
315
  # We updated autobuild or autoproj themselves ... Restart !
@@ -315,6 +322,19 @@ def update_autoproj(options = Hash.new)
315
322
  end
316
323
  end
317
324
 
325
+ def run(*args, &block)
326
+ if args.last.kind_of?(Hash)
327
+ options = args.pop
328
+ else options = Hash.new
329
+ end
330
+ options_env = options.fetch(:env, Hash.new)
331
+ options[:env] = env.resolved_env.merge(options_env)
332
+ if options_env['BUNDLE_GEMFILE']
333
+ raise
334
+ end
335
+ Autobuild::Subprocess.run(*args, options, &block)
336
+ end
337
+
318
338
  def set_as_main_workspace
319
339
  Autoproj.workspace = self
320
340
  Autoproj.root_dir = root_dir
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: autoproj
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.rc9
4
+ version: 2.0.0.rc10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Joyeux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-11 00:00:00.000000000 Z
11
+ date: 2015-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: autobuild