1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
#!/usr/bin/env ruby
# frozen_string_literal: true
require 'fileutils'
require 'json'
require 'netrc'
require 'octokit'
require 'shellwords'
require 'uri'
def run(*args)
puts('<exec> ' + args.map { |s| Shellwords.escape(s) }.join(' '))
system(*args)
end
gem_name = 'ddmetrics'
version_constant = 'DDMetrics::VERSION'
gem_path = 'ddmetrics'
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 "deleting #{fn}…"
FileUtils.rm_f(fn)
end
puts
puts '=== Verifying presence of release date…'
unless File.readlines('NEWS.md').drop(2).first =~ / \(\d{4}-\d{2}-\d{2}\)$/
warn 'No proper release date found!'
exit 1
end
puts
puts '=== Reading version…'
require "./lib/#{gem_path}/version"
version = eval(version_constant) # rubocop:disable Security/Eval
puts "Version = #{version}"
puts
puts '=== Building new gem…'
run('gem', 'build', 'ddmetrics.gemspec')
puts
puts '=== Verifying that gems were built properly…'
gem_filename = "#{gem_name}-#{version}.gem"
unless File.file?(gem_filename)
warn "Error: Could not find gem: #{gem_filename}"
exit 1
end
puts
puts '=== Verifying that gem version does not yet exist…'
url = URI.parse("https://rubygems.org/api/v1/versions/#{gem_name}.json")
response = Net::HTTP.get_response(url)
existing_versions =
case response.code
when '404'
[]
when '200'
JSON.parse(response.body).map { |e| e.fetch('number') }
else
warn "Error: Couldn’t fetch version information for #{gem_name} (status #{response.code})"
exit 1
end
if existing_versions.include?(version)
warn "Error: #{gem_name} v#{version} already exists"
exit 1
end
puts
puts '=== Verifying that release does not yet exist…'
releases = client.releases('ddfreyne/ddmetrics')
release = releases.find { |r| r.tag_name == DDMetrics::VERSION }
if release
warn 'Release already exists!'
warn 'ABORTED!'
exit 1
end
puts
puts '=== Creating Git tag…'
run('git', 'tag', '--sign', '--annotate', DDMetrics::VERSION, '--message', "Version #{DDMetrics::VERSION}")
puts
puts '=== Pushing Git data…'
run('git', 'push', 'origin', '--tags')
puts
puts '=== Pushing gem…'
run('gem', 'push', "ddmetrics-#{DDMetrics::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 = DDMetrics::VERSION =~ /a|b|rc/ || DDMetrics::VERSION =~ /^0/
client.create_release(
'ddfreyne/ddmetrics', DDMetrics::VERSION,
prerelease: !is_prerelease.nil?,
body: release_notes
)
puts
puts 'DONE!'
|