cookbook-release 1.3.4 → 1.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.travis.yml +2 -1
- data/README.md +1 -1
- data/cookbook-release.gemspec +3 -2
- data/lib/cookbook-release.rb +45 -16
- data/lib/cookbook-release/changelog.rb +86 -0
- data/lib/cookbook-release/commit.rb +25 -3
- data/lib/cookbook-release/git-utilities.rb +6 -2
- data/lib/cookbook-release/release.rb +7 -1
- data/spec/changelog_spec.rb +35 -0
- data/spec/commit_spec.rb +12 -0
- data/spec/git_spec.rb +48 -2
- metadata +18 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 1d320d81b00bbc0568db5a101bf05cb341ffc23aed196a0d82a08a37c2921ccd
|
|
4
|
+
data.tar.gz: a66c146cce4f56369b30329f810d0de829abe85fcfe79f9760d0f445547d3a65
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a8d578db88940e2a0552cd74a203e104693ec1377b97db12fbf29ea15aed8e58e1fb1e967bc3226a8fb45a5689c24ab69d7826fd96a6935fdfc9d908b38f540d
|
|
7
|
+
data.tar.gz: febc04990a5974dd9305874332443155069f3f044d562fb5297b805345554b2ba62bac2b2e389bbde73bf396b1ef49b2caceddde7ec21b3501d4202d11aed7c7
|
data/.travis.yml
CHANGED
|
@@ -4,8 +4,9 @@ rvm:
|
|
|
4
4
|
deploy:
|
|
5
5
|
provider: rubygems
|
|
6
6
|
api_key:
|
|
7
|
-
secure:
|
|
7
|
+
secure: ylfB0GIaZxPfZ6/dSJIPujfSt3vxqVFg16lqTBq/2AAZ0qwKTZi9qeM/QZDLMX28vCXmTsYxHGepmyvv0PvJaKvy7E6YBzIKz1Y1vsEZFeAFrgIQq9cDvc4wIX2eFjI7N1ChyaRgi+YYK4BSVfKjYqGBfXk5Wyh7uqNEuWE7FzABV+RxXoHcNi+AhYkCX3NF80qNukXRtiB7XTQj6CP4Wd+Dm25iOUwx8/zNMce8Z8V3j2ysvR4Vtm/soDsr/+Z+27wIdP0VqwElV1FxtR9km8MIJhmzSsnzcvgqJpRmMvO6HLZFzwqnLBzCoPYJqm3K+uQSSfll5LbaNtixlBzIusgtGgm1UjQy1YDGkPexJd5K5CuC/LW78Y7Zrl3CeT34RDlICoztEjhJxFry3EvFxPT03lVQx5z5Fc55/u0hy3mBCiHbxHxAPJLMOtehfv35bzOS7Jv3+otBm/8jn9dXO2pJJdwxL9W2wrzljWkly4yemwceMvtMYf+xnf1zdTnMYoqkYGGl0KutbFL69w78w7BwTFQIhcJOO+g27C6V8vHtqU0U5JOgE/QNg3yWhzhQjgCpzQhmuO+Bcs3Jq2T/OcqTfwM6gufNe+Gq2TdEfeH5Y0WcRtTKJBVVQ4XWFtgONE1C1hNBFLyh7GNZDQQVYBT3c/MXeV5Q++rVJYOdSrw=
|
|
8
8
|
gem: cookbook-release
|
|
9
9
|
on:
|
|
10
10
|
tags: true
|
|
11
11
|
repo: criteo/cookbook-release
|
|
12
|
+
skip_cleanup: 'true'
|
data/README.md
CHANGED
|
@@ -77,4 +77,4 @@ require 'cookbook-release'
|
|
|
77
77
|
CookbookRelease::Rake::RepoTask.new
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
-
will allow to create tasks to generate html changelog between HEAD and master branch. It aims to make some changes more visible such as [Risky] tag (or any tag used for major changes).
|
|
80
|
+
will allow to create tasks to generate html changelog between HEAD and master branch. It aims to make some changes more visible such as [Risky] tag (or any tag used for major changes). You may add a `sub_dir` parameter to restrict the scope of the changes to a sub-directory of the git root.
|
data/cookbook-release.gemspec
CHANGED
|
@@ -6,7 +6,7 @@ require 'English'
|
|
|
6
6
|
|
|
7
7
|
Gem::Specification.new do |spec|
|
|
8
8
|
spec.name = 'cookbook-release'
|
|
9
|
-
spec.version = '1.
|
|
9
|
+
spec.version = '1.4.5'
|
|
10
10
|
spec.authors = ['Grégoire Seux']
|
|
11
11
|
spec.email = 'g.seux@criteo.com'
|
|
12
12
|
spec.summary = 'Provide primitives (and rake tasks) to release a cookbook'
|
|
@@ -22,8 +22,9 @@ Gem::Specification.new do |spec|
|
|
|
22
22
|
spec.add_dependency 'semantic'
|
|
23
23
|
spec.add_dependency 'highline'
|
|
24
24
|
spec.add_dependency 'mixlib-shellout'
|
|
25
|
-
spec.add_dependency 'chef'
|
|
25
|
+
spec.add_dependency 'chef', '>= 12.18.31'
|
|
26
26
|
spec.add_dependency 'git-ng' # see https://github.com/schacon/ruby-git/issues/307
|
|
27
|
+
spec.add_dependency 'unicode-emoji'
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
spec.add_development_dependency 'rspec'
|
data/lib/cookbook-release.rb
CHANGED
|
@@ -12,15 +12,22 @@ module CookbookRelease
|
|
|
12
12
|
|
|
13
13
|
class RepoTask < ::Rake::TaskLib
|
|
14
14
|
def initialize(opts = {}, &html_block)
|
|
15
|
-
desc
|
|
16
|
-
task
|
|
17
|
-
git = GitUtilities.new
|
|
15
|
+
desc 'Display raw changelog between branches'
|
|
16
|
+
task 'changelog:raw', [:sub_dir] do |_, args|
|
|
17
|
+
git = GitUtilities.new('sub_dir': args['sub_dir'])
|
|
18
18
|
puts Changelog.new(git, opts).raw
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
desc
|
|
22
|
-
task
|
|
23
|
-
git = GitUtilities.new
|
|
21
|
+
desc 'Display raw changelog between branches with risky commits on top'
|
|
22
|
+
task 'changelog:raw_priority', [:sub_dir] do |_, args|
|
|
23
|
+
git = GitUtilities.new(args)
|
|
24
|
+
git = GitUtilities.new('sub_dir': args['sub_dir'])
|
|
25
|
+
puts Changelog.new(git, opts).raw_priority
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
desc 'Display html changelog between branches'
|
|
29
|
+
task 'changelog:html', [:sub_dir] do |_, args|
|
|
30
|
+
git = GitUtilities.new('sub_dir': args['sub_dir'])
|
|
24
31
|
html = Changelog.new(git, opts).html
|
|
25
32
|
if block_given?
|
|
26
33
|
html = html_block.call(html)
|
|
@@ -28,11 +35,33 @@ module CookbookRelease
|
|
|
28
35
|
puts html
|
|
29
36
|
end
|
|
30
37
|
|
|
38
|
+
desc 'Display html changelog between branches with risky commits on top'
|
|
39
|
+
task 'changelog:html_priority', [:sub_dir] do |_, args|
|
|
40
|
+
git = GitUtilities.new('sub_dir': args['sub_dir'])
|
|
41
|
+
html = Changelog.new(git, opts).html_priority
|
|
42
|
+
if block_given?
|
|
43
|
+
html = html_block.call(html)
|
|
44
|
+
end
|
|
45
|
+
puts html
|
|
46
|
+
end
|
|
47
|
+
|
|
31
48
|
desc 'Display markdown changelog between branches'
|
|
32
|
-
task 'changelog:markdown' do
|
|
33
|
-
git = GitUtilities.new
|
|
49
|
+
task 'changelog:markdown', [:sub_dir] do |_, args|
|
|
50
|
+
git = GitUtilities.new('sub_dir': args['sub_dir'])
|
|
34
51
|
puts Changelog.new(git, opts).markdown
|
|
35
52
|
end
|
|
53
|
+
|
|
54
|
+
desc 'Display markdown changelog between branches with risky commits on top'
|
|
55
|
+
task 'changelog:markdown_priority', [:sub_dir] do |_, args|
|
|
56
|
+
git = GitUtilities.new('sub_dir': args['sub_dir'])
|
|
57
|
+
puts Changelog.new(git, opts).markdown_priority
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
desc 'Display markdown changelog between branches with risky commits on top and non-node-only changes separated'
|
|
61
|
+
task 'changelog:markdown_priority_nodes', [:sub_dir] do |_, args|
|
|
62
|
+
git = GitUtilities.new('sub_dir': args['sub_dir'])
|
|
63
|
+
puts Changelog.new(git, opts).markdown_priority_nodes
|
|
64
|
+
end
|
|
36
65
|
end
|
|
37
66
|
end
|
|
38
67
|
|
|
@@ -44,8 +73,8 @@ module CookbookRelease
|
|
|
44
73
|
|
|
45
74
|
def define_tasks(namespaced)
|
|
46
75
|
|
|
47
|
-
desc
|
|
48
|
-
task
|
|
76
|
+
desc 'Prepare cookbook release and push tag to git'
|
|
77
|
+
task 'release!' do
|
|
49
78
|
opts = {
|
|
50
79
|
no_prompt: ENV['NO_PROMPT'],
|
|
51
80
|
category: ENV['COOKBOOK_CATEGORY'],
|
|
@@ -54,22 +83,22 @@ module CookbookRelease
|
|
|
54
83
|
Release.new(git, opts).release!
|
|
55
84
|
end
|
|
56
85
|
|
|
57
|
-
desc
|
|
58
|
-
task
|
|
86
|
+
desc 'Suggest new release version'
|
|
87
|
+
task 'release:suggest_version' do
|
|
59
88
|
git = GitUtilities.new
|
|
60
89
|
release = Release.new(git)
|
|
61
90
|
release.display_suggested_version(*release.new_version)
|
|
62
91
|
end
|
|
63
92
|
|
|
64
|
-
desc
|
|
65
|
-
task
|
|
93
|
+
desc 'Display last released version'
|
|
94
|
+
task 'release:version' do
|
|
66
95
|
git = GitUtilities.new
|
|
67
96
|
release = Release.new(git)
|
|
68
97
|
puts release.last_release
|
|
69
98
|
end
|
|
70
99
|
|
|
71
|
-
desc
|
|
72
|
-
task
|
|
100
|
+
desc 'Display changelog since last release'
|
|
101
|
+
task 'release:changelog' do
|
|
73
102
|
git = GitUtilities.new
|
|
74
103
|
release = Release.new(git)
|
|
75
104
|
release.display_changelog(release.new_version.first)
|
|
@@ -4,9 +4,16 @@ module CookbookRelease
|
|
|
4
4
|
DEFAULT_OPTS = {
|
|
5
5
|
expand_major: true,
|
|
6
6
|
expand_risky: true,
|
|
7
|
+
separate_nodes: true,
|
|
7
8
|
short_sha: true
|
|
8
9
|
}
|
|
9
10
|
|
|
11
|
+
RISKY = 'RISKY/BREAKING (details below):'
|
|
12
|
+
NO_RISKY = 'NO RISKY/BREAKING COMMITS. READ FULL CHANGELOG.'
|
|
13
|
+
NON_NODES_ONLY = 'Non-risky/major, Non-node-only commits'
|
|
14
|
+
FULL = 'Full changelog:'
|
|
15
|
+
DETAILS = 'Details of risky commits:'
|
|
16
|
+
|
|
10
17
|
def initialize(git, opts = {})
|
|
11
18
|
@git = git
|
|
12
19
|
@opts = DEFAULT_OPTS.merge(opts)
|
|
@@ -16,6 +23,18 @@ module CookbookRelease
|
|
|
16
23
|
changelog.map(&:to_s_oneline)
|
|
17
24
|
end
|
|
18
25
|
|
|
26
|
+
def raw_priority
|
|
27
|
+
risky_commits = changelog.select { |c| c.risky? || c.major? }
|
|
28
|
+
result = []
|
|
29
|
+
if risky_commits.any?
|
|
30
|
+
result << "#{RISKY}\n" << risky_commits.map(&:to_s_oneline).join("\n") << "\n"
|
|
31
|
+
else
|
|
32
|
+
result << "#{NO_RISKY}\n\n"
|
|
33
|
+
end
|
|
34
|
+
result << "#{FULL}\n"
|
|
35
|
+
result << changelog.map(&:to_s_oneline).join("\n")
|
|
36
|
+
end
|
|
37
|
+
|
|
19
38
|
def html
|
|
20
39
|
result = []
|
|
21
40
|
result << <<-EOH
|
|
@@ -25,6 +44,7 @@ module CookbookRelease
|
|
|
25
44
|
result << changelog.map do |c|
|
|
26
45
|
full_body ||= @opts[:expand_major] && c.major?
|
|
27
46
|
full_body ||= @opts[:expand_risky] && c.risky?
|
|
47
|
+
full_body ||= @opts[:separate_nodes] && c.nodes_only?
|
|
28
48
|
full_body ||= @opts[:expand_commit] && (c[:subject] =~ @opts[:expand_commit] || c[:body] =~ @opts[:expand_commit])
|
|
29
49
|
c.to_s_html(full_body)
|
|
30
50
|
end.map { |c| " <p>#{c}</p>" }
|
|
@@ -35,15 +55,81 @@ module CookbookRelease
|
|
|
35
55
|
result.join("\n")
|
|
36
56
|
end
|
|
37
57
|
|
|
58
|
+
def html_priority
|
|
59
|
+
risky_commits = changelog.select { |c| c.risky? || c.major? }
|
|
60
|
+
result = []
|
|
61
|
+
result << <<-EOH
|
|
62
|
+
<html>
|
|
63
|
+
<body>
|
|
64
|
+
EOH
|
|
65
|
+
if risky_commits.any?
|
|
66
|
+
result << " <p>#{RISKY}</p>\n" << risky_commits.map { |c| c.to_s_html(false) }.map {|c| " <p>#{c}</p>"}.join("\n")
|
|
67
|
+
else
|
|
68
|
+
result << " <p>#{NO_RISKY}</p>\n\n"
|
|
69
|
+
end
|
|
70
|
+
result << " <p>#{FULL}</p>\n"
|
|
71
|
+
result << changelog.map { |c| c.to_s_html(false) }.map { |c| " <p>#{c}</p>" }.join("\n")
|
|
72
|
+
if risky_commits.any?
|
|
73
|
+
result << "\n<p>#{DETAILS}</p>\n"
|
|
74
|
+
result << risky_commits.map { |c| c.to_s_html(true) }.map { |c| " <p>#{c}</p>" }.join("\n")
|
|
75
|
+
end
|
|
76
|
+
result << <<-EOH
|
|
77
|
+
</body>
|
|
78
|
+
</html>
|
|
79
|
+
EOH
|
|
80
|
+
result.join("\n")
|
|
81
|
+
end
|
|
82
|
+
|
|
38
83
|
def markdown
|
|
39
84
|
changelog.map do |c|
|
|
40
85
|
full_body ||= @opts[:expand_major] && c.major?
|
|
41
86
|
full_body ||= @opts[:expand_risky] && c.risky?
|
|
87
|
+
full_body ||= @opts[:separate_nodes] && c.nodes_only?
|
|
88
|
+
full_body ||= @opts[:expand_commit] && (c[:subject] =~ @opts[:expand_commit] || c[:body] =~ @opts[:expand_commit])
|
|
42
89
|
full_body ||= @opts[:expand_commit] && (c[:subject] =~ @opts[:expand_commit] || c[:body] =~ @opts[:expand_commit])
|
|
43
90
|
c.to_s_markdown(full_body)
|
|
44
91
|
end.join("\n")
|
|
45
92
|
end
|
|
46
93
|
|
|
94
|
+
def markdown_priority
|
|
95
|
+
risky_commits = changelog.select { |c| c.risky? || c.major? }
|
|
96
|
+
result = []
|
|
97
|
+
if risky_commits.any?
|
|
98
|
+
result << "*#{RISKY}*\n" << risky_commits.map { |c| c.to_s_markdown(false) }.join("\n") << "\n"
|
|
99
|
+
else
|
|
100
|
+
result << "*#{NO_RISKY}*\n\n"
|
|
101
|
+
end
|
|
102
|
+
result << "*#{FULL}*\n"
|
|
103
|
+
result << changelog.map { |c| c.to_s_markdown(false) }.join("\n")
|
|
104
|
+
if risky_commits.any?
|
|
105
|
+
result << "\n#{DETAILS}\n"
|
|
106
|
+
result << risky_commits.map { |c| c.to_s_markdown(true) }.join("\n")
|
|
107
|
+
end
|
|
108
|
+
result
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def markdown_priority_nodes
|
|
112
|
+
cl = changelog
|
|
113
|
+
risky_commits = cl.select { |c| c.risky? || c.major? }
|
|
114
|
+
not_nodes_only_commits = cl.reject { |c| c.nodes_only? || c.risky? || c.major? }
|
|
115
|
+
result = []
|
|
116
|
+
if risky_commits.any?
|
|
117
|
+
result << "*#{RISKY}*\n" << risky_commits.map { |c| c.to_s_markdown(false) }.join("\n") << "\n"
|
|
118
|
+
else
|
|
119
|
+
result << "*#{NO_RISKY}*\n\n"
|
|
120
|
+
end
|
|
121
|
+
if not_nodes_only_commits.any?
|
|
122
|
+
result << "*#{NON_NODES_ONLY}*\n" << not_nodes_only_commits.map { |c| c.to_s_markdown(false) }.join("\n") << "\n"
|
|
123
|
+
end
|
|
124
|
+
result << "*#{FULL}*\n"
|
|
125
|
+
result << cl.map { |c| c.to_s_markdown(false) }.join("\n")
|
|
126
|
+
if risky_commits.any?
|
|
127
|
+
result << "\n#{DETAILS}\n"
|
|
128
|
+
result << risky_commits.map { |c| c.to_s_markdown(true) }.join("\n")
|
|
129
|
+
end
|
|
130
|
+
result
|
|
131
|
+
end
|
|
132
|
+
|
|
47
133
|
private
|
|
48
134
|
|
|
49
135
|
def changelog
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
require 'unicode/emoji'
|
|
3
|
+
|
|
1
4
|
module CookbookRelease
|
|
2
5
|
class Commit
|
|
3
6
|
extend Forwardable
|
|
@@ -34,6 +37,10 @@ module CookbookRelease
|
|
|
34
37
|
!!(self[:subject] =~ /\[risky\]/i)
|
|
35
38
|
end
|
|
36
39
|
|
|
40
|
+
def nodes_only?
|
|
41
|
+
self[:nodes_only]
|
|
42
|
+
end
|
|
43
|
+
|
|
37
44
|
def color
|
|
38
45
|
case true
|
|
39
46
|
when major?
|
|
@@ -59,7 +66,7 @@ module CookbookRelease
|
|
|
59
66
|
if full && self[:body]
|
|
60
67
|
result << <<-EOH
|
|
61
68
|
<pre>
|
|
62
|
-
#{self[:body]}
|
|
69
|
+
#{strip_change_id(self[:body])}
|
|
63
70
|
</pre>
|
|
64
71
|
EOH
|
|
65
72
|
end
|
|
@@ -75,9 +82,24 @@ module CookbookRelease
|
|
|
75
82
|
else
|
|
76
83
|
result << "_#{self[:author]} <#{self[:email]}>_"
|
|
77
84
|
end
|
|
78
|
-
result <<
|
|
79
|
-
result <<
|
|
85
|
+
result << ' '
|
|
86
|
+
result << backtick_string(self[:subject])
|
|
87
|
+
result << "\n```\n#{strip_change_id(self[:body])}```" if full && self[:body]
|
|
80
88
|
result
|
|
81
89
|
end
|
|
90
|
+
|
|
91
|
+
def backtick_string(input)
|
|
92
|
+
s = input.gsub(/( )?(#{Unicode::Emoji::REGEX})( )?/, '` \2 `')
|
|
93
|
+
.gsub(/( )?``( )?/, '')
|
|
94
|
+
s += '`' unless s =~ /`$/
|
|
95
|
+
s = '`' + s unless s =~ /^`/
|
|
96
|
+
s
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
private
|
|
100
|
+
|
|
101
|
+
def strip_change_id(body)
|
|
102
|
+
body.each_line.reject {|l| l.start_with?('Change-Id') }.join
|
|
103
|
+
end
|
|
82
104
|
end
|
|
83
105
|
end
|
|
@@ -12,6 +12,7 @@ module CookbookRelease
|
|
|
12
12
|
def initialize(options={})
|
|
13
13
|
@tag_prefix = options[:tag_prefix] || ''
|
|
14
14
|
cwd = options[:cwd] || Dir.pwd
|
|
15
|
+
@sub_dir = options[:sub_dir] # if nil takes the cwd
|
|
15
16
|
@shellout_opts = {
|
|
16
17
|
cwd: cwd
|
|
17
18
|
}
|
|
@@ -63,7 +64,7 @@ module CookbookRelease
|
|
|
63
64
|
end
|
|
64
65
|
|
|
65
66
|
def compute_changelog(since, short_sha = true)
|
|
66
|
-
@g.log(500).between(since, 'HEAD').map do |commit|
|
|
67
|
+
@g.log(500).object(@sub_dir).between(since, 'HEAD').map do |commit|
|
|
67
68
|
message = commit.message.lines.map(&:chomp).compact.delete_if(&:empty?)
|
|
68
69
|
Commit.new(
|
|
69
70
|
author: commit.author.name,
|
|
@@ -71,7 +72,10 @@ module CookbookRelease
|
|
|
71
72
|
subject: message.delete_at(0),
|
|
72
73
|
hash: short_sha ? commit.sha[0,7] : commit.sha,
|
|
73
74
|
body: message.empty? ? nil : message.join("\n"),
|
|
74
|
-
is_merge_commit: commit.parents.length > 1
|
|
75
|
+
is_merge_commit: commit.parents.length > 1,
|
|
76
|
+
nodes_only: @g.diff(commit.sha, "#{commit.sha}~1").name_status.reject do |path, change_type|
|
|
77
|
+
path.include?('nodes/') && ['A', 'D'].include?(change_type) # basic node additions or deletions only
|
|
78
|
+
end.count.zero?
|
|
75
79
|
)
|
|
76
80
|
end.reject { |commit| commit[:is_merge_commit] }
|
|
77
81
|
end
|
|
@@ -86,7 +86,13 @@ module CookbookRelease
|
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
def release!
|
|
89
|
-
|
|
89
|
+
|
|
90
|
+
new_version = begin
|
|
91
|
+
prepare_release
|
|
92
|
+
rescue ExistingRelease
|
|
93
|
+
raise unless ENV['COOKBOOK_RELEASE_SILENT_FAIL']
|
|
94
|
+
exit 0
|
|
95
|
+
end
|
|
90
96
|
begin
|
|
91
97
|
git.tag(new_version)
|
|
92
98
|
display_changelog(new_version)
|
data/spec/changelog_spec.rb
CHANGED
|
@@ -55,5 +55,40 @@ describe CookbookRelease::Changelog do
|
|
|
55
55
|
expect(changelog.markdown).to start_with('*654321* @j.doe `[Risky] hello`')
|
|
56
56
|
end
|
|
57
57
|
end
|
|
58
|
+
context 'Separates risky and non-risky+non-nodes' do
|
|
59
|
+
let(:commits) do
|
|
60
|
+
[
|
|
61
|
+
CookbookRelease::Commit.new(
|
|
62
|
+
hash: '654321',
|
|
63
|
+
subject: 'hello',
|
|
64
|
+
author: 'John Doe',
|
|
65
|
+
email: 'j.doe@nobody.com',
|
|
66
|
+
body: 'New Men Just Want to Watch the World Burn',
|
|
67
|
+
nodes_only: false),
|
|
68
|
+
CookbookRelease::Commit.new(
|
|
69
|
+
hash: '654321',
|
|
70
|
+
subject: '[Risky] hello',
|
|
71
|
+
author: 'John Doe',
|
|
72
|
+
email: 'j.doe@nobody.com',
|
|
73
|
+
body: 'Some Men Just Want to Watch the World Turn',
|
|
74
|
+
nodes_only: true),
|
|
75
|
+
CookbookRelease::Commit.new(
|
|
76
|
+
hash: '654321',
|
|
77
|
+
subject: 'hello only nodes',
|
|
78
|
+
author: 'John Doe',
|
|
79
|
+
email: 'j.doe@nobody.com',
|
|
80
|
+
body: 'Old Men Just Want to Watch the World Learn',
|
|
81
|
+
nodes_only: true)
|
|
82
|
+
]
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it 'expands the body with non-risky+non-nodes' do
|
|
86
|
+
expect(git).to receive(:compute_changelog).and_return(commits)
|
|
87
|
+
changelog = CookbookRelease::Changelog.new(git, expand_risky: true, nodes_only: true)
|
|
88
|
+
expect(changelog.markdown_priority_nodes.join('')).to include(
|
|
89
|
+
"\n*Non-risky/major, Non-node-only commits*\n*654321* _John Doe <j.doe@nobody.com>_ `hello`\n*Full"
|
|
90
|
+
)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
58
93
|
end
|
|
59
94
|
end
|
data/spec/commit_spec.rb
CHANGED
|
@@ -23,4 +23,16 @@ describe CookbookRelease::Commit do
|
|
|
23
23
|
expect(minor_change) .not_to be_patch
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
|
+
|
|
27
|
+
describe '.to_s_markdown' do
|
|
28
|
+
it 'surrounds subject with backticks' do
|
|
29
|
+
commit = CookbookRelease::Commit.new(subject: 'This is a fix', hash: 'abcdef', author: 'Linus', email: 'linus@linux.org')
|
|
30
|
+
expect(commit.to_s_markdown(false)).to match(/`#{commit[:subject]}`/)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'properly handle emojis' do
|
|
34
|
+
commit = CookbookRelease::Commit.new(subject: 'This is a fix 🔧 and I love 🪐🚀', hash: 'abcdef', author: 'Linus', email: 'linus@linux.org')
|
|
35
|
+
expect(commit.to_s_markdown(false)).to match(/`This is a fix` 🔧 `and I love` 🪐🚀/)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
26
38
|
end
|
data/spec/git_spec.rb
CHANGED
|
@@ -123,16 +123,35 @@ git tag 12.34.56
|
|
|
123
123
|
cmd.run_command
|
|
124
124
|
cmd.error!
|
|
125
125
|
end
|
|
126
|
-
|
|
127
126
|
changelog = git.compute_changelog('1.0.0')
|
|
128
127
|
expect(changelog.size).to eq(3)
|
|
129
128
|
expect(changelog.map {|c| c[:subject]}).to contain_exactly('A commit', 'Another commit', 'A third one')
|
|
130
129
|
end
|
|
131
130
|
|
|
132
|
-
it '
|
|
131
|
+
it 'shows only sub_dir commits' do
|
|
133
132
|
cmds = <<-EOH
|
|
134
133
|
git commit --allow-empty -m "subject" -m "body" -m "line2"
|
|
135
134
|
git commit --allow-empty -m "without body"
|
|
135
|
+
mkdir -p subbie
|
|
136
|
+
echo "hello" > subbie/there
|
|
137
|
+
git add subbie/there
|
|
138
|
+
git commit -m "hello there"
|
|
139
|
+
EOH
|
|
140
|
+
sub_git = CookbookRelease::GitUtilities.new(sub_dir: 'subbie')
|
|
141
|
+
cmds.split("\n").each do |cmd|
|
|
142
|
+
cmd = Mixlib::ShellOut.new(cmd)
|
|
143
|
+
cmd.run_command
|
|
144
|
+
cmd.error!
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
changelog = sub_git.compute_changelog('1.0.0')
|
|
148
|
+
expect(changelog.size).to eq(1)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it 'parse correctly commits' do
|
|
152
|
+
cmds = <<-EOH
|
|
153
|
+
git commit --allow-empty --no-verify -m "subject" -m "body" -m "line2"
|
|
154
|
+
git commit --allow-empty --no-verify -m "without body"
|
|
136
155
|
EOH
|
|
137
156
|
cmds.split("\n").each do |cmd|
|
|
138
157
|
cmd = Mixlib::ShellOut.new(cmd)
|
|
@@ -164,5 +183,32 @@ git tag 12.34.56
|
|
|
164
183
|
changelog = git.compute_changelog('HEAD~1', false)
|
|
165
184
|
expect(changelog[0][:hash].size).to eq(40)
|
|
166
185
|
end
|
|
186
|
+
|
|
187
|
+
it 'detects node-only commits' do
|
|
188
|
+
cmds = <<-EOH
|
|
189
|
+
mkdir -p nodes/preprod
|
|
190
|
+
echo "hello first" > nodes/preprod/tata.rb
|
|
191
|
+
git add nodes/preprod/tata.rb
|
|
192
|
+
git commit -m "hello there"
|
|
193
|
+
echo "hello second" > nodes/preprod/tata.rb
|
|
194
|
+
git add nodes/preprod/tata.rb
|
|
195
|
+
git commit -m "hello there modify"
|
|
196
|
+
mkdir -p toto
|
|
197
|
+
echo "hello" > toto/titi.rb
|
|
198
|
+
git add toto/titi.rb
|
|
199
|
+
git commit -m "subject" -m "body" -m "line2"
|
|
200
|
+
EOH
|
|
201
|
+
cmds.split("\n").each do |cmd|
|
|
202
|
+
cmd = Mixlib::ShellOut.new(cmd)
|
|
203
|
+
cmd.run_command
|
|
204
|
+
cmd.error!
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
git = CookbookRelease::GitUtilities.new
|
|
208
|
+
changelog = git.compute_changelog('HEAD~3')
|
|
209
|
+
expect(changelog[0][:nodes_only]).to be false # Add a non-"nodes" file
|
|
210
|
+
expect(changelog[1][:nodes_only]).to be false # Modify a "nodes" file
|
|
211
|
+
expect(changelog[2][:nodes_only]).to be true # Add a "nodes" file
|
|
212
|
+
end
|
|
167
213
|
end
|
|
168
214
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cookbook-release
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.4.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Grégoire Seux
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2020-06-05 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: semantic
|
|
@@ -54,6 +54,20 @@ dependencies:
|
|
|
54
54
|
version: '0'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: chef
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 12.18.31
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 12.18.31
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: git-ng
|
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
|
58
72
|
requirements:
|
|
59
73
|
- - ">="
|
|
@@ -67,7 +81,7 @@ dependencies:
|
|
|
67
81
|
- !ruby/object:Gem::Version
|
|
68
82
|
version: '0'
|
|
69
83
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
84
|
+
name: unicode-emoji
|
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
|
72
86
|
requirements:
|
|
73
87
|
- - ">="
|
|
@@ -181,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
181
195
|
version: '0'
|
|
182
196
|
requirements: []
|
|
183
197
|
rubyforge_project:
|
|
184
|
-
rubygems_version: 2.
|
|
198
|
+
rubygems_version: 2.7.7
|
|
185
199
|
signing_key:
|
|
186
200
|
specification_version: 4
|
|
187
201
|
summary: Provide primitives (and rake tasks) to release a cookbook
|