autoproj 2.0.0.rc3 → 2.0.0.rc4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +9 -29
  3. data/bin/autoproj_bootstrap +159 -3150
  4. data/bin/autoproj_bootstrap.in +4 -256
  5. data/bin/autoproj_install +225 -0
  6. data/bin/autoproj_install.in +14 -0
  7. data/lib/autoproj.rb +2 -1
  8. data/lib/autoproj/autobuild.rb +2 -2
  9. data/lib/autoproj/cli/bootstrap.rb +0 -39
  10. data/lib/autoproj/cli/build.rb +0 -3
  11. data/lib/autoproj/cli/main.rb +13 -1
  12. data/lib/autoproj/cli/osdeps.rb +1 -1
  13. data/lib/autoproj/cli/show.rb +1 -1
  14. data/lib/autoproj/cli/update.rb +4 -4
  15. data/lib/autoproj/cli/upgrade.rb +71 -0
  16. data/lib/autoproj/configuration.rb +18 -1
  17. data/lib/autoproj/exceptions.rb +7 -0
  18. data/lib/autoproj/installation_manifest.rb +23 -12
  19. data/lib/autoproj/manifest.rb +22 -48
  20. data/lib/autoproj/ops/build.rb +2 -2
  21. data/lib/autoproj/ops/configuration.rb +1 -1
  22. data/lib/autoproj/ops/import.rb +1 -1
  23. data/lib/autoproj/ops/install.rb +211 -0
  24. data/lib/autoproj/ops/main_config_switcher.rb +1 -5
  25. data/lib/autoproj/os_package_installer.rb +348 -0
  26. data/lib/autoproj/{osdeps.rb → os_package_resolver.rb} +56 -392
  27. data/lib/autoproj/package_managers/apt_dpkg_manager.rb +2 -2
  28. data/lib/autoproj/package_managers/bundler_manager.rb +179 -0
  29. data/lib/autoproj/package_managers/emerge_manager.rb +2 -2
  30. data/lib/autoproj/package_managers/gem_manager.rb +7 -6
  31. data/lib/autoproj/package_managers/homebrew_manager.rb +2 -2
  32. data/lib/autoproj/package_managers/manager.rb +5 -6
  33. data/lib/autoproj/package_managers/pacman_manager.rb +2 -2
  34. data/lib/autoproj/package_managers/pip_manager.rb +8 -8
  35. data/lib/autoproj/package_managers/pkg_manager.rb +2 -2
  36. data/lib/autoproj/package_managers/port_manager.rb +2 -2
  37. data/lib/autoproj/package_managers/shell_script_manager.rb +4 -4
  38. data/lib/autoproj/package_managers/unknown_os_manager.rb +2 -2
  39. data/lib/autoproj/package_managers/yum_manager.rb +2 -2
  40. data/lib/autoproj/package_managers/zypper_manager.rb +2 -2
  41. data/lib/autoproj/package_set.rb +10 -10
  42. data/lib/autoproj/reporter.rb +3 -2
  43. data/lib/autoproj/system.rb +1 -4
  44. data/lib/autoproj/version.rb +1 -1
  45. data/lib/autoproj/workspace.rb +155 -32
  46. metadata +9 -3
@@ -5,260 +5,8 @@ if RUBY_VERSION < "1.9.2"
5
5
  exit 1
6
6
  end
7
7
 
8
- require 'rbconfig'
9
- module Autobuild
10
- @windows = RbConfig::CONFIG["host_os"] =~ %r!(msdos|mswin|djgpp|mingw|[Ww]indows)!
11
- def self.windows?
12
- @windows
13
- end
14
-
15
- @macos = RbConfig::CONFIG["host_os"] =~ %r!([Dd]arwin)!
16
- def self.macos?
17
- @macos
18
- end
19
- end
20
-
21
- require 'yaml'
22
- require 'set'
23
-
24
- module Autoproj
25
- class ConfigError < RuntimeError; end
26
- class << self
27
- attr_reader :verbose
28
- end
29
-
30
- def self.color(string, *args)
31
- string
32
- end
33
-
34
- def self.warn(str, *args)
35
- STDERR.puts "WARN #{str}"
36
- end
37
- def self.message(str)
38
- STDERR.puts " #{str}"
39
- end
40
- end
41
-
42
- module Autobuild
43
- class Exception < RuntimeError; end
44
-
45
- def self.do_update
46
- true
47
- end
48
- def self.message(str)
49
- STDERR.puts " #{str}"
50
- end
51
- def self.progress(key, str)
52
- STDERR.puts " #{str}"
53
- end
54
- def self.progress_done(key)
55
- end
56
- def self.message(str)
57
- STDERR.puts " #{str}"
58
- end
59
-
60
- class << self
61
- attr_reader :programs
62
- end
63
- @programs = Hash.new
64
- def self.tool(name)
65
- # Let the ability to set programs[name] to nil to make sure we don't use
66
- # that program. This is used later on in this file to make sure we
67
- # aren't using the wrong rubygems binary
68
- if programs.has_key?(name)
69
- programs[name]
70
- else
71
- name
72
- end
73
- end
74
-
75
- module Subprocess
76
- def self.run(name, phase, *cmd)
77
- if cmd.last.kind_of?(Hash)
78
- options = cmd.pop
79
- (options[:env] || Hash.new).each do |k, v|
80
- ENV[k] = v
81
- end
82
- end
83
-
84
- output = `#{cmd.join(" ")}`
85
- if $?.exitstatus != 0
86
- STDERR.puts "ERROR: failed to run #{cmd.join(" ")}"
87
- STDERR.puts "ERROR: command output is: #{output}"
88
- exit 1
89
- end
90
- end
91
- end
92
- end
93
-
94
- BUILD_OPTION_CODE
95
- CONFIG_CODE
96
- module Autoproj
97
- def self.config
98
- @config ||= Configuration.new
99
- end
100
- end
101
-
102
- OSDEPS_CODE
103
- TOOLS_CODE
104
- SYSTEM_CODE
105
-
106
- DEFS = <<EODEFS
107
- OSDEPS_DEFAULTS
108
- EODEFS
109
-
110
- # Override Autoproj.root_dir
111
- module Autoproj
112
- def self.root_dir
113
- @root_dir
114
- end
115
- @root_dir = Dir.pwd
116
- end
117
-
118
- if File.directory?(File.join(Autoproj.root_dir, 'autoproj'))
119
- STDERR.puts "there is already an autoproj/ directory here, cannot bootstrap"
120
- STDERR.puts "Either delete it and attempt bootstrapping again, or source env.sh"
121
- STDERR.puts "and use the usual autoproj workflow"
122
- exit 1
123
- end
124
-
125
- if defined? Encoding # This is a 1.9-only thing
126
- Encoding.default_internal = Encoding::UTF_8
127
- Encoding.default_external = Encoding::UTF_8
128
- end
129
-
130
- if ENV['AUTOPROJ_CURRENT_ROOT'] && ENV['AUTOPROJ_CURRENT_ROOT'] != Dir.pwd
131
- STDERR.puts "the env.sh from #{ENV['AUTOPROJ_CURRENT_ROOT']} seem to already be sourced"
132
- STDERR.puts "start a new shell and try to bootstrap again"
133
- exit 1
134
- end
135
-
136
- require 'set'
137
- curdir_entries = Dir.entries('.').to_set - [".", "..", "autoproj_bootstrap", ".gems", 'env.sh'].to_set
138
- if !curdir_entries.empty? && ENV['AUTOPROJ_BOOTSTRAP_IGNORE_NONEMPTY_DIR'] != '1'
139
- while true
140
- print "The current directory is not empty, continue bootstrapping anyway ? [yes] "
141
- STDOUT.flush
142
- answer = STDIN.readline.chomp
143
- if answer == "no"
144
- exit
145
- elsif answer == "" || answer == "yes"
146
- # Set the environment variable since we might restart the
147
- # autoproj_bootstrap script and -- anyway -- will run "autoproj
148
- # bootstrap" later on
149
- break
150
- else
151
- STDOUT.puts "invalid answer. Please answer 'yes' or 'no'"
152
- STDOUT.flush
153
- end
154
- end
155
- end
156
-
157
- # While in here, we don't have utilrb
158
- module Kernel
159
- def filter_options(options, defaults)
160
- options = options.dup
161
- filtered = Hash.new
162
- defaults.each do |k, v|
163
- filtered[k] =
164
- if options.has_key?(k) then options.delete(k)
165
- else v
166
- end
167
- end
168
- return filtered, options
169
- end
170
- def validate_options(options, defaults)
171
- defaults.merge(options)
172
- end
173
- end
174
-
175
- # Environment is clean, so just mark it as so unconditionally
176
- ENV['AUTOPROJ_BOOTSTRAP_IGNORE_NONEMPTY_DIR'] = '1'
177
-
178
- gem_home = ENV['AUTOPROJ_GEM_HOME'] || File.join(Dir.pwd, '.gems')
179
- gem_path = ([gem_home] + Gem.default_path).join(":")
180
- Gem.paths = Hash['GEM_HOME' => gem_home, 'GEM_PATH' => gem_path]
181
-
182
- ENV['GEM_HOME'] = gem_home
183
- ENV['GEM_PATH'] = gem_path
184
- ENV['PATH'] = "#{ENV['GEM_HOME']}/bin:#{ENV['PATH']}"
185
-
186
- Autoproj::OSDependencies.define_osdeps_mode_option
187
- osdeps_mode = Autoproj::OSDependencies.osdeps_mode.join(",")
188
- ENV['AUTOPROJ_OSDEPS_MODE'] = osdeps_mode
189
-
190
- # First thing we do is install a proper ruby environment. We make sure that we
191
- # aren't installing any gems for now (as we need to choose the right gem
192
- # binary) by setting Autobuild.programs['gem'] to nil
193
- Autobuild.programs['gem'] = nil
194
- Autoproj::OSDependencies.autodetect_ruby
195
- Autoproj::OSDependencies.autodetect_ruby_program
196
-
197
- osdeps_management =
198
- if ENV['AUTOPROJ_DEFAULT_OSDEPS']
199
- Autoproj::OSDependencies.load(ENV['AUTOPROJ_DEFAULT_OSDEPS'])
200
- else
201
- Autoproj::OSDependencies.new(YAML.load(DEFS))
202
- end
203
- osdeps_management.silent = false
204
- Autoproj::PackageManagers::GemManager.gem_home = gem_home
205
- Autoproj::PackageManagers::GemManager.use_cache_dir
206
-
207
- begin
208
- STDERR.puts "autoproj: installing a proper Ruby environment (this can take a long time)"
209
- osdeps_management.install(['ruby'])
210
- rescue Autoproj::ConfigError => e
211
- STDERR.puts "failed: #{e.message}"
212
- exit(1)
213
- end
214
-
215
- # Now try to find out the name of the gem binary
216
- PACKAGES = ['build-essential', 'sudo']
217
-
218
- STDERR.puts "autoproj: installing autoproj and its dependencies (this can take a long time)"
219
- # First install the dependencies of autoproj, as we don't want them to be
220
- # affected by the prerelease flag
221
- begin
222
- if !PACKAGES.empty?
223
- osdeps_management.install(PACKAGES)
224
- end
225
- rescue Autoproj::ConfigError => e
226
- STDERR.puts "failed: #{e.message}"
227
- exit(1)
228
- end
229
-
230
- File.open('env.sh', 'w') do |io|
231
- io.write <<-EOSHELL
232
- export RUBYOPT=-rubygems
233
- export GEM_PATH=#{gem_path}
234
- export GEM_HOME=#{gem_home}
235
- export PATH=$GEM_HOME/bin:$PATH
236
- EOSHELL
237
- end
238
-
239
- # If the user specifies "dev" on the command line, install the prerelease
240
- # version of autoproj. If it is "localdev", expect him to install autoproj and
241
- # run autoproj bootstrap manually.
242
- if ARGV.first != "localdev"
243
- if ARGV.first == "dev"
244
- ENV['AUTOPROJ_USE_PRERELEASE'] = '1'
245
- ARGV.shift
246
- end
247
-
248
- Autoproj::PackageManagers::GemManager.with_prerelease =
249
- (ENV['AUTOPROJ_USE_PRERELEASE'] == '1')
250
- begin
251
- osdeps_management.install(['autobuild'])
252
- osdeps_management.install(['autoproj'])
253
- rescue Autoproj::ConfigError => e
254
- STDERR.puts "failed: #{e.message}"
255
- exit(1)
256
- end
257
- Autoproj::PackageManagers::GemManager.with_prerelease = false
258
-
259
- if !system('autoproj', 'bootstrap', *ARGV)
260
- STDERR.puts "ERROR: failed to run autoproj bootstrap #{ARGV.join(", ")}"
261
- exit 1
262
- end
263
- end
8
+ AUTOPROJ_OPS_INSTALL
264
9
 
10
+ ops = Autoproj::Ops::Install.new(Dir.pwd)
11
+ ops.parse_options(ARGV)
12
+ ops.run
@@ -0,0 +1,225 @@
1
+ #! /usr/bin/ruby
2
+
3
+ if RUBY_VERSION < "1.9.2"
4
+ STDERR.puts "autoproj requires Ruby >= 1.9.2"
5
+ exit 1
6
+ end
7
+
8
+ require 'optparse'
9
+ require 'fileutils'
10
+ require 'yaml'
11
+
12
+ module Autoproj
13
+ module Ops
14
+ # This class contains the functionality necessary to install autoproj in a
15
+ # clean root
16
+ #
17
+ # It can be required standalone (i.e. does not depend on anything else than
18
+ # ruby and the ruby standard library)
19
+ class Install
20
+ # The directory in which to install autoproj
21
+ attr_reader :root_dir
22
+ # Content of the Gemfile generated to install autoproj itself
23
+ attr_accessor :gemfile
24
+
25
+ def initialize(root_dir)
26
+ @root_dir = root_dir
27
+ @gemfile = default_gemfile_contents
28
+ @private_bundler = false
29
+ @private_autoproj = false
30
+ @private_gems = false
31
+ end
32
+
33
+ def dot_autoproj; File.join(root_dir, '.autoproj') end
34
+ def bin_dir; File.join(dot_autoproj, 'bin') end
35
+ def bundler_install_dir; File.join(dot_autoproj, 'bundler') end
36
+ def autoproj_install_dir; File.join(dot_autoproj, 'autoproj') end
37
+ # The path to the gemfile used to install autoproj
38
+ def autoproj_gemfile_path; File.join(autoproj_install_dir, 'Gemfile') end
39
+ def autoproj_config_path; File.join(dot_autoproj, 'config.yml') end
40
+
41
+ # Whether bundler should be installed locally in {#dot_autoproj}
42
+ def private_bundler?; @private_bundler end
43
+ # Whether autoproj should be installed locally in {#dot_autoproj}
44
+ def private_autoproj?; @private_autoproj end
45
+ # Whether bundler should be installed locally in the workspace
46
+ # prefix directory
47
+ def private_gems?; @private_gems end
48
+
49
+ def guess_gem_program
50
+ ruby_bin = RbConfig::CONFIG['RUBY_INSTALL_NAME']
51
+ ruby_bindir = RbConfig::CONFIG['bindir']
52
+
53
+ candidates = ['gem']
54
+ if ruby_bin =~ /^ruby(.+)$/
55
+ candidates << "gem#{$1}"
56
+ end
57
+
58
+ candidates.each do |gem_name|
59
+ if File.file?(gem_full_path = File.join(ruby_bindir, gem_name))
60
+ return gem_full_path
61
+ end
62
+ end
63
+ raise ArgumentError, "cannot find a gem program (tried #{candidates.sort.join(", ")} in #{ruby_bindir})"
64
+ end
65
+
66
+ # The content of the default {#gemfile}
67
+ #
68
+ # @param [String] autoproj_version a constraint on the autoproj version
69
+ # that should be used
70
+ # @return [String]
71
+ def default_gemfile_contents(autoproj_version = ">= 0")
72
+ ["source \"https://rubygems.org\"",
73
+ "gem \"autoproj\", \"#{autoproj_version}\""].join("\n")
74
+ end
75
+
76
+ # Parse the provided command line options and returns the non-options
77
+ def parse_options(args = ARGV)
78
+ options = OptionParser.new do |opt|
79
+ opt.on '--private-bundler', 'install bundler locally in the workspace' do
80
+ @private_bundler = true
81
+ end
82
+ opt.on '--private-autoproj', 'install autoproj locally in the workspace' do
83
+ @private_autoproj = true
84
+ end
85
+ opt.on '--private-gems', 'install gems locally in the prefix directory' do
86
+ @private_gems = true
87
+ end
88
+ opt.on '--private', 'whether bundler, autoproj and the workspace gems should be installed locally in the workspace' do
89
+ @private_bundler = true
90
+ @private_autoproj = true
91
+ @private_gems = true
92
+ end
93
+ opt.on '--version=VERSION_CONSTRAINT', String, 'use the provided string as a version constraint for autoproj' do |version|
94
+ @gemfile = default_gemfile_contents(version)
95
+ end
96
+ opt.on '--gemfile=PATH', String, 'use the given Gemfile to install autoproj instead of the default' do |path|
97
+ @gemfile = File.read(path)
98
+ end
99
+ end
100
+ options.parse(ARGV)
101
+ end
102
+
103
+ def install_bundler
104
+ gem_program = guess_gem_program
105
+ puts "Detected 'gem' to be #{gem_program}"
106
+
107
+ result = system(
108
+ Hash['GEM_PATH' => nil,
109
+ 'GEM_HOME' => bundler_install_dir],
110
+ gem_program, 'install', '--no-document', '--no-user-install', '--no-format-executable',
111
+ "--bindir=#{File.join(bundler_install_dir, 'bin')}", 'bundler')
112
+
113
+ if !result
114
+ STDERR.puts "FATAL: failed to install bundler in #{dot_autoproj}"
115
+ exit 1
116
+ end
117
+ File.join(bin_dir, 'bundler')
118
+ end
119
+
120
+ def save_env_sh
121
+ env = Autobuild::Environment.new
122
+ path = []
123
+ if private_bundler?
124
+ env.push_path 'PATH', File.join(bundler_install_dir, 'bin')
125
+ env.push_path 'GEM_PATH', bundler_install_dir
126
+ end
127
+ env.push_path 'PATH', File.join(autoproj_install_dir, 'bin')
128
+ env.inherit 'PATH'
129
+ if private_autoproj?
130
+ env.push_path 'GEM_PATH', autoproj_install_dir
131
+ end
132
+
133
+ # Generate environment files right now, we can at least use bundler
134
+ File.open(File.join(dot_autoproj, 'env.sh'), 'w') do |io|
135
+ env.export_env_sh(io)
136
+ end
137
+
138
+ File.open(File.join(root_dir, 'env.sh'), 'w') do |io|
139
+ io.write <<-EOSHELL
140
+ source "#{File.join(dot_autoproj, 'env.sh')}"
141
+ export AUTOPROJ_CURRENT_ROOT=#{root_dir}
142
+ EOSHELL
143
+ end
144
+ end
145
+
146
+ def save_gemfile
147
+ FileUtils.mkdir_p File.dirname(autoproj_gemfile_path)
148
+ File.open(autoproj_gemfile_path, 'w') do |io|
149
+ io.write gemfile
150
+ end
151
+ end
152
+
153
+ def install_autoproj(bundler)
154
+ # Force bundler to update. If the user does not want this, let him specify a
155
+ # Gemfile with tighter version constraints
156
+ lockfile = File.join(File.dirname(autoproj_gemfile_path), 'Gemfile.lock')
157
+ if File.exist?(lockfile)
158
+ FileUtils.rm lockfile
159
+ end
160
+
161
+ env = Hash['BUNDLE_GEMFILE' => nil, 'RUBYLIB' => nil]
162
+ opts = Array.new
163
+
164
+ if private_autoproj?
165
+ env = Hash['GEM_PATH' => bundler_install_dir,
166
+ 'GEM_HOME' => nil]
167
+ opts << "--clean" << "--path=#{autoproj_install_dir}"
168
+ end
169
+
170
+ result = system(env,
171
+ bundler, 'install',
172
+ "--gemfile=#{autoproj_gemfile_path}",
173
+ "--binstubs=#{File.join(autoproj_install_dir, 'bin')}",
174
+ *opts)
175
+ if !result
176
+ STDERR.puts "FATAL: failed to install autoproj in #{dot_autoproj}"
177
+ exit 1
178
+ end
179
+ end
180
+
181
+ def update_configuration
182
+ if File.exist?(autoproj_config_path)
183
+ config = YAML.load(File.read(autoproj_config_path)) || Hash.new
184
+ else
185
+ config = Hash.new
186
+ end
187
+ config['private_bundler'] = private_bundler?
188
+ config['private_autoproj'] = private_autoproj?
189
+ config['private_gems'] = private_gems?
190
+ File.open(autoproj_config_path, 'w') do |io|
191
+ YAML.dump(config, io)
192
+ end
193
+ end
194
+
195
+ def install
196
+ if private_bundler?
197
+ puts "Installing bundler in #{bundler_install_dir}"
198
+ bundler = install_bundler
199
+ end
200
+ save_gemfile
201
+ puts "Installing autoproj in #{dot_autoproj}"
202
+ install_autoproj(bundler || 'bundler')
203
+ end
204
+
205
+ # Actually perform the install
206
+ def run
207
+ install
208
+ ENV['BUNDLE_GEMFILE'] = autoproj_gemfile_path
209
+ require 'bundler'
210
+ Bundler.setup
211
+ require 'autobuild'
212
+ save_env_sh
213
+ update_configuration
214
+ end
215
+ end
216
+ end
217
+ end
218
+
219
+
220
+
221
+ ENV.delete('BUNDLE_GEMFILE')
222
+ ENV.delete('RUBYLIB')
223
+ ops = Autoproj::Ops::Install.new(Dir.pwd)
224
+ ops.parse_options(ARGV)
225
+ ops.run