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.



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

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.



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

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
12
13
14
15
16
# File 'lib/cookbook-release/release.rb', line 4

def self.current_version(file)
  dir = File.dirname(file)
  version_file = File.join(dir, '.cookbook_version')

  return File.read(version_file) if !GitUtilities.git?(dir) && File.exist?(version_file)

  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



61
62
63
64
65
66
# File 'lib/cookbook-release/release.rb', line 61

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



53
54
55
56
57
58
59
# File 'lib/cookbook-release/release.rb', line 53

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



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

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

#last_releaseObject



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

def last_release
  @last_release ||= git.compute_last_release
end

#new_versionObject

return the new version and the reasons

Raises:



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

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



68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/cookbook-release/release.rb', line 68

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



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/cookbook-release/release.rb', line 83

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



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

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