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.



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

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



50
51
52
# File 'lib/cookbook-release/release.rb', line 50

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

#last_releaseObject



46
47
48
# File 'lib/cookbook-release/release.rb', line 46

def last_release
  @last_release ||= git.compute_last_release
end

#new_versionObject

return the new version and the reasons

Raises:



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_releaseObject



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_versionObject



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