File: release

package info (click to toggle)
ruby-ddmetrics 1.0.1-1.1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, sid, trixie
  • size: 220 kB
  • sloc: ruby: 760; makefile: 3
file content (115 lines) | stat: -rwxr-xr-x 2,758 bytes parent folder | download | duplicates (2)
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!'