ra10ke 1.0.0 → 1.1.0
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 +4 -4
- data/.github/dependabot.yml +11 -0
- data/.github/workflows/release.yml +32 -0
- data/.github/workflows/test.yml +35 -0
- data/.gitignore +3 -0
- data/.ruby-version +1 -1
- data/.travis.yml +1 -0
- data/CHANGELOG.md +35 -4
- data/Gemfile +9 -0
- data/HISTORY.md +118 -0
- data/README.md +25 -1
- data/Rakefile +13 -0
- data/lib/ra10ke/dependencies.rb +34 -12
- data/lib/ra10ke/deprecation.rb +72 -0
- data/lib/ra10ke/git_repo.rb +116 -0
- data/lib/ra10ke/puppetfile_parser.rb +7 -0
- data/lib/ra10ke/validate.rb +18 -59
- data/lib/ra10ke/version.rb +1 -1
- data/lib/ra10ke.rb +5 -0
- data/ra10ke.gemspec +4 -1
- data/spec/fixtures/Puppetfile +2 -0
- data/spec/fixtures/Puppetfile_with_bad_refs +3 -0
- data/spec/fixtures/Puppetfile_with_control_branch +23 -0
- data/spec/fixtures/refs/debug.txt +0 -0
- data/spec/fixtures/refs/gitlab.txt +285 -0
- data/spec/fixtures/refs/r10k.txt +120 -0
- data/spec/fixtures/{reflist.txt → refs/reflist.txt} +0 -0
- data/spec/ra10ke/dependencies_spec.rb +72 -0
- data/spec/ra10ke/deprecation_spec.rb +37 -0
- data/spec/ra10ke/git_repo_spec.rb +88 -0
- data/spec/ra10ke/puppetfile_parser_spec.rb +3 -1
- data/spec/ra10ke/validate_spec.rb +87 -35
- data/spec/ra10ke_spec.rb +6 -4
- data/spec/spec_helper.rb +28 -0
- metadata +46 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64e7e73cfb508697efd25e4aec36655c126a168a81fca44345f6564929be6bcd
|
4
|
+
data.tar.gz: 2139cb8c668b255a04d975121014006bd94cc4a4b45d71008e37e9e1341c74d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d05765b4c95390301ec8c6e0917f251ee60333b09810174c643d1d6a5608824ee96c46d334f60232beb026ea28caa4c4c5ea0e1e6b72b0f12ff7c7fdda6783b4
|
7
|
+
data.tar.gz: dc0317d3c47ce2e18e9c8818d7dd468f0acdd8e5a8047dad637938f40745196c66369ac4741293e092f8ab28e6a115aec70e936ea8845cb133c6f1f9108a0cd0
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# To get started with Dependabot version updates, you'll need to specify which
|
2
|
+
# package ecosystems to update and where the package manifests are located.
|
3
|
+
# Please see the documentation for all configuration options:
|
4
|
+
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
5
|
+
|
6
|
+
version: 2
|
7
|
+
updates:
|
8
|
+
- package-ecosystem: "bundler" # See documentation for possible values
|
9
|
+
directory: "/" # Location of package manifests
|
10
|
+
schedule:
|
11
|
+
interval: "daily"
|
@@ -0,0 +1,32 @@
|
|
1
|
+
name: Release
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
tags:
|
6
|
+
- '*'
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
release:
|
10
|
+
runs-on: ubuntu-latest
|
11
|
+
if: github.repository_owner == 'voxpupuli'
|
12
|
+
steps:
|
13
|
+
- uses: actions/checkout@v2
|
14
|
+
- name: Install Ruby 3.0
|
15
|
+
uses: ruby/setup-ruby@v1
|
16
|
+
with:
|
17
|
+
ruby-version: '3.0'
|
18
|
+
env:
|
19
|
+
BUNDLE_WITHOUT: release
|
20
|
+
- name: Build gem
|
21
|
+
run: gem build *.gemspec
|
22
|
+
- name: Publish gem to rubygems.org
|
23
|
+
run: gem push *.gem
|
24
|
+
env:
|
25
|
+
GEM_HOST_API_KEY: '${{ secrets.RUBYGEMS_AUTH_TOKEN }}'
|
26
|
+
- name: Setup GitHub packages access
|
27
|
+
run: |
|
28
|
+
mkdir -p ~/.gem
|
29
|
+
echo ":github: Bearer ${{ secrets.GITHUB_TOKEN }}" >> ~/.gem/credentials
|
30
|
+
chmod 0600 ~/.gem/credentials
|
31
|
+
- name: Publish gem to GitHub packages
|
32
|
+
run: gem push --key github --host https://rubygems.pkg.github.com/voxpupuli *.gem
|
@@ -0,0 +1,35 @@
|
|
1
|
+
name: Test
|
2
|
+
|
3
|
+
on:
|
4
|
+
- pull_request
|
5
|
+
- push
|
6
|
+
|
7
|
+
env:
|
8
|
+
BUNDLE_WITHOUT: release
|
9
|
+
|
10
|
+
jobs:
|
11
|
+
test:
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
strategy:
|
14
|
+
fail-fast: false
|
15
|
+
matrix:
|
16
|
+
include:
|
17
|
+
- ruby: "2.4"
|
18
|
+
- ruby: "2.5"
|
19
|
+
- ruby: "2.6"
|
20
|
+
- ruby: "2.7"
|
21
|
+
- ruby: "3.0"
|
22
|
+
coverage: "yes"
|
23
|
+
env:
|
24
|
+
COVERAGE: ${{ matrix.coverage }}
|
25
|
+
steps:
|
26
|
+
- uses: actions/checkout@v2
|
27
|
+
- name: Install Ruby ${{ matrix.ruby }}
|
28
|
+
uses: ruby/setup-ruby@v1
|
29
|
+
with:
|
30
|
+
ruby-version: ${{ matrix.ruby }}
|
31
|
+
bundler-cache: true
|
32
|
+
- name: Run tests
|
33
|
+
run: bundle exec rake
|
34
|
+
- name: Build gem
|
35
|
+
run: gem build *.gemspec
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.5.
|
1
|
+
2.5.7
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,36 @@
|
|
1
|
-
|
2
|
-
=========
|
1
|
+
# Changelog
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
## [v1.1.0](https://github.com/voxpupuli/ra10ke/tree/v1.1.0) (2021-10-26)
|
6
|
+
|
7
|
+
[Full Changelog](https://github.com/voxpupuli/ra10ke/compare/v1.0.0...v1.1.0)
|
8
|
+
|
9
|
+
**Implemented enhancements:**
|
10
|
+
|
11
|
+
- Support r10k:validate with control\_branch [\#58](https://github.com/voxpupuli/ra10ke/issues/58)
|
12
|
+
- Implement GitHub Actions and fix tests [\#62](https://github.com/voxpupuli/ra10ke/pull/62) ([bastelfreak](https://github.com/bastelfreak))
|
13
|
+
- Add handling for additional r10k args in validate for control\_branch [\#61](https://github.com/voxpupuli/ra10ke/pull/61) ([ananace](https://github.com/ananace))
|
14
|
+
- Add r10k:deprecation task [\#60](https://github.com/voxpupuli/ra10ke/pull/60) ([ananace](https://github.com/ananace))
|
15
|
+
- Support r10k:validate with control\_branch modules [\#59](https://github.com/voxpupuli/ra10ke/pull/59) ([ananace](https://github.com/ananace))
|
16
|
+
- allow to add other version formats in dependencies [\#56](https://github.com/voxpupuli/ra10ke/pull/56) ([jduepmeier](https://github.com/jduepmeier))
|
17
|
+
- Fixes \#52 - validate task fails when repo does not exist [\#53](https://github.com/voxpupuli/ra10ke/pull/53) ([logicminds](https://github.com/logicminds))
|
18
|
+
|
19
|
+
**Fixed bugs:**
|
20
|
+
|
21
|
+
- Fix source of control\_branch data [\#63](https://github.com/voxpupuli/ra10ke/pull/63) ([ananace](https://github.com/ananace))
|
22
|
+
|
23
|
+
**Closed issues:**
|
24
|
+
|
25
|
+
- validate task fails when repo does not exist [\#52](https://github.com/voxpupuli/ra10ke/issues/52)
|
26
|
+
|
27
|
+
**Merged pull requests:**
|
28
|
+
|
29
|
+
- Add Dependabot config [\#65](https://github.com/voxpupuli/ra10ke/pull/65) ([bastelfreak](https://github.com/bastelfreak))
|
30
|
+
- Set minimal Ruby version to 2.4.0 [\#64](https://github.com/voxpupuli/ra10ke/pull/64) ([bastelfreak](https://github.com/bastelfreak))
|
31
|
+
- Add coverage reports [\#54](https://github.com/voxpupuli/ra10ke/pull/54) ([logicminds](https://github.com/logicminds))
|
32
|
+
|
33
|
+
## [v1.0.0](https://github.com/voxpupuli/ra10ke/tree/v1.0.0) (2020-02-08)
|
6
34
|
|
7
35
|
2020-02-08
|
8
36
|
|
@@ -120,3 +148,6 @@ Many thanks to [Alexander "Ace" Olofsson](https://github.com/ace13) and [James P
|
|
120
148
|
2015-12-07
|
121
149
|
|
122
150
|
* Initial release
|
151
|
+
|
152
|
+
|
153
|
+
\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
|
data/Gemfile
CHANGED
@@ -2,3 +2,12 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in ra10ke.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
group :release do
|
7
|
+
gem 'github_changelog_generator', :require => false
|
8
|
+
end
|
9
|
+
|
10
|
+
group :coverage, optional: ENV['COVERAGE']!='yes' do
|
11
|
+
gem 'simplecov-console', :require => false
|
12
|
+
gem 'codecov', :require => false
|
13
|
+
end
|
data/HISTORY.md
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
## [v1.0.0](https://github.com/voxpupuli/ra10ke/tree/v1.0.0) (2020-02-08)
|
2
|
+
|
3
|
+
2020-02-08
|
4
|
+
|
5
|
+
Closed Pull Requests:
|
6
|
+
|
7
|
+
* [#44](https://github.com/voxpupuli/ra10ke/pull/44) - Fix the faulty docs for Ra10ke::Validate#all_refs after [#42](https://github.com/voxpupuli/ra10ke/pull/42)
|
8
|
+
* [#45](https://github.com/voxpupuli/ra10ke/pull/45) - Add a duplicates check
|
9
|
+
* [#48](https://github.com/voxpupuli/ra10ke/pull/48) - Allow semverse 3.x
|
10
|
+
|
11
|
+
0.6.2
|
12
|
+
-----
|
13
|
+
|
14
|
+
2019-08-26
|
15
|
+
|
16
|
+
Closed Pull Requests:
|
17
|
+
|
18
|
+
* [#42](https://github.com/voxpupuli/ra10ke/pull/42) - Fix lost refs in validation
|
19
|
+
|
20
|
+
Again many thanks to the following contributors for submitting PRs:
|
21
|
+
|
22
|
+
* [Alexander Olofsson](https://github.com/ananace)
|
23
|
+
|
24
|
+
0.6.1
|
25
|
+
-----
|
26
|
+
|
27
|
+
2019-08-17
|
28
|
+
|
29
|
+
Closed Pull Requests:
|
30
|
+
|
31
|
+
* [#40](https://github.com/voxpupuli/ra10ke/pull/40) - Fix a fault in the mod handling behaviour
|
32
|
+
|
33
|
+
Closed Issues:
|
34
|
+
|
35
|
+
* [#25](https://github.com/voxpupuli/ra10ke/issues/25) - Consider making r10k:install have a default path of '.'
|
36
|
+
|
37
|
+
Many thanks to the following contributors for submitting PRs:
|
38
|
+
|
39
|
+
* [Alexander Olofsson](https://github.com/ananace)
|
40
|
+
|
41
|
+
0.6.0
|
42
|
+
-----
|
43
|
+
|
44
|
+
2019-07-30
|
45
|
+
|
46
|
+
Closed Pull Requests:
|
47
|
+
|
48
|
+
* [#35](https://github.com/voxpupuli/ra10ke/pull/35) Adds new validate task for verifying the integrity of all modules specified in the Puppetfile
|
49
|
+
* [#33](https://github.com/voxpupuli/ra10ke/pull/33) Refactor tasks, Version tag handling fix, purge option
|
50
|
+
* [#32](https://github.com/voxpupuli/ra10ke/pull/32) Make it possible to configure the tasks in the rakefile
|
51
|
+
|
52
|
+
Many thanks to the following contributors for submitting PRs:
|
53
|
+
|
54
|
+
* [Corey Osman](https://github.com/logicminds)
|
55
|
+
* [Andreas Zuber](https://github.com/ZeroPointEnergy)
|
56
|
+
|
57
|
+
0.5.0
|
58
|
+
-----
|
59
|
+
|
60
|
+
2018-12-26
|
61
|
+
|
62
|
+
Closed Pull Requests:
|
63
|
+
|
64
|
+
* [#22](https://github.com/voxpupuli/ra10ke/pull/22) Add rudimentary r10k:install task
|
65
|
+
* [#26](https://github.com/voxpupuli/ra10ke/pull/26) make use of the forge command in puppetfile
|
66
|
+
* [#29](https://github.com/voxpupuli/ra10ke/pull/29) Abort (exit 1) if Puppetfile syntax check fails
|
67
|
+
* [#30](https://github.com/voxpupuli/ra10ke/pull/30) enable travis deployment
|
68
|
+
|
69
|
+
0.4.0
|
70
|
+
-----
|
71
|
+
|
72
|
+
2018-06-17
|
73
|
+
|
74
|
+
* [#13](https://github.com/voxpupuli/ra10ke/pull/13) Avoid using `desired_ref` directly for Git
|
75
|
+
* [#14](https://github.com/voxpupuli/ra10ke/pull/14) Set required Ruby version as `>= 2.1.0`
|
76
|
+
* [#15](https://github.com/voxpupuli/ra10ke/pull/15) ignore invalid ref
|
77
|
+
* [#16](https://github.com/voxpupuli/ra10ke/pull/16) Use Semantic Versioning for Git tags
|
78
|
+
* [#17](https://github.com/voxpupuli/ra10ke/pull/17) Be careful around trimming Git tags
|
79
|
+
* [#19](https://github.com/voxpupuli/ra10ke/pull/19) Ensure Puppetfile gets parsed with absolute path
|
80
|
+
|
81
|
+
Many thanks to the following contributors for submitting the PRs:
|
82
|
+
* [Valter Jansons](https://github.com/sigv)
|
83
|
+
* [Martin Alfke](https://github.com/tuxmea)
|
84
|
+
* [Matthias Baur](https://github.com/baurmatt)
|
85
|
+
|
86
|
+
0.3.0
|
87
|
+
-----
|
88
|
+
|
89
|
+
2017-10-08
|
90
|
+
|
91
|
+
* [#6](https://github.com/voxpupuli/ra10ke/pull/6) Add a dependency solver based on the Ruby Solve library (thanks to [Jarkko Oranen](https://github.com/oranenj))
|
92
|
+
* [#8](https://github.com/voxpupuli/ra10ke/pull/8) Add numeric tag convention support (thanks to [Hervé MARTIN](https://github.com/HerveMARTIN))
|
93
|
+
|
94
|
+
0.2.0
|
95
|
+
-----
|
96
|
+
|
97
|
+
2017-01-03
|
98
|
+
|
99
|
+
* Moved to [Vox Pupuli](https://voxpupuli.org/)
|
100
|
+
* [#3](https://github.com/voxpupuli/ra10ke/pull/3) Update ra10ke with r10k 2.4.0 support
|
101
|
+
* [#4](https://github.com/voxpupuli/ra10ke/pull/4) Added git support
|
102
|
+
|
103
|
+
Many thanks to [Alexander "Ace" Olofsson](https://github.com/ace13) and [James Powis](https://github.com/james-powis) for their contributions!
|
104
|
+
|
105
|
+
0.1.1
|
106
|
+
-----
|
107
|
+
|
108
|
+
2016-08-22
|
109
|
+
|
110
|
+
* [#1](https://github.com/tampakrap/ra10ke/issues/1) update docs to mention Gemfile and Rakefile
|
111
|
+
* properly advertise the user agent
|
112
|
+
|
113
|
+
0.1.0
|
114
|
+
-----
|
115
|
+
|
116
|
+
2015-12-07
|
117
|
+
|
118
|
+
* Initial release
|
data/README.md
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
ra10ke
|
2
2
|
======
|
3
3
|
|
4
|
-
[](https://github.com/voxpupuli/ra10ke/blob/master/LICENSE.txt)
|
5
|
+
[](https://github.com/voxpupuli/ra10ke/actions/workflows/test.yml)
|
6
|
+
[](https://codecov.io/gh/voxpupuli/ra10ke)
|
7
|
+
[](https://github.com/voxpupuli/ra10ke/actions/workflows/release.yml)
|
8
|
+
[](https://rubygems.org/gems/ra10ke)
|
9
|
+
[](https://rubygems.org/gems/ra10ke)
|
5
10
|
|
6
11
|
Rake tasks related to [R10K](https://github.com/puppetlabs/r10k) and
|
7
12
|
[Puppetfile](https://github.com/puppetlabs/r10k/blob/master/doc/puppetfile.mkd).
|
@@ -145,3 +150,22 @@ gitlab:
|
|
145
150
|
|
146
151
|
Error: Duplicates exist in the Puppetfile
|
147
152
|
```
|
153
|
+
|
154
|
+
### r10k:deprecation
|
155
|
+
|
156
|
+
This rake task checks all the Forge modules listed in the Puppetfile, looking
|
157
|
+
for modules that are marked as deprecated on the Forge.
|
158
|
+
|
159
|
+
Example
|
160
|
+
|
161
|
+
```
|
162
|
+
NAME | DEPRECATED_AT
|
163
|
+
------------------------|--------------------------
|
164
|
+
kemra102-auditd | 2021-07-22 12:11:46
|
165
|
+
puppet-staging | 2018-12-18 11:11:29
|
166
|
+
puppetlabs-resource_api | 2021-03-31 12:53:24
|
167
|
+
puppetlabs-ruby | 2021-04-22 10:29:42
|
168
|
+
puppetlabs-translate | 2021-03-19 10:11:51
|
169
|
+
|
170
|
+
Error: Puppetfile contains deprecated modules.
|
171
|
+
```
|
data/Rakefile
CHANGED
@@ -14,3 +14,16 @@ task :default => [:spec]
|
|
14
14
|
RSpec::Core::RakeTask.new(:spec) do |spec|
|
15
15
|
spec.pattern = FileList['spec/**/*_spec.rb']
|
16
16
|
end
|
17
|
+
|
18
|
+
begin
|
19
|
+
require 'github_changelog_generator/task'
|
20
|
+
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
|
21
|
+
version = Ra10ke::VERSION
|
22
|
+
config.future_release = "v#{version}" if version =~ /^\d+\.\d+.\d+$/
|
23
|
+
config.header = "# Changelog\n\nAll notable changes to this project will be documented in this file."
|
24
|
+
config.exclude_labels = %w{duplicate question invalid wontfix wont-fix skip-changelog}
|
25
|
+
config.user = 'voxpupuli'
|
26
|
+
config.project = 'ra10ke'
|
27
|
+
end
|
28
|
+
rescue LoadError
|
29
|
+
end
|
data/lib/ra10ke/dependencies.rb
CHANGED
@@ -1,4 +1,34 @@
|
|
1
1
|
module Ra10ke::Dependencies
|
2
|
+
@@version_formats = {}
|
3
|
+
|
4
|
+
# Registers a block that finds the latest version.
|
5
|
+
# The block will be called with a list of tags.
|
6
|
+
# If the block returns nil the next format will be tried.
|
7
|
+
def self.register_version_format(name, &block)
|
8
|
+
@@version_formats[name] = block
|
9
|
+
end
|
10
|
+
|
11
|
+
# semver is the default version format.
|
12
|
+
register_version_format(:semver) do |tags|
|
13
|
+
latest_tag = tags.map do |tag|
|
14
|
+
begin
|
15
|
+
Semverse::Version.new tag[/\Av?(.*)\Z/, 1]
|
16
|
+
rescue Semverse::InvalidVersionFormat
|
17
|
+
# ignore tags that do not comply to semver
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
end.select { |tag| !tag.nil? }.sort.last.to_s.downcase
|
21
|
+
latest_ref = tags.detect { |tag| tag[/\Av?(.*)\Z/, 1] == latest_tag }
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_latest_ref(remote_refs)
|
25
|
+
tags = remote_refs['tags'].keys
|
26
|
+
latest_ref = nil
|
27
|
+
@@version_formats.detect { |_, block| latest_ref = block.call(tags) }
|
28
|
+
latest_ref = 'undef (tags do not follow any known pattern)' if latest_ref.nil?
|
29
|
+
latest_ref
|
30
|
+
end
|
31
|
+
|
2
32
|
def define_task_dependencies(*_args)
|
3
33
|
desc "Print outdated forge modules"
|
4
34
|
task :dependencies do
|
@@ -44,17 +74,10 @@ module Ra10ke::Dependencies
|
|
44
74
|
# we have to be be opinionated here
|
45
75
|
# so semantic versioning (vX.Y.Z) it is for us
|
46
76
|
# as well as support for skipping the leading v letter
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
rescue Semverse::InvalidVersionFormat
|
52
|
-
# ignore tags that do not comply to semver
|
53
|
-
nil
|
54
|
-
end
|
55
|
-
end.select { |tag| !tag.nil? }.sort.last.to_s.downcase
|
56
|
-
latest_ref = tags.detect { |tag| tag[/\Av?(.*)\Z/, 1] == latest_tag }
|
57
|
-
latest_ref = 'undef (tags do not match semantic versioning)' if latest_ref.nil?
|
77
|
+
#
|
78
|
+
# register own version formats with
|
79
|
+
# Ra10ke::Dependencies.register_version_format(:name, &block)
|
80
|
+
latest_ref = get_latest_ref(remote_refs)
|
58
81
|
elsif ref.match(/^[a-z0-9]{40}$/)
|
59
82
|
# for sha just assume head should be tracked
|
60
83
|
latest_ref = remote_refs['head'][:sha]
|
@@ -66,6 +89,5 @@ module Ra10ke::Dependencies
|
|
66
89
|
end
|
67
90
|
end
|
68
91
|
end
|
69
|
-
|
70
92
|
end
|
71
93
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ra10ke/puppetfile_parser'
|
4
|
+
require 'English'
|
5
|
+
require 'puppet_forge'
|
6
|
+
require 'table_print'
|
7
|
+
require 'time'
|
8
|
+
|
9
|
+
module Ra10ke::Deprecation
|
10
|
+
# Validate the git urls and refs
|
11
|
+
def define_task_deprecation(*)
|
12
|
+
desc 'Validate that no forge modules are deprecated'
|
13
|
+
task :deprecation do
|
14
|
+
valid = Ra10ke::Deprecation::Validation.new(get_puppetfile.puppetfile_path)
|
15
|
+
exit_code = 0
|
16
|
+
if valid.bad_mods?
|
17
|
+
exit_code = 1
|
18
|
+
message = "\nError: Puppetfile contains deprecated modules."
|
19
|
+
tp valid.sorted_mods, :name, :deprecated_at
|
20
|
+
else
|
21
|
+
message = 'Puppetfile contains no deprecated Forge modules.'
|
22
|
+
end
|
23
|
+
abort(message) if exit_code.positive?
|
24
|
+
|
25
|
+
puts message
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class Validation
|
30
|
+
include Ra10ke::PuppetfileParser
|
31
|
+
|
32
|
+
attr_reader :puppetfile
|
33
|
+
|
34
|
+
def initialize(file)
|
35
|
+
file ||= './Puppetfile'
|
36
|
+
@puppetfile = File.expand_path(file)
|
37
|
+
abort("Puppetfile does not exist at #{puppetfile}") unless File.readable?(puppetfile)
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [Array[Hash]] array of module information and git status
|
41
|
+
def deprecated_modules
|
42
|
+
@deprecated_modules ||= begin
|
43
|
+
deprecated = forge_modules(puppetfile).map do |mod|
|
44
|
+
# For Ruby 2.4 support
|
45
|
+
begin # rubocop:disable Style/RedundantBegin
|
46
|
+
module_name = "#{mod[:namespace] || mod[:name]}-#{mod[:name]}"
|
47
|
+
forge_data = PuppetForge::Module.find(module_name)
|
48
|
+
|
49
|
+
next forge_data if forge_data.deprecated_at
|
50
|
+
|
51
|
+
nil
|
52
|
+
rescue Faraday::ResourceNotFound
|
53
|
+
nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
deprecated.compact.map do |mod|
|
57
|
+
{ name: mod.slug, deprecated_at: Time.parse(mod.deprecated_at) }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# @return [Boolean] - true if there are any bad mods
|
63
|
+
def bad_mods?
|
64
|
+
deprecated_modules.any?
|
65
|
+
end
|
66
|
+
|
67
|
+
# @return [Hash] - sorts the mods based on good/bad
|
68
|
+
def sorted_mods
|
69
|
+
deprecated_modules.sort_by { |a| a[:name] }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'tempfile'
|
4
|
+
|
5
|
+
module Ra10ke
|
6
|
+
class GitRepo
|
7
|
+
attr_reader :url
|
8
|
+
|
9
|
+
REMOTE_REFS_CMD = 'git ls-remote --symref'
|
10
|
+
CLONE_CMD = 'git clone --no-tags'
|
11
|
+
CURRENT_BRANCH_CMD = 'git symbolic-ref --short HEAD'
|
12
|
+
SHOW_CMD = 'git show'
|
13
|
+
|
14
|
+
def initialize(url)
|
15
|
+
@url = url
|
16
|
+
end
|
17
|
+
|
18
|
+
# Get the current branch for a Git repo
|
19
|
+
# @param path [String] - The path to the repository to check
|
20
|
+
# @return [String] - The current active branch of the Git repo
|
21
|
+
def self.current_branch(path)
|
22
|
+
Dir.chdir(path) do
|
23
|
+
data, success = run_command(CURRENT_BRANCH_CMD)
|
24
|
+
return success ? data.strip : nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [Array] - the raw data from the git ls-remote command as lines array
|
29
|
+
# return empty array if url or command failed
|
30
|
+
def remote_refs
|
31
|
+
@remote_refs ||= begin
|
32
|
+
data, success = run_command("#{REMOTE_REFS_CMD} #{url}")
|
33
|
+
success ? data.lines : []
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [Boolean] true if the git url is valid
|
38
|
+
def valid_url?
|
39
|
+
!remote_refs.empty?
|
40
|
+
end
|
41
|
+
|
42
|
+
# @return [Boolean] - return true if the commit sha is valid
|
43
|
+
# @param url [String] - the git string either https or ssh url
|
44
|
+
# @param ref [String] - the sha id
|
45
|
+
def valid_commit?(sha)
|
46
|
+
return false if sha.nil? || sha.empty?
|
47
|
+
return true if valid_ref?(sha)
|
48
|
+
|
49
|
+
# cloning is a last resort if for some reason we cannot
|
50
|
+
# remotely get via ls-remote
|
51
|
+
Dir.mktmpdir do |dir|
|
52
|
+
run_command("#{CLONE_CMD} #{url} #{dir}", silent: true)
|
53
|
+
Dir.chdir(dir) do
|
54
|
+
_, status = run_command("#{SHOW_CMD} #{sha}", silent: true)
|
55
|
+
status
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# @return [Boolean] - return true if the ref is valid
|
61
|
+
# @param url [String] - the git string either https or ssh url
|
62
|
+
# @param ref [String] - the ref object, branch name, tag name, or commit sha, defaults to HEAD
|
63
|
+
def valid_ref?(ref = 'HEAD')
|
64
|
+
return false if ref.nil?
|
65
|
+
|
66
|
+
found = all_refs.find do |data|
|
67
|
+
# we don't need to bother with these types
|
68
|
+
next if data[:type] == :pull || data[:type] == :merge_request
|
69
|
+
|
70
|
+
# is the name equal to the tag or branch? Is the commit sha equal?
|
71
|
+
data[:name].eql?(ref) || data[:sha].slice(0, 8).eql?(ref.slice(0, 8))
|
72
|
+
end
|
73
|
+
!found.nil?
|
74
|
+
end
|
75
|
+
|
76
|
+
# @return [Array] - an array of all the refs associated with the remote repository
|
77
|
+
# @param url [String] - the git string either https or ssh url
|
78
|
+
# @example
|
79
|
+
# [{:sha=>"0ec707e431367bbe2752966be8ab915b6f0da754", :ref=>"refs/heads/74110ac", :type=>:branch, :subtype=>nil, :name=>"74110ac"},
|
80
|
+
# :sha=>"07bb5d2d94db222dca5860eb29c184e8970f36f4", :ref=>"refs/pull/74/head", :type=>:pull, :subtype=>:head, :name=>"74"},
|
81
|
+
# :sha=>"156ca9a8ea69e056e86355b27d944e59d1b3a1e1", :ref=>"refs/heads/master", :type=>:branch, :subtype=>nil, :name=>"master"},
|
82
|
+
# :sha=>"fcc0532bbc5a5b65f3941738339e9cc7e3d767ce", :ref=>"refs/pull/249/head", :type=>:pull, :subtype=>:head, :name=>"249"},
|
83
|
+
# :sha=>"8d54891fa5df75890ee15d53080c2a81b4960f92", :ref=>"refs/pull/267/head", :type=>:pull, :subtype=>:head, :name=>"267"}]
|
84
|
+
def all_refs
|
85
|
+
@all_refs ||= begin
|
86
|
+
remote_refs.each_with_object([]) do |line, refs|
|
87
|
+
sha, ref = line.split("\t")
|
88
|
+
next refs if sha.eql?('ref: refs/heads/master')
|
89
|
+
|
90
|
+
_, type, name, subtype = ref.chomp.split('/')
|
91
|
+
next refs unless name
|
92
|
+
|
93
|
+
type = :tag if type.eql?('tags')
|
94
|
+
type = type.to_sym
|
95
|
+
subtype = subtype.to_sym if subtype
|
96
|
+
type = :branch if type.eql?(:heads)
|
97
|
+
refs << { sha: sha, ref: ref.chomp, type: type, subtype: subtype, name: name }
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# useful for mocking easily
|
103
|
+
# @param cmd [String]
|
104
|
+
# @param silent [Boolean] set to true if you wish to send output to /dev/null, false by default
|
105
|
+
# @return [Array]
|
106
|
+
def self.run_command(cmd, silent: false)
|
107
|
+
out_args = silent ? '2>&1 > /dev/null' : '2>&1'
|
108
|
+
out = `#{cmd} #{out_args}`
|
109
|
+
[out, $CHILD_STATUS.success?]
|
110
|
+
end
|
111
|
+
|
112
|
+
def run_command(cmd, silent: false)
|
113
|
+
self.class.run_command(cmd, silent: silent)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -12,6 +12,13 @@ module Ra10ke
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
+
# @return [Array] - returns a array of hashes that contain modules from the Forge
|
16
|
+
def forge_modules(file = puppetfile)
|
17
|
+
modules(file).reject do |mod|
|
18
|
+
mod[:args].key?(:git)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
15
22
|
# @param puppetfile [String] - the absolute path to the puppetfile
|
16
23
|
# @return [Array] - returns an array of module hashes that represent the puppetfile
|
17
24
|
# @example
|