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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
# File 'lib/amitree/heroku_deployer.rb', line 45
def compute_release(options={})
result = ReleaseDetails.new
result.production_release = @heroku.last_promoted_production_release
staging_releases = @heroku.staging_releases_since(result.production_release)
prod_commit = @heroku.get_production_commit(result.production_release)
puts "Production release is #{prod_commit}" if options[:verbose]
git_range = @git.range_since(prod_commit)
result.stories = all_stories(git_range)
all_stories = Hash[result.stories.map{|story| [story.id, story]}]
staging_releases.reverse.each do |staging_release|
begin
staging_commit = @heroku.get_staging_commit(staging_release)
puts "- Trying staging release #{@heroku.version(staging_release)} with commit #{staging_commit}" if options[:verbose]
candidate_git_range = git_range.up_to(staging_commit)
stories = all_stories.values_at(*candidate_git_range.story_ids).compact
story_ids = stories.map(&:id)
puts " - Stories: #{story_ids.inspect}" if options[:verbose]
unaccepted_story_ids = story_ids.select { |story_id| get_tracker_status(story_id) != 'accepted' }
if unaccepted_story_ids.length > 0
stories.each do |story|
story.blocked_by = unaccepted_story_ids
end
puts " - Some stories are not yet accepted: #{unaccepted_story_ids.inspect}" if options[:verbose]
elsif story_ids.length == 0 && !options[:allow_empty]
puts " - Refusing to deploy empty release" if options[:verbose]
else
story_ids_referenced_later = story_ids & git_range.since(staging_commit).story_ids
if story_ids_referenced_later.length > 0
puts " - Some stories have been worked on in a later commit: #{story_ids_referenced_later}" if options[:verbose]
else
stories.each do |story|
story.blocked_by = unaccepted_story_ids
end
puts " - This release is good to go!" if options[:verbose]
result.staging_release_to_deploy = staging_release
result.git_range = candidate_git_range
break
end
end
rescue => error
puts " - Skipping candidate staging release because an error was encountered"
puts "\n#{error.class} (#{error.message}):\n " + error.backtrace.join("\n ") + "\n"
end
end
return result
end
|