lib/stove/plugins/git.rb
module Stove
class Plugin::Git < Plugin::Base
id 'git'
description 'Tag and push to a git remote'
validate(:repository) do
File.directory?(File.join(Dir.pwd, '.git'))
end
validate(:clean) do
git_null('status --porcelain').strip.empty?
end
validate(:up_to_date) do
git_null('fetch')
local_sha = git_null("rev-parse #{branch}").strip
remote_sha = git_null("rev-parse #{remote}/#{branch}").strip
Stove::Log.debug("Local SHA: #{local_sha}")
Stove::Log.debug("Remote SHA: #{remote_sha}")
local_sha == remote_sha
end
run('Tagging new release') do
annotation_type = options[:sign] ? '-s' : '-a'
tag = cookbook.tag_version
git %|tag #{annotation_type} #{tag} -m "Release #{tag}"|
git %|push #{remote} #{branch}|
git %|push #{remote} #{tag}|
end
private
def git(command, errors = true)
Stove::Log.debug("the command matches")
Stove::Log.debug("Running `git #{command}', errors: #{errors}")
Dir.chdir(cookbook.path) do
response = %x|git #{command}|
if errors && !$?.success?
raise Error::GitTaggingFailed.new(command: command) if command =~ /^tag/
raise Error::GitFailed.new(command: command)
end
response
end
end
def git_null(command)
null = case RbConfig::CONFIG['host_os']
when /mswin|mingw|cygwin/
'NUL'
else
'/dev/null'
end
git("#{command} 2>#{null}", false)
end
def remote
options[:remote]
end
def branch
options[:branch]
end
end
end