autobuild 1.18.1 → 1.22.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/lint.yml +25 -0
- data/.github/workflows/test.yml +30 -0
- data/.rubocop.yml +14 -7
- data/autobuild.gemspec +8 -6
- data/bin/autobuild +1 -1
- data/lib/autobuild/build_logfile.rb +1 -2
- data/lib/autobuild/config.rb +18 -5
- data/lib/autobuild/configurable.rb +3 -1
- data/lib/autobuild/environment.rb +28 -45
- data/lib/autobuild/exceptions.rb +11 -5
- data/lib/autobuild/import/archive.rb +31 -22
- data/lib/autobuild/import/cvs.rb +6 -6
- data/lib/autobuild/import/darcs.rb +4 -4
- data/lib/autobuild/import/git-lfs.rb +4 -4
- data/lib/autobuild/import/git.rb +153 -68
- data/lib/autobuild/import/hg.rb +7 -7
- data/lib/autobuild/import/svn.rb +15 -9
- data/lib/autobuild/importer.rb +38 -38
- data/lib/autobuild/mail_reporter.rb +5 -2
- data/lib/autobuild/package.rb +45 -35
- data/lib/autobuild/packages/autotools.rb +3 -8
- data/lib/autobuild/packages/cmake.rb +16 -7
- data/lib/autobuild/packages/dummy.rb +0 -4
- data/lib/autobuild/packages/gnumake.rb +1 -1
- data/lib/autobuild/packages/orogen.rb +11 -4
- data/lib/autobuild/packages/pkgconfig.rb +2 -2
- data/lib/autobuild/packages/python.rb +6 -8
- data/lib/autobuild/packages/ruby.rb +5 -5
- data/lib/autobuild/parallel.rb +20 -21
- data/lib/autobuild/pkgconfig.rb +1 -0
- data/lib/autobuild/progress_display.rb +130 -49
- data/lib/autobuild/rake_task_extension.rb +16 -5
- data/lib/autobuild/reporting.rb +20 -7
- data/lib/autobuild/subcommand.rb +24 -23
- data/lib/autobuild/test_utility.rb +2 -1
- data/lib/autobuild/timestamps.rb +3 -3
- data/lib/autobuild/utility.rb +54 -8
- data/lib/autobuild/version.rb +1 -1
- data/lib/autobuild.rb +0 -3
- metadata +42 -26
- data/.travis.yml +0 -19
@@ -106,6 +106,7 @@ module Autobuild
|
|
106
106
|
@auto_update = (ENV['AUTOBUILD_ARCHIVE_AUTOUPDATE'] == '1')
|
107
107
|
|
108
108
|
attr_writer :update_cached_file
|
109
|
+
|
109
110
|
def update_cached_file?
|
110
111
|
@update_cached_file
|
111
112
|
end
|
@@ -118,15 +119,16 @@ module Autobuild
|
|
118
119
|
|
119
120
|
Net::HTTP.start(
|
120
121
|
uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
|
121
|
-
|
122
122
|
http.request(request) do |resp|
|
123
123
|
case resp
|
124
124
|
when Net::HTTPNotModified
|
125
125
|
return false
|
126
126
|
when Net::HTTPSuccess
|
127
|
-
if current_time && (last_modified = resp['last-modified'])
|
128
|
-
|
127
|
+
if current_time && (last_modified = resp['last-modified']) &&
|
128
|
+
(current_time >= Time.rfc2822(last_modified))
|
129
|
+
return false
|
129
130
|
end
|
131
|
+
|
130
132
|
if (length = resp['Content-Length'])
|
131
133
|
length = Integer(length)
|
132
134
|
expected_size = "/#{Autobuild.human_readable_size(length)}"
|
@@ -158,11 +160,12 @@ module Autobuild
|
|
158
160
|
end
|
159
161
|
|
160
162
|
return download_http(package, URI(redirect_uri), filename,
|
161
|
-
|
163
|
+
user: user, password: password,
|
164
|
+
current_time: current_time)
|
162
165
|
else
|
163
166
|
raise PackageException.new(package, 'import'),
|
164
|
-
|
165
|
-
|
167
|
+
"failed download of #{package.name} from #{uri}: "\
|
168
|
+
"#{resp.class}"
|
166
169
|
end
|
167
170
|
end
|
168
171
|
end
|
@@ -204,19 +207,19 @@ module Autobuild
|
|
204
207
|
end
|
205
208
|
|
206
209
|
if mtime && size
|
207
|
-
|
210
|
+
size != cached_size || mtime > cached_mtime
|
208
211
|
elsif mtime
|
209
212
|
package.warn "%s: archive size is not available for #{@url}, "\
|
210
213
|
"relying on modification time"
|
211
|
-
|
214
|
+
mtime > cached_mtime
|
212
215
|
elsif size
|
213
216
|
package.warn "%s: archive modification time "\
|
214
217
|
"is not available for #{@url}, relying on size"
|
215
|
-
|
218
|
+
size != cached_size
|
216
219
|
else
|
217
220
|
package.warn "%s: neither the archive size nor its modification time "\
|
218
221
|
"are available for #{@url}, will always update"
|
219
|
-
|
222
|
+
true
|
220
223
|
end
|
221
224
|
end
|
222
225
|
|
@@ -231,8 +234,8 @@ module Autobuild
|
|
231
234
|
end
|
232
235
|
|
233
236
|
updated = download_http(package, @url, "#{cachefile}.partial",
|
234
|
-
|
235
|
-
|
237
|
+
user: @user, password: @password,
|
238
|
+
current_time: cached_mtime)
|
236
239
|
return false unless updated
|
237
240
|
elsif Autobuild.bsd?
|
238
241
|
return false unless update_needed?(package)
|
@@ -250,8 +253,8 @@ module Autobuild
|
|
250
253
|
additional_options << "--tries" << retries
|
251
254
|
end
|
252
255
|
package.run(:import, Autobuild.tool('wget'), '-q', '-P', cachedir,
|
253
|
-
|
254
|
-
|
256
|
+
*additional_options, @url, '-O', "#{cachefile}.partial",
|
257
|
+
retry: true)
|
255
258
|
end
|
256
259
|
rescue Exception
|
257
260
|
FileUtils.rm_f "#{cachefile}.partial"
|
@@ -264,13 +267,15 @@ module Autobuild
|
|
264
267
|
# Updates the downloaded file in cache only if it is needed
|
265
268
|
#
|
266
269
|
# @return [Boolean] true if a new file was downloaded, false otherwise
|
267
|
-
# @raises ConfigException if a expected digest was given in the
|
270
|
+
# @raises ConfigException if a expected digest was given in the
|
271
|
+
# source.yml file and it doesn't match
|
268
272
|
def update_cache(package)
|
269
273
|
updated = download_from_url(package)
|
270
274
|
@cachefile_digest = read_cachefile_digest
|
271
275
|
|
272
276
|
if @expected_digest && @expected_digest != @cachefile_digest
|
273
|
-
raise ConfigException,
|
277
|
+
raise ConfigException,
|
278
|
+
"The archive #{@url} does not match the digest provided"
|
274
279
|
end
|
275
280
|
|
276
281
|
updated
|
@@ -279,11 +284,11 @@ module Autobuild
|
|
279
284
|
def read_cachefile_digest
|
280
285
|
Digest::SHA1.hexdigest File.read(cachefile)
|
281
286
|
end
|
282
|
-
|
287
|
+
|
283
288
|
# Fingerprint for archive importer, we are using
|
284
289
|
# its digest whether is calculated or expected
|
285
290
|
# @raises ConfigException if no digest is present
|
286
|
-
def vcs_fingerprint(
|
291
|
+
def vcs_fingerprint(_package)
|
287
292
|
if @cachefile_digest
|
288
293
|
@cachefile_digest
|
289
294
|
elsif File.file?(cachefile)
|
@@ -291,7 +296,9 @@ module Autobuild
|
|
291
296
|
elsif @expected_digest
|
292
297
|
@expected_digest
|
293
298
|
else
|
294
|
-
raise ConfigException,
|
299
|
+
raise ConfigException,
|
300
|
+
"There is no digest for archive #{@url}, make sure "\
|
301
|
+
"cache directories are configured correctly"
|
295
302
|
end
|
296
303
|
end
|
297
304
|
|
@@ -378,9 +385,11 @@ module Autobuild
|
|
378
385
|
# [:mode] The unpack mode: one of Zip, Bzip, Gzip or Plain, this is
|
379
386
|
# usually automatically inferred from the filename
|
380
387
|
def initialize(url, options = Hash.new)
|
381
|
-
sourceopts, options = Kernel.filter_options
|
388
|
+
sourceopts, options = Kernel.filter_options(
|
389
|
+
options,
|
382
390
|
:source_id, :repository_id, :filename, :mode, :update_cached_file,
|
383
391
|
:user, :password, :expected_digest
|
392
|
+
)
|
384
393
|
super(options)
|
385
394
|
|
386
395
|
@filename = nil
|
@@ -452,7 +461,7 @@ module Autobuild
|
|
452
461
|
end
|
453
462
|
|
454
463
|
if needs_update || archive_changed?(package)
|
455
|
-
|
464
|
+
checkout(package, allow_interactive: options[:allow_interactive])
|
456
465
|
else
|
457
466
|
false
|
458
467
|
end
|
@@ -477,7 +486,7 @@ module Autobuild
|
|
477
486
|
|
478
487
|
def checkout(package, options = Hash.new) # :nodoc:
|
479
488
|
options = Kernel.validate_options options,
|
480
|
-
|
489
|
+
allow_interactive: true
|
481
490
|
|
482
491
|
update_cache(package)
|
483
492
|
|
data/lib/autobuild/import/cvs.rb
CHANGED
@@ -10,7 +10,7 @@ module Autobuild
|
|
10
10
|
# Autobuild.programs['cvs'] = 'my_cvs_tool'
|
11
11
|
def initialize(root_name, options = {})
|
12
12
|
cvsopts, common = Kernel.filter_options options,
|
13
|
-
|
13
|
+
module: nil, cvsup: '-dP', cvsco: '-P'
|
14
14
|
@root = root_name
|
15
15
|
@module = cvsopts[:module]
|
16
16
|
raise ArgumentError, "no module given" unless @module
|
@@ -41,7 +41,7 @@ module Autobuild
|
|
41
41
|
|
42
42
|
unless File.exist?("#{package.srcdir}/CVS/Root")
|
43
43
|
raise ConfigException.new(package, 'import'),
|
44
|
-
|
44
|
+
"#{package.srcdir} is not a CVS working copy"
|
45
45
|
end
|
46
46
|
|
47
47
|
root = File.open("#{package.srcdir}/CVS/Root", &:read).chomp
|
@@ -56,8 +56,8 @@ module Autobuild
|
|
56
56
|
|
57
57
|
if root != expected_root || mod != @module
|
58
58
|
raise ConfigException.new(package, 'import'),
|
59
|
-
|
60
|
-
|
59
|
+
"checkout in #{package.srcdir} is from #{root}:#{mod}, "\
|
60
|
+
"was expecting #{expected_root}:#{@module}"
|
61
61
|
end
|
62
62
|
package.run(:import, Autobuild.tool(:cvs), 'up', *@options_up,
|
63
63
|
retry: true, working_directory: package.importdir)
|
@@ -72,8 +72,8 @@ module Autobuild
|
|
72
72
|
|
73
73
|
FileUtils.mkdir_p(head) unless File.directory?(head)
|
74
74
|
package.run(:import, Autobuild.tool(:cvs), '-d', cvsroot, 'co',
|
75
|
-
|
76
|
-
|
75
|
+
'-d', tail, *@options_co, modulename,
|
76
|
+
retry: true, working_directory: head)
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
@@ -28,12 +28,12 @@ module Autobuild
|
|
28
28
|
end
|
29
29
|
unless File.directory?(File.join(package.srcdir, '_darcs'))
|
30
30
|
raise ConfigException.new(package, 'import'),
|
31
|
-
|
31
|
+
"#{package.srcdir} is not a Darcs repository"
|
32
32
|
end
|
33
33
|
|
34
34
|
package.run(:import, @program, 'pull', '--all',
|
35
|
-
|
36
|
-
|
35
|
+
"--repodir=#{package.srcdir}", '--set-scripts-executable',
|
36
|
+
@source, *@pull, retry: true)
|
37
37
|
true # no easy to know if package was updated, keep previous behavior
|
38
38
|
end
|
39
39
|
|
@@ -42,7 +42,7 @@ module Autobuild
|
|
42
42
|
FileUtils.mkdir_p(basedir) unless File.directory?(basedir)
|
43
43
|
|
44
44
|
package.run(:import, @program, 'get', '--set-scripts-executable',
|
45
|
-
|
45
|
+
@source, package.srcdir, *@get, retry: true)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -10,26 +10,26 @@ module Autobuild
|
|
10
10
|
if includes.empty?
|
11
11
|
begin
|
12
12
|
importer.run_git_bare(package, 'config', '--local',
|
13
|
-
|
13
|
+
'--unset', 'lfs.fetchinclude')
|
14
14
|
rescue SubcommandFailed => e
|
15
15
|
raise if e.status != 5
|
16
16
|
end
|
17
17
|
else
|
18
18
|
importer.run_git_bare(package, 'config', '--local',
|
19
|
-
|
19
|
+
'lfs.fetchinclude', includes)
|
20
20
|
end
|
21
21
|
|
22
22
|
excludes = importer.options.fetch(:lfs_exclude, '')
|
23
23
|
if excludes.empty?
|
24
24
|
begin
|
25
25
|
importer.run_git_bare(package, 'config', '--local',
|
26
|
-
|
26
|
+
'--unset', 'lfs.fetchexclude')
|
27
27
|
rescue SubcommandFailed => e
|
28
28
|
raise if e.status != 5
|
29
29
|
end
|
30
30
|
else
|
31
31
|
importer.run_git_bare(package, 'config', '--local',
|
32
|
-
|
32
|
+
'lfs.fetchexclude', excludes)
|
33
33
|
end
|
34
34
|
|
35
35
|
if importer.options[:lfs] != false
|
data/lib/autobuild/import/git.rb
CHANGED
@@ -7,6 +7,9 @@ require 'English'
|
|
7
7
|
|
8
8
|
module Autobuild
|
9
9
|
class Git < Importer
|
10
|
+
# Exception raised when a network access is needed while only_local is true
|
11
|
+
class NetworkAccessNeeded < RuntimeError; end
|
12
|
+
|
10
13
|
class << self
|
11
14
|
# Sets the default alternates path used by all Git importers
|
12
15
|
#
|
@@ -24,6 +27,11 @@ module Autobuild
|
|
24
27
|
# AUTOBUILD_GIT_CACHE_DIR and AUTOBUILD_CACHE_DIR environment
|
25
28
|
# variables
|
26
29
|
#
|
30
|
+
# Because of its role within the caching system in autobuild/autoproj,
|
31
|
+
# these defaults are not applied to git repositories that are using
|
32
|
+
# submodules. The autoproj cache builder does not generate repositories
|
33
|
+
# compatible with having submodules
|
34
|
+
#
|
27
35
|
# @return [Array]
|
28
36
|
# @see default_alternates=, Git#alternates
|
29
37
|
def default_alternates
|
@@ -49,7 +57,7 @@ module Autobuild
|
|
49
57
|
def self.version
|
50
58
|
version = Subprocess.run('git', 'setup', Autobuild.tool(:git), '--version').
|
51
59
|
first
|
52
|
-
if version =~ /^git version (\d[\d
|
60
|
+
if version =~ /^git version (\d[\d.]+)/
|
53
61
|
$1.split(".").map { |i| Integer(i) }
|
54
62
|
else
|
55
63
|
raise ArgumentError, "cannot parse git version string #{version}, "\
|
@@ -111,7 +119,6 @@ module Autobuild
|
|
111
119
|
# workflow, it is recommended to not use submodules but checkout all
|
112
120
|
# repositories separately instead.
|
113
121
|
def initialize(repository, branch = nil, options = {})
|
114
|
-
@alternates = Git.default_alternates.dup
|
115
122
|
@git_dir_cache = Array.new
|
116
123
|
@local_branch = @remote_branch = nil
|
117
124
|
@tag = @commit = nil
|
@@ -135,16 +142,16 @@ module Autobuild
|
|
135
142
|
end
|
136
143
|
|
137
144
|
gitopts, common = Kernel.filter_options options,
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
145
|
+
push_to: nil,
|
146
|
+
branch: nil,
|
147
|
+
local_branch: nil,
|
148
|
+
remote_branch: nil,
|
149
|
+
tag: nil,
|
150
|
+
commit: nil,
|
151
|
+
repository_id: nil,
|
152
|
+
source_id: nil,
|
153
|
+
with_submodules: false,
|
154
|
+
single_branch: false
|
148
155
|
if gitopts[:branch] && branch
|
149
156
|
raise ConfigException, "git branch specified with both the option hash "\
|
150
157
|
"and the explicit parameter"
|
@@ -155,6 +162,13 @@ module Autobuild
|
|
155
162
|
|
156
163
|
@single_branch = gitopts[:single_branch]
|
157
164
|
@with_submodules = gitopts.delete(:with_submodules)
|
165
|
+
@alternates =
|
166
|
+
if @with_submodules
|
167
|
+
[]
|
168
|
+
else
|
169
|
+
Git.default_alternates.dup
|
170
|
+
end
|
171
|
+
|
158
172
|
@remote_name = 'autobuild'
|
159
173
|
@push_to = nil
|
160
174
|
relocate(repository, gitopts)
|
@@ -282,6 +296,66 @@ module Autobuild
|
|
282
296
|
git_dir(package, true)
|
283
297
|
end
|
284
298
|
|
299
|
+
# Return the remote head branch from local copy if exists, if not return nil
|
300
|
+
#
|
301
|
+
# @param [Package] package
|
302
|
+
def try_resolve_remote_head_from_local(package)
|
303
|
+
ls_local_string = run_git(package, 'symbolic-ref',
|
304
|
+
"refs/remotes/#{@remote_name}/HEAD").first.strip
|
305
|
+
local_remote_head = ls_local_string.match("refs/remotes/#{@remote_name}/(.*)")
|
306
|
+
local_remote_head ? local_remote_head[1] : nil
|
307
|
+
rescue Autobuild::SubcommandFailed # rubocop:disable Lint/SuppressedException
|
308
|
+
end
|
309
|
+
|
310
|
+
# Return the remote head branch from server if exists, if not return 'master'
|
311
|
+
#
|
312
|
+
# @param [Package] package
|
313
|
+
def try_resolve_remote_head_from_server(package)
|
314
|
+
ls_remote_string = package.run(
|
315
|
+
:import,
|
316
|
+
Autobuild.tool('git'), 'ls-remote', '--symref', repository
|
317
|
+
).first.strip
|
318
|
+
server_remote_head =
|
319
|
+
ls_remote_string.match("ref:[^A-z]refs/heads/(.*)[^A-z]HEAD")
|
320
|
+
server_remote_head ? server_remote_head[1] : 'master'
|
321
|
+
end
|
322
|
+
|
323
|
+
# Return default local branch if exists, if not return the default remote branch
|
324
|
+
#
|
325
|
+
# @param [Package] package
|
326
|
+
def resolve_remote_head(package, only_local: false)
|
327
|
+
try_resolve_remote_head_from_local(package) ||
|
328
|
+
(!only_local && try_resolve_remote_head_from_server(package))
|
329
|
+
end
|
330
|
+
|
331
|
+
# Whether both the local and remote branches are known
|
332
|
+
#
|
333
|
+
# See documentation of {#resolve_all_branches}
|
334
|
+
def has_all_branches?
|
335
|
+
remote_branch && local_branch
|
336
|
+
end
|
337
|
+
|
338
|
+
# Resolve branches based on the remote's HEAD
|
339
|
+
#
|
340
|
+
# Since GitHub (and others) decided to change the name of the "default"
|
341
|
+
# branch, we can't assume that master is ... well ... master.
|
342
|
+
#
|
343
|
+
# For this reason, a Git importer does not have a built-in default.
|
344
|
+
# If the branch(es) are not provided explicitly, the importer will
|
345
|
+
# call this method to guess the name of the default branch instead.
|
346
|
+
#
|
347
|
+
# Call {#has_all_branches?} to determine whether it is necessary
|
348
|
+
def resolve_all_branches(package, only_local: false)
|
349
|
+
default_branch = resolve_remote_head(package, only_local: only_local)
|
350
|
+
unless default_branch
|
351
|
+
raise NetworkAccessNeeded,
|
352
|
+
"determining the remote branch would require access to "\
|
353
|
+
"the network, and only_local is true"
|
354
|
+
end
|
355
|
+
|
356
|
+
relocate(repository, default_branch: default_branch)
|
357
|
+
end
|
358
|
+
|
285
359
|
# @api private
|
286
360
|
#
|
287
361
|
# Resolves the git directory associated with path, and tells whether it
|
@@ -355,12 +429,12 @@ module Autobuild
|
|
355
429
|
def self.validate_git_dir(package, require_working_copy, _dir, style)
|
356
430
|
if !style
|
357
431
|
raise ConfigException.new(package, 'import', retry: false),
|
358
|
-
|
359
|
-
|
432
|
+
"while importing #{package.name}, #{package.importdir} "\
|
433
|
+
"does not point to a git repository"
|
360
434
|
elsif require_working_copy && (style == :bare)
|
361
435
|
raise ConfigException.new(package, 'import', retry: false),
|
362
|
-
|
363
|
-
|
436
|
+
"while importing #{package.name}, #{package.importdir} "\
|
437
|
+
"points to a bare git repository but a working copy was required"
|
364
438
|
end
|
365
439
|
end
|
366
440
|
|
@@ -466,21 +540,24 @@ module Autobuild
|
|
466
540
|
#
|
467
541
|
# Set a remote up in the repositorie's configuration
|
468
542
|
def setup_remote(package, remote_name, repository, push_to = repository)
|
543
|
+
resolve_all_branches(package, only_local: true) unless has_all_branches?
|
544
|
+
|
469
545
|
run_git_bare(package, 'config', '--replace-all',
|
470
|
-
|
546
|
+
"remote.#{remote_name}.url", repository)
|
471
547
|
run_git_bare(package, 'config', '--replace-all',
|
472
|
-
|
548
|
+
"remote.#{remote_name}.pushurl", push_to || repository)
|
473
549
|
run_git_bare(package, 'config', '--replace-all',
|
474
|
-
|
475
|
-
|
550
|
+
"remote.#{remote_name}.fetch",
|
551
|
+
"+refs/heads/*:refs/remotes/#{remote_name}/*")
|
476
552
|
|
477
553
|
if remote_branch && local_branch
|
554
|
+
remote_ref = remote_branch_to_ref(remote_branch)
|
478
555
|
run_git_bare(package, 'config', '--replace-all',
|
479
|
-
|
480
|
-
|
556
|
+
"remote.#{remote_name}.push",
|
557
|
+
"refs/heads/#{local_branch}:#{remote_ref}")
|
481
558
|
else
|
482
559
|
run_git_bare(package, 'config', '--replace-all',
|
483
|
-
|
560
|
+
"remote.#{remote_name}.push", "refs/heads/*:refs/heads/*")
|
484
561
|
end
|
485
562
|
end
|
486
563
|
|
@@ -506,16 +583,17 @@ module Autobuild
|
|
506
583
|
|
507
584
|
if local_branch
|
508
585
|
run_git_bare(package, 'config', '--replace-all',
|
509
|
-
|
586
|
+
"branch.#{local_branch}.remote", remote_name)
|
510
587
|
run_git_bare(package, 'config', '--replace-all',
|
511
|
-
|
588
|
+
"branch.#{local_branch}.merge",
|
589
|
+
remote_branch_to_ref(local_branch))
|
512
590
|
end
|
513
591
|
end
|
514
592
|
|
515
593
|
# Resolve a commit ref to a tag or commit ID
|
516
594
|
def describe_rev(package, rev)
|
517
595
|
tag = run_git_bare(package, 'describe',
|
518
|
-
|
596
|
+
'--tags', '--exact-match', rev).first.strip
|
519
597
|
[true, tag.encode('UTF-8')]
|
520
598
|
rescue Autobuild::SubcommandFailed
|
521
599
|
commit = rev_parse(package, rev)
|
@@ -573,7 +651,7 @@ module Autobuild
|
|
573
651
|
refspec.zip(fetched_commits).each do |spec, commit_id|
|
574
652
|
if spec =~ %r{^refs/heads/(.*)$}
|
575
653
|
run_git_bare(package, 'update-ref', "-m", "updated by autobuild",
|
576
|
-
|
654
|
+
"refs/remotes/#{remote_name}/#{$1}", commit_id)
|
577
655
|
end
|
578
656
|
end
|
579
657
|
|
@@ -630,7 +708,7 @@ module Autobuild
|
|
630
708
|
run_git_bare(package, 'show-ref', '-s', refspec).first.strip
|
631
709
|
rescue SubcommandFailed
|
632
710
|
raise PackageException.new(package, "import"),
|
633
|
-
|
711
|
+
"cannot resolve #{refspec}"
|
634
712
|
end
|
635
713
|
else
|
636
714
|
refspec =
|
@@ -639,7 +717,7 @@ module Autobuild
|
|
639
717
|
remote_branch_to_ref(remote_branch)
|
640
718
|
begin fetch_remote(package, refspec: refspec)
|
641
719
|
rescue Exception => e
|
642
|
-
|
720
|
+
fallback(e, package, :status, package, only_local)
|
643
721
|
end
|
644
722
|
end
|
645
723
|
end
|
@@ -655,6 +733,8 @@ module Autobuild
|
|
655
733
|
end
|
656
734
|
|
657
735
|
validate_importdir(package)
|
736
|
+
resolve_all_branches(package, only_local: only_local) unless has_all_branches?
|
737
|
+
|
658
738
|
_pinned_state, target_commit, = determine_target_state(
|
659
739
|
package, only_local: only_local)
|
660
740
|
|
@@ -685,7 +765,7 @@ module Autobuild
|
|
685
765
|
|
686
766
|
def has_branch?(package, branch_name)
|
687
767
|
run_git_bare(package, 'show-ref', '-q', '--verify',
|
688
|
-
|
768
|
+
remote_branch_to_ref(branch_name))
|
689
769
|
true
|
690
770
|
rescue SubcommandFailed => e
|
691
771
|
if e.status == 1
|
@@ -695,7 +775,7 @@ module Autobuild
|
|
695
775
|
end
|
696
776
|
|
697
777
|
def has_local_branch?(package)
|
698
|
-
has_branch?(package, local_branch)
|
778
|
+
has_branch?(package, local_branch) if local_branch
|
699
779
|
end
|
700
780
|
|
701
781
|
def detached_head?(package)
|
@@ -703,6 +783,8 @@ module Autobuild
|
|
703
783
|
end
|
704
784
|
|
705
785
|
private def remote_branch_to_ref(branch)
|
786
|
+
return unless branch
|
787
|
+
|
706
788
|
if branch.start_with?("refs/")
|
707
789
|
branch
|
708
790
|
else
|
@@ -739,9 +821,7 @@ module Autobuild
|
|
739
821
|
#
|
740
822
|
# This is the value returned by {Git#status}
|
741
823
|
class Status < Importer::Status
|
742
|
-
attr_reader :fetch_commit
|
743
|
-
attr_reader :head_commit
|
744
|
-
attr_reader :common_commit
|
824
|
+
attr_reader :fetch_commit, :head_commit, :common_commit
|
745
825
|
|
746
826
|
def initialize(package, status, remote_commit, local_commit, common_commit)
|
747
827
|
super()
|
@@ -786,8 +866,8 @@ module Autobuild
|
|
786
866
|
run_git_bare(package, 'rev-parse', '-q', '--verify', name).first
|
787
867
|
rescue Autobuild::SubcommandFailed
|
788
868
|
raise PackageException.new(package, 'import'),
|
789
|
-
|
790
|
-
|
869
|
+
"failed to resolve #{name}. "\
|
870
|
+
"Are you sure this commit, branch or tag exists ?"
|
791
871
|
end
|
792
872
|
|
793
873
|
# Returns the file's conents at a certain commit
|
@@ -800,7 +880,7 @@ module Autobuild
|
|
800
880
|
run_git_bare(package, 'show', "#{commit}:#{path}").join("\n")
|
801
881
|
rescue Autobuild::SubcommandFailed
|
802
882
|
raise PackageException.new(package, 'import'),
|
803
|
-
|
883
|
+
"failed to either resolve commit #{commit} or file #{path}"
|
804
884
|
end
|
805
885
|
|
806
886
|
# Tests whether a commit is already present in a given history
|
@@ -834,7 +914,7 @@ module Autobuild
|
|
834
914
|
def describe_commit_on_remote(package, rev = 'HEAD', options = Hash.new)
|
835
915
|
rev = rev.to_str
|
836
916
|
options = Kernel.validate_options options,
|
837
|
-
|
917
|
+
tags: true
|
838
918
|
|
839
919
|
commit_id = rev_parse(package, rev)
|
840
920
|
|
@@ -864,15 +944,13 @@ module Autobuild
|
|
864
944
|
end
|
865
945
|
|
866
946
|
remote_refs.delete_if do |rev_name, rev_id|
|
867
|
-
begin
|
868
947
|
if commit_present_in?(package, commit_id, rev_id)
|
869
948
|
return rev_name
|
870
949
|
else
|
871
950
|
true
|
872
951
|
end
|
873
|
-
|
952
|
+
rescue PackageException
|
874
953
|
false
|
875
|
-
end
|
876
954
|
end
|
877
955
|
|
878
956
|
unless remote_refs.empty?
|
@@ -898,7 +976,7 @@ module Autobuild
|
|
898
976
|
def merge_status(package, fetch_commit, reference_commit = "HEAD")
|
899
977
|
begin
|
900
978
|
common_commit = run_git_bare(package, 'merge-base',
|
901
|
-
|
979
|
+
reference_commit, fetch_commit).first.strip
|
902
980
|
rescue Exception
|
903
981
|
raise PackageException.new(package, 'import'), "failed to find "\
|
904
982
|
"the merge-base between #{reference_commit} and #{fetch_commit}. "\
|
@@ -931,7 +1009,7 @@ module Autobuild
|
|
931
1009
|
# @return [void]
|
932
1010
|
def update_alternates(package)
|
933
1011
|
alternates_path = File.join(git_dir(package, false),
|
934
|
-
|
1012
|
+
'objects', 'info', 'alternates')
|
935
1013
|
current_alternates =
|
936
1014
|
if File.file?(alternates_path)
|
937
1015
|
File.readlines(alternates_path)
|
@@ -996,18 +1074,18 @@ module Autobuild
|
|
996
1074
|
# changes
|
997
1075
|
unless commit_present_in?(package, current_head, fetch_commit)
|
998
1076
|
raise ImporterCannotReset.new(package, 'import'),
|
999
|
-
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
1003
|
-
|
1004
|
-
|
1005
|
-
|
1077
|
+
"branch #{local_branch} of #{package.name} contains"\
|
1078
|
+
" commits that do not seem to be present on the branch"\
|
1079
|
+
" #{remote_branch} of the remote repository. I can't"\
|
1080
|
+
" go on as it could make you lose some stuff. Update"\
|
1081
|
+
" the remote branch in your overrides, push your"\
|
1082
|
+
" changes or reset to the remote commit manually"\
|
1083
|
+
" before trying again"
|
1006
1084
|
end
|
1007
1085
|
end
|
1008
1086
|
|
1009
1087
|
package.message format(" %%s: resetting branch %<branch>s to %<commit>s",
|
1010
|
-
|
1088
|
+
branch: local_branch, commit: target_commit)
|
1011
1089
|
# I don't use a reset --hard here as it would add even more
|
1012
1090
|
# restrictions on when we can do the operation (as we would refuse
|
1013
1091
|
# doing it if there are local changes). The checkout creates a
|
@@ -1018,7 +1096,7 @@ module Autobuild
|
|
1018
1096
|
begin
|
1019
1097
|
run_git(package, 'checkout', target_commit)
|
1020
1098
|
run_git(package, 'update-ref', "refs/heads/#{local_branch}",
|
1021
|
-
|
1099
|
+
resolved_target_commit)
|
1022
1100
|
run_git(package, 'symbolic-ref', "HEAD", "refs/heads/#{local_branch}")
|
1023
1101
|
rescue ::Exception
|
1024
1102
|
run_git(package, 'symbolic-ref', "HEAD", target_commit)
|
@@ -1054,6 +1132,9 @@ module Autobuild
|
|
1054
1132
|
# @option (see Package#update)
|
1055
1133
|
def update(package, options = Hash.new)
|
1056
1134
|
validate_importdir(package)
|
1135
|
+
|
1136
|
+
resolve_all_branches(package) unless has_all_branches?
|
1137
|
+
|
1057
1138
|
only_local = options.fetch(:only_local, false)
|
1058
1139
|
reset = options.fetch(:reset, false)
|
1059
1140
|
|
@@ -1073,20 +1154,21 @@ module Autobuild
|
|
1073
1154
|
end
|
1074
1155
|
|
1075
1156
|
unless pin_is_uptodate
|
1076
|
-
fetch_commit ||= current_remote_commit(
|
1077
|
-
only_local: only_local,
|
1078
|
-
|
1157
|
+
fetch_commit ||= current_remote_commit(
|
1158
|
+
package, only_local: only_local,
|
1159
|
+
refspec: [remote_branch_to_ref(remote_branch), tag]
|
1160
|
+
)
|
1079
1161
|
did_update =
|
1080
1162
|
if reset
|
1081
1163
|
reset_head_to_commit(package, target_commit, fetch_commit,
|
1082
|
-
|
1164
|
+
force: (reset == :force))
|
1083
1165
|
else
|
1084
1166
|
merge_if_simple(package, target_commit)
|
1085
1167
|
end
|
1086
1168
|
end
|
1087
1169
|
|
1088
1170
|
if !only_local && with_submodules?
|
1089
|
-
run_git(package, "submodule", "update", '--init')
|
1171
|
+
run_git(package, "submodule", "update", '--init', '--recursive')
|
1090
1172
|
did_update = true
|
1091
1173
|
end
|
1092
1174
|
|
@@ -1096,12 +1178,12 @@ module Autobuild
|
|
1096
1178
|
private def ensure_on_local_branch(package, target_commit)
|
1097
1179
|
if !has_local_branch?(package)
|
1098
1180
|
package.message format("%%s: checking out branch %<branch>s",
|
1099
|
-
|
1181
|
+
branch: local_branch)
|
1100
1182
|
run_git(package, 'checkout', '-b', local_branch, target_commit)
|
1101
1183
|
true
|
1102
1184
|
elsif !on_local_branch?(package)
|
1103
1185
|
package.message format("%%s: switching to branch %<branch>s",
|
1104
|
-
|
1186
|
+
branch: local_branch)
|
1105
1187
|
run_git(package, 'checkout', local_branch)
|
1106
1188
|
true
|
1107
1189
|
else
|
@@ -1184,27 +1266,30 @@ module Autobuild
|
|
1184
1266
|
clone_options << "--config=#{key}=#{value}"
|
1185
1267
|
end
|
1186
1268
|
package.run(:import,
|
1187
|
-
|
1188
|
-
|
1269
|
+
Autobuild.tool('git'), 'clone', '-o', remote_name, *clone_options,
|
1270
|
+
repository, package.importdir, retry: true)
|
1189
1271
|
|
1190
1272
|
update_remotes_configuration(package)
|
1191
|
-
update(package, only_local: !remote_branch.start_with?("refs/"),
|
1192
|
-
|
1273
|
+
update(package, only_local: !remote_branch.start_with?("refs/"),
|
1274
|
+
reset: :force)
|
1275
|
+
if with_submodules?
|
1276
|
+
run_git(package, "submodule", "update", '--init', '--recursive')
|
1277
|
+
end
|
1193
1278
|
end
|
1194
1279
|
|
1195
1280
|
# Changes the repository this importer is pointing to
|
1196
1281
|
def relocate(repository, options = Hash.new)
|
1197
|
-
options =
|
1282
|
+
options = options.transform_keys(&:to_sym)
|
1198
1283
|
|
1199
1284
|
local_branch =
|
1200
1285
|
options[:local_branch] || options[:branch] ||
|
1201
|
-
self.local_branch ||
|
1286
|
+
self.local_branch || options[:default_branch] || nil
|
1202
1287
|
remote_branch =
|
1203
1288
|
options[:remote_branch] || options[:branch] ||
|
1204
|
-
self.remote_branch ||
|
1205
|
-
if local_branch
|
1289
|
+
self.remote_branch || options[:default_branch] || nil
|
1290
|
+
if local_branch&.start_with?("refs/")
|
1206
1291
|
raise ArgumentError, "you cannot provide a full ref for"\
|
1207
|
-
|
1292
|
+
" the local branch, only for the remote branch"
|
1208
1293
|
end
|
1209
1294
|
|
1210
1295
|
@push_to = options[:push_to] || @push_to
|