r10k 3.10.0 → 3.11.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.
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 ""