|
| 1 | +require 'erb' |
| 2 | + |
| 3 | +class Release |
| 4 | + def initialize(version) |
| 5 | + parts = version.split('.', 3).map(&:to_i) |
| 6 | + major = parts[0] || 0 |
| 7 | + minor = parts[1] || 0 |
| 8 | + release = parts[2] || 0 |
| 9 | + |
| 10 | + parts = version.split('-', 2) |
| 11 | + stability = parts[1] || 'stable' |
| 12 | + stability = 'devel' if major < 1 |
| 13 | + # strip release modifier e.g. beta.1 becomes beta |
| 14 | + stability = stability.split('.').first |
| 15 | + |
| 16 | + @version = version |
| 17 | + @major = major |
| 18 | + @minor = minor |
| 19 | + @release = release |
| 20 | + @stability = stability |
| 21 | + @dirname = File.expand_path(File.dirname(__FILE__)) |
| 22 | + end |
| 23 | + |
| 24 | + def perform! |
| 25 | + puts "Preparing to release PHP Driver v#{version}-#{@stability}..." |
| 26 | + bump_version |
| 27 | + tag_repository |
| 28 | + end |
| 29 | + |
| 30 | + private |
| 31 | + |
| 32 | + attr_reader :version, :major, :minor, :release, :stability |
| 33 | + |
| 34 | + def timestamp |
| 35 | + Time.now |
| 36 | + end |
| 37 | + |
| 38 | + def sources |
| 39 | + ( |
| 40 | + Dir.glob(@dirname + '/ext/config.{m4,w32}') + |
| 41 | + Dir.glob(@dirname + '/ext/php_cassandra.{c,h}') + |
| 42 | + Dir.glob(@dirname + '/ext/{php_cassandra_types.h,version.h}') + |
| 43 | + Dir.glob(@dirname + '/ext/src/**/*.{c,h}') + |
| 44 | + Dir.glob(@dirname + '/ext/util/**/*.{c,h}') |
| 45 | + ).map {|p| p.gsub(@dirname + '/ext/', '') }.sort |
| 46 | + end |
| 47 | + |
| 48 | + def docs |
| 49 | + Dir.glob(@dirname + '/ext/doc/**/*.*'). |
| 50 | + map {|p| p.gsub(@dirname + '/ext/', '') }.sort |
| 51 | + end |
| 52 | + |
| 53 | + def tests |
| 54 | + Dir.glob(@dirname + '/ext/tests/**/*.phpt'). |
| 55 | + map {|p| p.gsub(@dirname + '/ext/', '') }.sort |
| 56 | + end |
| 57 | + |
| 58 | + def files |
| 59 | + { |
| 60 | + 'src' => sources, |
| 61 | + 'doc' => docs, |
| 62 | + 'test' => tests |
| 63 | + } |
| 64 | + end |
| 65 | + |
| 66 | + def notes |
| 67 | + notes = '' |
| 68 | + state = :start |
| 69 | + |
| 70 | + File.read(@dirname + '/CHANGELOG.md').each_line do |line| |
| 71 | + case state |
| 72 | + when :start |
| 73 | + next unless line.start_with?("# ") |
| 74 | + |
| 75 | + version = line[2..-1].strip |
| 76 | + parts = version.split('.', 3).map(&:to_i) |
| 77 | + major = parts[0] |
| 78 | + minor = parts[1] || 0 |
| 79 | + release = parts[2] || 0 |
| 80 | + parts = version.split('-', 2) |
| 81 | + stability = parts[1] |
| 82 | + stability ||= 'stable' |
| 83 | + |
| 84 | + if major == @major && minor == @minor && |
| 85 | + release == @release && stability == @stability |
| 86 | + notes << line |
| 87 | + state = :body |
| 88 | + end |
| 89 | + when :body |
| 90 | + break if line.start_with?("# ") |
| 91 | + notes << line |
| 92 | + end |
| 93 | + end |
| 94 | + |
| 95 | + notes.strip |
| 96 | + end |
| 97 | + |
| 98 | + def package_xml |
| 99 | + ERB.new(<<-ERB) |
| 100 | +<?xml version="1.0" encoding="UTF-8"?> |
| 101 | +<package version="2.1" xmlns="http://pear.php.net/dtd/package-2.1" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.1 http://pear.php.net/dtd/package-2.1.xsd"> |
| 102 | + <name>cassandra</name> |
| 103 | + <channel>pecl.php.net</channel> |
| 104 | + <summary>DataStax PHP Driver for Apache Cassandra</summary> |
| 105 | + <description> |
| 106 | +A modern, feature-rich and highly tunable PHP client library for Apache |
| 107 | +Cassandra and DataStax Enterprise using exclusively Cassandra's binary |
| 108 | +protocol and Cassandra Query Language v3. |
| 109 | + </description> |
| 110 | + <lead> |
| 111 | + <name>Bulat Shakirzyanov</name> |
| 112 | + <user>avalanche123</user> |
| 113 | + |
| 114 | + <active>yes</active> |
| 115 | + </lead> |
| 116 | + <date><%= timestamp.strftime('%Y-%m-%d') %></date> |
| 117 | + <time><%= timestamp.strftime('%H:%M:%S') %></time> |
| 118 | + <version> |
| 119 | + <release><%= major %>.<%= minor %>.<%= release %></release> |
| 120 | + <api><%= major %>.<%= minor %>.<%= release %></api> |
| 121 | + </version> |
| 122 | + <stability> |
| 123 | + <release><%= stability %></release> |
| 124 | + <api><%= stability %></api> |
| 125 | + </stability> |
| 126 | + <license uri="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</license> |
| 127 | + <notes> |
| 128 | +<%= notes %> |
| 129 | + </notes> |
| 130 | + <contents> |
| 131 | + <dir name="/"><% |
| 132 | +files.each do |role, list| |
| 133 | + list.each do |file| |
| 134 | +%> |
| 135 | + <file role="<%= role %>" name="<%= file %>" /><% |
| 136 | + end |
| 137 | +end |
| 138 | +%> |
| 139 | + </dir> |
| 140 | + </contents> |
| 141 | + <dependencies> |
| 142 | + <required> |
| 143 | + <php> |
| 144 | + <min>5.3.4</min> |
| 145 | + <max>5.99.99</max> |
| 146 | + </php> |
| 147 | + <pearinstaller> |
| 148 | + <min>1.4.8</min> |
| 149 | + </pearinstaller> |
| 150 | + </required> |
| 151 | + </dependencies> |
| 152 | + <providesextension>cassandra</providesextension> |
| 153 | + <extsrcrelease/> |
| 154 | +</package> |
| 155 | + ERB |
| 156 | + end |
| 157 | + |
| 158 | + def version_h |
| 159 | + ERB.new(<<-ERB) |
| 160 | +#ifndef PHP_CASSANDRA_VERSION_H |
| 161 | +#define PHP_CASSANDRA_VERSION_H |
| 162 | +
|
| 163 | +/* Define Extension and Version Properties */ |
| 164 | +#define PHP_CASSANDRA_NAME "cassandra" |
| 165 | +#define PHP_CASSANDRA_MAJOR <%= major %> |
| 166 | +#define PHP_CASSANDRA_MINOR <%= minor %> |
| 167 | +#define PHP_CASSANDRA_RELEASE <%= release %> |
| 168 | +#define PHP_CASSANDRA_STABILITY "<%= stability %>" |
| 169 | +#define PHP_CASSANDRA_VERSION "<%= version %>" |
| 170 | +
|
| 171 | +#endif /* PHP_CASSANDRA_VERSION_H */ |
| 172 | + ERB |
| 173 | + end |
| 174 | + |
| 175 | + def create_package_xml |
| 176 | + stability = @stability |
| 177 | + stability = 'stable' if stability.start_with?('rc') |
| 178 | + |
| 179 | + unless ["snapshot", "devel", "alpha", "beta", "stable"].include?(stability) |
| 180 | + raise ::ArgumentError, |
| 181 | + %[stability must be "snapshot", "devel", "alpha", "beta" or ] + |
| 182 | + %["stable", #{stability.inspect} given] |
| 183 | + end |
| 184 | + |
| 185 | + File.open(@dirname + '/ext/package.xml', 'w+') do |f| |
| 186 | + f.write(package_xml.result(binding)) |
| 187 | + end |
| 188 | + end |
| 189 | + |
| 190 | + def create_version_h |
| 191 | + File.open(@dirname + '/ext/version.h', 'w+') do |f| |
| 192 | + f.write(version_h.result(binding)) |
| 193 | + end |
| 194 | + end |
| 195 | + |
| 196 | + def bump_version |
| 197 | + puts "Bumping version.h and package.xml" |
| 198 | + create_version_h |
| 199 | + create_package_xml |
| 200 | + # system('git', 'add', @dirname + '/ext/package.xml') |
| 201 | + # system('git', 'add', @dirname + '/ext/version.h') |
| 202 | + # system('git', 'commit', '-m', "prepare release v#{@version}") |
| 203 | + end |
| 204 | + |
| 205 | + def tag_repository |
| 206 | + puts "Creating v#{version} tag" |
| 207 | + # system('git', 'tag', "v#{@version}") |
| 208 | + # system('git', 'push') |
| 209 | + end |
| 210 | +end |
| 211 | + |
| 212 | +desc 'Prepare a new release of the PHP Driver' |
| 213 | +task :release, [:version] do |t, args| |
| 214 | + Release.new(args['version']).perform! |
| 215 | +end |
0 commit comments