knife-changelog 1.2.4 → 1.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/knife-changelog.gemspec +1 -1
- data/lib/chef/knife/changelog.rb +7 -1
- data/lib/knife/changelog/changelog.rb +8 -3
- data/lib/knife/changelog/policyfile.rb +24 -1
- data/spec/unit/policyfile_spec.rb +29 -0
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd73707c23a179823ac967479e0ec8de3780d759fb05689e229854281e33a0a8
|
4
|
+
data.tar.gz: 80bc4745a9c0f39426a6f259d81a46ec13b17680a6601ed5cba2543fb01ed45a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f86532a7c3005c3ec488fe090f66d7c779d148b9fed9eccd90a546bb9c465cc09e23df145618771b994171703576235494c81a4b207b4b6de027799b4bd897a1
|
7
|
+
data.tar.gz: 0f12940e801842989f715b5b0b5be67a6abaaac1d01abfaf3808af42d750beaa7a726fd5d075871094ebda5f044eb6784dd57d68d12c818093130d6b03bb5ab9
|
data/knife-changelog.gemspec
CHANGED
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = 'knife-changelog'
|
8
|
-
spec.version = '1.2
|
8
|
+
spec.version = '1.4.2'
|
9
9
|
spec.authors = ['Gregoire Seux']
|
10
10
|
spec.email = ['kamaradclimber@gmail.com']
|
11
11
|
spec.summary = 'Facilitate access to cookbooks changelog'
|
data/lib/chef/knife/changelog.rb
CHANGED
@@ -42,6 +42,12 @@ class Chef
|
|
42
42
|
long: '--submodules SUBMODULE[,SUBMODULE]',
|
43
43
|
description: 'Submoduless to check for changes as well (comma separated)'
|
44
44
|
|
45
|
+
option :prevent_downgrade,
|
46
|
+
long: '--prevent-downgrade',
|
47
|
+
description: 'Fail if knife-changelog detect a cookbook downgrade',
|
48
|
+
boolean: true,
|
49
|
+
default: false
|
50
|
+
|
45
51
|
option :policyfile,
|
46
52
|
long: '--policyfile PATH',
|
47
53
|
description: 'Link to policyfile, defaults to "Policyfile.rb"',
|
@@ -58,7 +64,7 @@ class Chef
|
|
58
64
|
description: 'Update Berksfile'
|
59
65
|
|
60
66
|
def run
|
61
|
-
Log.info config
|
67
|
+
Log.info config.to_s
|
62
68
|
if config[:policyfile] && File.exist?(config[:policyfile])
|
63
69
|
puts PolicyChangelog.new(
|
64
70
|
@name_args,
|
@@ -239,10 +239,15 @@ class KnifeChangelog
|
|
239
239
|
c
|
240
240
|
end
|
241
241
|
|
242
|
+
GERRIT_REGEXP = %r{^(.*)/[^/]+/[^/]+(?:\.git)$}
|
242
243
|
def linkify(url, changelog)
|
243
|
-
|
244
|
-
|
245
|
-
|
244
|
+
format = case url
|
245
|
+
when /gitlab/, /github/
|
246
|
+
"\\2 (#{url.chomp('.git')}/commit/\\1)"
|
247
|
+
when GERRIT_REGEXP
|
248
|
+
"\\2 (#{::Regexp.last_match(1)}/#/q/\\1)"
|
249
|
+
end
|
250
|
+
format ? changelog.map { |line| line.sub(/^([a-f0-9]+) (.*)$/, format) } : changelog
|
246
251
|
end
|
247
252
|
|
248
253
|
def https_url(location)
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'chef'
|
4
4
|
require 'chef/knife'
|
5
5
|
require 'chef-dk/command/update'
|
6
|
+
require 'chef-dk/command/install'
|
6
7
|
require 'deep_merge'
|
7
8
|
require 'git'
|
8
9
|
require 'json'
|
@@ -10,6 +11,9 @@ require 'rest-client'
|
|
10
11
|
|
11
12
|
class PolicyChangelog
|
12
13
|
TMP_PREFIX = 'knife-changelog'
|
14
|
+
# Regex matching Chef cookbook version syntax
|
15
|
+
# See https://docs.chef.io/cookbook_versioning.html#syntax
|
16
|
+
VERSION_REGEX = /^[1-9]*[0-9](\.[0-9]+){1,2}$/
|
13
17
|
|
14
18
|
# Initialzes Helper class
|
15
19
|
#
|
@@ -28,6 +32,8 @@ class PolicyChangelog
|
|
28
32
|
def update_policyfile_lock
|
29
33
|
backup_dir = Dir.mktmpdir
|
30
34
|
FileUtils.cp(File.join(@policyfile_dir, 'Policyfile.lock.json'), backup_dir)
|
35
|
+
installer = ChefDK::Command::Install.new
|
36
|
+
raise "Cannot install Policyfile lock #{@policyfile_path}" unless installer.run([@policyfile_relative_path]).zero?
|
31
37
|
updater = ChefDK::Command::Update.new
|
32
38
|
raise "Error updating Policyfile lock #{@policyfile_path}" unless updater.run([@policyfile_path, @cookbooks_to_update].flatten).zero?
|
33
39
|
updated_policyfile_lock = read_policyfile_lock(@policyfile_dir)
|
@@ -173,10 +179,24 @@ class PolicyChangelog
|
|
173
179
|
data['current_version'] == data['target_version'] || data['target_version'].nil?
|
174
180
|
end
|
175
181
|
|
182
|
+
# Search for cookbook downgrade and raise an error if any
|
183
|
+
def validate_downgrade!(data)
|
184
|
+
downgrade = data.select do |_, ck|
|
185
|
+
# Do not try to validate downgrade on non-sementic versions (e.g. git revision)
|
186
|
+
ck['target_version'] =~ VERSION_REGEX && ck['current_version'] =~ VERSION_REGEX &&
|
187
|
+
::Gem::Version.new(ck['target_version']) < ::Gem::Version.new(ck['current_version'])
|
188
|
+
end
|
189
|
+
|
190
|
+
return if downgrade.empty?
|
191
|
+
|
192
|
+
details = downgrade.map { |name, data| "#{name} (#{data['current_version']} -> #{data['target_version']})" }
|
193
|
+
raise "Trying to downgrade following cookbooks: #{details.join(', ')}"
|
194
|
+
end
|
195
|
+
|
176
196
|
# Generates Policyfile changelog
|
177
197
|
#
|
178
198
|
# @return [String] formatted version changelog
|
179
|
-
def generate_changelog
|
199
|
+
def generate_changelog(prevent_downgrade: false)
|
180
200
|
lock_current = read_policyfile_lock(@policyfile_dir)
|
181
201
|
current = versions(lock_current['cookbook_locks'], 'current')
|
182
202
|
|
@@ -189,6 +209,9 @@ class PolicyChangelog
|
|
189
209
|
else
|
190
210
|
updated_cookbooks.select { |name, _data| @cookbooks_to_update.include?(name) }
|
191
211
|
end
|
212
|
+
|
213
|
+
validate_downgrade!(updated_cookbooks) if prevent_downgrade
|
214
|
+
|
192
215
|
generate_changelog_from_versions(changelog_cookbooks)
|
193
216
|
end
|
194
217
|
|
@@ -92,6 +92,35 @@ RSpec.describe PolicyChangelog do
|
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
|
+
describe '#linkify' do
|
96
|
+
subject { KnifeChangelog::Changelog.new(config) }
|
97
|
+
let(:config) { double('config') }
|
98
|
+
let(:changelog) do
|
99
|
+
['9363423 Leverage criteo-flavor 3.11 to benefit from labels']
|
100
|
+
end
|
101
|
+
context 'when url is gitlab style' do
|
102
|
+
let(:url) { 'https://gitlab.com/chef-cookbooks/criteo-rackguru.git' }
|
103
|
+
|
104
|
+
it 'creates a gitlab style link' do
|
105
|
+
expect(subject.linkify(url, changelog).first).to match(%r{https://gitlab.com/chef-cookbooks/criteo-rackguru/commit/9363423})
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'when url is github style' do
|
110
|
+
let(:url) { 'https://github.com/chef-cookbooks/criteo-rackguru.git' }
|
111
|
+
it 'creates a github style link' do
|
112
|
+
expect(subject.linkify(url, changelog).first).to match(%r{https://github.com/chef-cookbooks/criteo-rackguru/commit/9363423})
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'when url has no known style' do
|
117
|
+
let(:url) { 'https://review.mycompany.com/chef-cookbooks/criteo-rackguru.git' }
|
118
|
+
it 'creates a gerrit style link' do
|
119
|
+
expect(subject.linkify(url, changelog).first).to match(%r{https://review.mycompany.com/#/q/9363423})
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
95
124
|
describe '#versions' do
|
96
125
|
context 'when type is current' do
|
97
126
|
it 'returns correct current versions' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-changelog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2
|
4
|
+
version: 1.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gregoire Seux
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -243,8 +243,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
243
243
|
- !ruby/object:Gem::Version
|
244
244
|
version: '0'
|
245
245
|
requirements: []
|
246
|
-
|
247
|
-
rubygems_version: 2.7.7
|
246
|
+
rubygems_version: 3.0.8
|
248
247
|
signing_key:
|
249
248
|
specification_version: 4
|
250
249
|
summary: Facilitate access to cookbooks changelog
|