18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
# File 'lib/flash_flow/merge/release.rb', line 18
def run
begin
check_version
check_branches
puts "Merging these branches into #{@git.release_branch}:\n #{@release_branches.map(&:ref).join("\n ")}"
logger.info "\n\n### Beginning #{@local_git.merge_branch} merge ###\n\n"
mergers, errors = [], []
@lock.with_lock do
release = pending_release
if release
raise PendingReleaseError.new("There is already a pending release: #{release}")
elsif release_ahead_of_master
raise PendingReleaseError.new("The release branch '#{@git.release_branch}' has commits that are not in master")
end
@git.in_original_merge_branch do
@git.initialize_rerere
end
@git.reset_temp_merge_branch
@git.in_temp_merge_branch do
merge_branches(@release_branches) do |branch, merger|
mergers << [branch, merger]
end
end
errors = mergers.select { |m| m.last.result != :success }
if errors.empty?
unless @git.push("#{@git.temp_merge_branch}:#{@git.release_branch}", true)
raise GitPushFailure.new("Unable to push to #{@git.release_branch}. See log for details.")
end
release_sha = @git.get_sha(@git.temp_merge_branch)
@data.releases.unshift({ created_at: Time.now, sha: release_sha, status: 'Pending' })
write_data('Release branch created [ci skip]')
end
end
if errors.empty?
puts 'Success!'
else
raise UnmergeableBranch.new("The following branches didn't merge successfully:\n #{errors.map { |e| e.first.ref }.join("\n ")}")
end
logger.info "### Finished #{@git.release_branch} merge ###"
rescue Lock::Error, OutOfSyncWithRemote, UnmergeableBranch, GitPushFailure, NothingToMergeError, VersionError, PendingReleaseError => e
puts 'Failure!'
puts e.message
ensure
@local_git.run("checkout #{@local_git.working_branch}")
end
end
|