cookbook-release 1.3.4 → 1.4.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|