ddfreyne/d-parse

View on GitHub
scripts/release

Summary

Maintainability
Test Coverage
#!/usr/bin/env ruby
require 'fileutils'
require 'octokit'

def run(*args)
  puts 'I will execute the following:'
  puts '    ' + args.map { |a| a =~ /\s/ ? a.inspect : a }.join(' ')
  print 'Is this correct? [y/N] '
  res = gets
  unless res.strip.casecmp('y').zero?
    warn 'Answer was not Y; release aborted.'
    exit 1
  end

  system('echo', *args)
  system(*args)

  print 'Continue? [y/N] '
  res = gets
  unless res.strip.casecmp('y').zero?
    warn 'Answer was not Y; release aborted.'
    exit 1
  end
end

puts '=== Logging in to GitHub’s API…'
client = Octokit::Client.new(netrc: true)
puts

puts '=== Deleting old *.gem files…'
Dir['*.gem'].each do |fn|
  puts "  #{fn}…"
  FileUtils.rm_f(fn)
end
puts

puts '=== Building new gem…'
run('gem', 'build', 'd-parse.gemspec')
puts

puts '=== Reading version…'
require './lib/d-parse/version'
puts "Version = #{DParse::VERSION}"
puts

puts '=== Verifying that release does not yet exist…'
releases = client.releases('ddfreyne/d-parse')
release = releases.find { |r| r.tag_name == DParse::VERSION }
if release
  warn 'Release already exists!'
  warn 'ABORTED!'
  exit 1
end
puts

puts '=== Creating Git tag…'
run('git', 'tag', '--sign', '--annotate', DParse::VERSION, '--message', "Version #{DParse::VERSION}")
puts

puts '=== Pushing Git data…'
run('git', 'push', 'origin')
run('git', 'push', 'origin', '--tags')
puts

puts '=== Pushing gem…'
run('gem', 'push', "d-parse-#{DParse::VERSION}.gem")
puts

puts '=== Reading release notes…'
release_notes =
  File.readlines('NEWS.md')
      .drop(4)
      .take_while { |l| l !~ /^## / }
      .join
puts

puts '=== Creating release on GitHub…'
sleep 3 # Give GitHub some time to detect the new tag
is_prerelease = DParse::VERSION =~ /a|b|rc/ || DParse::VERSION =~ /^0/
client.create_release(
  'ddfreyne/d-parse', DParse::VERSION,
  prerelease: !!is_prerelease,
  body: release_notes,
)
puts

puts 'DONE!'