summaryrefslogtreecommitdiff
path: root/tasks
diff options
context:
space:
mode:
authorDan Allen <dan.j.allen@gmail.com>2022-07-26 23:51:31 -0600
committerDan Allen <dan.j.allen@gmail.com>2022-07-27 03:01:59 -0600
commit224baa449b304039c1baf3f999edf3d464080cec (patch)
treedefeb32b79653122b2e5368ce23b663cdb0b7822 /tasks
parent6740c9c10c1a47d7360b8df143e46a41af7cd00a (diff)
set up fully automated release [no ci]
Diffstat (limited to 'tasks')
-rw-r--r--tasks/postversion.rb30
-rw-r--r--tasks/release-notes.rb66
-rw-r--r--tasks/version.rb66
3 files changed, 162 insertions, 0 deletions
diff --git a/tasks/postversion.rb b/tasks/postversion.rb
new file mode 100644
index 00000000..84d8152e
--- /dev/null
+++ b/tasks/postversion.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+release_version = ENV['RELEASE_VERSION']
+major_minor_version = ((release_version.split '.').slice 0, 2).join '.'
+prerelease = (release_version.count '[a-z]') > 0 ? %(.#{(release_version.split '.', 3)[-1]}) : nil
+
+changelog_file = 'CHANGELOG.adoc'
+antora_file = 'docs/antora.yml'
+
+changelog_contents = File.readlines changelog_file, mode: 'r:UTF-8'
+last_release_idx = changelog_contents.index {|l| (l.start_with? '== ') && (%r/^== \d/.match? l) }
+changelog_contents.insert last_release_idx, <<~END
+== Unreleased
+
+_No changes since previous release._
+
+END
+
+antora_contents = (File.readlines antora_file, mode: 'r:UTF-8').map do |l|
+ if l.start_with? 'prerelease: '
+ %(prerelease: #{prerelease ? ?' + prerelease + ?' : 'false'}\n)
+ elsif l.start_with? 'version: '
+ %(version: '#{major_minor_version}'\n)
+ else
+ l
+ end
+end
+
+File.write changelog_file, changelog_contents.join, mode: 'w:UTF-8'
+File.write antora_file, antora_contents.join, mode: 'w:UTF-8'
diff --git a/tasks/release-notes.rb b/tasks/release-notes.rb
new file mode 100644
index 00000000..80d67e97
--- /dev/null
+++ b/tasks/release-notes.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'time'
+
+old_tz, ENV['TZ'] = ENV['TZ'], 'US/Mountain'
+release_date = Time.now.strftime '%Y-%m-%d'
+ENV['TZ'] = old_tz
+
+spec = Gem::Specification.load Dir['*.gemspec'].first
+gem_name = spec.name
+gem_version = spec.version
+gem_dist_url = %(https://rubygems.org/gems/#{gem_name})
+release_user = ENV['RELEASE_USER'] || 'mojavelinux'
+release_beer = ENV['RELEASE_BEER'] || 'TBD'
+release_tag = %(v#{gem_version})
+previous_tag = (`git -c versionsort.suffix=. -c versionsort.suffix=- ls-remote --tags --refs --sort -v:refname origin`.each_line chomp: true)
+ .map {|it| (it.rpartition '/')[-1] }
+ .drop_while {|it| it != release_tag }
+ .reject {|it| it == release_tag }
+ .find {|it| (Gem::Version.new it.slice 1, it.length) < gem_version }
+issues_url = spec.metadata['bug_tracker_uri']
+repo_url = spec.metadata['source_code_uri']
+changelog = (File.readlines 'CHANGELOG.adoc', chomp: true, mode: 'r:UTF-8').reduce nil do |accum, line|
+ if line == '=== Details'
+ accum.pop
+ break accum.join ?\n
+ elsif accum
+ if line.end_with? '::'
+ line = %(### #{line.slice 0, line.length - 2})
+ elsif line.start_with? ' * '
+ line = line.lstrip
+ end
+ accum << line unless accum.empty? && line.empty?
+ elsif line.start_with? %(== #{gem_version} )
+ accum = []
+ end
+ accum
+end
+
+notes = <<~EOS.chomp
+Write summary...
+
+## Distribution
+
+- [RubyGem (#{gem_name})](#{gem_dist_url})
+
+Asciidoctor is also packaged for [Fedora](https://apps.fedoraproject.org/packages/rubygem-asciidoctor), [Debian](https://packages.debian.org/sid/asciidoctor), [Ubuntu](https://packages.ubuntu.com/search?keywords=asciidoctor), [Alpine Linux](https://pkgs.alpinelinux.org/packages?name=asciidoctor), [OpenSUSE](https://software.opensuse.org/package/rubygem-asciidoctor), and [Homebrew](http://brewformulas.org/Asciidoctor). You can use the system's package manager to install the package named **asciidoctor**.
+
+## Changelog
+
+#{changelog}
+
+## Release meta
+
+Released on: #{release_date}
+Released by: @#{release_user}
+Release beer: #{release_beer}
+
+Logs: [resolved issues](#{issues_url}?q=is%3Aissue+label%3A#{release_tag}+is%3Aclosed)#{previous_tag ? %( | [source diff](#{repo_url}/compare/#{previous_tag}...#{release_tag}) | [gem diff](https://my.diffend.io/gems/asciidoctor/#{previous_tag}/#{release_tag})) : ''}
+
+## Credits
+
+A very special thanks to all the **awesome** [supporters of the Asciidoctor OpenCollective campaign](https://opencollective.com/asciidoctor), who provide critical funding for the ongoing development of this project.
+EOS
+
+File.write 'release-notes.md', notes, mode: 'w:UTF-8'
diff --git a/tasks/version.rb b/tasks/version.rb
new file mode 100644
index 00000000..4be309f8
--- /dev/null
+++ b/tasks/version.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'time'
+
+release_version = ENV['RELEASE_VERSION']
+prerelease = (release_version.count '[a-z]') > 0 ? %(-#{(release_version.split '.', 3)[-1]}) : nil
+release_date = Time.now.strftime '%Y-%m-%d'
+release_user = ENV['RELEASE_USER']
+
+version_file = Dir['lib/**/version.rb'].first
+readme_file = 'README.adoc'
+changelog_file = 'CHANGELOG.adoc'
+antora_file = 'docs/antora.yml'
+
+version_contents = (File.readlines version_file, mode: 'r:UTF-8').map do |l|
+ (l.include? 'VERSION') ? (l.sub %r/'[^']+'/, %('#{release_version}')) : l
+end
+
+readme_contents = File.readlines readme_file, mode: 'r:UTF-8'
+if readme_contents[2].start_with? 'v'
+ readme_contents[2] = %(v#{release_version}, #{release_date}\n)
+else
+ readme_contents.insert 2, %(v#{release_version}, #{release_date}\n)
+end
+
+changelog_contents = (File.readlines changelog_file, mode: 'r:UTF-8').reject do |line|
+ line == %(// tag::compact[]\n) || line == %(// end::compact[]\n)
+end
+if (last_release_idx = changelog_contents.index {|l| (l.start_with? '== ') && (%r/^== \d/.match? l) })
+ previous_release_version = (changelog_contents[last_release_idx].match %r/\d\S+/)[0]
+else
+ last_release_idx = changelog_contents.length
+end
+changelog_contents.insert last_release_idx, <<~END
+=== Details
+
+{url-repo}/releases/tag/v#{release_version}[git tag]#{previous_release_version ? %( | {url-repo}/compare/v#{previous_release_version}\\...v#{release_version}[source diff]) : ''}
+// end::compact[]
+
+END
+if (unreleased_idx = changelog_contents.index {|l| (l.start_with? '== Unreleased') && l.rstrip == '== Unreleased' })
+ changelog_contents[unreleased_idx] = %(// tag::compact[]\n== #{release_version} (#{release_date}) - @#{release_user}\n)
+else
+ changelog_contents.insert last_release_idx, <<~END
+ // tag::compact[]
+ == #{release_version} (#{release_date}) - @#{release_user}
+
+ _No changes since previous release._
+
+ END
+end
+
+antora_contents = (File.readlines antora_file, mode: 'r:UTF-8').map do |l|
+ if l.start_with? 'prerelease: '
+ %(prerelease: #{prerelease ? 'true' : 'false'}\n)
+ elsif l.start_with? 'version: '
+ %(version: '#{release_version}'\n)
+ else
+ l
+ end
+end
+
+File.write version_file, version_contents.join, mode: 'w:UTF-8'
+File.write readme_file, readme_contents.join, mode: 'w:UTF-8'
+File.write changelog_file, changelog_contents.join, mode: 'w:UTF-8'
+File.write antora_file, antora_contents.join, mode: 'w:UTF-8'