lib/cookbook-release/git-utilities.rb in cookbook-release-0.4.4 vs lib/cookbook-release/git-utilities.rb in cookbook-release-1.0.0

- old
+ new

@@ -1,102 +1,104 @@ require 'semantic' require 'semantic/core_ext' require 'mixlib/shellout' require 'highline/import' -class GitUtilities +module CookbookRelease + class GitUtilities - attr_accessor :no_prompt + attr_accessor :no_prompt - def initialize(options={}) - @tag_prefix = options[:tag_prefix] || '' - @shellout_opts = { - cwd: options[:cwd] - } - end + def initialize(options={}) + @tag_prefix = options[:tag_prefix] || '' + @shellout_opts = { + cwd: options[:cwd] + } + end - def self.git?(dir) - !Mixlib::ShellOut.new( - 'git status', - cwd: dir, - environment: { GIT_DIR: dir } - ).run_command.error? - end + def self.git?(dir) + !Mixlib::ShellOut.new( + 'git status', + cwd: dir, + environment: { GIT_DIR: dir } + ).run_command.error? + end - def reset_command(new_version) - remote = choose_remote - "git tag -d #{new_version} ; git push #{remote} :#{new_version}" - end + def reset_command(new_version) + remote = choose_remote + "git tag -d #{new_version} ; git push #{remote} :#{new_version}" + end - def clean_index? - clean_index = Mixlib::ShellOut.new("git diff --exit-code", @shellout_opts) - clean_index.run_command - clean_staged = Mixlib::ShellOut.new("git diff --exit-code --cached", @shellout_opts) - clean_staged.run_command - !clean_index.error? && !clean_staged.error? - end + def clean_index? + clean_index = Mixlib::ShellOut.new("git diff --exit-code", @shellout_opts) + clean_index.run_command + clean_staged = Mixlib::ShellOut.new("git diff --exit-code --cached", @shellout_opts) + clean_staged.run_command + !clean_index.error? && !clean_staged.error? + end - def clean_index! - raise "All changes must be committed!" unless clean_index? - end + def clean_index! + raise "All changes must be committed!" unless clean_index? + end - def compute_last_release + def compute_last_release - tag = Mixlib::ShellOut.new([ - 'git describe', - "--tags", - "--match \"#{@tag_prefix}[0-9]\.[0-9]*\.[0-9]*\"" - ].join(" "), @shellout_opts) - tag.run_command - last = tag.stdout.split('-').first - unless last - $stderr.puts "No last release found, defaulting to 0.1.0" - last = '0.1.0' + tag = Mixlib::ShellOut.new([ + 'git describe', + "--tags", + "--match \"#{@tag_prefix}[0-9]\.[0-9]*\.[0-9]*\"" + ].join(" "), @shellout_opts) + tag.run_command + last = tag.stdout.split('-').first + unless last + $stderr.puts "No last release found, defaulting to 0.1.0" + last = '0.1.0' + end + last.to_version end - last.to_version - end - # This string is used to split one-line git commit summary - # it just needs to be unlikely in a commit message - MAGIC_SEP = '@+-+@+-+@+-+@' + # This string is used to split one-line git commit summary + # it just needs to be unlikely in a commit message + MAGIC_SEP = '@+-+@+-+@+-+@' - def compute_changelog(since) - # TODO use whole commit message instead of title only - log_cmd = Mixlib::ShellOut.new("git log --pretty=\"format:%an <%ae>#{MAGIC_SEP}%s#{MAGIC_SEP}%h\" #{since}..HEAD", @shellout_opts) - log_cmd.run_command - log = log_cmd.stdout - log.split("\n").map do |entry| - author, subject, hash = entry.chomp.split(MAGIC_SEP) - Commit.new({ - author: author, - subject: subject, - hash: hash - }) - end.reject { |commit| commit[:subject] =~ /^Merge branch (.*) into/i } - end + def compute_changelog(since) + # TODO use whole commit message instead of title only + log_cmd = Mixlib::ShellOut.new("git log --pretty=\"format:%an <%ae>#{MAGIC_SEP}%s#{MAGIC_SEP}%h\" #{since}..HEAD", @shellout_opts) + log_cmd.run_command + log = log_cmd.stdout + log.split("\n").map do |entry| + author, subject, hash = entry.chomp.split(MAGIC_SEP) + Commit.new({ + author: author, + subject: subject, + hash: hash + }) + end.reject { |commit| commit[:subject] =~ /^Merge branch (.*) into/i } + end - def tag(version) - cmd = Mixlib::ShellOut.new("git tag #{@tag_prefix}#{version}", @shellout_opts) - cmd.run_command - cmd.error! - end + def tag(version) + cmd = Mixlib::ShellOut.new("git tag #{@tag_prefix}#{version}", @shellout_opts) + cmd.run_command + cmd.error! + end - def choose_remote - cmd = Mixlib::ShellOut.new("git remote", @shellout_opts) - cmd.run_command - cmd.error! - remotes = cmd.stdout.split("\n") - if remotes.size == 1 || @no_prompt - puts "Choosing remote #{remotes.first}" if @no_prompt - remotes.first - else - choose(*remotes) + def choose_remote + cmd = Mixlib::ShellOut.new("git remote", @shellout_opts) + cmd.run_command + cmd.error! + remotes = cmd.stdout.split("\n") + if remotes.size == 1 || @no_prompt + puts "Choosing remote #{remotes.first}" if @no_prompt + remotes.first + else + choose(*remotes) + end end - end - def push_tag(version) - remote = choose_remote - cmd = Mixlib::ShellOut.new("git push #{remote} #{@tag_prefix}#{version}", @shellout_opts) - cmd.run_command - cmd.error! + def push_tag(version) + remote = choose_remote + cmd = Mixlib::ShellOut.new("git push #{remote} #{@tag_prefix}#{version}", @shellout_opts) + cmd.run_command + cmd.error! + end end end