autobuild 1.16.0 → 1.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/autobuild/import/git-lfs.rb +5 -1
- data/lib/autobuild/import/git.rb +68 -20
- data/lib/autobuild/package.rb +35 -1
- data/lib/autobuild/subcommand.rb +14 -1
- data/lib/autobuild/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43869aed86ff761f4f091a8c5dbd4d27cdb481cd2b60bf4843bd259366d2a88b
|
4
|
+
data.tar.gz: c62531880b13b4401323193c8bbbc1d095ae1f0201aecf16646c5f316f7aff03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47a3d57e94becd1e6e96ccf36902e5cb908d56d3faf0ee0f18904c041caae1940eaa959b51ae641c9de826c6cf211a42953a81268a61d4bf60efce9173bf373f
|
7
|
+
data.tar.gz: e6edd90897e22b8dd0e89e490027ebb2c2632bc3c201355a787bf83413b8958a5ee97a3aab6da0e6dbe96fde093d453032244fcca7145af99f578ad3c425874d
|
@@ -1,9 +1,13 @@
|
|
1
|
-
# Disable git-lfs at checkout time, we run install --local and pull later
|
1
|
+
# Disable git-lfs at checkout time, we run install --local and pull later
|
2
2
|
Autobuild::Git.default_config['filter.lfs.smudge'] = 'git-lfs smudge --skip -- %f'
|
3
3
|
Autobuild::Git.default_config['filter.lfs.required'] = 'false'
|
4
4
|
|
5
5
|
module Autobuild
|
6
6
|
Git.add_post_hook(always: true) do |importer, package|
|
7
|
+
if importer.options[:lfs] != false && importer.uses_lfs?(package) && !Git.lfs_installed?
|
8
|
+
Autobuild.warn "#{package.name} uses git LFS but it is not installed, files may be missing from checkout"
|
9
|
+
end
|
10
|
+
|
7
11
|
lfs_dir = File.join(package.srcdir, '.git', 'lfs')
|
8
12
|
if File.directory?(lfs_dir)
|
9
13
|
importer.run_git(package, 'lfs', 'install', '--force', '--local', '--skip-smudge')
|
data/lib/autobuild/import/git.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require 'autobuild/subcommand'
|
3
3
|
require 'autobuild/importer'
|
4
4
|
require 'utilrb/kernel/options'
|
5
|
+
require 'open3'
|
5
6
|
|
6
7
|
module Autobuild
|
7
8
|
class Git < Importer
|
@@ -54,7 +55,7 @@ def self.version
|
|
54
55
|
# Helper method to compare two (partial) versions represented as array
|
55
56
|
# of integers
|
56
57
|
#
|
57
|
-
# @return [Integer] -1 if actual is greater than required,
|
58
|
+
# @return [Integer] -1 if actual is greater than required,
|
58
59
|
# 0 if equal, and 1 if actual is smaller than required
|
59
60
|
def self.compare_versions(actual, required)
|
60
61
|
if actual.size > required.size
|
@@ -82,7 +83,7 @@ def self.at_least_version(*version)
|
|
82
83
|
# Creates an importer which tracks a repository and branch.
|
83
84
|
#
|
84
85
|
# This importer uses the 'git' tool to perform the import. It defaults
|
85
|
-
# to 'git' and can be configured by doing
|
86
|
+
# to 'git' and can be configured by doing
|
86
87
|
#
|
87
88
|
# Autobuild.programs['git'] = 'my_git_tool'
|
88
89
|
#
|
@@ -128,6 +129,8 @@ def initialize(repository, branch = nil, options = {})
|
|
128
129
|
gitopts, common = Kernel.filter_options options,
|
129
130
|
push_to: nil,
|
130
131
|
branch: nil,
|
132
|
+
local_branch: nil,
|
133
|
+
remote_branch: nil,
|
131
134
|
tag: nil,
|
132
135
|
commit: nil,
|
133
136
|
repository_id: nil,
|
@@ -370,7 +373,7 @@ def delta_between_tags(package, from_tag, to_tag)
|
|
370
373
|
# @param [Package] package
|
371
374
|
# @option options [Boolean] only_local (false) whether the tags should
|
372
375
|
# be fetch from the remote first, or if one should only list tags that
|
373
|
-
# are already known locally
|
376
|
+
# are already known locally
|
374
377
|
# @return [Hash<String,String>] a mapping from a tag name to its commit
|
375
378
|
# ID
|
376
379
|
def tags(package, options = Hash.new)
|
@@ -443,7 +446,7 @@ def setup_remote(package, remote_name, repository, push_to = repository)
|
|
443
446
|
run_git_bare(package, 'config', '--replace-all', "remote.#{remote_name}.fetch", "+refs/heads/*:refs/remotes/#{remote_name}/*")
|
444
447
|
|
445
448
|
if remote_branch && local_branch
|
446
|
-
run_git_bare(package, 'config', '--replace-all', "remote.#{remote_name}.push", "refs/heads/#{local_branch}
|
449
|
+
run_git_bare(package, 'config', '--replace-all', "remote.#{remote_name}.push", "refs/heads/#{local_branch}:#{remote_branch_to_ref(remote_branch)}")
|
447
450
|
else
|
448
451
|
run_git_bare(package, 'config', '--replace-all', "remote.#{remote_name}.push", "refs/heads/*:refs/heads/*")
|
449
452
|
end
|
@@ -471,7 +474,7 @@ def update_remotes_configuration(package)
|
|
471
474
|
|
472
475
|
if local_branch
|
473
476
|
run_git_bare(package, 'config', '--replace-all', "branch.#{local_branch}.remote", remote_name)
|
474
|
-
run_git_bare(package, 'config', '--replace-all', "branch.#{local_branch}.merge",
|
477
|
+
run_git_bare(package, 'config', '--replace-all', "branch.#{local_branch}.merge", remote_branch_to_ref(local_branch))
|
475
478
|
end
|
476
479
|
end
|
477
480
|
|
@@ -578,12 +581,16 @@ def current_remote_commit(package, options = Hash.new)
|
|
578
581
|
end
|
579
582
|
only_local = options.delete(:only_local)
|
580
583
|
|
581
|
-
|
582
584
|
if only_local
|
583
585
|
refspec = options[:refspec] ||
|
584
586
|
("refs/tags/#{tag}" if tag) ||
|
585
|
-
"refs/remotes/#{remote_name}/#{remote_branch}"
|
586
|
-
|
587
|
+
("refs/remotes/#{remote_name}/#{remote_branch}" \
|
588
|
+
unless remote_branch.start_with?("refs/"))
|
589
|
+
unless (refspec = Array(refspec).first)
|
590
|
+
raise ArgumentError, "cannot use only_local with no tag,"\
|
591
|
+
" and an absolute remote ref"
|
592
|
+
end
|
593
|
+
|
587
594
|
begin
|
588
595
|
run_git_bare(package, 'show-ref', '-s', refspec).first.strip
|
589
596
|
rescue SubcommandFailed
|
@@ -592,7 +599,7 @@ def current_remote_commit(package, options = Hash.new)
|
|
592
599
|
else
|
593
600
|
refspec = options[:refspec] ||
|
594
601
|
("refs/tags/#{tag}" if tag) ||
|
595
|
-
|
602
|
+
remote_branch_to_ref(remote_branch)
|
596
603
|
begin fetch_remote(package, refspec: refspec)
|
597
604
|
rescue Exception => e
|
598
605
|
return fallback(e, package, :status, package, only_local)
|
@@ -635,7 +642,7 @@ def has_commit?(package, commit_id)
|
|
635
642
|
end
|
636
643
|
|
637
644
|
def has_branch?(package, branch_name)
|
638
|
-
run_git_bare(package, 'show-ref', '-q', '--verify',
|
645
|
+
run_git_bare(package, 'show-ref', '-q', '--verify', remote_branch_to_ref(branch_name))
|
639
646
|
true
|
640
647
|
rescue SubcommandFailed => e
|
641
648
|
if e.status == 1
|
@@ -652,6 +659,14 @@ def detached_head?(package)
|
|
652
659
|
current_branch(package).nil?
|
653
660
|
end
|
654
661
|
|
662
|
+
private def remote_branch_to_ref(branch)
|
663
|
+
if branch.start_with?("refs/")
|
664
|
+
branch
|
665
|
+
else
|
666
|
+
"refs/heads/#{branch}"
|
667
|
+
end
|
668
|
+
end
|
669
|
+
|
655
670
|
# Returns the branch HEAD is pointing to
|
656
671
|
#
|
657
672
|
# @return [String,nil] the full ref HEAD is pointing to (i.e.
|
@@ -733,7 +748,7 @@ def rev_parse(package, name, object_type = "commit")
|
|
733
748
|
raise PackageException.new(package, 'import'), "failed to resolve #{name}. Are you sure this commit, branch or tag exists ?"
|
734
749
|
end
|
735
750
|
|
736
|
-
# Returns the file's conents at a certain commit
|
751
|
+
# Returns the file's conents at a certain commit
|
737
752
|
#
|
738
753
|
# @param [Package] package
|
739
754
|
# @param [String] commit
|
@@ -758,7 +773,7 @@ def commit_present_in?(package, rev, reference)
|
|
758
773
|
begin
|
759
774
|
merge_base = run_git_bare(package, 'merge-base', commit, reference).first
|
760
775
|
merge_base == commit
|
761
|
-
|
776
|
+
|
762
777
|
rescue Exception
|
763
778
|
raise PackageException.new(package, 'import'), "failed to find the merge-base between #{rev} and #{reference}. Are you sure these commits exist ?"
|
764
779
|
end
|
@@ -780,7 +795,7 @@ def describe_commit_on_remote(package, rev = 'HEAD', options = Hash.new)
|
|
780
795
|
commit_id = rev_parse(package, rev)
|
781
796
|
|
782
797
|
remote_refs = Hash[*each_remote_ref(package).to_a.flatten]
|
783
|
-
remote_branch_ref =
|
798
|
+
remote_branch_ref = remote_branch_to_ref(remote_branch)
|
784
799
|
remote_branch_id = remote_refs.delete(remote_branch_ref)
|
785
800
|
begin
|
786
801
|
if commit_present_in?(package, commit_id, remote_branch_id)
|
@@ -932,7 +947,14 @@ def reset_head_to_commit(package, target_commit, fetch_commit, options = Hash.ne
|
|
932
947
|
# repository. We'll refuse resetting if there are uncommitted
|
933
948
|
# changes
|
934
949
|
if !commit_present_in?(package, current_head, fetch_commit)
|
935
|
-
raise ImporterCannotReset.new(package, 'import'),
|
950
|
+
raise ImporterCannotReset.new(package, 'import'),
|
951
|
+
"branch #{local_branch} of #{package.name} contains"\
|
952
|
+
" commits that do not seem to be present on the branch"\
|
953
|
+
" #{remote_branch} of the remote repository. I can't"\
|
954
|
+
" go on as it could make you lose some stuff. Update"\
|
955
|
+
" the remote branch in your overrides, push your"\
|
956
|
+
" changes or reset to the remote commit manually"\
|
957
|
+
" before trying again"
|
936
958
|
end
|
937
959
|
end
|
938
960
|
|
@@ -951,7 +973,7 @@ def reset_head_to_commit(package, target_commit, fetch_commit, options = Hash.ne
|
|
951
973
|
rescue ::Exception
|
952
974
|
run_git(package, 'symbolic-ref', "HEAD", target_commit)
|
953
975
|
run_git(package, 'update-ref', "refs/heads/#{local_branch}", current_head)
|
954
|
-
run_git(package, 'checkout', local_branch)
|
976
|
+
run_git(package, 'checkout', "refs/heads/#{local_branch}")
|
955
977
|
raise
|
956
978
|
end
|
957
979
|
true
|
@@ -968,7 +990,7 @@ def determine_target_state(package, only_local: false)
|
|
968
990
|
fetch_commit = current_remote_commit(
|
969
991
|
package,
|
970
992
|
only_local: only_local,
|
971
|
-
refspec: [remote_branch, tag])
|
993
|
+
refspec: [remote_branch_to_ref(remote_branch), tag])
|
972
994
|
end
|
973
995
|
target_commit = pinned_state = rev_parse(package, pinned_state)
|
974
996
|
else
|
@@ -985,7 +1007,7 @@ def update(package, options = Hash.new)
|
|
985
1007
|
validate_importdir(package)
|
986
1008
|
only_local = options.fetch(:only_local, false)
|
987
1009
|
reset = options.fetch(:reset, false)
|
988
|
-
|
1010
|
+
|
989
1011
|
# This is really really a hack to workaround how broken the
|
990
1012
|
# importdir thing is
|
991
1013
|
if package.importdir == package.srcdir
|
@@ -1005,7 +1027,8 @@ def update(package, options = Hash.new)
|
|
1005
1027
|
|
1006
1028
|
unless pin_is_uptodate
|
1007
1029
|
fetch_commit ||= current_remote_commit(
|
1008
|
-
package, only_local: only_local,
|
1030
|
+
package, only_local: only_local,
|
1031
|
+
refspec: [remote_branch_to_ref(remote_branch), tag])
|
1009
1032
|
did_update =
|
1010
1033
|
if reset
|
1011
1034
|
reset_head_to_commit(package, target_commit, fetch_commit,
|
@@ -1073,6 +1096,22 @@ def each_alternate_path(package)
|
|
1073
1096
|
nil
|
1074
1097
|
end
|
1075
1098
|
|
1099
|
+
def uses_lfs?(package)
|
1100
|
+
git_files = run_git(package, 'ls-files').join("\n")
|
1101
|
+
git_attrs = run_git(
|
1102
|
+
package, 'check-attr', '--all', '--stdin',
|
1103
|
+
input_streams: [StringIO.new(git_files)]
|
1104
|
+
).join("\n")
|
1105
|
+
|
1106
|
+
/(.*): filter: lfs/.match(git_attrs)
|
1107
|
+
end
|
1108
|
+
|
1109
|
+
def self.lfs_installed?
|
1110
|
+
return @lfs_installed unless @lfs_installed.nil?
|
1111
|
+
_, _, status = Open3.capture3('git lfs env')
|
1112
|
+
@lfs_installed = status.success?
|
1113
|
+
end
|
1114
|
+
|
1076
1115
|
def checkout(package, options = Hash.new)
|
1077
1116
|
base_dir = File.expand_path('..', package.importdir)
|
1078
1117
|
if !File.directory?(base_dir)
|
@@ -1084,6 +1123,10 @@ def checkout(package, options = Hash.new)
|
|
1084
1123
|
clone_options << '--recurse-submodules'
|
1085
1124
|
end
|
1086
1125
|
if single_branch?
|
1126
|
+
if remote_branch.start_with?("refs/")
|
1127
|
+
raise ArgumentError, "you cannot provide a full ref for"\
|
1128
|
+
" the remote branch while cloning a single branch"
|
1129
|
+
end
|
1087
1130
|
clone_options << "--branch=#{remote_branch}" << "--single-branch"
|
1088
1131
|
end
|
1089
1132
|
each_alternate_path(package) do |path|
|
@@ -1096,7 +1139,7 @@ def checkout(package, options = Hash.new)
|
|
1096
1139
|
Autobuild.tool('git'), 'clone', '-o', remote_name, *clone_options, repository, package.importdir, retry: true)
|
1097
1140
|
|
1098
1141
|
update_remotes_configuration(package)
|
1099
|
-
update(package, only_local:
|
1142
|
+
update(package, only_local: !remote_branch.start_with?("refs/"), reset: true)
|
1100
1143
|
if with_submodules?
|
1101
1144
|
run_git(package, "submodule", "update", '--init')
|
1102
1145
|
end
|
@@ -1106,9 +1149,14 @@ def checkout(package, options = Hash.new)
|
|
1106
1149
|
def relocate(repository, options = Hash.new)
|
1107
1150
|
options = Hash[options.map { |k, v| [k.to_sym, v] }]
|
1108
1151
|
|
1109
|
-
@push_to = options[:push_to] || @push_to
|
1110
1152
|
local_branch = options[:local_branch] || options[:branch] || self.local_branch || 'master'
|
1111
1153
|
remote_branch = options[:remote_branch] || options[:branch] || self.remote_branch || 'master'
|
1154
|
+
if local_branch.start_with?("refs/")
|
1155
|
+
raise ArgumentError, "you cannot provide a full ref for"\
|
1156
|
+
" the local branch, only for the remote branch"
|
1157
|
+
end
|
1158
|
+
|
1159
|
+
@push_to = options[:push_to] || @push_to
|
1112
1160
|
@branch = @local_branch = @remote_branch = nil
|
1113
1161
|
if local_branch == remote_branch
|
1114
1162
|
@branch = local_branch
|
data/lib/autobuild/package.rb
CHANGED
@@ -132,6 +132,9 @@ def initialize(spec = Hash.new)
|
|
132
132
|
@in_dir_stack = Array.new
|
133
133
|
@utilities = Hash.new
|
134
134
|
@env = Array.new
|
135
|
+
@imported = false
|
136
|
+
@prepared = false
|
137
|
+
@built = false
|
135
138
|
|
136
139
|
if Hash === spec
|
137
140
|
name, depends = spec.to_a.first
|
@@ -153,18 +156,20 @@ def initialize(spec = Hash.new)
|
|
153
156
|
# Define the default tasks
|
154
157
|
task "#{name}-import" do
|
155
158
|
isolate_errors { import }
|
159
|
+
@imported = true
|
156
160
|
end
|
157
161
|
task :import => "#{name}-import"
|
158
162
|
|
159
163
|
# Define the prepare task
|
160
164
|
task "#{name}-prepare" => "#{name}-import" do
|
161
165
|
isolate_errors { prepare }
|
166
|
+
@prepared = true
|
162
167
|
end
|
163
168
|
task :prepare => "#{name}-prepare"
|
164
169
|
|
165
170
|
task "#{name}-build"
|
166
|
-
task :build => "#{name}-build"
|
167
171
|
|
172
|
+
task :build => "#{name}-build"
|
168
173
|
task(name) do
|
169
174
|
Rake::Task["#{name}-import"].invoke
|
170
175
|
Rake::Task["#{name}-prepare"].invoke
|
@@ -185,6 +190,30 @@ def checked_out?
|
|
185
190
|
File.directory?(srcdir)
|
186
191
|
end
|
187
192
|
|
193
|
+
def prepare_invoked?
|
194
|
+
task("#{name}-prepare").already_invoked?
|
195
|
+
end
|
196
|
+
|
197
|
+
def prepared?
|
198
|
+
@prepared
|
199
|
+
end
|
200
|
+
|
201
|
+
def import_invoked?
|
202
|
+
task("#{name}-import").already_invoked?
|
203
|
+
end
|
204
|
+
|
205
|
+
def imported?
|
206
|
+
@imported
|
207
|
+
end
|
208
|
+
|
209
|
+
def build_invoked?
|
210
|
+
task("#{name}-build").already_invoked?
|
211
|
+
end
|
212
|
+
|
213
|
+
def built?
|
214
|
+
@built
|
215
|
+
end
|
216
|
+
|
188
217
|
def to_s
|
189
218
|
"#<#{self.class} name=#{name}>"
|
190
219
|
end
|
@@ -422,6 +451,7 @@ def import(options = Hash.new)
|
|
422
451
|
|
423
452
|
if @importer
|
424
453
|
result = @importer.import(self, options)
|
454
|
+
@imported = true
|
425
455
|
elsif update?
|
426
456
|
message "%s: no importer defined, doing nothing"
|
427
457
|
end
|
@@ -443,6 +473,8 @@ def prepare
|
|
443
473
|
isolate_errors { install }
|
444
474
|
end
|
445
475
|
task "#{name}-build" => installstamp
|
476
|
+
|
477
|
+
@prepared = true
|
446
478
|
end
|
447
479
|
|
448
480
|
def process_formatting_string(msg, *prefix_style)
|
@@ -522,6 +554,8 @@ def install
|
|
522
554
|
progress_done
|
523
555
|
|
524
556
|
Autobuild.touch_stamp(installstamp)
|
557
|
+
|
558
|
+
@built = true
|
525
559
|
end
|
526
560
|
|
527
561
|
def run(*args, &block)
|
data/lib/autobuild/subcommand.rb
CHANGED
@@ -348,12 +348,17 @@ def self.run(target, phase, *command)
|
|
348
348
|
end
|
349
349
|
end
|
350
350
|
|
351
|
+
readbuffer = StringIO.new
|
352
|
+
|
351
353
|
# Feed the input
|
352
354
|
if !input_streams.empty?
|
353
355
|
pread.close
|
354
356
|
begin
|
355
357
|
input_streams.each do |instream|
|
356
|
-
instream.each_line
|
358
|
+
instream.each_line do |line|
|
359
|
+
readbuffer.write(outread.readpartial(128)) while IO.select([outread], nil, nil, 0)
|
360
|
+
pwrite.write(line)
|
361
|
+
end
|
357
362
|
end
|
358
363
|
rescue Errno::ENOENT => e
|
359
364
|
raise Failed.new(nil, false),
|
@@ -387,6 +392,14 @@ def self.run(target, phase, *command)
|
|
387
392
|
# If the caller asked for process output, provide it to him
|
388
393
|
# line-by-line.
|
389
394
|
outwrite.close
|
395
|
+
|
396
|
+
if !input_streams.empty?
|
397
|
+
readbuffer.write(outread.read)
|
398
|
+
readbuffer.seek(0)
|
399
|
+
outread.close
|
400
|
+
outread = readbuffer
|
401
|
+
end
|
402
|
+
|
390
403
|
outread.each_line do |line|
|
391
404
|
line.force_encoding(options[:encoding])
|
392
405
|
line = line.chomp
|
data/lib/autobuild/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: autobuild
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Joyeux
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|