Class: CookbookRelease::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.



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

#gitObject (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_changelogObject



38
39
40
# File 'lib/cookbook-release/release.rb', line 38

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

#last_releaseObject



34
35
36
# File 'lib/cookbook-release/release.rb', line 34

def last_release
  @last_release ||= git.compute_last_release
end

#new_versionObject

return the new version and the reasons

Raises:



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_releaseObject



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_versionObject



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