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.
38 39 40 41 42 43 44 |
# File 'lib/cookbook-release/release.rb', line 38 def initialize(git, opts={}) @git = git @no_prompt = opts[:no_prompt] @skip_upload = opts[:skip_upload] @git.no_prompt = @no_prompt @category = opts[:category] || 'Other' end |
Instance Attribute Details
#git ⇒ Object (readonly)
Returns the value of attribute git.
36 37 38 |
# File 'lib/cookbook-release/release.rb', line 36 def git @git end |
Class Method Details
.current_version(file) ⇒ Object
file will be used to determine the git directory
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/cookbook-release/release.rb', line 9 def self.current_version(file) dir = File.dirname(file) version_file = File.join(dir, '.cookbook_version') git_root = GitUtilities.find_root(dir) if !GitUtilities.git?(dir) && git_root.nil? return File.read(version_file) if File.exist?(version_file) raise "Can't determine version in a non-git environment without #{version_file}" end git = if git_root == dir GitUtilities.new(cwd: dir) else GitUtilities.new(cwd: git_root, tag_prefix: "#{File.basename(dir)}-", sub_dir: dir) end r = Release.new(git) 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
78 79 80 81 82 83 |
# File 'lib/cookbook-release/release.rb', line 78 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
70 71 72 73 74 75 76 |
# File 'lib/cookbook-release/release.rb', line 70 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
50 51 52 |
# File 'lib/cookbook-release/release.rb', line 50 def git_changelog @git_changelog ||= git.compute_changelog(last_release) end |
#last_release ⇒ Object
46 47 48 |
# File 'lib/cookbook-release/release.rb', line 46 def last_release @last_release ||= git.compute_last_release end |
#new_version ⇒ Object
return the new version and the reasons
55 56 57 58 59 60 61 62 |
# File 'lib/cookbook-release/release.rb', line 55 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
85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/cookbook-release/release.rb', line 85 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
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
# File 'lib/cookbook-release/release.rb', line 100 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, git.sub_dir) unless @skip_upload 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
64 65 66 67 68 |
# File 'lib/cookbook-release/release.rb', line 64 def user_defined_version puts "Which kind of upgrade ?" new_release_level = choose(*%w(major minor patch)) last_release.send("#{new_release_level}!") end |