r10k 3.5.2 → 3.6.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/pull_request_template.md +4 -1
- data/CHANGELOG.mkd +14 -1
- data/README.mkd +11 -2
- data/azure-pipelines.yml +2 -1
- data/doc/dynamic-environments/configuration.mkd +26 -3
- data/docker/Makefile +3 -1
- data/docker/r10k/Dockerfile +3 -2
- data/docker/r10k/release.Dockerfile +2 -1
- data/integration/tests/git_source/git_source_repeated_remote.rb +68 -0
- data/lib/r10k/git/cache.rb +1 -3
- data/lib/r10k/git/stateful_repository.rb +4 -0
- data/lib/r10k/module/base.rb +8 -0
- data/lib/r10k/module/git.rb +4 -0
- data/lib/r10k/puppetfile.rb +26 -6
- data/lib/r10k/settings.rb +1 -1
- data/lib/r10k/source/git.rb +22 -2
- data/lib/r10k/version.rb +1 -1
- data/locales/r10k.pot +12 -8
- data/spec/unit/action/deploy/module_spec.rb +2 -2
- data/spec/unit/action/puppetfile/install_spec.rb +1 -0
- data/spec/unit/puppetfile_spec.rb +67 -2
- data/spec/unit/source/git_spec.rb +37 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e54158e0a651c799246229971ba62ad36bd40a670ca84e61479aa5280306c8a
|
4
|
+
data.tar.gz: 153cc105ce9276d79e2501dc99accb398bba8fec423fbf0726a1b183993a2748
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 264ea2591c062d460edab02b8edf7a59c9ebc08ebea27ee2b103e43bdf71c936b797094014d66b776573196d4a9e86dfc9f0fd345626f27d7e25c8170ebaa83a
|
7
|
+
data.tar.gz: 224e40f3f13466ab2ea3296bc3741b10d591ea65c97ba60b3dd81078f70149770c07c46ac1464a44fd59af0d20dbc8bbf1a5e3990e5d7921cc05403772d99640
|
data/CHANGELOG.mkd
CHANGED
@@ -2,7 +2,15 @@ CHANGELOG
|
|
2
2
|
=========
|
3
3
|
|
4
4
|
Unreleased
|
5
|
-
|
5
|
+
----------
|
6
|
+
|
7
|
+
3.6.0
|
8
|
+
-----
|
9
|
+
|
10
|
+
- Add filter_command configuration option for git repositories. (Thanks to [mhumpula](https://github.com/mhumpula) for the feature.) [#823](https://github.com/puppetlabs/r10k/pull/823)
|
11
|
+
- Increase default pool_size to 4, allowing modules to be downloaded on 4 threads concurrently. [#1038](https://github.com/puppetlabs/r10k/issues/1038)
|
12
|
+
- Ensure that modules that share a cachedir download serially, to avoid cache corruption. [#1058](https://github.com/puppetlabs/r10k/issues/1058)
|
13
|
+
- Don't purge root when using `puppetfile install`. [#1084](https://github.com/puppetlabs/r10k/issues/1084)
|
6
14
|
|
7
15
|
3.5.2
|
8
16
|
-----
|
@@ -175,6 +183,11 @@ Ruby >= 2.3 official and documented.
|
|
175
183
|
- Unable to parse Puppetfile
|
176
184
|
- Various perfomance improvements
|
177
185
|
|
186
|
+
2.6.9
|
187
|
+
----
|
188
|
+
|
189
|
+
- Don't purge root when using `puppetfile install`. [#1084](https://github.com/puppetlabs/r10k/issues/1084)
|
190
|
+
|
178
191
|
2.6.8
|
179
192
|
----
|
180
193
|
|
data/README.mkd
CHANGED
@@ -98,6 +98,14 @@ When localizing the strings found in R10k, follow the prescribed
|
|
98
98
|
The workflow describes the rake tasks provided to generate the .po files for
|
99
99
|
each locale.
|
100
100
|
|
101
|
+
Releasing
|
102
|
+
---------
|
103
|
+
To release a new version of the r10k gem, ensure the [changelog](CHANGELOG.mkd) is up to date and open a pull request updating the [version file](lib/r10k/version.rb). When the PR is merged, a new release of the gem will be triggered.
|
104
|
+
|
105
|
+
By default, a patch (Z) release will be triggered. To release a new major (X) or minor (Y) version, include `#major` or `#minor` (respectively) in your commit message to trigger the appropriate release.
|
106
|
+
|
107
|
+
NOTE: This currently only works for the default branch. If you would like to release from a different branch, please contact the [CODEOWNERS](CODEOWNERS).
|
108
|
+
|
101
109
|
Getting help
|
102
110
|
------------
|
103
111
|
|
@@ -113,6 +121,7 @@ Please see the CHANGELOG for a listing of the (very awesome) contributors.
|
|
113
121
|
|
114
122
|
## Maintenance
|
115
123
|
|
116
|
-
See [
|
124
|
+
See [CODEOWNERS](CODEOWNERS) for active repo maintainers.
|
125
|
+
|
126
|
+
Open [issues](https://github.com/puppetlabs/r10k/issues) directly in the r10k repo.
|
117
127
|
|
118
|
-
Tickets: File at https://tickets.puppet.com/browse/RK
|
data/azure-pipelines.yml
CHANGED
@@ -19,6 +19,7 @@ variables:
|
|
19
19
|
CONTAINER_BUILD_PATH: .
|
20
20
|
LINT_IGNORES:
|
21
21
|
DOCKER_BUILDKIT: 1
|
22
|
+
BUILD_OPTIONS: --build-arg alpine_version=3.9
|
22
23
|
|
23
24
|
workspace:
|
24
25
|
clean: resources
|
@@ -53,7 +54,7 @@ steps:
|
|
53
54
|
|
54
55
|
- powershell: |
|
55
56
|
. "$(bundle show pupperware)/ci/build.ps1"
|
56
|
-
Build-Container -Name $ENV:CONTAINER_NAME -Namespace $ENV:NAMESPACE -PathOrUri $ENV:CONTAINER_BUILD_PATH
|
57
|
+
Build-Container -Name $ENV:CONTAINER_NAME -Namespace $ENV:NAMESPACE -PathOrUri $ENV:CONTAINER_BUILD_PATH -AdditionalOptions ($ENV:BUILD_OPTIONS -split ' ')
|
57
58
|
displayName: Build $(CONTAINER_NAME) Container
|
58
59
|
timeoutInMinutes: 5
|
59
60
|
name: build_container
|
@@ -76,9 +76,9 @@ The proxy server being used will be logged at the "debug" level when r10k runs.
|
|
76
76
|
### pool_size
|
77
77
|
|
78
78
|
The pool_size setting is a number to determine how many threads should be spawn
|
79
|
-
while updating modules. The default value is
|
80
|
-
|
81
|
-
|
79
|
+
while updating modules. The default value is 4, which means modules will be updated
|
80
|
+
in parallel. If this causes issues, change this setting to 1 to cause modules to be
|
81
|
+
updated serially.
|
82
82
|
|
83
83
|
### git
|
84
84
|
|
@@ -411,6 +411,29 @@ sources:
|
|
411
411
|
- 'dev'
|
412
412
|
```
|
413
413
|
|
414
|
+
### filter_command
|
415
|
+
|
416
|
+
You can filter out any branch based on the result of the command specified as
|
417
|
+
'filter_command'. Currently it only works with git repository. Non zero return
|
418
|
+
status of the command results in a branch beeing removed. The command is passed
|
419
|
+
additional environment variables
|
420
|
+
|
421
|
+
* GIT_DIR – path to the cached git repository
|
422
|
+
* R10K_BRANCH – branch which is being filtered
|
423
|
+
* R10K_NAME – source name from r10k configuration
|
424
|
+
|
425
|
+
This can be used for example for filtering out the branches with invalid gpg signature of their latest commit
|
426
|
+
|
427
|
+
```yaml
|
428
|
+
---
|
429
|
+
sources:
|
430
|
+
mysource:
|
431
|
+
basedir: '/etc/puppet/environments'
|
432
|
+
filter_command: 'git verify-commit $R10K_BRANCH 2> /dev/null'
|
433
|
+
```
|
434
|
+
|
435
|
+
Beware that if the production branch of manifests is filtered out, you will end up with empty environment.
|
436
|
+
|
414
437
|
Examples
|
415
438
|
--------
|
416
439
|
|
data/docker/Makefile
CHANGED
@@ -6,6 +6,7 @@ build_date := $(shell date -u +%FT%T)
|
|
6
6
|
hadolint_available := $(shell hadolint --help > /dev/null 2>&1; echo $$?)
|
7
7
|
hadolint_command := hadolint
|
8
8
|
hadolint_container := hadolint/hadolint:latest
|
9
|
+
alpine_version := 3.9
|
9
10
|
export BUNDLE_PATH = $(PWD)/.bundle/gems
|
10
11
|
export BUNDLE_BIN = $(PWD)/.bundle/bin
|
11
12
|
export GEMFILE = $(PWD)/Gemfile
|
@@ -48,9 +49,10 @@ else
|
|
48
49
|
endif
|
49
50
|
|
50
51
|
build: prep
|
52
|
+
docker pull alpine:$(alpine_version)
|
51
53
|
docker build \
|
52
54
|
${DOCKER_BUILD_FLAGS} \
|
53
|
-
--
|
55
|
+
--build-arg alpine_version=$(alpine_version) \
|
54
56
|
--build-arg vcs_ref=$(vcs_ref) \
|
55
57
|
--build-arg build_date=$(build_date) \
|
56
58
|
--build-arg version=$(VERSION) \
|
data/docker/r10k/Dockerfile
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
ARG alpine_version=3.9
|
2
|
+
FROM alpine:${alpine_version} as build
|
2
3
|
|
3
4
|
# hadolint ignore=DL3018
|
4
5
|
RUN apk add --no-cache ruby git && \
|
@@ -8,7 +9,7 @@ COPY . /workspace
|
|
8
9
|
RUN gem build r10k.gemspec && \
|
9
10
|
mv r10k*.gem r10k.gem
|
10
11
|
|
11
|
-
FROM alpine
|
12
|
+
FROM alpine:${alpine_version}
|
12
13
|
|
13
14
|
ARG vcs_ref
|
14
15
|
ARG build_date
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'git_utils'
|
2
|
+
require 'r10k_utils'
|
3
|
+
require 'master_manipulator'
|
4
|
+
test_name 'Verify the same remote can be used in more than one object'
|
5
|
+
|
6
|
+
env_path = on(master, puppet('config print environmentpath')).stdout.rstrip
|
7
|
+
r10k_fqp = get_r10k_fqp(master)
|
8
|
+
git_environments_path = '/root/environments'
|
9
|
+
git_repo_path = '/git_repos'
|
10
|
+
git_repo_name = 'environments'
|
11
|
+
git_control_remote = File.join(git_repo_path, "#{git_repo_name}.git")
|
12
|
+
code_dir = "#{env_path}/production"
|
13
|
+
|
14
|
+
last_commit = git_last_commit(master, git_environments_path)
|
15
|
+
git_provider = ENV['GIT_PROVIDER']
|
16
|
+
r10k_config_path = get_r10k_config_file_path(master)
|
17
|
+
r10k_config_bak_path = "#{r10k_config_path}.bak"
|
18
|
+
#In-line files
|
19
|
+
r10k_conf = <<-CONF
|
20
|
+
cachedir: '/var/cache/r10k'
|
21
|
+
git:
|
22
|
+
provider: '#{git_provider}'
|
23
|
+
sources:
|
24
|
+
control:
|
25
|
+
basedir: "#{env_path}"
|
26
|
+
remote: "#{git_control_remote}"
|
27
|
+
CONF
|
28
|
+
|
29
|
+
# Install the same module in two different places
|
30
|
+
puppetfile = <<-EOS
|
31
|
+
mod 'prod_apache',
|
32
|
+
:git => 'git://github.com/puppetlabs/puppetlabs-apache.git',
|
33
|
+
:branch => 'master'
|
34
|
+
|
35
|
+
mod 'test_apache',
|
36
|
+
:git => 'git://github.com/puppetlabs/puppetlabs-apache.git',
|
37
|
+
:branch => 'master'
|
38
|
+
EOS
|
39
|
+
|
40
|
+
teardown do
|
41
|
+
step 'Restore Original "r10k" Config'
|
42
|
+
on(master, "mv #{r10k_config_bak_path} #{r10k_config_path}")
|
43
|
+
|
44
|
+
clean_up_r10k(master, last_commit, git_environments_path)
|
45
|
+
end
|
46
|
+
|
47
|
+
step 'Stub the forge'
|
48
|
+
stub_forge_on(master)
|
49
|
+
|
50
|
+
step 'Backup Current "r10k" Config'
|
51
|
+
on(master, "mv #{r10k_config_path} #{r10k_config_bak_path}")
|
52
|
+
|
53
|
+
step 'Update the "r10k" Config'
|
54
|
+
create_remote_file(master, r10k_config_path, r10k_conf)
|
55
|
+
|
56
|
+
step 'Ask r10k to deploy'
|
57
|
+
on(master, "#{r10k_fqp} deploy environment -p")
|
58
|
+
|
59
|
+
step 'Add puppetfile with repeated remote'
|
60
|
+
create_remote_file(master, "#{git_environments_path}/Puppetfile", puppetfile)
|
61
|
+
git_add_commit_push(master, 'production', 'add Puppetfile', git_environments_path)
|
62
|
+
|
63
|
+
step 'Deploy r10k'
|
64
|
+
on(master, "#{r10k_fqp} deploy environment -p")
|
65
|
+
|
66
|
+
step 'Verify module was installed in both places'
|
67
|
+
on(master, "test -d #{code_dir}/modules/prod_apache")
|
68
|
+
on(master, "test -d #{code_dir}/modules/test_apache")
|
data/lib/r10k/git/cache.rb
CHANGED
@@ -99,10 +99,8 @@ class R10K::Git::Cache
|
|
99
99
|
|
100
100
|
alias cached? exist?
|
101
101
|
|
102
|
-
private
|
103
|
-
|
104
102
|
# Reformat the remote name into something that can be used as a directory
|
105
103
|
def sanitized_dirname
|
106
|
-
@remote.gsub(/[^@\w\.-]/, '-')
|
104
|
+
@sanitized_dirname ||= @remote.gsub(/[^@\w\.-]/, '-')
|
107
105
|
end
|
108
106
|
end
|
data/lib/r10k/module/base.rb
CHANGED
@@ -99,6 +99,14 @@ class R10K::Module::Base
|
|
99
99
|
raise NotImplementedError
|
100
100
|
end
|
101
101
|
|
102
|
+
# Return the module's cachedir. Subclasses that implement a cache
|
103
|
+
# will override this to return a real directory location.
|
104
|
+
#
|
105
|
+
# @return [String, :none]
|
106
|
+
def cachedir
|
107
|
+
:none
|
108
|
+
end
|
109
|
+
|
102
110
|
private
|
103
111
|
|
104
112
|
def parse_title(title)
|
data/lib/r10k/module/git.rb
CHANGED
data/lib/r10k/puppetfile.rb
CHANGED
@@ -10,7 +10,7 @@ class Puppetfile
|
|
10
10
|
|
11
11
|
include R10K::Settings::Mixin
|
12
12
|
|
13
|
-
def_setting_attr :pool_size,
|
13
|
+
def_setting_attr :pool_size, 4
|
14
14
|
|
15
15
|
include R10K::Logging
|
16
16
|
|
@@ -42,6 +42,11 @@ class Puppetfile
|
|
42
42
|
# @return [Boolean] Overwrite any locally made changes
|
43
43
|
attr_accessor :force
|
44
44
|
|
45
|
+
# @!attribute [r] modules_by_vcs_cachedir
|
46
|
+
# @api private Only exposed for testing purposes
|
47
|
+
# @return [Hash{:none, String => Array<R10K::Module>}]
|
48
|
+
attr_reader :modules_by_vcs_cachedir
|
49
|
+
|
45
50
|
# @param [String] basedir
|
46
51
|
# @param [String] moduledir The directory to install the modules, default to #{basedir}/modules
|
47
52
|
# @param [String] puppetfile_path The path to the Puppetfile, default to #{basedir}/Puppetfile
|
@@ -58,6 +63,7 @@ class Puppetfile
|
|
58
63
|
|
59
64
|
@modules = []
|
60
65
|
@managed_content = {}
|
66
|
+
@modules_by_vcs_cachedir = {}
|
61
67
|
@forge = 'forgeapi.puppetlabs.com'
|
62
68
|
|
63
69
|
@loaded = false
|
@@ -137,6 +143,9 @@ class Puppetfile
|
|
137
143
|
mod.origin = 'Puppetfile'
|
138
144
|
|
139
145
|
@managed_content[install_path] << mod.name
|
146
|
+
cachedir = mod.cachedir
|
147
|
+
@modules_by_vcs_cachedir[cachedir] ||= []
|
148
|
+
@modules_by_vcs_cachedir[cachedir] << mod
|
140
149
|
@modules << mod
|
141
150
|
end
|
142
151
|
|
@@ -145,7 +154,9 @@ class Puppetfile
|
|
145
154
|
def managed_directories
|
146
155
|
self.load unless @loaded
|
147
156
|
|
148
|
-
@managed_content.keys
|
157
|
+
dirs = @managed_content.keys
|
158
|
+
dirs.delete(real_basedir)
|
159
|
+
dirs
|
149
160
|
end
|
150
161
|
|
151
162
|
# Returns an array of the full paths to all the content being managed.
|
@@ -212,15 +223,22 @@ class Puppetfile
|
|
212
223
|
def modules_queue(visitor)
|
213
224
|
Queue.new.tap do |queue|
|
214
225
|
visitor.visit(:puppetfile, self) do
|
215
|
-
|
226
|
+
modules_by_cachedir = modules_by_vcs_cachedir.clone
|
227
|
+
modules_without_vcs_cachedir = modules_by_cachedir.delete(:none) || []
|
228
|
+
|
229
|
+
modules_without_vcs_cachedir.each {|mod| queue << Array(mod) }
|
230
|
+
modules_by_cachedir.values.each {|mods| queue << mods }
|
216
231
|
end
|
217
232
|
end
|
218
233
|
end
|
234
|
+
public :modules_queue
|
219
235
|
|
220
236
|
def visitor_thread(visitor, mods_queue)
|
221
237
|
Thread.new do
|
222
238
|
begin
|
223
|
-
while
|
239
|
+
while mods = mods_queue.pop(true) do
|
240
|
+
mods.each {|mod| mod.accept(visitor) }
|
241
|
+
end
|
224
242
|
rescue ThreadError => e
|
225
243
|
logger.debug _("Module thread %{id} exiting: %{message}") % {message: e.message, id: Thread.current.object_id}
|
226
244
|
Thread.exit
|
@@ -248,8 +266,6 @@ class Puppetfile
|
|
248
266
|
end
|
249
267
|
|
250
268
|
def validate_install_path(path, modname)
|
251
|
-
real_basedir = Pathname.new(basedir).cleanpath.to_s
|
252
|
-
|
253
269
|
unless /^#{Regexp.escape(real_basedir)}.*/ =~ path
|
254
270
|
raise R10K::Error.new("Puppetfile cannot manage content '#{modname}' outside of containing environment: #{path} is not within #{real_basedir}")
|
255
271
|
end
|
@@ -257,6 +273,10 @@ class Puppetfile
|
|
257
273
|
true
|
258
274
|
end
|
259
275
|
|
276
|
+
def real_basedir
|
277
|
+
Pathname.new(basedir).cleanpath.to_s
|
278
|
+
end
|
279
|
+
|
260
280
|
class DSL
|
261
281
|
# A barebones implementation of the Puppetfile DSL
|
262
282
|
#
|
data/lib/r10k/settings.rb
CHANGED
@@ -160,7 +160,7 @@ module R10K
|
|
160
160
|
|
161
161
|
Definition.new(:pool_size, {
|
162
162
|
:desc => "The amount of threads used to concurrently install modules. The default value is 1: install one module at a time.",
|
163
|
-
:default =>
|
163
|
+
:default => 4,
|
164
164
|
:validate => lambda do |value|
|
165
165
|
if !value.is_a?(Integer)
|
166
166
|
raise ArgumentError, "The pool_size setting should be an integer, not a #{value.class}"
|
data/lib/r10k/source/git.rb
CHANGED
@@ -41,6 +41,10 @@ class R10K::Source::Git < R10K::Source::Base
|
|
41
41
|
# that will be deployed as environments.
|
42
42
|
attr_reader :ignore_branch_prefixes
|
43
43
|
|
44
|
+
# @!attribute [r] filter_command
|
45
|
+
# @return [String] Command to run to filter branches
|
46
|
+
attr_reader :filter_command
|
47
|
+
|
44
48
|
# Initialize the given source.
|
45
49
|
#
|
46
50
|
# @param name [String] The identifier for this source.
|
@@ -61,6 +65,7 @@ class R10K::Source::Git < R10K::Source::Base
|
|
61
65
|
@remote = options[:remote]
|
62
66
|
@invalid_branches = (options[:invalid_branches] || 'correct_and_warn')
|
63
67
|
@ignore_branch_prefixes = options[:ignore_branch_prefixes]
|
68
|
+
@filter_command = options[:filter_command]
|
64
69
|
|
65
70
|
@cache = R10K::Git.cache.generate(@remote)
|
66
71
|
end
|
@@ -115,7 +120,7 @@ class R10K::Source::Git < R10K::Source::Base
|
|
115
120
|
environments.map {|env| env.dirname }
|
116
121
|
end
|
117
122
|
|
118
|
-
def
|
123
|
+
def filter_branches_by_regexp(branches, ignore_prefixes)
|
119
124
|
filter = Regexp.new("^#{Regexp.union(ignore_prefixes)}")
|
120
125
|
branches = branches.reject do |branch|
|
121
126
|
result = filter.match(branch)
|
@@ -127,14 +132,29 @@ class R10K::Source::Git < R10K::Source::Base
|
|
127
132
|
branches
|
128
133
|
end
|
129
134
|
|
135
|
+
def filter_branches_by_command(branches, command)
|
136
|
+
branches.select do |branch|
|
137
|
+
result = system({'GIT_DIR' => @cache.git_dir.to_s, 'R10K_BRANCH' => branch, 'R10K_NAME' => @name.to_s}, command)
|
138
|
+
unless result
|
139
|
+
logger.warn _("Branch `%{name}:%{branch}` filtered out by filter_command %{cmd}") % {name: @name, branch: branch, cmd: command}
|
140
|
+
end
|
141
|
+
result
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
130
145
|
private
|
131
146
|
|
132
147
|
def branch_names
|
133
148
|
opts = {:prefix => @prefix, :invalid => @invalid_branches, :source => @name}
|
134
149
|
branches = @cache.branches
|
135
150
|
if @ignore_branch_prefixes && !@ignore_branch_prefixes.empty?
|
136
|
-
branches =
|
151
|
+
branches = filter_branches_by_regexp(branches, @ignore_branch_prefixes)
|
152
|
+
end
|
153
|
+
|
154
|
+
if @filter_command && !@filter_command.empty?
|
155
|
+
branches = filter_branches_by_command(branches, @filter_command)
|
137
156
|
end
|
157
|
+
|
138
158
|
branches.map do |branch|
|
139
159
|
R10K::Environment::Name.new(branch, opts)
|
140
160
|
end
|
data/lib/r10k/version.rb
CHANGED
@@ -2,5 +2,5 @@ module R10K
|
|
2
2
|
# When updating to a new major (X) or minor (Y) version, include `#major` or
|
3
3
|
# `#minor` (respectively) in your commit message to trigger the appropriate
|
4
4
|
# release. Otherwise, a new patch (Z) version will be released.
|
5
|
-
VERSION = '3.
|
5
|
+
VERSION = '3.6.0'
|
6
6
|
end
|
data/locales/r10k.pot
CHANGED
@@ -6,11 +6,11 @@
|
|
6
6
|
#, fuzzy
|
7
7
|
msgid ""
|
8
8
|
msgstr ""
|
9
|
-
"Project-Id-Version: r10k 3.4.1-
|
9
|
+
"Project-Id-Version: r10k 3.4.1-57-g2eb088a\n"
|
10
10
|
"\n"
|
11
11
|
"Report-Msgid-Bugs-To: docs@puppetlabs.com\n"
|
12
|
-
"POT-Creation-Date: 2020-
|
13
|
-
"PO-Revision-Date: 2020-
|
12
|
+
"POT-Creation-Date: 2020-07-22 16:41+0000\n"
|
13
|
+
"PO-Revision-Date: 2020-07-22 16:41+0000\n"
|
14
14
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
15
15
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
16
16
|
"Language: \n"
|
@@ -442,26 +442,30 @@ msgid ""
|
|
442
442
|
"Returned: %{data}"
|
443
443
|
msgstr ""
|
444
444
|
|
445
|
-
#: ../lib/r10k/source/git.rb:
|
445
|
+
#: ../lib/r10k/source/git.rb:77
|
446
446
|
msgid "Fetching '%{remote}' to determine current branches."
|
447
447
|
msgstr ""
|
448
448
|
|
449
|
-
#: ../lib/r10k/source/git.rb:
|
449
|
+
#: ../lib/r10k/source/git.rb:80
|
450
450
|
msgid "Unable to determine current branches for Git source '%{name}' (%{basedir})"
|
451
451
|
msgstr ""
|
452
452
|
|
453
|
-
#: ../lib/r10k/source/git.rb:
|
453
|
+
#: ../lib/r10k/source/git.rb:105
|
454
454
|
msgid "Environment %{env_name} contained non-word characters, correcting name to %{corrected_env_name}"
|
455
455
|
msgstr ""
|
456
456
|
|
457
|
-
#: ../lib/r10k/source/git.rb:
|
457
|
+
#: ../lib/r10k/source/git.rb:109
|
458
458
|
msgid "Environment %{env_name} contained non-word characters, ignoring it."
|
459
459
|
msgstr ""
|
460
460
|
|
461
|
-
#: ../lib/r10k/source/git.rb:
|
461
|
+
#: ../lib/r10k/source/git.rb:128 ../lib/r10k/source/svn.rb:113
|
462
462
|
msgid "Branch %{branch} filtered out by ignore_branch_prefixes %{ibp}"
|
463
463
|
msgstr ""
|
464
464
|
|
465
|
+
#: ../lib/r10k/source/git.rb:139
|
466
|
+
msgid "Branch `%{name}:%{branch}` filtered out by filter_command %{cmd}"
|
467
|
+
msgstr ""
|
468
|
+
|
465
469
|
#: ../lib/r10k/source/yaml.rb:10
|
466
470
|
msgid "Couldn't open environments file %{file}: %{err}"
|
467
471
|
msgstr ""
|
@@ -70,8 +70,8 @@ describe R10K::Action::Deploy::Module do
|
|
70
70
|
|
71
71
|
before do
|
72
72
|
allow(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
|
73
|
-
expect(environment.puppetfile).to receive(:
|
74
|
-
[R10K::Module::Local.new(environment.name, '/fakedir', [], environment)]
|
73
|
+
expect(environment.puppetfile).to receive(:modules_by_vcs_cachedir).and_return(
|
74
|
+
{none: [R10K::Module::Local.new(environment.name, '/fakedir', [], environment)]}
|
75
75
|
)
|
76
76
|
original.call(environment, &block)
|
77
77
|
end
|
@@ -27,6 +27,7 @@ describe R10K::Action::Puppetfile::Install do
|
|
27
27
|
before do
|
28
28
|
allow(puppetfile).to receive(:purge!)
|
29
29
|
allow(puppetfile).to receive(:modules).and_return(modules)
|
30
|
+
allow(puppetfile).to receive(:modules_by_vcs_cachedir).and_return({none: modules})
|
30
31
|
end
|
31
32
|
|
32
33
|
it "syncs each module in the Puppetfile" do
|
@@ -127,6 +127,25 @@ describe R10K::Puppetfile do
|
|
127
127
|
|
128
128
|
expect { subject.add_module('puppet/test_module', module_opts) }.to raise_error(R10K::Error, /cannot manage content.*is not within/i).and not_change { subject.modules }
|
129
129
|
end
|
130
|
+
|
131
|
+
it "groups modules by vcs cache location" do
|
132
|
+
module_opts = { install_path: File.join(subject.basedir, 'vendor') }
|
133
|
+
opts1 = module_opts.merge(git: 'git@example.com:puppet/test_module.git')
|
134
|
+
opts2 = module_opts.merge(git: 'git@example.com:puppet/test_module_c.git')
|
135
|
+
sanitized_name1 = "git@example.com-puppet-test_module.git"
|
136
|
+
sanitized_name2 = "git@example.com-puppet-test_module_c.git"
|
137
|
+
|
138
|
+
subject.add_module('puppet/test_module_a', opts1)
|
139
|
+
subject.add_module('puppet/test_module_b', opts1)
|
140
|
+
subject.add_module('puppet/test_module_c', opts2)
|
141
|
+
subject.add_module('puppet/test_module_d', '1.2.3')
|
142
|
+
|
143
|
+
mods_by_cachedir = subject.modules_by_vcs_cachedir
|
144
|
+
|
145
|
+
expect(mods_by_cachedir[:none].length).to be 1
|
146
|
+
expect(mods_by_cachedir[sanitized_name1].length).to be 2
|
147
|
+
expect(mods_by_cachedir[sanitized_name2].length).to be 1
|
148
|
+
end
|
130
149
|
end
|
131
150
|
|
132
151
|
describe "#purge_exclusions" do
|
@@ -154,6 +173,26 @@ describe R10K::Puppetfile do
|
|
154
173
|
end
|
155
174
|
end
|
156
175
|
|
176
|
+
describe '#managed_directories' do
|
177
|
+
it 'returns an array of paths that can be purged' do
|
178
|
+
allow(R10K::Module).to receive(:new).with('puppet/test_module', subject.moduledir, '1.2.3', anything).and_call_original
|
179
|
+
|
180
|
+
subject.add_module('puppet/test_module', '1.2.3')
|
181
|
+
expect(subject.managed_directories).to match_array(["/some/nonexistent/basedir/modules"])
|
182
|
+
end
|
183
|
+
|
184
|
+
context 'with a module with install_path == \'\'' do
|
185
|
+
it 'basedir isn\'t in the list of paths to purge' do
|
186
|
+
module_opts = { install_path: '', git: 'git@example.com:puppet/test_module.git' }
|
187
|
+
|
188
|
+
allow(R10K::Module).to receive(:new).with('puppet/test_module', subject.basedir, module_opts, anything).and_call_original
|
189
|
+
|
190
|
+
subject.add_module('puppet/test_module', module_opts)
|
191
|
+
expect(subject.managed_directories).to be_empty
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
157
196
|
describe "evaluating a Puppetfile" do
|
158
197
|
def expect_wrapped_error(orig, pf_path, wrapped_error)
|
159
198
|
expect(orig).to be_a_kind_of(R10K::Error)
|
@@ -268,7 +307,7 @@ describe R10K::Puppetfile do
|
|
268
307
|
mod2 = spy('module')
|
269
308
|
expect(mod2).to receive(:accept).with(visitor)
|
270
309
|
|
271
|
-
expect(subject).to receive(:
|
310
|
+
expect(subject).to receive(:modules_by_vcs_cachedir).and_return({none: [mod1, mod2]})
|
272
311
|
subject.accept(visitor)
|
273
312
|
end
|
274
313
|
|
@@ -289,12 +328,38 @@ describe R10K::Puppetfile do
|
|
289
328
|
mod2 = spy('module')
|
290
329
|
expect(mod2).to receive(:accept).with(visitor)
|
291
330
|
|
292
|
-
expect(subject).to receive(:
|
331
|
+
expect(subject).to receive(:modules_by_vcs_cachedir).and_return({none: [mod1, mod2]})
|
293
332
|
|
294
333
|
expect(Thread).to receive(:new).exactly(pool_size).and_call_original
|
295
334
|
expect(Queue).to receive(:new).and_call_original
|
296
335
|
|
297
336
|
subject.accept(visitor)
|
298
337
|
end
|
338
|
+
|
339
|
+
it "Creates queues of modules grouped by cachedir" do
|
340
|
+
visitor = spy('visitor')
|
341
|
+
expect(visitor).to receive(:visit) do |type, other, &block|
|
342
|
+
expect(type).to eq :puppetfile
|
343
|
+
expect(other).to eq subject
|
344
|
+
block.call
|
345
|
+
end
|
346
|
+
|
347
|
+
mod1 = spy('module1')
|
348
|
+
mod2 = spy('module2')
|
349
|
+
mod3 = spy('module3')
|
350
|
+
mod4 = spy('module4')
|
351
|
+
mod5 = spy('module5')
|
352
|
+
mod6 = spy('module6')
|
353
|
+
|
354
|
+
expect(subject).to receive(:modules_by_vcs_cachedir)
|
355
|
+
.and_return({:none => [mod1, mod2],
|
356
|
+
"foo-cachedir" => [mod3, mod4],
|
357
|
+
"bar-cachedir" => [mod5, mod6]})
|
358
|
+
|
359
|
+
queue = subject.modules_queue(visitor)
|
360
|
+
expect(queue.length).to be 4
|
361
|
+
queue_array = 4.times.map { queue.pop }
|
362
|
+
expect(queue_array).to match_array([[mod1], [mod2], [mod3, mod4], [mod5, mod6]])
|
363
|
+
end
|
299
364
|
end
|
300
365
|
end
|
@@ -93,9 +93,45 @@ describe R10K::Source::Git do
|
|
93
93
|
let(:ignore_prefixes) { ['dev', 'test'] }
|
94
94
|
|
95
95
|
it "filters branches" do
|
96
|
-
expect(subject.
|
96
|
+
expect(subject.filter_branches_by_regexp(branches, ignore_prefixes)).to eq(['master', 'production', 'not_dev_test_me'])
|
97
97
|
end
|
98
98
|
end
|
99
|
+
|
100
|
+
describe "filtering branches with command" do
|
101
|
+
let(:branches) { ['master', 'development', 'production'] }
|
102
|
+
let(:filter_command) { 'sh -c "[ $R10K_BRANCH != development ]"' }
|
103
|
+
|
104
|
+
it "filters branches" do
|
105
|
+
expect(subject.filter_branches_by_command(branches, filter_command)).to eq(['master', 'production'])
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe "generate_environments respects filter_command setting" do
|
110
|
+
before do
|
111
|
+
allow(subject.cache).to receive(:branches).and_return ['master', 'development', 'production']
|
112
|
+
subject.instance_variable_set(:@filter_command, '[ $R10K_BRANCH != master ]')
|
113
|
+
end
|
114
|
+
|
115
|
+
let(:environments) { subject.generate_environments }
|
116
|
+
|
117
|
+
it "creates an environment for each branch not filtered by filter_command" do
|
118
|
+
expect(subject.generate_environments.size).to eq(2)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe "generate_environments respects filter_command setting and name" do
|
123
|
+
before do
|
124
|
+
allow(subject.cache).to receive(:branches).and_return ['master', 'development', 'production']
|
125
|
+
subject.instance_variable_set(:@filter_command, '[ $R10K_NAME = mysource ]')
|
126
|
+
end
|
127
|
+
|
128
|
+
let(:environments) { subject.generate_environments }
|
129
|
+
|
130
|
+
it "creates an environment for each branch not filtered by filter_command" do
|
131
|
+
expect(subject.generate_environments.size).to eq(3)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
99
135
|
end
|
100
136
|
|
101
137
|
describe R10K::Source::Git, "handling invalid branch names" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: r10k
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrien Thebo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colored2
|
@@ -282,6 +282,7 @@ files:
|
|
282
282
|
- integration/tests/command_line/negative/neg_invalid_cmd_line_arg.rb
|
283
283
|
- integration/tests/git_source/HTTP_proxy_and_git_source.rb
|
284
284
|
- integration/tests/git_source/git_source_git.rb
|
285
|
+
- integration/tests/git_source/git_source_repeated_remote.rb
|
285
286
|
- integration/tests/git_source/git_source_ssh.rb
|
286
287
|
- integration/tests/git_source/git_source_submodule.rb
|
287
288
|
- integration/tests/git_source/negative/neg_git_broken_remote.rb
|