releasetool 0.4.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a125cee11cd4ea5f8f7e0d11f1483c6d97e0d5b8e95f66a86641ac84e27ca1d
4
- data.tar.gz: 45b0ec021a7e0067655a7c87d334b45687df6a2a4b21920b0b895c770a9045d6
3
+ metadata.gz: be31ca29505431ae2078f139521c8a0de7ebe18146acee1feaa862e169475645
4
+ data.tar.gz: cf6a69fe17b82ea44099124cfc61b53b5541b9767d813cc4260d9908e9260446
5
5
  SHA512:
6
- metadata.gz: 0c4147c03ebf447fd56092d1348aa95fa5eb808d007ac9a39ce82344724fa5b09921a88628524b379408d4b40a64a0709f7f1aec8f4f4183ea63f37286f38868
7
- data.tar.gz: a8c6d7e67bde87c0935175e12b75bc400dd0f425cafb8d2d7a318f0ba7ebfad28ba599cce13d65a01d4e74f69b6aab6f4015616021577640035fd8daa32d00df
6
+ metadata.gz: e0c60d8f3d241c2bbc4035cbd71e5b8a744a99618c9f4aa72718918c6c66b926647d0bf4bd327cf5a1b87066631a94b73160be3972e0b5b62e9449a84d496485
7
+ data.tar.gz: 1a38cc0c5f621f84030f95baa81fe13229ac51621cee1462cdb88e9d907039595b76825eb3e47c4007f17391a7472ed8c1cd0485da0bce9fc835e578e0c322fd
data/README.md CHANGED
@@ -69,6 +69,7 @@ It will ask for a one-line summary of the release (full details are in the relea
69
69
 
70
70
  The tests work on a known-good repo stored in `spec/fixtures/example_with_releases.tar`. To recreate this:
71
71
  ```
72
+ mkdir -p spec/fixtures/example_with_releases
72
73
  cd spec/fixtures/example_with_releases && tar -xvf ../example_with_releases.tar && cd -
73
74
  ```
74
75
 
@@ -77,11 +78,20 @@ then you can tweak it and save it back with:
77
78
  cd spec/fixtures/example_with_releases && tar -cvf ../example_with_releases.tar . && cd -
78
79
  ```
79
80
 
81
+ ditto for other one with config
82
+
83
+ cd spec/fixtures/example_with_releases && tar -cvf ../example_with_releases.tar . && cd -
84
+
80
85
  ## Configuration
81
86
 
82
87
  If you want it to automatically update the version number in a string then set the environment variable
83
88
  `RELEASETOOL_VERSION_FILE`, eg. `export RELEASETOOL_VERSION_FILE=./lib/releasetool.rb`. By default this is configured to config/initializers/00-version.rb (useful for rails projects).
84
89
 
90
+ If you want to run something after `release start` or after `release commit` then generate a hooks file:
91
+
92
+ release init
93
+
94
+ which will generate a file at `config/releasetool/hooks.rb` which you can adjust.
85
95
 
86
96
  ## Contributing
87
97
 
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "releasetool/util"
4
+
5
+ module Releasetool
6
+ class BaseHooks
7
+ # @param config [Releasetool::Configuration]
8
+ def initialize(config)
9
+ @config = config
10
+ end
11
+
12
+ def after_prepare(version)
13
+ # noop
14
+ end
15
+
16
+ def after_commit(version)
17
+ # noop
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "releasetool/util"
4
+ require "pathname"
5
+
6
+ module Releasetool
7
+ class Configuration
8
+ def after_start_hook(version)
9
+ return nil unless hooks.respond_to?(:after_start)
10
+
11
+ hooks.after_start(version)
12
+ end
13
+
14
+ def after_commit_hook(version)
15
+ return nil unless hooks.respond_to?(:after_commit)
16
+
17
+ hooks.after_commit(version)
18
+ end
19
+
20
+ def generate
21
+ FileUtils.mkdir_p(config_dir)
22
+ if File.exist?(hooks_file)
23
+ say "File #{hooks_file.inspect} already exists"
24
+ return
25
+ end
26
+
27
+ File.write(hooks_file, default_hooks)
28
+ end
29
+
30
+ private
31
+
32
+ def config_dir
33
+ Pathname.new("./config/releasetool")
34
+ end
35
+
36
+ def hooks
37
+ @hooks ||= new_hooks
38
+ end
39
+
40
+ def new_hooks
41
+ return nil unless File.exist?(hooks_file)
42
+
43
+ load hooks_file # we use load so we can test it 🙁
44
+ return nil unless defined?(Releasetool::Hooks)
45
+
46
+ Releasetool::Hooks.new(self)
47
+ end
48
+
49
+ def hooks_file
50
+ config_dir / "hooks.rb"
51
+ end
52
+
53
+ def default_hooks
54
+ <<~HOOKS
55
+ # frozen_string_literal: true
56
+
57
+ require "releasetool/util"
58
+ require "releasetool/base_hooks"
59
+
60
+ module Releasetool
61
+ class Hooks < Releasetool::BaseHooks
62
+ include Releasetool::Util
63
+
64
+ # def after_start(version)
65
+ # puts "after_start has been called"
66
+ # end
67
+
68
+ # def after_commit(version)
69
+ # puts "after_commit has been called"
70
+ # end
71
+ end
72
+ end
73
+ HOOKS
74
+ end
75
+ end
76
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'English'
4
+ require "releasetool/configuration"
4
5
 
5
6
  module Releasetool
6
7
  module Util
@@ -35,5 +36,10 @@ module Releasetool
35
36
 
36
37
  output
37
38
  end
39
+
40
+ # @return [Releasetool::Configuration]
41
+ def config
42
+ @config ||= Releasetool::Configuration.new
43
+ end
38
44
  end
39
45
  end
data/lib/releasetool.rb CHANGED
@@ -3,5 +3,5 @@
3
3
  require "releasetool/release"
4
4
 
5
5
  module Releasetool
6
- VERSION = "0.4.0"
6
+ VERSION = "0.5.1"
7
7
  end
@@ -8,6 +8,16 @@ require "releasetool/version"
8
8
 
9
9
  class Release < Thor
10
10
  include Releasetool::Util
11
+ desc "init", <<-END
12
+ generate optional config directory and optional hooks file
13
+ END
14
+
15
+ def init
16
+ config.generate
17
+ end
18
+
19
+ # ========================
20
+
11
21
  desc "list", <<-END
12
22
  show a list of tags ordered by date (just a git listing).
13
23
  END
@@ -51,9 +61,10 @@ class Release < Thor
51
61
  def start(specified_version = nil)
52
62
  raise Thor::Error.new("Can't start when already started on a version. release abort or release finish") if File.exist?(RELEASE_MARKER_FILE)
53
63
 
54
- version = next_version(specified_version)
64
+ version = specified_version ? Releasetool::Version.new(specified_version) : next_version
55
65
  File.write(RELEASE_MARKER_FILE, version)
56
66
  Releasetool::Release.new(version, previous: previous_version).prepare(edit: options[:edit])
67
+ config.after_start_hook(version)
57
68
  end
58
69
 
59
70
  DEFAULT_COMMIT_MESSAGE = 'preparing for release [CI SKIP]'
@@ -62,13 +73,16 @@ class Release < Thor
62
73
  If no version given, it will use the version stored by release start
63
74
  END
64
75
 
65
- # should take release commit --edit which allows you to edit, or --no-edit (default) which allows you to just skip
66
- method_option :edit, type: :boolean, desc: "edit", aliases: 'e', default: false
76
+ method_option :edit, type: :boolean, desc: "release commit --edit allows you to edit, or --no-edit (default) which allows you to just skip", aliases: 'e', default: false
77
+ method_option :after, type: :boolean, desc: " --after (only do after -- needed for when after fails first time); --no-after (only do the standard); default is do both", default: "default", check_default_type: false
67
78
  def commit(version = nil)
68
- version || stored_version
69
- guarded_system("git add #{DIR}")
70
- guarded_system("git add #{Releasetool::Util.version_file}") if File.exist?(Releasetool::Util.version_file)
71
- guarded_system("git commit #{DIR} #{File.exist?(Releasetool::Util.version_file) ? Releasetool::Util.version_file : ''} #{options[:edit] ? '-e' : nil} -m\"#{DEFAULT_COMMIT_MESSAGE}\"")
79
+ version ||= stored_version
80
+ if options[:after] == "default" || !options[:after]
81
+ guarded_system("git add #{DIR}")
82
+ guarded_system("git add #{Releasetool::Util.version_file}") if File.exist?(Releasetool::Util.version_file)
83
+ guarded_system("git commit #{DIR} #{File.exist?(Releasetool::Util.version_file) ? Releasetool::Util.version_file : ''} #{options[:edit] ? '-e' : nil} -m\"#{DEFAULT_COMMIT_MESSAGE}\"")
84
+ end
85
+ config.after_commit_hook(version) unless options[:after]
72
86
  end
73
87
 
74
88
  desc "tag (NEW_VERSION)", <<-END
@@ -111,9 +125,7 @@ class Release < Thor
111
125
 
112
126
  protected
113
127
 
114
- def next_version(specified)
115
- return Releasetool::Version.new(specified) if specified
116
-
128
+ def next_version
117
129
  if options[:major]
118
130
  previous_version.next_major
119
131
  elsif options[:minor]
@@ -0,0 +1,5 @@
1
+ v0.5.0 Release Notes
2
+
3
+ *Changes since v0.4.0*
4
+
5
+ - allow local configuration of after_start and after_commit (#12)
@@ -0,0 +1,8 @@
1
+ v0.5.1 Release Notes
2
+
3
+ *Changes since v0.5.0*
4
+
5
+ allow release commit --after and release commit --no-after (#13)
6
+
7
+ * `--after` for doing only the after commit hook (if it fails first time).
8
+ * `--no-after` for skipping the after commit hook
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ # deliberately empty
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "releasetool/util"
4
+ require "releasetool/base_hooks"
5
+
6
+ module Releasetool
7
+ class Hooks < Releasetool::BaseHooks
8
+ include Releasetool::Util
9
+
10
+ def after_start(version)
11
+ puts "after_start(#{version}) has been called"
12
+ end
13
+
14
+ def after_commit(version)
15
+ puts "after_commit(#{version}) has been called"
16
+ end
17
+ end
18
+ end
@@ -10,11 +10,15 @@ RSpec.describe Releasetool do
10
10
  end
11
11
  end
12
12
 
13
- RSpec.describe Release, quietly: true do
13
+ RSpec.describe Release, quietly: false do
14
14
  subject { Release.new }
15
+
15
16
  let(:tmpdir) { File.expand_path('../tmp/testing', __dir__) }
16
17
  let(:root_dir) { File.expand_path('..', __dir__) }
18
+ let(:hooks_example_rb) { File.expand_path('./fixtures/hooks_example.rb', __dir__) }
19
+ let(:empty_file) { File.expand_path('./fixtures/empty_file.rb', __dir__) }
17
20
  before {
21
+ Releasetool.send(:remove_const, :Hooks) if defined?(Releasetool::Hooks)
18
22
  FileUtils.rmtree(tmpdir)
19
23
  FileUtils.mkdir_p(tmpdir)
20
24
  FileUtils.chdir(tmpdir)
@@ -53,7 +57,7 @@ RSpec.describe Release, quietly: true do
53
57
 
54
58
  it "with existing release-version file, it should freak out" do
55
59
  FileUtils.touch(File.join(tmpdir, '.RELEASE_NEW_VERSION'))
56
- expect { subject.start('v0.0.3') }.to raise_error
60
+ expect { subject.start('v0.0.3') }.to raise_error(/Can't start when already started on a version/)
57
61
  end
58
62
  end
59
63
 
@@ -92,6 +96,31 @@ RSpec.describe Release, quietly: true do
92
96
  subject.start
93
97
  end
94
98
  end
99
+
100
+ context "with config and..." do
101
+ context "with empty hooks" do
102
+ before do
103
+ FileUtils.mkdir_p("#{tmpdir}/config/releasetool")
104
+ FileUtils.cp(empty_file, "#{tmpdir}/config/releasetool/hooks.rb")
105
+ end
106
+ it "should still work" do
107
+ expect(Releasetool::Release).to receive(:new).with(v_0_0_2, previous: v_0_0_1).and_return(mock_target)
108
+ expect(mock_target).to receive(:prepare)
109
+ expected = "after_start(v0.0.2) has been called"
110
+ expect { subject.start }.not_to output(/#{Regexp.escape(expected)}/).to_stdout
111
+ end
112
+ end
113
+ context "with hook" do
114
+ before do
115
+ FileUtils.mkdir_p("#{tmpdir}/config/releasetool")
116
+ FileUtils.cp(hooks_example_rb, "#{tmpdir}/config/releasetool/hooks.rb")
117
+ end
118
+ it "should output hook" do
119
+ expected = "after_start(v0.0.2) has been called"
120
+ expect { subject.start }.to output(/#{Regexp.escape(expected)}/).to_stdout
121
+ end
122
+ end
123
+ end
95
124
  end
96
125
 
97
126
  describe "commit" do
@@ -114,6 +143,37 @@ RSpec.describe Release, quietly: true do
114
143
  subject.commit('v0.0.3')
115
144
  end
116
145
  end
146
+
147
+ context "with generated config and hook" do
148
+ it "should generate and still work" do
149
+ subject.init
150
+ expected = "after_commit(v0.0.3) has been called"
151
+ expect(subject).to receive(:guarded_system).with("git commit release_notes config/initializers/00-version.rb -m\"#{Release::DEFAULT_COMMIT_MESSAGE}\"")
152
+ expect { subject.commit('v0.0.3') }.not_to output(/#{Regexp.escape(expected)}/).to_stdout
153
+ end
154
+ end
155
+
156
+ context "with config and hook" do
157
+ before do
158
+ FileUtils.mkdir_p("#{tmpdir}/config/releasetool")
159
+ FileUtils.cp(hooks_example_rb, "#{tmpdir}/config/releasetool/hooks.rb")
160
+ end
161
+ it "should output hook" do
162
+ expect(subject).to receive(:guarded_system).with("git commit release_notes config/initializers/00-version.rb -m\"#{Release::DEFAULT_COMMIT_MESSAGE}\"")
163
+ expected = "after_commit(v0.0.3) has been called"
164
+ expect { subject.commit('v0.0.3') }.to output(/#{Regexp.escape(expected)}/).to_stdout
165
+ end
166
+ end
167
+ end
168
+
169
+ describe "init" do
170
+ it "should generate " do
171
+ expect(Dir.exist?("#{tmpdir}/config/releasetool")).to be_falsey
172
+ expect(File.exist?("#{tmpdir}/config/releasetool/hooks.rb")).to be_falsey
173
+ subject.init
174
+ expect(Dir.exist?("#{tmpdir}/config/releasetool")).to be_truthy
175
+ expect(File.exist?("#{tmpdir}/config/releasetool/hooks.rb")).to be_truthy
176
+ end
117
177
  end
118
178
 
119
179
  describe "latest" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: releasetool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Diggins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-11 00:00:00.000000000 Z
11
+ date: 2023-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -98,6 +98,8 @@ files:
98
98
  - Rakefile
99
99
  - bin/release
100
100
  - lib/releasetool.rb
101
+ - lib/releasetool/base_hooks.rb
102
+ - lib/releasetool/configuration.rb
101
103
  - lib/releasetool/release.rb
102
104
  - lib/releasetool/util.rb
103
105
  - lib/releasetool/version.rb
@@ -111,8 +113,12 @@ files:
111
113
  - release_notes/v0.2.0.md
112
114
  - release_notes/v0.3.0.md
113
115
  - release_notes/v0.4.0.md
116
+ - release_notes/v0.5.0.md
117
+ - release_notes/v0.5.1.md
114
118
  - releasetool.gemspec
119
+ - spec/fixtures/empty_file.rb
115
120
  - spec/fixtures/example_with_releases.tar
121
+ - spec/fixtures/hooks_example.rb
116
122
  - spec/releasetool_spec.rb
117
123
  - spec/spec_helper.rb
118
124
  - spec/version_spec.rb
@@ -136,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
142
  - !ruby/object:Gem::Version
137
143
  version: '0'
138
144
  requirements: []
139
- rubygems_version: 3.1.6
145
+ rubygems_version: 3.2.33
140
146
  signing_key:
141
147
  specification_version: 4
142
148
  summary: Release management tools