Class: CookbookRelease::Release
- Inherits:
-
Object
- Object
- CookbookRelease::Release
- Defined in:
- lib/cookbook-release/release.rb
Defined Under Namespace
Classes: ExistingRelease
Instance Attribute Summary collapse
-
#git ⇒ Object
readonly
Returns the value of attribute git.
Class Method Summary collapse
-
.current_version(file) ⇒ Object
file will be used to determine the git directory.
Instance Method Summary collapse
- #display_changelog(new_version) ⇒ Object
- #display_suggested_version(new_version, reasons) ⇒ Object
- #git_changelog ⇒ Object
-
#initialize(git, opts = {}) ⇒ Release
constructor
A new instance of Release.
- #last_release ⇒ Object
-
#new_version ⇒ Object
return the new version and the reasons.
- #prepare_release ⇒ Object
- #release! ⇒ Object
- #user_defined_version ⇒ Object
Constructor Details
#initialize(git, opts = {}) ⇒ Release
Returns a new instance of Release.
27 28 29 30 31 32 |
# File 'lib/cookbook-release/release.rb', line 27 def initialize(git, opts={}) @git = git @no_prompt = opts[:no_prompt] @git.no_prompt = @no_prompt @category = opts[:category] || 'Other' end |
Instance Attribute Details
#git ⇒ Object (readonly)
Returns the value of attribute git.
25 26 27 |
# File 'lib/cookbook-release/release.rb', line 25 def git @git end |
Class Method Details
.current_version(file) ⇒ Object
file will be used to determine the git directory
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# File 'lib/cookbook-release/release.rb', line 5 def self.current_version(file) dir = File.dirname(file) version_file = File.join(dir, '.cookbook_version') if !GitUtilities.git?(dir) return File.read(version_file) if File.exist?(version_file) raise "Can't determine version in a non-git environment without #{version_file}" end r = Release.new(GitUtilities.new(cwd: dir)) begin r.new_version.first rescue ExistingRelease r.last_release end.tap { |v| File.write(version_file, v) } end |
Instance Method Details
#display_changelog(new_version) ⇒ Object
66 67 68 69 70 71 |
# File 'lib/cookbook-release/release.rb', line 66 def display_changelog(new_version) puts "Changelog for #{new_version}:" git_changelog.each do |commit| puts "* #{commit[:hash]} #{HighLine.color(commit[:subject], commit.color)} (#{commit[:author]} <#{commit[:email]}>)" end end |
#display_suggested_version(new_version, reasons) ⇒ Object
58 59 60 61 62 63 64 |
# File 'lib/cookbook-release/release.rb', line 58 def display_suggested_version(new_version, reasons) puts "Suggested version: " + new_version.to_s puts "Commits that suggest this change:" reasons.each do |commit| puts "* #{commit[:hash]} #{commit[:subject]} (#{commit[:author]} <#{commit[:email]}>)" end end |
#git_changelog ⇒ Object
38 39 40 |
# File 'lib/cookbook-release/release.rb', line 38 def git_changelog @git_changelog ||= git.compute_changelog(last_release) end |
#last_release ⇒ Object
34 35 36 |
# File 'lib/cookbook-release/release.rb', line 34 def last_release @last_release ||= git.compute_last_release end |
#new_version ⇒ Object
return the new version and the reasons
43 44 45 46 47 48 49 50 |
# File 'lib/cookbook-release/release.rb', line 43 def new_version return ['0.1.0'.to_version, []] unless git.has_any_release? %w(major minor patch).each do |level| changes = git_changelog.select(&"#{level}?".to_sym) return [ last_release.send("#{level}!"), changes ] if changes.size > 0 end raise ExistingRelease, "No commit since last release (#{last_release})" end |
#prepare_release ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/cookbook-release/release.rb', line 73 def prepare_release git.clean_index! new_version , reasons = self.new_version puts "Last release was: " + last_release.to_s display_suggested_version(new_version, reasons) puts "" agreed = @no_prompt || agree("Do you agree with that version?") { |q| q.default = "yes" } new_version = user_defined_version unless agreed puts "New release will be #{new_version}" puts "" new_version end |
#release! ⇒ Object
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/cookbook-release/release.rb', line 88 def release! new_version = begin prepare_release rescue ExistingRelease raise unless ENV['COOKBOOK_RELEASE_SILENT_FAIL'] exit 0 end begin git.tag(new_version) display_changelog(new_version) puts "" agreed = @no_prompt || agree("Do you agree with this changelog?") { |q| q.default = "yes" } exit 1 unless agreed git.push_tag(new_version) supermarket = Supermarket.new supermarket.publish_ck(@category) rescue puts HighLine.color("Release aborted, you have to reset to previous state manually", :red) puts ":use with care: #{git.reset_command(new_version)}" raise end end |
#user_defined_version ⇒ Object
52 53 54 55 56 |
# File 'lib/cookbook-release/release.rb', line 52 def user_defined_version puts "Which kind of upgrade ?" new_release_level = choose(*%w(major minor patch)) last_release.send("#{new_release_level}!") end |