r10k 3.10.0 → 3.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -10
  3. data/CHANGELOG.mkd +9 -0
  4. data/README.mkd +6 -0
  5. data/doc/dynamic-environments/configuration.mkd +14 -0
  6. data/doc/puppetfile.mkd +15 -1
  7. data/integration/Rakefile +2 -0
  8. data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +15 -13
  9. data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +3 -3
  10. data/integration/tests/user_scenario/complex_workflow/multi_env_remove_re-add.rb +3 -3
  11. data/integration/tests/user_scenario/complex_workflow/multi_env_unamanaged.rb +3 -3
  12. data/lib/r10k/action/deploy/environment.rb +6 -1
  13. data/lib/r10k/action/deploy/module.rb +31 -5
  14. data/lib/r10k/action/runner.rb +34 -4
  15. data/lib/r10k/cli/deploy.rb +4 -0
  16. data/lib/r10k/git.rb +3 -0
  17. data/lib/r10k/git/rugged/credentials.rb +77 -0
  18. data/lib/r10k/git/stateful_repository.rb +1 -0
  19. data/lib/r10k/initializers.rb +3 -0
  20. data/lib/r10k/module/base.rb +37 -0
  21. data/lib/r10k/module/forge.rb +1 -0
  22. data/lib/r10k/module/git.rb +1 -0
  23. data/lib/r10k/module/svn.rb +1 -0
  24. data/lib/r10k/module_loader/puppetfile.rb +15 -4
  25. data/lib/r10k/puppetfile.rb +10 -11
  26. data/lib/r10k/settings.rb +44 -2
  27. data/lib/r10k/settings/definition.rb +1 -1
  28. data/lib/r10k/version.rb +1 -1
  29. data/locales/r10k.pot +106 -38
  30. data/r10k.gemspec +2 -0
  31. data/spec/unit/action/deploy/environment_spec.rb +16 -0
  32. data/spec/unit/action/deploy/module_spec.rb +178 -0
  33. data/spec/unit/action/runner_spec.rb +80 -0
  34. data/spec/unit/git/rugged/credentials_spec.rb +29 -0
  35. data/spec/unit/git/stateful_repository_spec.rb +5 -0
  36. data/spec/unit/module/base_spec.rb +46 -0
  37. data/spec/unit/module/forge_spec.rb +19 -0
  38. data/spec/unit/module/git_spec.rb +17 -0
  39. data/spec/unit/module/svn_spec.rb +18 -0
  40. data/spec/unit/module_loader/puppetfile_spec.rb +16 -3
  41. data/spec/unit/module_spec.rb +12 -1
  42. data/spec/unit/puppetfile_spec.rb +31 -1
  43. data/spec/unit/settings_spec.rb +18 -0
  44. metadata +16 -2
data/lib/r10k/git.rb CHANGED
@@ -135,6 +135,9 @@ module R10K
135
135
 
136
136
  def_setting_attr :private_key
137
137
  def_setting_attr :oauth_token
138
+ def_setting_attr :github_app_id
139
+ def_setting_attr :github_app_key
140
+ def_setting_attr :github_app_ttl
138
141
  def_setting_attr :proxy
139
142
  def_setting_attr :username
140
143
  def_setting_attr :repositories, {}
@@ -1,6 +1,10 @@
1
1
  require 'r10k/git/rugged'
2
2
  require 'r10k/git/errors'
3
3
  require 'r10k/logging'
4
+ require 'json'
5
+ require 'jwt'
6
+ require 'net/http'
7
+ require 'openssl'
4
8
 
5
9
  # Generate credentials for secured remote connections.
6
10
  #
@@ -62,15 +66,29 @@ class R10K::Git::Rugged::Credentials
62
66
 
63
67
  def get_plaintext_credentials(url, username_from_url)
64
68
  per_repo_oauth_token = nil
69
+ per_repo_github_app_id = nil
70
+ per_repo_github_app_key = nil
71
+ per_repo_github_app_ttl = nil
72
+
65
73
  if per_repo_settings = R10K::Git.get_repo_settings(url)
66
74
  per_repo_oauth_token = per_repo_settings[:oauth_token]
75
+ per_repo_github_app_id = per_repo_settings[:github_app_id]
76
+ per_repo_github_app_key = per_repo_settings[:github_app_key]
77
+ per_repo_github_app_ttl = per_repo_settings[:github_app_ttl]
67
78
  end
68
79
 
80
+ app_id = per_repo_github_app_id || R10K::Git.settings[:github_app_id]
81
+ app_key = per_repo_github_app_key || R10K::Git.settings[:github_app_key]
82
+ app_ttl = per_repo_github_app_ttl || R10K::Git.settings[:github_app_ttl]
83
+
69
84
  if token_path = per_repo_oauth_token || R10K::Git.settings[:oauth_token]
70
85
  @oauth_token ||= extract_token(token_path, url)
71
86
 
72
87
  user = 'x-oauth-token'
73
88
  password = @oauth_token
89
+ elsif app_id && app_key && app_ttl
90
+ user = 'x-access-token'
91
+ password = github_app_token(app_id, app_key, app_ttl)
74
92
  else
75
93
  user = get_git_username(url, username_from_url)
76
94
  password = URI.parse(url).password || ''
@@ -125,4 +143,63 @@ class R10K::Git::Rugged::Credentials
125
143
 
126
144
  user
127
145
  end
146
+
147
+ def github_app_token(app_id, private_key, ttl)
148
+ raise R10K::Git::GitError, _('Github App id contains invalid characters.') unless app_id =~ /^\d+$/
149
+ raise R10K::Git::GitError, _('Github App token ttl contains invalid characters.') unless ttl =~ /^\d+$/
150
+ raise R10K::Git::GitError, _('Github App key is missing or unreadable') unless File.readable?(private_key)
151
+
152
+ begin
153
+ ssl_key = OpenSSL::PKey::RSA.new(File.read(private_key).strip)
154
+ unless ssl_key.private?
155
+ raise R10K::Git::GitError, _('Github App key is not a valid SSL private key')
156
+ end
157
+ rescue OpenSSL::PKey::RSAError
158
+ raise R10K::Git::GitError, _('Github App key is not a valid SSL key')
159
+ end
160
+
161
+ logger.debug2 _("Using Github App id %{app_id} with SSL key from %{key_path}") % { key_path: private_key, app_id: app_id }
162
+
163
+ jwt_issue_time = Time.now.to_i - 60
164
+ jwt_exp_time = (jwt_issue_time + 60) + ttl.to_i
165
+ payload = { iat: jwt_issue_time, exp: jwt_exp_time, iss: app_id }
166
+ jwt = JWT.encode(payload, ssl_key, "RS256")
167
+
168
+ get = URI.parse("https://api.github.com/app/installations")
169
+ get_request = Net::HTTP::Get.new(get)
170
+ get_request["Authorization"] = "Bearer #{jwt}"
171
+ get_request["Accept"] = "application/vnd.github.v3+json"
172
+ get_req_options = { use_ssl: get.scheme == "https", }
173
+ get_response = Net::HTTP.start(get.hostname, get.port, get_req_options) do |http|
174
+ http.request(get_request)
175
+ end
176
+
177
+ unless (get_response.class < Net::HTTPSuccess)
178
+ logger.debug2 _("Unexpected response code: #{get_response.code}\nResponse body: #{get_response.body}")
179
+ raise R10K::Git::GitError, _("Error using private key to get Github App access token from url")
180
+ end
181
+
182
+ access_tokens_url = JSON.parse(get_response.body)[0]['access_tokens_url']
183
+
184
+ post = URI.parse(access_tokens_url)
185
+ post_request = Net::HTTP::Post.new(post)
186
+ post_request["Authorization"] = "Bearer #{jwt}"
187
+ post_request["Accept"] = "application/vnd.github.v3+json"
188
+ post_req_options = { use_ssl: post.scheme == "https", }
189
+ post_response = Net::HTTP.start(post.hostname, post.port, post_req_options) do |http|
190
+ http.request(post_request)
191
+ end
192
+
193
+ unless (post_response.class < Net::HTTPSuccess)
194
+ logger.debug2 _("Unexpected response code: #{post_response.code}\nResponse body: #{post_response.body}")
195
+ raise R10K::Git::GitError, _("Error using private key to generate access token from #{access_token_url}")
196
+ end
197
+
198
+ token = JSON.parse(post_response.body)['token']
199
+
200
+ raise R10K::Git::GitError, _("Github App token contains invalid characters.") unless valid_token?(token)
201
+
202
+ logger.debug2 _("Github App token generated, expires at: %{expire}") % {expire: JSON.parse(post_response.body)['expires_at']}
203
+ token
204
+ end
128
205
  end
@@ -93,6 +93,7 @@ class R10K::Git::StatefulRepository
93
93
  # @api private
94
94
  def sync_cache?(ref)
95
95
  return true if !@cache.exist?
96
+ return true if ref == 'HEAD'
96
97
  return true if !([:commit, :tag].include? @cache.ref_type(ref))
97
98
  return false
98
99
  end
@@ -56,6 +56,9 @@ module R10K
56
56
  with_setting(:proxy) { |value| R10K::Git.settings[:proxy] = value }
57
57
  with_setting(:repositories) { |value| R10K::Git.settings[:repositories] = value }
58
58
  with_setting(:oauth_token) { |value| R10K::Git.settings[:oauth_token] = value }
59
+ with_setting(:github_app_id) { |value| R10K::Git.settings[:github_app_id] = value }
60
+ with_setting(:github_app_key) { |value| R10K::Git.settings[:github_app_key] = value }
61
+ with_setting(:github_app_ttl) { |value| R10K::Git.settings[:github_app_ttl] = value }
59
62
  end
60
63
  end
61
64
 
@@ -35,6 +35,10 @@ class R10K::Module::Base
35
35
  # @return [String] Where the module was sourced from. E.g., "Puppetfile"
36
36
  attr_accessor :origin
37
37
 
38
+ # @!attribute [rw] spec_deletable
39
+ # @return [Boolean] set this to true if the spec dir can be safely removed, ie in the moduledir
40
+ attr_accessor :spec_deletable
41
+
38
42
  # There's been some churn over `author` vs `owner` and `full_name` over
39
43
  # `title`, so in the short run it's easier to support both and deprecate one
40
44
  # later.
@@ -52,6 +56,9 @@ class R10K::Module::Base
52
56
  @path = Pathname.new(File.join(@dirname, @name))
53
57
  @environment = environment
54
58
  @overrides = args.delete(:overrides) || {}
59
+ @spec_deletable = true
60
+ @exclude_spec = args.delete(:exclude_spec)
61
+ @exclude_spec = @overrides[:modules].delete(:exclude_spec) if @overrides.dig(:modules, :exclude_spec)
55
62
  @origin = 'external' # Expect Puppetfile or R10k::Environment to set this to a specific value
56
63
 
57
64
  @requested_modules = @overrides.dig(:modules, :requested_modules) || []
@@ -64,6 +71,36 @@ class R10K::Module::Base
64
71
  path.to_s
65
72
  end
66
73
 
74
+ # Delete the spec dir if @exclude_spec has been set to true and @spec_deletable is also true
75
+ def maybe_delete_spec_dir
76
+ if @exclude_spec
77
+ if @spec_deletable
78
+ delete_spec_dir
79
+ else
80
+ logger.info _("Spec dir for #{@title} will not be deleted because it is not in the moduledir")
81
+ end
82
+ end
83
+ end
84
+
85
+ # Actually remove the spec dir
86
+ def delete_spec_dir
87
+ spec_path = @path + 'spec'
88
+ if spec_path.symlink?
89
+ spec_path = spec_path.realpath
90
+ end
91
+ if spec_path.directory?
92
+ logger.debug2 _("Deleting spec data at #{spec_path}")
93
+ # Use the secure flag for the #rm_rf method to avoid security issues
94
+ # involving TOCTTOU(time of check to time of use); more details here:
95
+ # https://ruby-doc.org/stdlib-2.7.0/libdoc/fileutils/rdoc/FileUtils.html#method-c-rm_rf
96
+ # Additionally, #rm_rf also has problems in windows with with symlink targets
97
+ # also being deleted; this should be revisted if Windows becomes higher priority.
98
+ FileUtils.rm_rf(spec_path, secure: true)
99
+ else
100
+ logger.debug2 _("No spec dir detected at #{spec_path}, skipping deletion")
101
+ end
102
+ end
103
+
67
104
  # Synchronize this module with the indicated state.
68
105
  # @param [Hash] opts Deprecated
69
106
  def sync(opts={})
@@ -68,6 +68,7 @@ class R10K::Module::Forge < R10K::Module::Base
68
68
  when :mismatched
69
69
  reinstall
70
70
  end
71
+ maybe_delete_spec_dir
71
72
  end
72
73
  end
73
74
 
@@ -86,6 +86,7 @@ class R10K::Module::Git < R10K::Module::Base
86
86
  def sync(opts={})
87
87
  force = opts[:force] || @force
88
88
  @repo.sync(version, force) if should_sync?
89
+ maybe_delete_spec_dir
89
90
  end
90
91
 
91
92
  def status
@@ -80,6 +80,7 @@ class R10K::Module::SVN < R10K::Module::Base
80
80
  when :outdated
81
81
  update
82
82
  end
83
+ maybe_delete_spec_dir
83
84
  end
84
85
  end
85
86
 
@@ -1,13 +1,17 @@
1
+ require 'r10k/logging'
2
+
1
3
  module R10K
2
4
  module ModuleLoader
3
5
  class Puppetfile
4
6
 
7
+ include R10K::Logging
8
+
5
9
  DEFAULT_MODULEDIR = 'modules'
6
10
  DEFAULT_PUPPETFILE_NAME = 'Puppetfile'
7
11
  DEFAULT_FORGE_API = 'forgeapi.puppetlabs.com'
8
12
 
9
13
  attr_accessor :default_branch_override, :environment
10
- attr_reader :modules, :moduledir,
14
+ attr_reader :modules, :moduledir, :puppetfile_path,
11
15
  :managed_directories, :desired_contents, :purge_exclusions
12
16
 
13
17
  # @param basedir [String] The path that contains the moduledir &
@@ -30,7 +34,7 @@ module R10K
30
34
 
31
35
  @basedir = cleanpath(basedir)
32
36
  @moduledir = resolve_path(@basedir, moduledir)
33
- @puppetfile = resolve_path(@basedir, puppetfile)
37
+ @puppetfile_path = resolve_path(@basedir, puppetfile)
34
38
  @forge = forge
35
39
  @overrides = overrides
36
40
  @environment = environment
@@ -41,11 +45,14 @@ module R10K
41
45
  @managed_directories = []
42
46
  @desired_contents = []
43
47
  @purge_exclusions = []
48
+
49
+ logger.info _("Using Puppetfile '%{puppetfile}'") % {puppetfile: @puppetfile_path}
50
+ logger.debug _("Using moduledir '%{moduledir}'") % {moduledir: @moduledir}
44
51
  end
45
52
 
46
53
  def load
47
54
  dsl = R10K::ModuleLoader::Puppetfile::DSL.new(self)
48
- dsl.instance_eval(puppetfile_content(@puppetfile), @puppetfile)
55
+ dsl.instance_eval(puppetfile_content(@puppetfile_path), @puppetfile_path)
49
56
 
50
57
  validate_no_duplicate_names(@modules)
51
58
  @modules
@@ -64,7 +71,7 @@ module R10K
64
71
  }
65
72
 
66
73
  rescue SyntaxError, LoadError, ArgumentError, NameError => e
67
- raise R10K::Error.wrap(e, _("Failed to evaluate %{path}") % {path: @puppetfile})
74
+ raise R10K::Error.wrap(e, _("Failed to evaluate %{path}") % {path: @puppetfile_path})
68
75
  end
69
76
 
70
77
 
@@ -103,11 +110,14 @@ module R10K
103
110
 
104
111
  module_info[:overrides] = @overrides
105
112
 
113
+ spec_deletable = false
114
+
106
115
  if install_path = module_info.delete(:install_path)
107
116
  install_path = resolve_path(@basedir, install_path)
108
117
  validate_install_path(install_path, name)
109
118
  else
110
119
  install_path = @moduledir
120
+ spec_deletable = true
111
121
  end
112
122
 
113
123
  if @default_branch_override
@@ -116,6 +126,7 @@ module R10K
116
126
 
117
127
  mod = R10K::Module.new(name, install_path, module_info, @environment)
118
128
  mod.origin = :puppetfile
129
+ mod.spec_deletable = spec_deletable
119
130
 
120
131
  # Do not save modules if they would conflict with the attached
121
132
  # environment
@@ -30,10 +30,6 @@ class Puppetfile
30
30
  # @return [String] The base directory that contains the Puppetfile
31
31
  attr_reader :basedir
32
32
 
33
- # @!attrbute [r] puppetfile_path
34
- # @return [String] The path to the Puppetfile
35
- attr_reader :puppetfile_path
36
-
37
33
  # @!attribute [r] environment
38
34
  # @return [R10K::Environment] Optional R10K::Environment that this Puppetfile belongs to.
39
35
  attr_reader :environment
@@ -68,21 +64,20 @@ class Puppetfile
68
64
 
69
65
  @force = deprecated_force_arg || options.delete(:force) || false
70
66
  @moduledir = deprecated_moduledir_arg || options.delete(:moduledir) || File.join(basedir, 'modules')
71
- @puppetfile_name = deprecated_name_arg || options.delete(:puppetfile_name) || 'Puppetfile'
72
- @puppetfile_path = deprecated_path_arg || options.delete(:puppetfile_path) || File.join(basedir, @puppetfile_name)
67
+ puppetfile_name = deprecated_name_arg || options.delete(:puppetfile_name) || 'Puppetfile'
68
+ puppetfile_path = deprecated_path_arg || options.delete(:puppetfile_path)
69
+ @puppetfile = puppetfile_path || puppetfile_name
73
70
  @environment = options.delete(:environment)
74
71
 
75
72
  @overrides = options.delete(:overrides) || {}
76
73
  @default_branch_override = @overrides.dig(:environments, :default_branch_override)
77
74
 
78
- logger.info _("Using Puppetfile '%{puppetfile}'") % {puppetfile: @puppetfile_path}
79
-
80
75
  @forge = 'forgeapi.puppetlabs.com'
81
76
 
82
77
  @loader = ::R10K::ModuleLoader::Puppetfile.new(
83
78
  basedir: @basedir,
84
79
  moduledir: @moduledir,
85
- puppetfile: @puppetfile_path,
80
+ puppetfile: @puppetfile,
86
81
  forge: @forge,
87
82
  overrides: @overrides,
88
83
  environment: @environment
@@ -106,8 +101,8 @@ class Puppetfile
106
101
  if self.loaded?
107
102
  return @loaded_content
108
103
  else
109
- if !File.readable?(@puppetfile_path)
110
- logger.debug _("Puppetfile %{path} missing or unreadable") % {path: @puppetfile_path.inspect}
104
+ if !File.readable?(puppetfile_path)
105
+ logger.debug _("Puppetfile %{path} missing or unreadable") % {path: puppetfile_path.inspect}
111
106
  else
112
107
  self.load!(default_branch_override)
113
108
  end
@@ -156,6 +151,10 @@ class Puppetfile
156
151
  @loader.moduledir
157
152
  end
158
153
 
154
+ def puppetfile_path
155
+ @loader.puppetfile_path
156
+ end
157
+
159
158
  def environment=(env)
160
159
  @loader.environment = env
161
160
  @environment = env
data/lib/r10k/settings.rb CHANGED
@@ -42,6 +42,22 @@ module R10K
42
42
  Only used by the 'rugged' Git provider."
43
43
  }),
44
44
 
45
+ Definition.new(:github_app_id, {
46
+ :desc => "The Github App id for Git SSL remotes.
47
+ Only used by the 'rugged' Git provider."
48
+ }),
49
+
50
+ Definition.new(:github_app_key, {
51
+ :desc => "The Github App private key for Git SSL remotes.
52
+ Only used by the 'rugged' Git provider."
53
+ }),
54
+
55
+ Definition.new(:github_app_ttl, {
56
+ :desc => "The ttl expiration for SSL tokens.
57
+ Only used by the 'rugged' Git provider.",
58
+ :default => "120",
59
+ }),
60
+
45
61
  URIDefinition.new(:proxy, {
46
62
  :desc => "An optional proxy server to use when interacting with Git sources via HTTP(S).",
47
63
  :default => :inherit,
@@ -65,6 +81,24 @@ module R10K
65
81
  :default => :inherit
66
82
  }),
67
83
 
84
+ Definition.new(:github_app_id, {
85
+ :desc => "The Github App id for Git SSL remotes.
86
+ Only used by the 'rugged' Git provider.",
87
+ :default => :inherit
88
+ }),
89
+
90
+ Definition.new(:github_app_key, {
91
+ :desc => "The Github App private key for Git SSL remotes.
92
+ Only used by the 'rugged' Git provider.",
93
+ :default => :inherit
94
+ }),
95
+
96
+ Definition.new(:github_app_ttl, {
97
+ :desc => "The ttl expiration for Git SSL tokens.
98
+ Only used by the 'rugged' Git provider.",
99
+ :default => :inherit
100
+ }),
101
+
68
102
  URIDefinition.new(:proxy, {
69
103
  :desc => "An optional proxy server to use when interacting with Git sources via HTTP(S).",
70
104
  :default => :inherit,
@@ -161,7 +195,15 @@ module R10K
161
195
  end
162
196
  end
163
197
  }),
164
- ])
198
+ Definition.new(:exclude_spec, {
199
+ :desc => "Whether or not to deploy the spec dir of a module. Defaults to false.",
200
+ :default => false,
201
+ :validate => lambda do |value|
202
+ unless !!value == value
203
+ raise ArgumentError, "`exclude_spec` can only be a boolean value, not '#{value}'"
204
+ end
205
+ end
206
+ })])
165
207
  end
166
208
 
167
209
  def self.global_settings
@@ -180,7 +222,7 @@ module R10K
180
222
  }),
181
223
 
182
224
  Definition.new(:postrun, {
183
- :desc => "The command r10k should run after deploying environments.",
225
+ :desc => "The command r10k should run after deploying environments or modules.",
184
226
  :validate => lambda do |value|
185
227
  if !value.is_a?(Array)
186
228
  raise ArgumentError, "The postrun setting should be an array of strings, not a #{value.class}"
@@ -90,7 +90,7 @@ module R10K
90
90
  def resolve
91
91
  if !@value.nil?
92
92
  @value
93
- elsif @default
93
+ elsif !@default.nil?
94
94
  if @default == :inherit
95
95
  # walk all the way up to root, starting with grandparent
96
96
  ancestor = parent
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.10.0'
5
+ VERSION = '3.11.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.9.3-10-gfedc81a\n"
9
+ "Project-Id-Version: r10k 3.9.3-75-ge9bdb69\n"
10
10
  "\n"
11
11
  "Report-Msgid-Bugs-To: docs@puppetlabs.com\n"
12
- "POT-Creation-Date: 2021-07-07 21:13+0000\n"
13
- "PO-Revision-Date: 2021-07-07 21:13+0000\n"
12
+ "POT-Creation-Date: 2021-08-13 23:48+0000\n"
13
+ "PO-Revision-Date: 2021-08-13 23:48+0000\n"
14
14
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
15
15
  "Language-Team: LANGUAGE <LL@li.org>\n"
16
16
  "Language: \n"
@@ -31,31 +31,31 @@ msgstr ""
31
31
  msgid "Reason: %{write_lock}"
32
32
  msgstr ""
33
33
 
34
- #: ../lib/r10k/action/deploy/environment.rb:112
34
+ #: ../lib/r10k/action/deploy/environment.rb:113
35
35
  msgid "Environment(s) \\'%{environments}\\' cannot be found in any source and will not be deployed."
36
36
  msgstr ""
37
37
 
38
- #: ../lib/r10k/action/deploy/environment.rb:145
38
+ #: ../lib/r10k/action/deploy/environment.rb:146
39
39
  msgid "Environment %{env_dir} does not match environment name filter, skipping"
40
40
  msgstr ""
41
41
 
42
- #: ../lib/r10k/action/deploy/environment.rb:153
42
+ #: ../lib/r10k/action/deploy/environment.rb:154
43
43
  msgid "Deploying environment %{env_path}"
44
44
  msgstr ""
45
45
 
46
- #: ../lib/r10k/action/deploy/environment.rb:156
46
+ #: ../lib/r10k/action/deploy/environment.rb:157
47
47
  msgid "Environment %{env_dir} is now at %{env_signature}"
48
48
  msgstr ""
49
49
 
50
- #: ../lib/r10k/action/deploy/environment.rb:160
50
+ #: ../lib/r10k/action/deploy/environment.rb:161
51
51
  msgid "Environment %{env_dir} is new, updating all modules"
52
52
  msgstr ""
53
53
 
54
- #: ../lib/r10k/action/deploy/module.rb:81
54
+ #: ../lib/r10k/action/deploy/module.rb:98
55
55
  msgid "Only updating modules in environment(s) %{opt_env} skipping environment %{env_path}"
56
56
  msgstr ""
57
57
 
58
- #: ../lib/r10k/action/deploy/module.rb:83
58
+ #: ../lib/r10k/action/deploy/module.rb:100
59
59
  msgid "Updating modules %{modules} in environment %{env_path}"
60
60
  msgstr ""
61
61
 
@@ -63,15 +63,15 @@ msgstr ""
63
63
  msgid "Syntax OK"
64
64
  msgstr ""
65
65
 
66
- #: ../lib/r10k/action/runner.rb:54 ../lib/r10k/deployment/config.rb:42
66
+ #: ../lib/r10k/action/runner.rb:57 ../lib/r10k/deployment/config.rb:42
67
67
  msgid "Overriding config file setting '%{key}': '%{old_val}' -> '%{new_val}'"
68
68
  msgstr ""
69
69
 
70
- #: ../lib/r10k/action/runner.rb:91
70
+ #: ../lib/r10k/action/runner.rb:99
71
71
  msgid "Reading configuration from %{config_path}"
72
72
  msgstr ""
73
73
 
74
- #: ../lib/r10k/action/runner.rb:94
74
+ #: ../lib/r10k/action/runner.rb:102
75
75
  msgid "No config file explicitly given and no default config file could be found, default settings will be used."
76
76
  msgstr ""
77
77
 
@@ -207,54 +207,106 @@ msgstr ""
207
207
  msgid "Rugged versions prior to 0.24.0 do not support pruning stale branches during fetch, please upgrade your \\'rugged\\' gem. (Current version is: %{version})"
208
208
  msgstr ""
209
209
 
210
- #: ../lib/r10k/git/rugged/credentials.rb:24
210
+ #: ../lib/r10k/git/rugged/credentials.rb:28
211
211
  msgid "Authentication failed for Git remote %{url}."
212
212
  msgstr ""
213
213
 
214
- #: ../lib/r10k/git/rugged/credentials.rb:48
214
+ #: ../lib/r10k/git/rugged/credentials.rb:52
215
215
  msgid "Using per-repository private key %{key} for URL %{url}"
216
216
  msgstr ""
217
217
 
218
- #: ../lib/r10k/git/rugged/credentials.rb:51
218
+ #: ../lib/r10k/git/rugged/credentials.rb:55
219
219
  msgid "URL %{url} has no per-repository private key using '%{key}'."
220
220
  msgstr ""
221
221
 
222
- #: ../lib/r10k/git/rugged/credentials.rb:53
222
+ #: ../lib/r10k/git/rugged/credentials.rb:57
223
223
  msgid "Git remote %{url} uses the SSH protocol but no private key was given"
224
224
  msgstr ""
225
225
 
226
- #: ../lib/r10k/git/rugged/credentials.rb:57
226
+ #: ../lib/r10k/git/rugged/credentials.rb:61
227
227
  msgid "Unable to use SSH key auth for %{url}: private key %{private_key} is missing or unreadable"
228
228
  msgstr ""
229
229
 
230
- #: ../lib/r10k/git/rugged/credentials.rb:84
230
+ #: ../lib/r10k/git/rugged/credentials.rb:102
231
231
  msgid "Using OAuth token from stdin for URL %{url}"
232
232
  msgstr ""
233
233
 
234
- #: ../lib/r10k/git/rugged/credentials.rb:87
234
+ #: ../lib/r10k/git/rugged/credentials.rb:105
235
235
  msgid "Using OAuth token from %{token_path} for URL %{url}"
236
236
  msgstr ""
237
237
 
238
- #: ../lib/r10k/git/rugged/credentials.rb:89
238
+ #: ../lib/r10k/git/rugged/credentials.rb:107
239
239
  msgid "%{path} is missing or unreadable, cannot load OAuth token"
240
240
  msgstr ""
241
241
 
242
- #: ../lib/r10k/git/rugged/credentials.rb:93
242
+ #: ../lib/r10k/git/rugged/credentials.rb:111
243
243
  msgid "Supplied OAuth token contains invalid characters."
244
244
  msgstr ""
245
245
 
246
- #: ../lib/r10k/git/rugged/credentials.rb:117
246
+ #: ../lib/r10k/git/rugged/credentials.rb:135
247
247
  msgid "URL %{url} includes the username %{username}, using that user for authentication."
248
248
  msgstr ""
249
249
 
250
- #: ../lib/r10k/git/rugged/credentials.rb:120
250
+ #: ../lib/r10k/git/rugged/credentials.rb:138
251
251
  msgid "URL %{url} did not specify a user, using %{user} from configuration"
252
252
  msgstr ""
253
253
 
254
- #: ../lib/r10k/git/rugged/credentials.rb:123
254
+ #: ../lib/r10k/git/rugged/credentials.rb:141
255
255
  msgid "URL %{url} did not specify a user, using current user %{user}"
256
256
  msgstr ""
257
257
 
258
+ #: ../lib/r10k/git/rugged/credentials.rb:148
259
+ msgid "Github App id contains invalid characters."
260
+ msgstr ""
261
+
262
+ #: ../lib/r10k/git/rugged/credentials.rb:149
263
+ msgid "Github App token ttl contains invalid characters."
264
+ msgstr ""
265
+
266
+ #: ../lib/r10k/git/rugged/credentials.rb:150
267
+ msgid "Github App key is missing or unreadable"
268
+ msgstr ""
269
+
270
+ #: ../lib/r10k/git/rugged/credentials.rb:155
271
+ msgid "Github App key is not a valid SSL private key"
272
+ msgstr ""
273
+
274
+ #: ../lib/r10k/git/rugged/credentials.rb:158
275
+ msgid "Github App key is not a valid SSL key"
276
+ msgstr ""
277
+
278
+ #: ../lib/r10k/git/rugged/credentials.rb:161
279
+ msgid "Using Github App id %{app_id} with SSL key from %{key_path}"
280
+ msgstr ""
281
+
282
+ #: ../lib/r10k/git/rugged/credentials.rb:178
283
+ msgid ""
284
+ "Unexpected response code: #{get_response.code}\n"
285
+ "Response body: #{get_response.body}"
286
+ msgstr ""
287
+
288
+ #: ../lib/r10k/git/rugged/credentials.rb:179
289
+ msgid "Error using private key to get Github App access token from url"
290
+ msgstr ""
291
+
292
+ #: ../lib/r10k/git/rugged/credentials.rb:194
293
+ msgid ""
294
+ "Unexpected response code: #{post_response.code}\n"
295
+ "Response body: #{post_response.body}"
296
+ msgstr ""
297
+
298
+ #: ../lib/r10k/git/rugged/credentials.rb:195
299
+ msgid "Error using private key to generate access token from #{access_token_url}"
300
+ msgstr ""
301
+
302
+ #: ../lib/r10k/git/rugged/credentials.rb:200
303
+ msgid "Github App token contains invalid characters."
304
+ msgstr ""
305
+
306
+ #: ../lib/r10k/git/rugged/credentials.rb:202
307
+ msgid "Github App token generated, expires at: %{expire}"
308
+ msgstr ""
309
+
258
310
  #: ../lib/r10k/git/rugged/thin_repository.rb:85 ../lib/r10k/git/shellgit/thin_repository.rb:65
259
311
  msgid "Updated repo %{path} to include alternate object db path %{objects_dir}"
260
312
  msgstr ""
@@ -319,27 +371,39 @@ msgstr ""
319
371
  msgid "Module %{name} with args %{args} doesn't have an implementation. (Are you using the right arguments?)"
320
372
  msgstr ""
321
373
 
322
- #: ../lib/r10k/module/base.rb:75
374
+ #: ../lib/r10k/module/base.rb:80
375
+ msgid "Spec dir for #{@title} will not be deleted because it is not in the moduledir"
376
+ msgstr ""
377
+
378
+ #: ../lib/r10k/module/base.rb:92
379
+ msgid "Deleting spec data at #{spec_path}"
380
+ msgstr ""
381
+
382
+ #: ../lib/r10k/module/base.rb:100
383
+ msgid "No spec dir detected at #{spec_path}, skipping deletion"
384
+ msgstr ""
385
+
386
+ #: ../lib/r10k/module/base.rb:112
323
387
  msgid "Deploying module to %{path}"
324
388
  msgstr ""
325
389
 
326
- #: ../lib/r10k/module/base.rb:78
390
+ #: ../lib/r10k/module/base.rb:115
327
391
  msgid "Only updating modules %{modules}, skipping module %{name}"
328
392
  msgstr ""
329
393
 
330
- #: ../lib/r10k/module/base.rb:134
394
+ #: ../lib/r10k/module/base.rb:171
331
395
  msgid "Module name (%{title}) must match either 'modulename' or 'owner/modulename'"
332
396
  msgstr ""
333
397
 
334
- #: ../lib/r10k/module/forge.rb:89
398
+ #: ../lib/r10k/module/forge.rb:90
335
399
  msgid "The module %{title} does not appear to have any published releases, cannot determine latest version."
336
400
  msgstr ""
337
401
 
338
- #: ../lib/r10k/module/forge.rb:92 ../lib/r10k/module/forge.rb:121
402
+ #: ../lib/r10k/module/forge.rb:93 ../lib/r10k/module/forge.rb:122
339
403
  msgid "The module %{title} does not exist on %{url}."
340
404
  msgstr ""
341
405
 
342
- #: ../lib/r10k/module/forge.rb:196
406
+ #: ../lib/r10k/module/forge.rb:197
343
407
  msgid "Forge module names must match 'owner/modulename', instead got #{title}"
344
408
  msgstr ""
345
409
 
@@ -355,30 +419,34 @@ msgstr ""
355
419
  msgid "Could not read metadata.json"
356
420
  msgstr ""
357
421
 
358
- #: ../lib/r10k/puppetfile.rb:73
422
+ #: ../lib/r10k/module_loader/puppetfile.rb:49
359
423
  msgid "Using Puppetfile '%{puppetfile}'"
360
424
  msgstr ""
361
425
 
362
- #: ../lib/r10k/puppetfile.rb:87
363
- msgid "Puppetfile %{path} missing or unreadable"
426
+ #: ../lib/r10k/module_loader/puppetfile.rb:50
427
+ msgid "Using moduledir '%{moduledir}'"
364
428
  msgstr ""
365
429
 
366
- #: ../lib/r10k/puppetfile.rb:100
430
+ #: ../lib/r10k/module_loader/puppetfile.rb:74
367
431
  msgid "Failed to evaluate %{path}"
368
432
  msgstr ""
369
433
 
370
- #: ../lib/r10k/puppetfile.rb:114
434
+ #: ../lib/r10k/module_loader/puppetfile.rb:149
371
435
  msgid "Puppetfiles cannot contain duplicate module names."
372
436
  msgstr ""
373
437
 
374
- #: ../lib/r10k/puppetfile.rb:116
438
+ #: ../lib/r10k/module_loader/puppetfile.rb:151
375
439
  msgid "Remove the duplicates of the following modules: %{dupes}"
376
440
  msgstr ""
377
441
 
378
- #: ../lib/r10k/puppetfile.rb:285
442
+ #: ../lib/r10k/module_loader/puppetfile/dsl.rb:32
379
443
  msgid "unrecognized declaration '%{method}'"
380
444
  msgstr ""
381
445
 
446
+ #: ../lib/r10k/puppetfile.rb:105
447
+ msgid "Puppetfile %{path} missing or unreadable"
448
+ msgstr ""
449
+
382
450
  #: ../lib/r10k/settings/collection.rb:77
383
451
  msgid "Validation failed for '%{name}' settings group"
384
452
  msgstr ""