Class: Release

Inherits:
Object
  • Object
show all
Defined in:
lib/cookbook-release/release.rb

Defined Under Namespace

Classes: ExistingRelease

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(git, opts = {}) ⇒ Release

Returns a new instance of Release.



18
19
20
21
22
23
# File 'lib/cookbook-release/release.rb', line 18

def initialize(git, opts={})
  @git         = git
  @no_prompt   = opts[:no_prompt]
  @git.no_prompt = @no_prompt
  @category    = opts[:category] || 'Other'
end

Instance Attribute Details

#gitObject (readonly)

Returns the value of attribute git.



16
17
18
# File 'lib/cookbook-release/release.rb', line 16

def git
  @git
end

Class Method Details

.current_version(file) ⇒ Object

file will be used to determine the git directory



4
5
6
7
8
9
10
11
# File 'lib/cookbook-release/release.rb', line 4

def self.current_version(file)
  r = Release.new(GitUtilities.new(cwd: File.dirname(file)))
  begin
    r.new_version.first
  rescue ExistingRelease
    r.last_release
  end
end

Instance Method Details

#display_changelog(new_version) ⇒ Object



56
57
58
59
60
61
# File 'lib/cookbook-release/release.rb', line 56

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]})"
  end
end

#display_suggested_version(new_version, reasons) ⇒ Object



48
49
50
51
52
53
54
# File 'lib/cookbook-release/release.rb', line 48

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]})"
  end
end

#git_changelogObject



29
30
31
# File 'lib/cookbook-release/release.rb', line 29

def git_changelog
  @git_changelog ||= git.compute_changelog(last_release)
end

#last_releaseObject



25
26
27
# File 'lib/cookbook-release/release.rb', line 25

def last_release
  @last_release ||= git.compute_last_release
end

#new_versionObject

return the new version and the reasons

Raises:



34
35
36
37
38
39
40
# File 'lib/cookbook-release/release.rb', line 34

def new_version
  %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_releaseObject



63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/cookbook-release/release.rb', line 63

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



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/cookbook-release/release.rb', line 78

def release!
  new_version = prepare_release
  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_versionObject



42
43
44
45
46
# File 'lib/cookbook-release/release.rb', line 42

def user_defined_version
  puts "Which kind of upgrade ?"
  new_release_level = choose(*%w(major minor patch))
  last_release.send("#{new_release_level}!")
end