autobuild 1.20.0 → 1.23.0
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.
- 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 +7 -6
- data/bin/autobuild +1 -1
- data/lib/autobuild/build_logfile.rb +1 -2
- data/lib/autobuild/config.rb +5 -5
- data/lib/autobuild/environment.rb +126 -58
- data/lib/autobuild/exceptions.rb +13 -6
- data/lib/autobuild/import/archive.rb +33 -23
- 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 +155 -73
- data/lib/autobuild/import/hg.rb +7 -7
- data/lib/autobuild/import/svn.rb +17 -10
- data/lib/autobuild/importer.rb +37 -39
- data/lib/autobuild/mail_reporter.rb +5 -2
- data/lib/autobuild/package.rb +28 -15
- data/lib/autobuild/packages/autotools.rb +6 -10
- data/lib/autobuild/packages/cmake.rb +13 -9
- 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 +19 -8
- data/lib/autobuild/packages/ruby.rb +5 -5
- data/lib/autobuild/parallel.rb +9 -17
- data/lib/autobuild/pkgconfig.rb +1 -0
- data/lib/autobuild/progress_display.rb +67 -43
- data/lib/autobuild/rake_task_extension.rb +6 -0
- data/lib/autobuild/reporting.rb +15 -9
- data/lib/autobuild/subcommand.rb +30 -26
- data/lib/autobuild/test_utility.rb +6 -3
- data/lib/autobuild/timestamps.rb +3 -3
- data/lib/autobuild/utility.rb +22 -4
- data/lib/autobuild/version.rb +1 -1
- data/lib/autobuild.rb +0 -3
- metadata +28 -26
- data/.travis.yml +0 -19
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
|
#
|
@@ -37,7 +40,8 @@ module Autobuild
|
|
37
40
|
@default_alternates = cache_dirs.map do |path|
|
38
41
|
File.join(File.expand_path(path), '%s')
|
39
42
|
end
|
40
|
-
else
|
43
|
+
else
|
44
|
+
Array.new
|
41
45
|
end
|
42
46
|
end
|
43
47
|
end
|
@@ -54,7 +58,7 @@ module Autobuild
|
|
54
58
|
def self.version
|
55
59
|
version = Subprocess.run('git', 'setup', Autobuild.tool(:git), '--version').
|
56
60
|
first
|
57
|
-
if version =~ /^git version (\d[\d
|
61
|
+
if version =~ /^git version (\d[\d.]+)/
|
58
62
|
$1.split(".").map { |i| Integer(i) }
|
59
63
|
else
|
60
64
|
raise ArgumentError, "cannot parse git version string #{version}, "\
|
@@ -139,16 +143,16 @@ module Autobuild
|
|
139
143
|
end
|
140
144
|
|
141
145
|
gitopts, common = Kernel.filter_options options,
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
146
|
+
push_to: nil,
|
147
|
+
branch: nil,
|
148
|
+
local_branch: nil,
|
149
|
+
remote_branch: nil,
|
150
|
+
tag: nil,
|
151
|
+
commit: nil,
|
152
|
+
repository_id: nil,
|
153
|
+
source_id: nil,
|
154
|
+
with_submodules: false,
|
155
|
+
single_branch: false
|
152
156
|
if gitopts[:branch] && branch
|
153
157
|
raise ConfigException, "git branch specified with both the option hash "\
|
154
158
|
"and the explicit parameter"
|
@@ -293,6 +297,68 @@ module Autobuild
|
|
293
297
|
git_dir(package, true)
|
294
298
|
end
|
295
299
|
|
300
|
+
# Return the remote head branch from local copy if exists, if not return nil
|
301
|
+
#
|
302
|
+
# @param [Package] package
|
303
|
+
def try_resolve_remote_head_from_local(package)
|
304
|
+
ls_local_string = run_git_bare(
|
305
|
+
package, 'symbolic-ref',
|
306
|
+
"refs/remotes/#{@remote_name}/HEAD"
|
307
|
+
).first.strip
|
308
|
+
local_remote_head = ls_local_string.match("refs/remotes/#{@remote_name}/(.*)")
|
309
|
+
local_remote_head ? local_remote_head[1] : nil
|
310
|
+
rescue Autobuild::SubcommandFailed # rubocop:disable Lint/SuppressedException
|
311
|
+
end
|
312
|
+
|
313
|
+
# Return the remote head branch from server if exists, if not return 'master'
|
314
|
+
#
|
315
|
+
# @param [Package] package
|
316
|
+
def try_resolve_remote_head_from_server(package)
|
317
|
+
ls_remote_string = package.run(
|
318
|
+
:import,
|
319
|
+
Autobuild.tool('git'), 'ls-remote', '--symref', repository
|
320
|
+
).first.strip
|
321
|
+
server_remote_head =
|
322
|
+
ls_remote_string.match("ref:[^A-z]refs/heads/(.*)[^A-z]HEAD")
|
323
|
+
server_remote_head ? server_remote_head[1] : 'master'
|
324
|
+
end
|
325
|
+
|
326
|
+
# Return default local branch if exists, if not return the default remote branch
|
327
|
+
#
|
328
|
+
# @param [Package] package
|
329
|
+
def resolve_remote_head(package, only_local: false)
|
330
|
+
try_resolve_remote_head_from_local(package) ||
|
331
|
+
(!only_local && try_resolve_remote_head_from_server(package))
|
332
|
+
end
|
333
|
+
|
334
|
+
# Whether both the local and remote branches are known
|
335
|
+
#
|
336
|
+
# See documentation of {#resolve_all_branches}
|
337
|
+
def has_all_branches?
|
338
|
+
remote_branch && local_branch
|
339
|
+
end
|
340
|
+
|
341
|
+
# Resolve branches based on the remote's HEAD
|
342
|
+
#
|
343
|
+
# Since GitHub (and others) decided to change the name of the "default"
|
344
|
+
# branch, we can't assume that master is ... well ... master.
|
345
|
+
#
|
346
|
+
# For this reason, a Git importer does not have a built-in default.
|
347
|
+
# If the branch(es) are not provided explicitly, the importer will
|
348
|
+
# call this method to guess the name of the default branch instead.
|
349
|
+
#
|
350
|
+
# Call {#has_all_branches?} to determine whether it is necessary
|
351
|
+
def resolve_all_branches(package, only_local: false)
|
352
|
+
default_branch = resolve_remote_head(package, only_local: only_local)
|
353
|
+
unless default_branch
|
354
|
+
raise NetworkAccessNeeded,
|
355
|
+
"determining the remote branch would require access to "\
|
356
|
+
"the network, and only_local is true"
|
357
|
+
end
|
358
|
+
|
359
|
+
relocate(repository, default_branch: default_branch)
|
360
|
+
end
|
361
|
+
|
296
362
|
# @api private
|
297
363
|
#
|
298
364
|
# Resolves the git directory associated with path, and tells whether it
|
@@ -366,12 +432,12 @@ module Autobuild
|
|
366
432
|
def self.validate_git_dir(package, require_working_copy, _dir, style)
|
367
433
|
if !style
|
368
434
|
raise ConfigException.new(package, 'import', retry: false),
|
369
|
-
|
370
|
-
|
435
|
+
"while importing #{package.name}, #{package.importdir} "\
|
436
|
+
"does not point to a git repository"
|
371
437
|
elsif require_working_copy && (style == :bare)
|
372
438
|
raise ConfigException.new(package, 'import', retry: false),
|
373
|
-
|
374
|
-
|
439
|
+
"while importing #{package.name}, #{package.importdir} "\
|
440
|
+
"points to a bare git repository but a working copy was required"
|
375
441
|
end
|
376
442
|
end
|
377
443
|
|
@@ -476,22 +542,28 @@ module Autobuild
|
|
476
542
|
# @api private
|
477
543
|
#
|
478
544
|
# Set a remote up in the repositorie's configuration
|
479
|
-
def setup_remote(
|
545
|
+
def setup_remote(
|
546
|
+
package, remote_name, repository, push_to = repository,
|
547
|
+
only_local: true
|
548
|
+
)
|
549
|
+
resolve_all_branches(package, only_local: only_local) unless has_all_branches?
|
550
|
+
|
480
551
|
run_git_bare(package, 'config', '--replace-all',
|
481
|
-
|
552
|
+
"remote.#{remote_name}.url", repository)
|
482
553
|
run_git_bare(package, 'config', '--replace-all',
|
483
|
-
|
554
|
+
"remote.#{remote_name}.pushurl", push_to || repository)
|
484
555
|
run_git_bare(package, 'config', '--replace-all',
|
485
|
-
|
486
|
-
|
556
|
+
"remote.#{remote_name}.fetch",
|
557
|
+
"+refs/heads/*:refs/remotes/#{remote_name}/*")
|
487
558
|
|
488
559
|
if remote_branch && local_branch
|
560
|
+
remote_ref = remote_branch_to_ref(remote_branch)
|
489
561
|
run_git_bare(package, 'config', '--replace-all',
|
490
|
-
|
491
|
-
|
562
|
+
"remote.#{remote_name}.push",
|
563
|
+
"refs/heads/#{local_branch}:#{remote_ref}")
|
492
564
|
else
|
493
565
|
run_git_bare(package, 'config', '--replace-all',
|
494
|
-
|
566
|
+
"remote.#{remote_name}.push", "refs/heads/*:refs/heads/*")
|
495
567
|
end
|
496
568
|
end
|
497
569
|
|
@@ -510,23 +582,24 @@ module Autobuild
|
|
510
582
|
# @api private
|
511
583
|
#
|
512
584
|
# Updates the git repository's configuration for the target remote
|
513
|
-
def update_remotes_configuration(package)
|
585
|
+
def update_remotes_configuration(package, only_local: true)
|
514
586
|
each_configured_remote do |*args|
|
515
|
-
setup_remote(package, *args)
|
587
|
+
setup_remote(package, *args, only_local: only_local)
|
516
588
|
end
|
517
589
|
|
518
590
|
if local_branch
|
519
591
|
run_git_bare(package, 'config', '--replace-all',
|
520
|
-
|
592
|
+
"branch.#{local_branch}.remote", remote_name)
|
521
593
|
run_git_bare(package, 'config', '--replace-all',
|
522
|
-
|
594
|
+
"branch.#{local_branch}.merge",
|
595
|
+
remote_branch_to_ref(local_branch))
|
523
596
|
end
|
524
597
|
end
|
525
598
|
|
526
599
|
# Resolve a commit ref to a tag or commit ID
|
527
600
|
def describe_rev(package, rev)
|
528
601
|
tag = run_git_bare(package, 'describe',
|
529
|
-
|
602
|
+
'--tags', '--exact-match', rev).first.strip
|
530
603
|
[true, tag.encode('UTF-8')]
|
531
604
|
rescue Autobuild::SubcommandFailed
|
532
605
|
commit = rev_parse(package, rev)
|
@@ -584,7 +657,7 @@ module Autobuild
|
|
584
657
|
refspec.zip(fetched_commits).each do |spec, commit_id|
|
585
658
|
if spec =~ %r{^refs/heads/(.*)$}
|
586
659
|
run_git_bare(package, 'update-ref', "-m", "updated by autobuild",
|
587
|
-
|
660
|
+
"refs/remotes/#{remote_name}/#{$1}", commit_id)
|
588
661
|
end
|
589
662
|
end
|
590
663
|
|
@@ -641,7 +714,7 @@ module Autobuild
|
|
641
714
|
run_git_bare(package, 'show-ref', '-s', refspec).first.strip
|
642
715
|
rescue SubcommandFailed
|
643
716
|
raise PackageException.new(package, "import"),
|
644
|
-
|
717
|
+
"cannot resolve #{refspec}"
|
645
718
|
end
|
646
719
|
else
|
647
720
|
refspec =
|
@@ -650,7 +723,7 @@ module Autobuild
|
|
650
723
|
remote_branch_to_ref(remote_branch)
|
651
724
|
begin fetch_remote(package, refspec: refspec)
|
652
725
|
rescue Exception => e
|
653
|
-
|
726
|
+
fallback(e, package, :status, package, only_local)
|
654
727
|
end
|
655
728
|
end
|
656
729
|
end
|
@@ -666,6 +739,8 @@ module Autobuild
|
|
666
739
|
end
|
667
740
|
|
668
741
|
validate_importdir(package)
|
742
|
+
resolve_all_branches(package, only_local: only_local) unless has_all_branches?
|
743
|
+
|
669
744
|
_pinned_state, target_commit, = determine_target_state(
|
670
745
|
package, only_local: only_local)
|
671
746
|
|
@@ -690,23 +765,25 @@ module Autobuild
|
|
690
765
|
rescue SubcommandFailed => e
|
691
766
|
if e.status == 1
|
692
767
|
false
|
693
|
-
else
|
768
|
+
else
|
769
|
+
raise
|
694
770
|
end
|
695
771
|
end
|
696
772
|
|
697
773
|
def has_branch?(package, branch_name)
|
698
774
|
run_git_bare(package, 'show-ref', '-q', '--verify',
|
699
|
-
|
775
|
+
remote_branch_to_ref(branch_name))
|
700
776
|
true
|
701
777
|
rescue SubcommandFailed => e
|
702
778
|
if e.status == 1
|
703
779
|
false
|
704
|
-
else
|
780
|
+
else
|
781
|
+
raise
|
705
782
|
end
|
706
783
|
end
|
707
784
|
|
708
785
|
def has_local_branch?(package)
|
709
|
-
has_branch?(package, local_branch)
|
786
|
+
has_branch?(package, local_branch) if local_branch
|
710
787
|
end
|
711
788
|
|
712
789
|
def detached_head?(package)
|
@@ -714,6 +791,8 @@ module Autobuild
|
|
714
791
|
end
|
715
792
|
|
716
793
|
private def remote_branch_to_ref(branch)
|
794
|
+
return unless branch
|
795
|
+
|
717
796
|
if branch.start_with?("refs/")
|
718
797
|
branch
|
719
798
|
else
|
@@ -750,9 +829,7 @@ module Autobuild
|
|
750
829
|
#
|
751
830
|
# This is the value returned by {Git#status}
|
752
831
|
class Status < Importer::Status
|
753
|
-
attr_reader :fetch_commit
|
754
|
-
attr_reader :head_commit
|
755
|
-
attr_reader :common_commit
|
832
|
+
attr_reader :fetch_commit, :head_commit, :common_commit
|
756
833
|
|
757
834
|
def initialize(package, status, remote_commit, local_commit, common_commit)
|
758
835
|
super()
|
@@ -797,8 +874,8 @@ module Autobuild
|
|
797
874
|
run_git_bare(package, 'rev-parse', '-q', '--verify', name).first
|
798
875
|
rescue Autobuild::SubcommandFailed
|
799
876
|
raise PackageException.new(package, 'import'),
|
800
|
-
|
801
|
-
|
877
|
+
"failed to resolve #{name}. "\
|
878
|
+
"Are you sure this commit, branch or tag exists ?"
|
802
879
|
end
|
803
880
|
|
804
881
|
# Returns the file's conents at a certain commit
|
@@ -811,7 +888,7 @@ module Autobuild
|
|
811
888
|
run_git_bare(package, 'show', "#{commit}:#{path}").join("\n")
|
812
889
|
rescue Autobuild::SubcommandFailed
|
813
890
|
raise PackageException.new(package, 'import'),
|
814
|
-
|
891
|
+
"failed to either resolve commit #{commit} or file #{path}"
|
815
892
|
end
|
816
893
|
|
817
894
|
# Tests whether a commit is already present in a given history
|
@@ -845,7 +922,7 @@ module Autobuild
|
|
845
922
|
def describe_commit_on_remote(package, rev = 'HEAD', options = Hash.new)
|
846
923
|
rev = rev.to_str
|
847
924
|
options = Kernel.validate_options options,
|
848
|
-
|
925
|
+
tags: true
|
849
926
|
|
850
927
|
commit_id = rev_parse(package, rev)
|
851
928
|
|
@@ -875,15 +952,13 @@ module Autobuild
|
|
875
952
|
end
|
876
953
|
|
877
954
|
remote_refs.delete_if do |rev_name, rev_id|
|
878
|
-
begin
|
879
955
|
if commit_present_in?(package, commit_id, rev_id)
|
880
956
|
return rev_name
|
881
957
|
else
|
882
958
|
true
|
883
959
|
end
|
884
|
-
|
960
|
+
rescue PackageException
|
885
961
|
false
|
886
|
-
end
|
887
962
|
end
|
888
963
|
|
889
964
|
unless remote_refs.empty?
|
@@ -909,7 +984,7 @@ module Autobuild
|
|
909
984
|
def merge_status(package, fetch_commit, reference_commit = "HEAD")
|
910
985
|
begin
|
911
986
|
common_commit = run_git_bare(package, 'merge-base',
|
912
|
-
|
987
|
+
reference_commit, fetch_commit).first.strip
|
913
988
|
rescue Exception
|
914
989
|
raise PackageException.new(package, 'import'), "failed to find "\
|
915
990
|
"the merge-base between #{reference_commit} and #{fetch_commit}. "\
|
@@ -942,13 +1017,14 @@ module Autobuild
|
|
942
1017
|
# @return [void]
|
943
1018
|
def update_alternates(package)
|
944
1019
|
alternates_path = File.join(git_dir(package, false),
|
945
|
-
|
1020
|
+
'objects', 'info', 'alternates')
|
946
1021
|
current_alternates =
|
947
1022
|
if File.file?(alternates_path)
|
948
1023
|
File.readlines(alternates_path)
|
949
1024
|
.map(&:strip)
|
950
1025
|
.find_all { |l| !l.empty? }
|
951
|
-
else
|
1026
|
+
else
|
1027
|
+
Array.new
|
952
1028
|
end
|
953
1029
|
|
954
1030
|
alternates = each_alternate_path(package).map do |path|
|
@@ -1007,18 +1083,18 @@ module Autobuild
|
|
1007
1083
|
# changes
|
1008
1084
|
unless commit_present_in?(package, current_head, fetch_commit)
|
1009
1085
|
raise ImporterCannotReset.new(package, 'import'),
|
1010
|
-
|
1011
|
-
|
1012
|
-
|
1013
|
-
|
1014
|
-
|
1015
|
-
|
1016
|
-
|
1086
|
+
"branch #{local_branch} of #{package.name} contains"\
|
1087
|
+
" commits that do not seem to be present on the branch"\
|
1088
|
+
" #{remote_branch} of the remote repository. I can't"\
|
1089
|
+
" go on as it could make you lose some stuff. Update"\
|
1090
|
+
" the remote branch in your overrides, push your"\
|
1091
|
+
" changes or reset to the remote commit manually"\
|
1092
|
+
" before trying again"
|
1017
1093
|
end
|
1018
1094
|
end
|
1019
1095
|
|
1020
1096
|
package.message format(" %%s: resetting branch %<branch>s to %<commit>s",
|
1021
|
-
|
1097
|
+
branch: local_branch, commit: target_commit)
|
1022
1098
|
# I don't use a reset --hard here as it would add even more
|
1023
1099
|
# restrictions on when we can do the operation (as we would refuse
|
1024
1100
|
# doing it if there are local changes). The checkout creates a
|
@@ -1029,7 +1105,7 @@ module Autobuild
|
|
1029
1105
|
begin
|
1030
1106
|
run_git(package, 'checkout', target_commit)
|
1031
1107
|
run_git(package, 'update-ref', "refs/heads/#{local_branch}",
|
1032
|
-
|
1108
|
+
resolved_target_commit)
|
1033
1109
|
run_git(package, 'symbolic-ref', "HEAD", "refs/heads/#{local_branch}")
|
1034
1110
|
rescue ::Exception
|
1035
1111
|
run_git(package, 'symbolic-ref', "HEAD", target_commit)
|
@@ -1065,6 +1141,9 @@ module Autobuild
|
|
1065
1141
|
# @option (see Package#update)
|
1066
1142
|
def update(package, options = Hash.new)
|
1067
1143
|
validate_importdir(package)
|
1144
|
+
|
1145
|
+
resolve_all_branches(package) unless has_all_branches?
|
1146
|
+
|
1068
1147
|
only_local = options.fetch(:only_local, false)
|
1069
1148
|
reset = options.fetch(:reset, false)
|
1070
1149
|
|
@@ -1084,20 +1163,21 @@ module Autobuild
|
|
1084
1163
|
end
|
1085
1164
|
|
1086
1165
|
unless pin_is_uptodate
|
1087
|
-
fetch_commit ||= current_remote_commit(
|
1088
|
-
only_local: only_local,
|
1089
|
-
|
1166
|
+
fetch_commit ||= current_remote_commit(
|
1167
|
+
package, only_local: only_local,
|
1168
|
+
refspec: [remote_branch_to_ref(remote_branch), tag]
|
1169
|
+
)
|
1090
1170
|
did_update =
|
1091
1171
|
if reset
|
1092
1172
|
reset_head_to_commit(package, target_commit, fetch_commit,
|
1093
|
-
|
1173
|
+
force: (reset == :force))
|
1094
1174
|
else
|
1095
1175
|
merge_if_simple(package, target_commit)
|
1096
1176
|
end
|
1097
1177
|
end
|
1098
1178
|
|
1099
1179
|
if !only_local && with_submodules?
|
1100
|
-
run_git(package, "submodule", "update", '--init')
|
1180
|
+
run_git(package, "submodule", "update", '--init', '--recursive')
|
1101
1181
|
did_update = true
|
1102
1182
|
end
|
1103
1183
|
|
@@ -1107,12 +1187,12 @@ module Autobuild
|
|
1107
1187
|
private def ensure_on_local_branch(package, target_commit)
|
1108
1188
|
if !has_local_branch?(package)
|
1109
1189
|
package.message format("%%s: checking out branch %<branch>s",
|
1110
|
-
|
1190
|
+
branch: local_branch)
|
1111
1191
|
run_git(package, 'checkout', '-b', local_branch, target_commit)
|
1112
1192
|
true
|
1113
1193
|
elsif !on_local_branch?(package)
|
1114
1194
|
package.message format("%%s: switching to branch %<branch>s",
|
1115
|
-
|
1195
|
+
branch: local_branch)
|
1116
1196
|
run_git(package, 'checkout', local_branch)
|
1117
1197
|
true
|
1118
1198
|
else
|
@@ -1195,28 +1275,30 @@ module Autobuild
|
|
1195
1275
|
clone_options << "--config=#{key}=#{value}"
|
1196
1276
|
end
|
1197
1277
|
package.run(:import,
|
1198
|
-
|
1199
|
-
|
1278
|
+
Autobuild.tool('git'), 'clone', '-o', remote_name, *clone_options,
|
1279
|
+
repository, package.importdir, retry: true)
|
1200
1280
|
|
1201
1281
|
update_remotes_configuration(package)
|
1202
1282
|
update(package, only_local: !remote_branch.start_with?("refs/"),
|
1203
1283
|
reset: :force)
|
1204
|
-
|
1284
|
+
if with_submodules?
|
1285
|
+
run_git(package, "submodule", "update", '--init', '--recursive')
|
1286
|
+
end
|
1205
1287
|
end
|
1206
1288
|
|
1207
1289
|
# Changes the repository this importer is pointing to
|
1208
1290
|
def relocate(repository, options = Hash.new)
|
1209
|
-
options =
|
1291
|
+
options = options.transform_keys(&:to_sym)
|
1210
1292
|
|
1211
1293
|
local_branch =
|
1212
1294
|
options[:local_branch] || options[:branch] ||
|
1213
|
-
self.local_branch ||
|
1295
|
+
self.local_branch || options[:default_branch] || nil
|
1214
1296
|
remote_branch =
|
1215
1297
|
options[:remote_branch] || options[:branch] ||
|
1216
|
-
self.remote_branch ||
|
1217
|
-
if local_branch
|
1298
|
+
self.remote_branch || options[:default_branch] || nil
|
1299
|
+
if local_branch&.start_with?("refs/")
|
1218
1300
|
raise ArgumentError, "you cannot provide a full ref for"\
|
1219
|
-
|
1301
|
+
" the local branch, only for the remote branch"
|
1220
1302
|
end
|
1221
1303
|
|
1222
1304
|
@push_to = options[:push_to] || @push_to
|
data/lib/autobuild/import/hg.rb
CHANGED
@@ -17,9 +17,9 @@ module Autobuild
|
|
17
17
|
# @option options [String] :branch (default) the branch to track
|
18
18
|
def initialize(repository, options = {})
|
19
19
|
hgopts, _common = Kernel.filter_options options,
|
20
|
-
|
20
|
+
branch: 'default'
|
21
21
|
sourceopts, common = Kernel.filter_options options,
|
22
|
-
|
22
|
+
:repository_id, :source_id
|
23
23
|
|
24
24
|
super(common)
|
25
25
|
@branch = hgopts[:branch]
|
@@ -48,8 +48,8 @@ module Autobuild
|
|
48
48
|
def validate_importdir(package)
|
49
49
|
unless File.directory?(File.join(package.importdir, '.hg'))
|
50
50
|
raise ConfigException.new(package, 'import'),
|
51
|
-
|
52
|
-
|
51
|
+
"while importing #{package.name}, "\
|
52
|
+
"#{package.importdir} is not a hg repository"
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
@@ -61,9 +61,9 @@ module Autobuild
|
|
61
61
|
end
|
62
62
|
validate_importdir(package)
|
63
63
|
package.run(:import, Autobuild.tool('hg'), 'pull',
|
64
|
-
|
64
|
+
repository, retry: true, working_directory: package.importdir)
|
65
65
|
package.run(:import, Autobuild.tool('hg'), 'update',
|
66
|
-
|
66
|
+
branch, working_directory: package.importdir)
|
67
67
|
true # no easy to know if package was updated, keep previous behavior
|
68
68
|
end
|
69
69
|
|
@@ -72,7 +72,7 @@ module Autobuild
|
|
72
72
|
FileUtils.mkdir_p(base_dir) unless File.directory?(base_dir)
|
73
73
|
|
74
74
|
package.run(:import, Autobuild.tool('hg'), 'clone',
|
75
|
-
|
75
|
+
'-u', branch, repository, package.importdir, retry: true)
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
data/lib/autobuild/import/svn.rb
CHANGED
@@ -14,9 +14,11 @@ module Autobuild
|
|
14
14
|
# Autobuild.programs['svn'] = 'my_svn_tool'
|
15
15
|
def initialize(svnroot, options = {})
|
16
16
|
svnroot = [*svnroot].join("/")
|
17
|
-
svnopts, common = Kernel.filter_options
|
17
|
+
svnopts, common = Kernel.filter_options(
|
18
|
+
options,
|
18
19
|
:svnup => [], :svnco => [], :revision => nil,
|
19
20
|
:repository_id => "svn:#{svnroot}"
|
21
|
+
)
|
20
22
|
common[:repository_id] = svnopts.delete(:repository_id)
|
21
23
|
relocate(svnroot, svnopts)
|
22
24
|
super(common.merge(repository_id: svnopts[:repository_id]))
|
@@ -67,7 +69,7 @@ module Autobuild
|
|
67
69
|
revision = svninfo.grep(/^Revision: /).first
|
68
70
|
unless revision
|
69
71
|
raise ConfigException.new(package, 'import'),
|
70
|
-
|
72
|
+
"cannot get SVN information for #{package.importdir}"
|
71
73
|
end
|
72
74
|
revision =~ /Revision: (\d+)/
|
73
75
|
Integer($1)
|
@@ -79,7 +81,9 @@ module Autobuild
|
|
79
81
|
# @return [String]
|
80
82
|
# @raises (see svn_info)
|
81
83
|
def vcs_fingerprint(package)
|
82
|
-
Digest::SHA1.hexdigest(
|
84
|
+
Digest::SHA1.hexdigest(
|
85
|
+
svn_info(package).grep(/^(URL|Revision):/).sort.join("\n")
|
86
|
+
)
|
83
87
|
end
|
84
88
|
|
85
89
|
# Returns the URL of the remote SVN repository
|
@@ -93,7 +97,7 @@ module Autobuild
|
|
93
97
|
url = svninfo.grep(/^URL: /).first
|
94
98
|
unless url
|
95
99
|
raise ConfigException.new(package, 'import'),
|
96
|
-
|
100
|
+
"cannot get SVN information for #{package.importdir}"
|
97
101
|
end
|
98
102
|
url.chomp =~ /URL: (.+)/
|
99
103
|
$1
|
@@ -165,8 +169,9 @@ module Autobuild
|
|
165
169
|
Hash.new
|
166
170
|
end
|
167
171
|
|
168
|
-
options, other_options = Kernel.filter_options
|
169
|
-
working_directory: package.importdir, retry: true
|
172
|
+
options, other_options = Kernel.filter_options(
|
173
|
+
options, working_directory: package.importdir, retry: true
|
174
|
+
)
|
170
175
|
options = options.merge(other_options)
|
171
176
|
package.run(:import, Autobuild.tool(:svn), *args, options, &block)
|
172
177
|
end
|
@@ -197,13 +202,15 @@ module Autobuild
|
|
197
202
|
# Try svn upgrade and info again
|
198
203
|
run_svn(package, 'upgrade', retry: false)
|
199
204
|
svninfo = run_svn(package, 'info')
|
200
|
-
else
|
205
|
+
else
|
206
|
+
raise
|
201
207
|
end
|
202
208
|
end
|
203
209
|
|
204
210
|
unless svninfo.grep(/is not a working copy/).empty?
|
205
211
|
raise ConfigException.new(package, 'import'),
|
206
|
-
|
212
|
+
"#{package.importdir} does not appear to be a "\
|
213
|
+
"Subversion working copy"
|
207
214
|
end
|
208
215
|
svninfo
|
209
216
|
ensure
|
@@ -241,8 +248,8 @@ module Autobuild
|
|
241
248
|
|
242
249
|
def checkout(package, _options = Hash.new) # :nodoc:
|
243
250
|
run_svn(package, 'co', "--non-interactive", *@options_co,
|
244
|
-
|
245
|
-
|
251
|
+
svnroot, package.importdir,
|
252
|
+
working_directory: nil)
|
246
253
|
end
|
247
254
|
end
|
248
255
|
|