autobuild 1.10.0.b2 → 1.10.0.b3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 67c87629da5179c5b58f195daf8679f53bfc4054
4
- data.tar.gz: af790ea0bf7210db55344839c79455b650d1e915
3
+ metadata.gz: 28218a1fe204bc6efd9ae8a5ca2635067dd1aa8f
4
+ data.tar.gz: dc5ea70ceb40b5798c5cbcfdbc53000dc1b0507d
5
5
  SHA512:
6
- metadata.gz: 504fec6fac6c095d815d7541ba6828dc55a62032ae8bfeea548e8c23ae3f29bb4dd2f945a80720fc8110ab0d3e3c2695e26fc3dd05729f94bf102c630cfd73ab
7
- data.tar.gz: 20292807e5da7f402da75132e4ed808e1b89f05eda485b371b7b03c1156827d6886dc4cd31be4a6da46b079c01e7db941b5b74fe5f2ad2a67d37eecbff83bfde
6
+ metadata.gz: a43bb95fbd578877a7559ea37323bdfaedc0a3197bf47a3b283667eb99b3c83d8079bdd4a2627c03ade5802a475e140c93bdf5aadcc075d8f42cb0fec3689c1d
7
+ data.tar.gz: b18e69dfe1aa5373a538d277ba30f455c94555b6de1c8a2335216545f0b37d8761920d1bd454bc9148f8ffed335aaf23e7e4225215ca2073fbbf2a24d770587c
@@ -275,7 +275,10 @@ module Autobuild
275
275
  utilities.keys
276
276
  end
277
277
 
278
- def self.apply(packages, buildname = "autobuild", phases = [])
278
+ def self.apply(packages, buildname = "autobuild", phases = [], options = Hash.new)
279
+ options = Kernel.validate_options options,
280
+ parallel: Autobuild.parallel_build_level
281
+
279
282
  if Autobuild.mail[:to]
280
283
  if !Autobuild::HAS_RMAIL
281
284
  Autobuild.warn "RMail is not available. Mail notification is disabled"
@@ -322,7 +325,7 @@ module Autobuild
322
325
  end
323
326
 
324
327
  begin
325
- invoker = Autobuild::RakeTaskParallelism.new
328
+ invoker = Autobuild::RakeTaskParallelism.new(options[:parallel])
326
329
  Autobuild.parallel_task_manager = invoker
327
330
  phases.each do |phase|
328
331
  invoker.invoke_parallel([Rake::Task["#{buildname}-#{phase}"]])
@@ -364,11 +364,37 @@ module Autobuild
364
364
  end
365
365
  end
366
366
 
367
+ # Resolve a commit ref to a tag or commit ID
368
+ def describe_rev(package, rev)
369
+ tag = run_git_bare(package, 'describe', '--tags', '--exact-match', rev).first.strip
370
+ return true, tag.encode('UTF-8')
371
+ rescue Autobuild::SubcommandFailed
372
+ commit = rev_parse(package, rev)
373
+ return false, commit.encode('UTF-8')
374
+ end
375
+
376
+ # Enumerates the ref that are present on the remote
377
+ #
378
+ # @yieldparam [String] ref_name the ref name
379
+ # @yieldparam [String] commit_id the ref's commit ID
380
+ def each_remote_ref(package)
381
+ return enum_for(__method__, package) if !block_given?
382
+ run_git_bare(package, 'ls-remote', repository).each do |line|
383
+ commit_id, ref_name = line.split(/\s+/)
384
+ if ref_name !~ /\^/
385
+ yield(ref_name, commit_id)
386
+ end
387
+ end
388
+ end
389
+
367
390
  # Fetches updates from the remote repository. Returns the remote commit
368
391
  # ID on success, nil on failure. Expects the current directory to be the
369
392
  # package's source directory.
370
- def fetch_remote(package)
393
+ def fetch_remote(package, options = Hash.new)
371
394
  validate_importdir(package)
395
+ options = Kernel.validate_options options,
396
+ refspec: remote_branch || tag
397
+
372
398
  git_dir = git_dir(package, false)
373
399
 
374
400
  # If we are checking out a specific commit, we don't know which
@@ -381,7 +407,7 @@ module Autobuild
381
407
  # Doing it now is better as it makes sure that we replace the
382
408
  # configuration parameters only if the repository and branch are
383
409
  # OK (i.e. we keep old working configuration instead)
384
- refspec = [branch || tag].compact
410
+ refspec = Array(options[:refspec])
385
411
  run_git_bare(package, 'fetch', '--tags', repository, *refspec, retry: true)
386
412
 
387
413
  update_remotes_configuration(package)
@@ -397,7 +423,7 @@ module Autobuild
397
423
  end
398
424
 
399
425
  # Update the remote tag if needs be
400
- if branch && commit_id
426
+ if remote_branch && commit_id
401
427
  run_git_bare(package, 'update-ref', "-m", "updated by autobuild", "refs/remotes/#{remote_name}/#{remote_branch}", commit_id)
402
428
  end
403
429
 
@@ -445,6 +471,13 @@ module Autobuild
445
471
  remote_commit = current_remote_commit(package, only_local)
446
472
  status = merge_status(package, remote_commit)
447
473
  status.uncommitted_code = self.class.has_uncommitted_changes?(package)
474
+ if current_branch = self.current_branch(package)
475
+ if current_branch != "refs/heads/#{local_branch}"
476
+ status.unexpected_working_copy_state << "working copy is on branch #{current_branch}, the autoproj configuration expected it to be on #{local_branch}"
477
+ end
478
+ else
479
+ status.unexpected_working_copy_state << "working copy is on a detached HEAD"
480
+ end
448
481
  status
449
482
  end
450
483
 
@@ -553,7 +586,7 @@ module Autobuild
553
586
  # Tests whether a commit is already present in a given history
554
587
  #
555
588
  # @param [Package] the package we are working on
556
- # @param [String] commit the commit ID we want to verify the presence of
589
+ # @param [String] rev what we want to verify the presence of
557
590
  # @param [String] reference the reference commit. The method tests that
558
591
  # 'commit' is present in the history of 'reference'
559
592
  #
@@ -569,6 +602,71 @@ module Autobuild
569
602
  end
570
603
  end
571
604
 
605
+ # Finds a remote reference that contains a commit
606
+ #
607
+ # It will favor the configured {#remote_branch} if it matches
608
+ #
609
+ # @param [Autobuild::Package] package the package we are working on
610
+ # @param [String] commit_id the commit ID (can be a rev)
611
+ # @return [String] a remote ref
612
+ # @raise [PackageException] if there is no such commit on the remote
613
+ def describe_commit_on_remote(package, rev = 'HEAD', options = Hash.new)
614
+ rev = rev.to_str
615
+ options = Kernel.validate_options options,
616
+ tags: true
617
+
618
+ commit_id = rev_parse(package, rev)
619
+
620
+ remote_refs = Hash[*each_remote_ref(package).to_a.flatten]
621
+ remote_branch_ref = "refs/heads/#{remote_branch}"
622
+ remote_branch_id = remote_refs.delete(remote_branch_ref)
623
+ begin
624
+ if commit_present_in?(package, commit_id, remote_branch_id)
625
+ return remote_branch
626
+ end
627
+ rescue PackageException # We have to fetch. Fetch all branches at once
628
+ fetch_remote(package, refspec: [remote_branch_ref, *remote_refs.keys])
629
+ if commit_present_in?(package, commit_id, remote_branch_id)
630
+ return remote_branch
631
+ end
632
+ end
633
+
634
+ if !options[:tags]
635
+ remote_refs.delete_if { |r| r =~ /^refs\/tags\// }
636
+ end
637
+
638
+ # Prefer tags, then heads, then the rest (e.g. github pull requests)
639
+ remote_refs = remote_refs.sort_by do |rev_name, rev_id|
640
+ case rev_name
641
+ when /^refs\/tags\// then 0
642
+ when /^refs\/heads\// then 1
643
+ else 2
644
+ end
645
+ end
646
+
647
+ remote_refs.delete_if do |rev_name, rev_id|
648
+ begin
649
+ if commit_present_in?(package, commit_id, rev_id)
650
+ return rev_name
651
+ end
652
+ true
653
+ rescue PackageException
654
+ false
655
+ end
656
+ end
657
+
658
+ if !remote_refs.empty?
659
+ fetch_remote(package, refspec: remote_refs.map(&:first))
660
+ remote_refs.each do |rev_name, rev_id|
661
+ if commit_present_in?(package, commit_id, rev_id)
662
+ return rev_name
663
+ end
664
+ end
665
+ end
666
+
667
+ raise PackageException.new(package), "current HEAD (#{commit_id}) does not seem to be present on the remote"
668
+ end
669
+
572
670
  # Computes the update status to update a branch whose tip is at
573
671
  # reference_commit (which can be a symbolic reference) using the
574
672
  # fetch_commit commit
@@ -798,8 +896,18 @@ module Autobuild
798
896
 
799
897
  # Changes the repository this importer is pointing to
800
898
  def relocate(repository, options = Hash.new)
899
+ options = Hash[options.map { |k, v| [k.to_sym, v] }]
900
+
801
901
  @push_to = options[:push_to] || @push_to
802
- @branch = options[:branch] || @branch || 'master'
902
+ @branch = @local_branch = @remote_branch = nil
903
+ local_branch = options[:local_branch] || options[:branch] || local_branch || 'master'
904
+ remote_branch = options[:remote_branch] || options[:branch] || remote_branch || 'master'
905
+ if local_branch == remote_branch
906
+ @branch = local_branch
907
+ else
908
+ @local_branch = local_branch
909
+ @remote_branch = remote_branch
910
+ end
803
911
  @tag = options[:tag] || @tag
804
912
  @commit = options[:commit] || @commit
805
913
 
@@ -807,7 +915,7 @@ module Autobuild
807
915
  @repository_id = options[:repository_id] ||
808
916
  "git:#{@repository}"
809
917
  @source_id = options[:source_id] ||
810
- "#{@repository_id} branch=#{self.branch} tag=#{self.tag} commit=#{self.commit}"
918
+ "#{@repository_id} branch=#{remote_branch} tag=#{self.tag} commit=#{self.commit}"
811
919
  end
812
920
 
813
921
  # Tests whether the given directory is a git repository
@@ -45,6 +45,14 @@ class Importer
45
45
  attr_accessor :status
46
46
  # True if there is code in the working copy that is not committed
47
47
  attr_accessor :uncommitted_code
48
+ # A list of messages describing differences between the local working
49
+ # copy and its expected state
50
+ #
51
+ # On git, it would for instance mention that currently checked out
52
+ # branch is not the one autoproj expects
53
+ #
54
+ # @return [Array<String>]
55
+ attr_reader :unexpected_working_copy_state
48
56
 
49
57
  # An array of strings that represent commits that are in the remote
50
58
  # repository and not in this one (would be merged by an update)
@@ -55,6 +63,7 @@ class Importer
55
63
 
56
64
  def initialize(status = -1)
57
65
  @status = status
66
+ @unexpected_working_copy_state = Array.new
58
67
  @uncommitted_code = false
59
68
  @remote_commits = Array.new
60
69
  @local_commits = Array.new
@@ -102,11 +102,12 @@ module Autobuild
102
102
 
103
103
  if block_given?
104
104
  begin
105
- yield
105
+ result = yield
106
106
  if options[:done_message] && has_progress_for?(key)
107
107
  progress(key, *options[:done_message])
108
108
  end
109
109
  progress_done(key, true)
110
+ result
110
111
  rescue Exception
111
112
  progress_done(key, false)
112
113
  raise
@@ -197,14 +197,15 @@ module Autobuild::Subprocess
197
197
  STDOUT.sync = true
198
198
 
199
199
  input_streams = []
200
- options = Hash[retry: false, env: ENV.to_hash, env_inherit: true]
200
+ options = Hash[retry: false, env: ENV.to_hash, env_inherit: true, encoding: 'BINARY']
201
201
  if command.last.kind_of?(Hash)
202
202
  options = command.pop
203
203
  options = Kernel.validate_options options,
204
204
  input: nil, working_directory: nil, retry: false,
205
205
  input_streams: [],
206
206
  env: ENV.to_hash,
207
- env_inherit: true
207
+ env_inherit: true,
208
+ encoding: 'BINARY'
208
209
 
209
210
  if options[:input]
210
211
  input_streams << File.open(options[:input])
@@ -246,9 +247,7 @@ module Autobuild::Subprocess
246
247
  elsif Autobuild.registered_logfile?(logname) then 'a'
247
248
  else 'w'
248
249
  end
249
- if defined? Encoding
250
- open_flag << ":BINARY"
251
- end
250
+ open_flag << ":BINARY"
252
251
 
253
252
  Autobuild.register_logfile(logname)
254
253
  subcommand_output = Array.new
@@ -385,7 +384,7 @@ module Autobuild::Subprocess
385
384
  # line-by-line.
386
385
  outwrite.close
387
386
  outread.each_line do |line|
388
- line.force_encoding('BINARY')
387
+ line.force_encoding(options[:encoding])
389
388
  line = line.chomp
390
389
  subcommand_output << line
391
390
 
@@ -1,5 +1,5 @@
1
1
  module Autobuild
2
- VERSION = "1.10.0.b2" unless defined? Autobuild::VERSION
2
+ VERSION = "1.10.0.b3" unless defined? Autobuild::VERSION
3
3
  end
4
4
 
5
5
 
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.10.0.b2
4
+ version: 1.10.0.b3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Joyeux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-13 00:00:00.000000000 Z
11
+ date: 2015-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake