autoproj 2.0.0.rc4 → 2.0.0.rc5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -0
- data/bin/alocate +1 -1
- data/bin/autoproj +5 -4
- data/bin/autoproj_bootstrap +205 -26
- data/bin/autoproj_bootstrap.in +7 -1
- data/bin/autoproj_install +198 -25
- data/lib/autoproj.rb +1 -0
- data/lib/autoproj/cli.rb +1 -2
- data/lib/autoproj/cli/commit.rb +1 -2
- data/lib/autoproj/cli/locate.rb +4 -3
- data/lib/autoproj/cli/log.rb +0 -1
- data/lib/autoproj/cli/main.rb +24 -6
- data/lib/autoproj/cli/reset.rb +1 -0
- data/lib/autoproj/cli/status.rb +3 -2
- data/lib/autoproj/cli/tag.rb +8 -3
- data/lib/autoproj/cli/upgrade.rb +43 -39
- data/lib/autoproj/environment.rb +8 -0
- data/lib/autoproj/exceptions.rb +4 -0
- data/lib/autoproj/find_workspace.rb +83 -0
- data/lib/autoproj/ops/install.rb +198 -25
- data/lib/autoproj/os_package_installer.rb +5 -1
- data/lib/autoproj/os_package_resolver.rb +15 -5
- data/lib/autoproj/package_managers/bundler_manager.rb +98 -46
- data/lib/autoproj/package_set.rb +4 -7
- data/lib/autoproj/reporter.rb +4 -0
- data/lib/autoproj/system.rb +2 -2
- data/lib/autoproj/version.rb +1 -1
- data/lib/autoproj/workspace.rb +7 -63
- metadata +3 -2
@@ -317,7 +317,11 @@ def install(packages, options = Hash.new)
|
|
317
317
|
|
318
318
|
packages = os_package_resolver.resolve_os_packages(packages)
|
319
319
|
packages = packages.map do |handler_name, list|
|
320
|
-
|
320
|
+
if manager = package_managers[handler_name]
|
321
|
+
[package_managers[handler_name], list]
|
322
|
+
else
|
323
|
+
raise ArgumentError, "no package manager called #{handler_name} found"
|
324
|
+
end
|
321
325
|
end
|
322
326
|
|
323
327
|
needs_filter = (filter_uptodate_packages? || filter_options[:install_only])
|
@@ -122,6 +122,12 @@ def load_default
|
|
122
122
|
# information in +definitions+ originates. It is a mapping from the
|
123
123
|
# package name to the osdeps file' full path
|
124
124
|
attr_reader :sources
|
125
|
+
# Controls whether the package resolver will prefer installing
|
126
|
+
# OS-independent packages (such as e.g. Gems) over their OS-provided
|
127
|
+
# equivalent (e.g. the packaged version of a gem)
|
128
|
+
def prefer_indep_over_os_packages?; !!@prefer_indep_over_os_packages end
|
129
|
+
# (see prefer_indep_over_os_packages?)
|
130
|
+
def prefer_indep_over_os_packages=(flag); @prefer_indep_over_os_packages = flag end
|
125
131
|
|
126
132
|
# Use to override the autodetected OS-specific package handler
|
127
133
|
attr_writer :os_package_manager
|
@@ -144,15 +150,15 @@ def os_package_manager
|
|
144
150
|
# Returns the set of known package managers
|
145
151
|
#
|
146
152
|
# @return [Array<String>]
|
147
|
-
|
148
|
-
PACKAGE_MANAGERS
|
149
|
-
end
|
153
|
+
attr_reader :package_managers
|
150
154
|
|
151
155
|
# The Gem::SpecFetcher object that should be used to query RubyGems, and
|
152
156
|
# install RubyGems packages
|
153
157
|
def initialize(defs = Hash.new, file = nil)
|
154
158
|
@definitions = defs.to_hash
|
155
159
|
@all_definitions = Hash.new { |h, k| h[k] = Array.new }
|
160
|
+
@package_managers = PACKAGE_MANAGERS.dup
|
161
|
+
@prefer_indep_over_os_packages = false
|
156
162
|
|
157
163
|
@sources = Hash.new
|
158
164
|
@installed_packages = Set.new
|
@@ -200,7 +206,7 @@ def merge(info)
|
|
200
206
|
osdep_h
|
201
207
|
end
|
202
208
|
if old_resolved != new_resolved
|
203
|
-
Autoproj.warn("osdeps definition for #{h}, previously defined in #{old} overridden by #{new}")
|
209
|
+
Autoproj.warn("osdeps definition for #{h}, previously defined in #{old} overridden by #{new}: resp. #{old_resolved} and #{new_resolved}")
|
204
210
|
end
|
205
211
|
end
|
206
212
|
v2
|
@@ -491,7 +497,11 @@ def resolve_package(name)
|
|
491
497
|
|
492
498
|
os_names, os_versions = self.class.operating_system
|
493
499
|
os_names = os_names.dup
|
494
|
-
|
500
|
+
if prefer_indep_over_os_packages?
|
501
|
+
os_names.unshift 'default'
|
502
|
+
else
|
503
|
+
os_names.push 'default'
|
504
|
+
end
|
495
505
|
|
496
506
|
dep_def = definitions[name]
|
497
507
|
if !dep_def
|
@@ -28,16 +28,18 @@ def self.with_prerelease(*value)
|
|
28
28
|
def initialize_environment
|
29
29
|
env = ws.env
|
30
30
|
|
31
|
-
env.original_env['GEM_PATH'] =
|
32
|
-
(env['GEM_PATH'] || "").split(File::PATH_SEPARATOR).find_all do |p|
|
33
|
-
!Workspace.in_autoproj_project?(p)
|
34
|
-
end.join(File::PATH_SEPARATOR)
|
35
31
|
env.inherit 'GEM_PATH'
|
36
32
|
env.init_from_env 'GEM_PATH'
|
37
|
-
orig_gem_path = env
|
33
|
+
orig_gem_path = (env['GEM_PATH'] || "").split(File::PATH_SEPARATOR).find_all do |p|
|
34
|
+
!Workspace.in_autoproj_project?(p)
|
35
|
+
end
|
38
36
|
env.system_env['GEM_PATH'] = Gem.default_path
|
39
37
|
env.original_env['GEM_PATH'] = orig_gem_path.join(File::PATH_SEPARATOR)
|
40
38
|
|
39
|
+
if Workspace.in_autoproj_project?(env['GEM_HOME'])
|
40
|
+
env.unset('GEM_HOME')
|
41
|
+
end
|
42
|
+
|
41
43
|
env.init_from_env 'RUBYLIB'
|
42
44
|
env.inherit 'RUBYLIB'
|
43
45
|
original_rubylib =
|
@@ -46,32 +48,33 @@ def initialize_environment
|
|
46
48
|
!p.start_with?(Bundler.rubygems.gem_dir) &&
|
47
49
|
!Bundler.rubygems.gem_path.any? { |gem_p| p.start_with?(p) }
|
48
50
|
end
|
49
|
-
system_rubylib = discover_rubylib
|
50
|
-
|
51
|
-
|
51
|
+
if system_rubylib = discover_rubylib
|
52
|
+
env.system_env['RUBYLIB'] = []
|
53
|
+
env.original_env['RUBYLIB'] = (original_rubylib - system_rubylib).join(File::PATH_SEPARATOR)
|
54
|
+
end
|
52
55
|
|
53
56
|
dot_autoproj = ws.dot_autoproj_dir
|
54
57
|
if ws.config.private_bundler?
|
55
|
-
env.
|
58
|
+
env.add_path 'GEM_PATH', File.join(dot_autoproj, 'bundler')
|
56
59
|
end
|
57
60
|
if ws.config.private_autoproj?
|
58
|
-
env.
|
61
|
+
env.add_path 'GEM_PATH', File.join(dot_autoproj, 'autoproj')
|
59
62
|
end
|
60
63
|
|
61
64
|
ws.manifest.each_reused_autoproj_installation do |p|
|
62
65
|
reused_w = ws.new(p)
|
63
66
|
reused_c = reused_w.load_config
|
64
67
|
if reused_c.private_gems?
|
65
|
-
env.
|
68
|
+
env.add_path 'GEM_PATH', File.join(reused_w.prefix_dir, 'gems')
|
66
69
|
end
|
67
|
-
env.
|
70
|
+
env.add_path 'PATH', File.join(reused_w.prefix_dir, 'gems', 'bin')
|
68
71
|
end
|
69
72
|
|
70
73
|
|
71
74
|
gem_home = File.join(ws.prefix_dir, "gems")
|
72
75
|
if ws.config.private_gems?
|
73
76
|
env.set 'GEM_HOME', gem_home
|
74
|
-
env.
|
77
|
+
env.add_path 'GEM_PATH', gem_home
|
75
78
|
end
|
76
79
|
|
77
80
|
FileUtils.mkdir_p gem_home
|
@@ -83,18 +86,19 @@ def initialize_environment
|
|
83
86
|
end
|
84
87
|
|
85
88
|
env.set 'BUNDLE_GEMFILE', File.join(gem_home, 'Gemfile')
|
86
|
-
env.
|
87
|
-
env.
|
89
|
+
env.add_path 'PATH', File.join(gem_home, 'bin')
|
90
|
+
env.add_path 'PATH', File.join(ws.dot_autoproj_dir, 'autoproj', 'bin')
|
88
91
|
Autobuild.programs['bundler'] = File.join(ws.dot_autoproj_dir, 'autoproj', 'bin', 'bundler')
|
89
92
|
|
90
|
-
|
93
|
+
if bundle_rubylib = discover_bundle_rubylib
|
94
|
+
update_env_rubylib(bundle_rubylib, system_rubylib)
|
95
|
+
end
|
91
96
|
end
|
92
97
|
|
93
|
-
def update_env_rubylib(system_rubylib = discover_rubylib)
|
94
|
-
rubylib = discover_bundle_rubylib
|
98
|
+
def update_env_rubylib(bundle_rubylib, system_rubylib = discover_rubylib)
|
95
99
|
current = ws.env.resolved_env['RUBYLIB'].split(File::PATH_SEPARATOR) + system_rubylib
|
96
|
-
(
|
97
|
-
ws.env.
|
100
|
+
(bundle_rubylib - current).each do |p|
|
101
|
+
ws.env.add_path('RUBYLIB', p)
|
98
102
|
end
|
99
103
|
end
|
100
104
|
|
@@ -106,24 +110,56 @@ def parse_package_entry(entry)
|
|
106
110
|
end
|
107
111
|
end
|
108
112
|
|
113
|
+
class NotCleanState < RuntimeError; end
|
114
|
+
|
115
|
+
def backup_files(mapping)
|
116
|
+
mapping.each do |file, backup_file|
|
117
|
+
if File.file?(file)
|
118
|
+
FileUtils.cp file, backup_file
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def backup_restore(mapping)
|
124
|
+
mapping.each do |file, backup_file|
|
125
|
+
if File.file?(backup_file)
|
126
|
+
FileUtils.cp backup_file, file
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def backup_clean(mapping)
|
132
|
+
mapping.each do |file, backup_file|
|
133
|
+
if File.file?(backup_file)
|
134
|
+
FileUtils.rm backup_file
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
109
139
|
def install(gems)
|
110
|
-
|
140
|
+
root_dir = File.join(ws.prefix_dir, 'gems')
|
141
|
+
gemfile_path = File.join(root_dir, 'Gemfile')
|
142
|
+
gemfile_lock_path = "#{gemfile_path}.lock"
|
143
|
+
backups = Hash[
|
144
|
+
gemfile_path => "#{gemfile_path}.orig",
|
145
|
+
gemfile_lock_path => "#{gemfile_lock_path}.orig"
|
146
|
+
]
|
147
|
+
|
148
|
+
# Back up the existing gemfile, we'll restore it if something is
|
149
|
+
# wrong to avoid leaving bundler in an inconsistent state
|
150
|
+
backup_files(backups)
|
151
|
+
|
152
|
+
# Generate the gemfile and remove the lockfile
|
111
153
|
gems = gems.sort.map do |name|
|
112
154
|
name, version = parse_package_entry(name)
|
113
155
|
"gem \"#{name}\", \"#{version || ">= 0"}\""
|
114
156
|
end.join("\n")
|
115
|
-
|
116
|
-
root_dir = File.join(ws.prefix_dir, 'gems')
|
117
157
|
FileUtils.mkdir_p root_dir
|
118
|
-
|
119
|
-
File.open(gemfile, 'w') do |io|
|
158
|
+
File.open(gemfile_path, 'w') do |io|
|
120
159
|
io.puts "eval_gemfile \"#{File.join(ws.dot_autoproj_dir, 'autoproj', 'Gemfile')}\""
|
121
160
|
io.puts gems
|
122
161
|
end
|
123
|
-
|
124
|
-
File.open(File.join(root_dir, 'Gemfile.lock'), 'w') do |io|
|
125
|
-
io.write File.read(File.join(ws.dot_autoproj_dir, 'autoproj', 'Gemfile.lock'))
|
126
|
-
end
|
162
|
+
FileUtils.rm File.join(root_dir, 'Gemfile.lock')
|
127
163
|
|
128
164
|
if ws.config.private_gems?
|
129
165
|
options = ['--path', root_dir]
|
@@ -133,9 +169,9 @@ def install(gems)
|
|
133
169
|
connections = Set.new
|
134
170
|
Autobuild::Subprocess.run 'autoproj', 'osdeps',
|
135
171
|
Autobuild.tool('bundler'), 'install',
|
136
|
-
"--gemfile=#{
|
172
|
+
"--gemfile=#{gemfile_path}", *options,
|
137
173
|
"--binstubs", File.join(root_dir, 'bin'),
|
138
|
-
env: Hash['BUNDLE_GEMFILE' =>
|
174
|
+
env: Hash['BUNDLE_GEMFILE' => gemfile_path] do |line|
|
139
175
|
|
140
176
|
case line
|
141
177
|
when /Installing (.*)/
|
@@ -150,28 +186,44 @@ def install(gems)
|
|
150
186
|
end
|
151
187
|
end
|
152
188
|
|
153
|
-
|
189
|
+
if bundle_rubylib = discover_bundle_rubylib
|
190
|
+
update_env_rubylib(bundle_rubylib)
|
191
|
+
else
|
192
|
+
raise NotCleanState, "bundler executed successfully, but the result is not in a clean state"
|
193
|
+
end
|
194
|
+
|
195
|
+
rescue Exception => e
|
196
|
+
backup_restore(backups)
|
197
|
+
raise
|
198
|
+
ensure
|
199
|
+
backup_clean(backups)
|
154
200
|
end
|
155
201
|
|
156
202
|
def discover_rubylib
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
203
|
+
Tempfile.open 'autoproj-rubylib' do |io|
|
204
|
+
result = Bundler.clean_system(
|
205
|
+
Hash['RUBYLIB' => nil],
|
206
|
+
Autobuild.tool('ruby'), '-e', 'puts $LOAD_PATH',
|
207
|
+
out: io)
|
208
|
+
#err: '/dev/null')
|
209
|
+
if result
|
210
|
+
io.readlines.map { |l| l.chomp }.find_all { |l| !l.empty? }
|
211
|
+
end
|
212
|
+
end
|
164
213
|
end
|
165
214
|
|
166
215
|
def discover_bundle_rubylib
|
167
216
|
gemfile = File.join(ws.prefix_dir, 'gems', 'Gemfile')
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
217
|
+
Tempfile.open 'autoproj-rubylib' do |io|
|
218
|
+
result = Bundler.clean_system(
|
219
|
+
Hash['BUNDLE_GEMFILE' => gemfile],
|
220
|
+
Autobuild.tool('bundler'), 'exec', 'ruby', '-e', 'puts $LOAD_PATH',
|
221
|
+
out: io)
|
222
|
+
#err: '/dev/null')
|
223
|
+
if result
|
224
|
+
io.readlines.map { |l| l.chomp }.find_all { |l| !l.empty? }
|
225
|
+
end
|
226
|
+
end
|
175
227
|
end
|
176
228
|
end
|
177
229
|
end
|
data/lib/autoproj/package_set.rb
CHANGED
@@ -571,8 +571,9 @@ def provides?(name)
|
|
571
571
|
|
572
572
|
# Specialization of the PackageSet class for the overrides listed in autoproj/
|
573
573
|
class LocalPackageSet < PackageSet
|
574
|
-
def initialize(manifest)
|
574
|
+
def initialize(manifest, local_dir = nil)
|
575
575
|
super(manifest, manifest.vcs)
|
576
|
+
@local_dir = local_dir
|
576
577
|
end
|
577
578
|
|
578
579
|
def name
|
@@ -592,14 +593,10 @@ def local?
|
|
592
593
|
end
|
593
594
|
|
594
595
|
def local_dir
|
595
|
-
if manifest.file
|
596
|
-
File.dirname(manifest.file)
|
597
|
-
end
|
596
|
+
@local_dir || (File.dirname(manifest.file) if manifest.file)
|
598
597
|
end
|
599
598
|
|
600
|
-
def raw_local_dir
|
601
|
-
local_dir
|
602
|
-
end
|
599
|
+
def raw_local_dir; local_dir end
|
603
600
|
|
604
601
|
def manifest_path
|
605
602
|
manifest.file
|
data/lib/autoproj/reporter.rb
CHANGED
@@ -58,6 +58,8 @@ def self.report(options = Hash.new)
|
|
58
58
|
silent: false,
|
59
59
|
debug: Autobuild.debug
|
60
60
|
|
61
|
+
reporter = Autoproj::Reporter.new
|
62
|
+
Autobuild::Reporting << reporter
|
61
63
|
Autobuild::Reporting.report do
|
62
64
|
yield
|
63
65
|
end
|
@@ -86,6 +88,8 @@ def self.report(options = Hash.new)
|
|
86
88
|
if options[:debug] then raise
|
87
89
|
else exit 1
|
88
90
|
end
|
91
|
+
ensure
|
92
|
+
Autobuild::Reporting.remove(reporter) if reporter
|
89
93
|
end
|
90
94
|
end
|
91
95
|
|
data/lib/autoproj/system.rb
CHANGED
@@ -11,7 +11,7 @@ def self.create_symlink(from, to)
|
|
11
11
|
|
12
12
|
# Returns true if +path+ is part of an autoproj installation
|
13
13
|
def self.in_autoproj_installation?(path)
|
14
|
-
!!
|
14
|
+
!!find_workspace_dir(path, 'workspace')
|
15
15
|
end
|
16
16
|
|
17
17
|
# Forcefully sets the root directory
|
@@ -33,7 +33,7 @@ def self.root_dir(dir = Dir.pwd)
|
|
33
33
|
if @root_dir
|
34
34
|
return @root_dir
|
35
35
|
end
|
36
|
-
path =
|
36
|
+
path = Autoproj.find_workspace_dir(dir)
|
37
37
|
if !path
|
38
38
|
raise UserError, "not in a Autoproj installation"
|
39
39
|
end
|
data/lib/autoproj/version.rb
CHANGED
data/lib/autoproj/workspace.rb
CHANGED
@@ -19,10 +19,7 @@ def initialize(root_dir)
|
|
19
19
|
env.source_before(File.join(dot_autoproj_dir, 'env.sh'))
|
20
20
|
@manifest = Manifest.new
|
21
21
|
@os_package_installer = OSPackageInstaller.new(self, os_package_resolver)
|
22
|
-
|
23
|
-
Autobuild.env = nil
|
24
22
|
env.prepare(root_dir)
|
25
|
-
|
26
23
|
super(root_dir)
|
27
24
|
end
|
28
25
|
|
@@ -53,21 +50,25 @@ def self.from_pwd
|
|
53
50
|
# and the one from +dir+ mismatch
|
54
51
|
# @raise [NotWorkspace] if dir is not within an autoproj workspace
|
55
52
|
def self.from_dir(dir)
|
56
|
-
if path = find_workspace_dir(dir)
|
53
|
+
if path = Autoproj.find_workspace_dir(dir)
|
57
54
|
# Make sure that the currently loaded env.sh is actually us
|
58
55
|
env = autoproj_current_root
|
59
56
|
if env && env != path
|
60
57
|
raise MismatchingWorkspace, "the current environment is for #{env}, but you are in #{path}, make sure you are loading the right #{ENV_FILENAME} script !"
|
61
58
|
end
|
62
59
|
Workspace.new(path)
|
60
|
+
elsif find_v1_workspace_dir(dir)
|
61
|
+
raise OutdatedWorkspace, "#{dir} looks like a v1 workspace, run autoproj upgrade before continuing"
|
63
62
|
else
|
64
63
|
raise NotWorkspace, "not in a Autoproj installation"
|
65
64
|
end
|
66
65
|
end
|
67
66
|
|
68
67
|
def self.from_environment
|
69
|
-
if path =
|
68
|
+
if path = Autoproj.find_workspace_dir
|
70
69
|
from_dir(path)
|
70
|
+
elsif Autoproj.find_v1_workspace_dir(dir = Autoproj.defaulT_find_base_dir)
|
71
|
+
raise OutdatedWorkspace, "#{dir} looks like a v1 workspace, run autoproj upgrade before continuing"
|
71
72
|
else
|
72
73
|
raise NotWorkspace, "not in an Autoproj installation, and no env.sh has been loaded so far"
|
73
74
|
end
|
@@ -76,64 +77,7 @@ def self.from_environment
|
|
76
77
|
# Tests whether the given path is under a directory tree managed by
|
77
78
|
# autoproj
|
78
79
|
def self.in_autoproj_project?(path)
|
79
|
-
!!find_workspace_dir(path)
|
80
|
-
end
|
81
|
-
|
82
|
-
# @private
|
83
|
-
#
|
84
|
-
# Finds an autoproj "root directory" that contains a given directory. It
|
85
|
-
# can either be the root of a workspace or the root of an install
|
86
|
-
# directory
|
87
|
-
#
|
88
|
-
# @param [String] base_dir the start of the search
|
89
|
-
# @param [String] config_field_name the name of a field in the root's
|
90
|
-
# configuration file, that should be returned instead of the root
|
91
|
-
# itself
|
92
|
-
# @return [String,nil] the root of the workspace directory, or nil if
|
93
|
-
# there's none
|
94
|
-
def self.find_root_dir(base_dir, config_field_name)
|
95
|
-
path = Pathname.new(base_dir)
|
96
|
-
while !path.root?
|
97
|
-
if (path + ".autoproj").exist?
|
98
|
-
break
|
99
|
-
end
|
100
|
-
path = path.parent
|
101
|
-
end
|
102
|
-
|
103
|
-
if path.root?
|
104
|
-
return
|
105
|
-
end
|
106
|
-
|
107
|
-
config_path = path + ".autoproj" + "config.yml"
|
108
|
-
if config_path.exist?
|
109
|
-
config = YAML.load(config_path.read) || Hash.new
|
110
|
-
result = config[config_field_name] || path.to_s
|
111
|
-
result = File.expand_path(result, path.to_s)
|
112
|
-
else
|
113
|
-
result = path.to_s
|
114
|
-
end
|
115
|
-
|
116
|
-
# I don't know if this is still useful or not ... but it does not hurt
|
117
|
-
#
|
118
|
-
# Preventing backslashed in path, that might be confusing on some path compares
|
119
|
-
if Autobuild.windows?
|
120
|
-
result = result.gsub(/\\/,'/')
|
121
|
-
end
|
122
|
-
result
|
123
|
-
end
|
124
|
-
|
125
|
-
# Finds the workspace root that contains a directory
|
126
|
-
#
|
127
|
-
# @return [String,nil]
|
128
|
-
def self.find_workspace_dir(base_dir = Dir.pwd)
|
129
|
-
find_root_dir(base_dir, 'workspace')
|
130
|
-
end
|
131
|
-
|
132
|
-
# Looks for the autoproj prefix that contains a given directory
|
133
|
-
#
|
134
|
-
# @return [String,nil]
|
135
|
-
def self.find_prefix_dir(base_dir = Dir.pwd)
|
136
|
-
find_root_dir(base_dir, 'prefix')
|
80
|
+
!!Autoproj.find_workspace_dir(path)
|
137
81
|
end
|
138
82
|
|
139
83
|
def load(*args)
|