#!/usr/bin/env ruby
require 'erb'

require_relative 'run.rb'

GEM_NAME = 'gitaly-proto'
RUBY_PREFIX = 'ruby/lib'
RUBY_VERSION_FILE = 'gitaly/version.rb'
REMOTES = {
  'gitlab.com' => 'gitlab-org/gitaly-proto.git',
}


def main(version, ssh)
  run!(%w[_support/generate-from-proto])
  puts 'Testing for changed files'
  run!(%w[git diff --quiet --exit-code])
  puts 'Testing for staged changes'
  run!(%w[git diff --quiet --cached --exit-code])
  write_version_files(version)
  version_msg = "Version #{version}"
  run!(%W[git commit -m #{version_msg}])
  tag_name = "v#{version}"
  run!(%W[git tag -a -m #{version_msg} #{tag_name}])
  run!(%W[git show --pretty #{tag_name}])
  run!(%W[gem build #{GEM_NAME}.gemspec])
  puts "Proceed to publish version #{version}? Enter 'Yes' to continue; Ctrl-C to abort"
  $stdout.flush
  abort unless $stdin.gets.chomp == 'Yes'
  REMOTES.each do |host, repo|
    remote = ssh ? "git@#{host}:#{repo}" : "https://#{host}/#{repo}"
    run!(%W[git push #{remote} HEAD #{tag_name}])
  end
  run!(%W[gem push #{GEM_NAME}-#{version}.gem])
end

def write_version_files(version)
  version_file = 'VERSION'
  open(version_file, 'w') { |f| f.puts version }
  run!(%W[git add #{version_file}])

  go_version_file = 'go/VERSION'
  open(go_version_file, 'w') { |f| f.puts version }
  run!(%W[git add #{go_version_file}])

  version_rb_template = ERB.new <<EOT
# This file was auto-generated by #{$0}
module Gitaly
  VERSION = "#{version}"
end
EOT
  version_rb = File.join(RUBY_PREFIX, RUBY_VERSION_FILE)
  open(version_rb, 'w') { |f| f.write(version_rb_template.result) }
  run!(%W[git add #{version_rb}])
end

def error(msg)
  warn "#{$0}: #{msg}"
end

ssh = false
if ARGV.first == '--ssh'
  ssh = true
  ARGV.shift
end

unless ARGV.count == 1
  warn "Usage: #{$0} [--ssh] VERSION"
  warn "Specify version as x.y.z"
  abort
end

directory_current_file = File.expand_path('..', __FILE__)
git_root_current_file = capture!(%w[git rev-parse --show-toplevel], directory_current_file).chomp
unless git_root_current_file == Dir.pwd
  error "#{$0}: this script must be run from the root of the Gitaly repository"
  abort
end

main(ARGV.first, ssh)
