dotfiles/bin/old-git-release

176 lines
4.0 KiB
Ruby
Executable File

#!/usr/bin/env ruby
begin
require 'cocaine'
rescue LoadError
puts "Cocaine gem not found, install it: 'gem install cocaine'"
exit
end
require 'yaml'
module Release
class Version
attr_accessor :major, :minor, :patch
VERSION_REGEX = /.*([0-9]+)\.([0-9]+)\.([0-9]+).*/
def self.load
[Ruby, Yaml].detect(&:check?).new
end
def initialize
read
end
def file
self.class::FILE
end
def increment
if ENV.key?('VERSION')
self.version = ENV['VERSION']
elsif ENV.key?('MAJOR')
increment_major
elsif ENV.key?('MINOR')
increment_minor
else
increment_patch
end
self
end
def increment_major
self.patch = 0
self.minor = 0
self.major += 1
end
def increment_minor
self.patch = 0
self.minor += 1
end
def increment_patch
self.patch += 1
end
def next
dup.increment
end
def version
"#{major}.#{minor}.#{patch}"
end
def version=(version)
match = VERSION_REGEX.match version
self.major = match[1].to_i
self.minor = match[2].to_i
self.patch = match[3].to_i
end
def save
write
version
end
class Ruby < Version
FILE = Dir.glob(File.join('lib', '*', 'version.rb')).first
REGEX = /VERSION\s*=\s*['"]([0-9]+)\.([0-9]+)\.([0-9]+)['"]/
def self.check?
!FILE.nil?
end
private
def read
file_version = File.open(FILE, 'r') { |f| f.grep(REGEX).first }
self.version = file_version
end
def write
content = File.read(FILE).gsub(REGEX, "VERSION = '#{version}'")
File.open(FILE, 'w') { |f| f.write content }
end
end
class Yaml < Version
FILE = File.join('config', 'version.yml')
def self.check?
File.exist?(FILE)
end
private
def read
yaml = YAML.load_file(FILE)
self.major = yaml['major'].to_i
self.minor = yaml['minor'].to_i
self.patch = yaml['patch'].to_i
end
def write
File.open(FILE, 'w') do |f|
f.write YAML.dump('major' => major, 'minor' => minor, 'patch' => patch)
end
end
end
end
class Git
REMOTE = 'origin'
RELEASE_BRANCH = 'master'
def self.create
develop_branch = current_branch
Cocaine::CommandLine.new('git', 'fetch :remote').run(remote: REMOTE)
stash = Cocaine::CommandLine.new('git', 'stash create').run.chomp
Cocaine::CommandLine.new('git', 'reset --hard').run
Cocaine::CommandLine.new('git', 'checkout :branch').run(branch: RELEASE_BRANCH)
Cocaine::CommandLine.new('git', 'merge --ff-only :branch').run(
branch: "#{REMOTE}/#{RELEASE_BRANCH}")
Cocaine::CommandLine.new('git', 'checkout :branch').run(branch: develop_branch)
version = Version.load
version.increment
version.save
Cocaine::CommandLine.new('git', 'add :file').run(file: version.file)
Cocaine::CommandLine.new('git', 'commit -m :message').run(
message: "Bump version to #{version.version}")
Cocaine::CommandLine.new('git', 'checkout :branch').run(branch: RELEASE_BRANCH)
Cocaine::CommandLine.new('git', 'merge --no-ff -m :message :branch').run(
message: "Merge release #{version.version}", branch: develop_branch)
Cocaine::CommandLine.new('git', 'tag -a -m :message :tag').run(
message: "Release #{version.version}", tag: version.version)
ensure
Cocaine::CommandLine.new('git', 'checkout :branch').run(branch: develop_branch)
Cocaine::CommandLine.new('git', 'stash apply :stash').run(stash: stash) unless stash.to_s.empty?
end
def self.current_branch
branch = Cocaine::CommandLine.new('git', 'rev-parse --abbrev-ref HEAD').run.chomp
branch == 'HEAD' ? current_commit : branch
end
def self.current_commit
Cocaine::CommandLine.new('git', 'rev-parse HEAD').run.chomp
end
end
end
Release::Git.create