dependabot-common 0.211.0 → 0.212.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/lib/dependabot/clients/azure.rb +1 -1
  3. data/lib/dependabot/clients/bitbucket.rb +2 -2
  4. data/lib/dependabot/config/ignore_condition.rb +1 -1
  5. data/lib/dependabot/dependency.rb +8 -10
  6. data/lib/dependabot/errors.rb +7 -7
  7. data/lib/dependabot/file_fetchers/base.rb +4 -4
  8. data/lib/dependabot/file_parsers/base/dependency_set.rb +1 -1
  9. data/lib/dependabot/file_updaters/vendor_updater.rb +2 -0
  10. data/lib/dependabot/git_commit_checker.rb +6 -2
  11. data/lib/dependabot/git_metadata_fetcher.rb +2 -2
  12. data/lib/dependabot/metadata_finders/base/changelog_finder.rb +5 -5
  13. data/lib/dependabot/metadata_finders/base/changelog_pruner.rb +4 -4
  14. data/lib/dependabot/metadata_finders/base/commits_finder.rb +4 -4
  15. data/lib/dependabot/metadata_finders/base/release_finder.rb +4 -4
  16. data/lib/dependabot/pull_request_creator/branch_namer.rb +10 -12
  17. data/lib/dependabot/pull_request_creator/github.rb +5 -5
  18. data/lib/dependabot/pull_request_creator/labeler.rb +2 -0
  19. data/lib/dependabot/pull_request_creator/message_builder/link_and_mention_sanitizer.rb +1 -1
  20. data/lib/dependabot/pull_request_creator/message_builder/metadata_presenter.rb +10 -10
  21. data/lib/dependabot/pull_request_creator/message_builder.rb +39 -39
  22. data/lib/dependabot/pull_request_creator/pr_name_prefixer.rb +5 -10
  23. data/lib/dependabot/pull_request_updater/github.rb +1 -1
  24. data/lib/dependabot/security_advisory.rb +3 -3
  25. data/lib/dependabot/shared_helpers.rb +12 -12
  26. data/lib/dependabot/source.rb +2 -2
  27. data/lib/dependabot/update_checkers/base.rb +1 -1
  28. data/lib/dependabot/version.rb +1 -1
  29. metadata +22 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e1b0e492dee111c834810de7850faa8a0bb5150e281d5eb32e8b44802f2be1f
4
- data.tar.gz: 2c9c14aeb59e0d6c33b1630c5425529dff45624f9b1657390ae644dd8d0abbbf
3
+ metadata.gz: 5242196cd22b0092cbdaaf08f6d5ce3f4249d1eeccedada949822b0b14657e9c
4
+ data.tar.gz: f47437aa525423bdbb507dfa5b0978863e41f3010682ed1c6f321d2ac67efea9
5
5
  SHA512:
6
- metadata.gz: 821283e91686501710d6146944b8b10f559cd7ed9e0084edfc5176027083c24b26918a273c823f5fd829f575d5e1a29ead356db403307ba0e36147de30e9e3de
7
- data.tar.gz: 768791aeb20b739bd36d4b788164f5d9e11f096879b7ac517cc4fbaa81462f58e1e1cb1d03a8fce5183b0af4da2ac5458a482dc31ee36cc6d5bf09697300c5ef
6
+ metadata.gz: cad3f4c8848f45b07d7769bdf4a1b351e3cca4f921bb449cee629ddffc3c579df3b1dfc9343ecfdabd1192d1f1e207e82f8af0c8ee0f142af5856e5bee769d0e
7
+ data.tar.gz: c564e966eba317b8b5e61bf4d82df255248ee4932711d85854e38e843ce0f26d0dc22a649cb7e2f475e01f2b0fd61dce160a46a5ecdc0cbe61d560fd5b004587
@@ -310,7 +310,7 @@ module Dependabot
310
310
  # https://developercommunity.visualstudio.com/content/problem/608770/remove-4000-character-limit-on-pull-request-descri.html
311
311
  pr_description = pr_description.dup.force_encoding(Encoding::UTF_16)
312
312
  if pr_description.length > MAX_PR_DESCRIPTION_LENGTH
313
- truncated_msg = "...\n\n_Description has been truncated_".dup.force_encoding(Encoding::UTF_16)
313
+ truncated_msg = (+"...\n\n_Description has been truncated_").force_encoding(Encoding::UTF_16)
314
314
  truncate_length = MAX_PR_DESCRIPTION_LENGTH - truncated_msg.length
315
315
  pr_description = (pr_description[0..truncate_length] + truncated_msg)
316
316
  end
@@ -189,8 +189,8 @@ module Dependabot
189
189
  raise NotFound if response.status == 404
190
190
 
191
191
  if response.status >= 400
192
- raise "Unhandled Bitbucket error!\n"\
193
- "Status: #{response.status}\n"\
192
+ raise "Unhandled Bitbucket error!\n" \
193
+ "Status: #{response.status}\n" \
194
194
  "Body: #{response.body}"
195
195
  end
196
196
 
@@ -28,7 +28,7 @@ module Dependabot
28
28
  private
29
29
 
30
30
  def transformed_update_types
31
- update_types.map(&:downcase).map(&:strip).compact
31
+ update_types.map(&:downcase).filter_map(&:strip)
32
32
  end
33
33
 
34
34
  def versions_by_type(dependency)
@@ -120,9 +120,7 @@ module Dependabot
120
120
  private
121
121
 
122
122
  def check_values
123
- if [version, previous_version].any? { |v| v == "" }
124
- raise ArgumentError, "blank strings must not be provided as versions"
125
- end
123
+ raise ArgumentError, "blank strings must not be provided as versions" if [version, previous_version].any?("")
126
124
 
127
125
  check_requirement_fields
128
126
  check_subdependency_metadata
@@ -130,8 +128,8 @@ module Dependabot
130
128
 
131
129
  def check_requirement_fields
132
130
  requirement_fields = [requirements, previous_requirements].compact
133
- unless requirement_fields.all? { |r| r.is_a?(Array) } &&
134
- requirement_fields.flatten.all? { |r| r.is_a?(Hash) }
131
+ unless requirement_fields.all?(Array) &&
132
+ requirement_fields.flatten.all?(Hash)
135
133
  raise ArgumentError, "requirements must be an array of hashes"
136
134
  end
137
135
 
@@ -139,9 +137,9 @@ module Dependabot
139
137
  optional_keys = %i(metadata)
140
138
  unless requirement_fields.flatten.
141
139
  all? { |r| required_keys.sort == (r.keys - optional_keys).sort }
142
- raise ArgumentError, "each requirement must have the following "\
143
- "required keys: #{required_keys.join(', ')}."\
144
- "Optionally, it may have the following keys: "\
140
+ raise ArgumentError, "each requirement must have the following " \
141
+ "required keys: #{required_keys.join(', ')}." \
142
+ "Optionally, it may have the following keys: " \
145
143
  "#{optional_keys.join(', ')}."
146
144
  end
147
145
 
@@ -154,13 +152,13 @@ module Dependabot
154
152
  return unless subdependency_metadata
155
153
 
156
154
  unless subdependency_metadata.is_a?(Array) &&
157
- subdependency_metadata.all? { |r| r.is_a?(Hash) }
155
+ subdependency_metadata.all?(Hash)
158
156
  raise ArgumentError, "subdependency_metadata must be an array of hashes"
159
157
  end
160
158
  end
161
159
 
162
160
  def symbolize_keys(hash)
163
- hash.keys.map { |k| [k.to_sym, hash[k]] }.to_h
161
+ hash.keys.to_h { |k| [k.to_sym, hash[k]] }
164
162
  end
165
163
  end
166
164
  end
@@ -124,8 +124,8 @@ module Dependabot
124
124
 
125
125
  def initialize(source)
126
126
  @source = sanitize_source(source)
127
- msg = "The following source could not be reached as it requires "\
128
- "authentication (and any provided details were invalid or lacked "\
127
+ msg = "The following source could not be reached as it requires " \
128
+ "authentication (and any provided details were invalid or lacked " \
129
129
  "the required permissions): #{@source}"
130
130
  super(msg)
131
131
  end
@@ -173,7 +173,7 @@ module Dependabot
173
173
  @dependency_urls =
174
174
  dependency_urls.flatten.map { |uri| filter_sensitive_data(uri) }
175
175
 
176
- msg = "The following git URLs could not be retrieved: "\
176
+ msg = "The following git URLs could not be retrieved: " \
177
177
  "#{@dependency_urls.join(', ')}"
178
178
  super(msg)
179
179
  end
@@ -185,7 +185,7 @@ module Dependabot
185
185
  def initialize(dependency)
186
186
  @dependency = dependency
187
187
 
188
- msg = "The branch or reference specified for #{@dependency} could not "\
188
+ msg = "The branch or reference specified for #{@dependency} could not " \
189
189
  "be retrieved"
190
190
  super(msg)
191
191
  end
@@ -196,7 +196,7 @@ module Dependabot
196
196
 
197
197
  def initialize(*dependencies)
198
198
  @dependencies = dependencies.flatten
199
- msg = "The following path based dependencies could not be retrieved: "\
199
+ msg = "The following path based dependencies could not be retrieved: " \
200
200
  "#{@dependencies.join(', ')}"
201
201
  super(msg)
202
202
  end
@@ -210,8 +210,8 @@ module Dependabot
210
210
  @declared_path = declared_path
211
211
  @discovered_path = discovered_path
212
212
 
213
- msg = "The module path '#{@declared_path}' found in #{@go_mod} doesn't "\
214
- "match the actual path '#{@discovered_path}' in the dependency's "\
213
+ msg = "The module path '#{@declared_path}' found in #{@go_mod} doesn't " \
214
+ "match the actual path '#{@discovered_path}' in the dependency's " \
215
215
  "go.mod"
216
216
  super(msg)
217
217
  end
@@ -141,7 +141,7 @@ module Dependabot
141
141
 
142
142
  path = Pathname.new(File.join(directory, filename)).cleanpath.to_path
143
143
  content = _fetch_file_content(path, fetch_submodules: fetch_submodules)
144
- type = @linked_paths.key?(path.gsub(%r{^/}, "")) ? "symlink" : type
144
+ type = "symlink" if @linked_paths.key?(path.gsub(%r{^/}, ""))
145
145
 
146
146
  DependencyFile.new(
147
147
  name: Pathname.new(filename).cleanpath.to_path,
@@ -233,8 +233,8 @@ module Dependabot
233
233
  repo_path = File.join(clone_repo_contents, relative_path)
234
234
  return [] unless Dir.exist?(repo_path)
235
235
 
236
- Dir.entries(repo_path).map do |name|
237
- next if [".", ".."].include?(name)
236
+ Dir.entries(repo_path).filter_map do |name|
237
+ next if name == "." || name == ".."
238
238
 
239
239
  absolute_path = File.join(repo_path, name)
240
240
  type = if File.symlink?(absolute_path)
@@ -251,7 +251,7 @@ module Dependabot
251
251
  type: type,
252
252
  size: 0 # NOTE: added for parity with github contents API
253
253
  )
254
- end.compact
254
+ end
255
255
  end
256
256
 
257
257
  def update_linked_paths(repo, path, commit, github_response)
@@ -10,7 +10,7 @@ module Dependabot
10
10
  class DependencySet
11
11
  def initialize(dependencies = [], case_sensitive: false)
12
12
  unless dependencies.is_a?(Array) &&
13
- dependencies.all? { |dep| dep.is_a?(Dependency) }
13
+ dependencies.all?(Dependency)
14
14
  raise ArgumentError, "must be an array of Dependency objects"
15
15
  end
16
16
 
@@ -18,7 +18,9 @@ module Dependabot
18
18
  return [] unless repo_contents_path && vendor_dir
19
19
 
20
20
  Dir.chdir(repo_contents_path) do
21
+ # rubocop:disable Performance/DeletePrefix
21
22
  relative_dir = Pathname.new(base_directory).sub(%r{\A/}, "").join(vendor_dir)
23
+ # rubocop:enable Performance/DeletePrefix
22
24
 
23
25
  status = SharedHelpers.run_shell_command(
24
26
  "git status --untracked-files all --porcelain v1 #{relative_dir}"
@@ -86,6 +86,10 @@ module Dependabot
86
86
  raise Dependabot::GitDependencyReferenceNotFound, dependency.name
87
87
  end
88
88
 
89
+ def head_commit_for_local_branch(name)
90
+ local_repo_git_metadata_fetcher.head_commit_for_ref(name)
91
+ end
92
+
89
93
  def local_tags_for_latest_version_commit_sha
90
94
  tags = allowed_version_tags
91
95
  max_tag = max_version_tag(tags)
@@ -274,8 +278,8 @@ module Dependabot
274
278
  end
275
279
 
276
280
  def bitbucket_commit_comparison_status(ref1, ref2)
277
- url = "https://api.bitbucket.org/2.0/repositories/"\
278
- "#{listing_source_repo}/commits/?"\
281
+ url = "https://api.bitbucket.org/2.0/repositories/" \
282
+ "#{listing_source_repo}/commits/?" \
279
283
  "include=#{ref2}&exclude=#{ref1}"
280
284
 
281
285
  client = Clients::BitbucketWithRetries.
@@ -88,7 +88,7 @@ module Dependabot
88
88
  service_pack_uri = uri
89
89
  service_pack_uri += ".git" unless service_pack_uri.end_with?(".git")
90
90
 
91
- env = { "PATH" => ENV["PATH"] }
91
+ env = { "PATH" => ENV.fetch("PATH", nil) }
92
92
  command = "git ls-remote #{service_pack_uri}"
93
93
  command = SharedHelpers.escape_command(command)
94
94
 
@@ -125,7 +125,7 @@ module Dependabot
125
125
  full_ref_name = line.split.last
126
126
  next unless full_ref_name.start_with?("refs/tags", "refs/heads")
127
127
 
128
- peeled_lines << line && next if line.strip.end_with?("^{}")
128
+ (peeled_lines << line) && next if line.strip.end_with?("^{}")
129
129
 
130
130
  ref_name = full_ref_name.sub(%r{^refs/(tags|heads)/}, "").strip
131
131
  sha = sha_for_update_pack_line(line)
@@ -239,7 +239,7 @@ module Dependabot
239
239
  files += github_client.contents(source.repo, opts)
240
240
 
241
241
  files.uniq.each do |f|
242
- next unless %w(doc docs).include?(f.name) && f.type == "dir"
242
+ next unless f.type == "dir" && f.name.match?(/docs?/o)
243
243
 
244
244
  opts = { path: f.path, ref: ref }.compact
245
245
  files += github_client.contents(source.repo, opts)
@@ -300,16 +300,16 @@ module Dependabot
300
300
  end
301
301
 
302
302
  def previous_ref
303
- previous_refs = dependency.previous_requirements.map do |r|
303
+ previous_refs = dependency.previous_requirements.filter_map do |r|
304
304
  r.dig(:source, "ref") || r.dig(:source, :ref)
305
- end.compact.uniq
305
+ end.uniq
306
306
  return previous_refs.first if previous_refs.count == 1
307
307
  end
308
308
 
309
309
  def new_ref
310
- new_refs = dependency.requirements.map do |r|
310
+ new_refs = dependency.requirements.filter_map do |r|
311
311
  r.dig(:source, "ref") || r.dig(:source, :ref)
312
- end.compact.uniq
312
+ end.uniq
313
313
  return new_refs.first if new_refs.count == 1
314
314
  end
315
315
 
@@ -137,16 +137,16 @@ module Dependabot
137
137
  end
138
138
 
139
139
  def previous_ref
140
- previous_refs = dependency.previous_requirements.map do |r|
140
+ previous_refs = dependency.previous_requirements.filter_map do |r|
141
141
  r.dig(:source, "ref") || r.dig(:source, :ref)
142
- end.compact.uniq
142
+ end.uniq
143
143
  return previous_refs.first if previous_refs.count == 1
144
144
  end
145
145
 
146
146
  def new_ref
147
- new_refs = dependency.requirements.map do |r|
147
+ new_refs = dependency.requirements.filter_map do |r|
148
148
  r.dig(:source, "ref") || r.dig(:source, :ref)
149
- end.compact.uniq
149
+ end.uniq
150
150
  return new_refs.first if new_refs.count == 1
151
151
  end
152
152
 
@@ -136,18 +136,18 @@ module Dependabot
136
136
  def previous_ref
137
137
  return unless git_source?(dependency.previous_requirements)
138
138
 
139
- previous_refs = dependency.previous_requirements.map do |r|
139
+ previous_refs = dependency.previous_requirements.filter_map do |r|
140
140
  r.dig(:source, "ref") || r.dig(:source, :ref)
141
- end.compact.uniq
141
+ end.uniq
142
142
  return previous_refs.first if previous_refs.count == 1
143
143
  end
144
144
 
145
145
  def new_ref
146
146
  return unless git_source?(dependency.previous_requirements)
147
147
 
148
- new_refs = dependency.requirements.map do |r|
148
+ new_refs = dependency.requirements.filter_map do |r|
149
149
  r.dig(:source, "ref") || r.dig(:source, :ref)
150
- end.compact.uniq
150
+ end.uniq
151
151
  return new_refs.first if new_refs.count == 1
152
152
  end
153
153
 
@@ -275,16 +275,16 @@ module Dependabot
275
275
  end
276
276
 
277
277
  def previous_ref
278
- previous_refs = dependency.previous_requirements.map do |r|
278
+ previous_refs = dependency.previous_requirements.filter_map do |r|
279
279
  r.dig(:source, "ref") || r.dig(:source, :ref)
280
- end.compact.uniq
280
+ end.uniq
281
281
  return previous_refs.first if previous_refs.count == 1
282
282
  end
283
283
 
284
284
  def new_ref
285
- new_refs = dependency.requirements.map do |r|
285
+ new_refs = dependency.requirements.filter_map do |r|
286
286
  r.dig(:source, "ref") || r.dig(:source, :ref)
287
- end.compact.uniq
287
+ end.uniq
288
288
  return new_refs.first if new_refs.count == 1
289
289
  end
290
290
 
@@ -90,7 +90,9 @@ module Dependabot
90
90
  def branch_version_suffix
91
91
  dep = dependencies.first
92
92
 
93
- if library? && ref_changed?(dep) && new_ref(dep)
93
+ if dep.removed?
94
+ "-removed"
95
+ elsif library? && ref_changed?(dep) && new_ref(dep)
94
96
  new_ref(dep)
95
97
  elsif library?
96
98
  sanitized_requirement(dep)
@@ -127,24 +129,24 @@ module Dependabot
127
129
  elsif dependency.version == dependency.previous_version &&
128
130
  package_manager == "docker"
129
131
  dependency.requirements.
130
- map { |r| r.dig(:source, "digest") || r.dig(:source, :digest) }.
131
- compact.first.split(":").last[0..6]
132
+ filter_map { |r| r.dig(:source, "digest") || r.dig(:source, :digest) }.
133
+ first.split(":").last[0..6]
132
134
  else
133
135
  dependency.version
134
136
  end
135
137
  end
136
138
 
137
139
  def previous_ref(dependency)
138
- previous_refs = dependency.previous_requirements.map do |r|
140
+ previous_refs = dependency.previous_requirements.filter_map do |r|
139
141
  r.dig(:source, "ref") || r.dig(:source, :ref)
140
- end.compact.uniq
142
+ end.uniq
141
143
  return previous_refs.first if previous_refs.count == 1
142
144
  end
143
145
 
144
146
  def new_ref(dependency)
145
- new_refs = dependency.requirements.map do |r|
147
+ new_refs = dependency.requirements.filter_map do |r|
146
148
  r.dig(:source, "ref") || r.dig(:source, :ref)
147
- end.compact.uniq
149
+ end.uniq
148
150
  return new_refs.first if new_refs.count == 1
149
151
  end
150
152
 
@@ -185,11 +187,7 @@ module Dependabot
185
187
  # Remove forbidden characters (those not already replaced elsewhere)
186
188
  gsub(%r{[^A-Za-z0-9/\-_.(){}]}, "").
187
189
  # Slashes can't be followed by periods
188
- gsub(%r{/\.}, "/dot-").
189
- # Two or more sequential periods are forbidden
190
- gsub(/\.+/, ".").
191
- # Two or more sequential slashes are forbidden
192
- gsub(%r{/+}, "/").
190
+ gsub(%r{/\.}, "/dot-").squeeze(".").squeeze("/").
193
191
  # Trailing periods are forbidden
194
192
  sub(/\.$/, "")
195
193
  end
@@ -219,7 +219,7 @@ module Dependabot
219
219
  retry_count ||= 0
220
220
  retry_count += 1
221
221
  if retry_count > 10
222
- raise "Repeatedly failed to create or update branch #{branch_name} "\
222
+ raise "Repeatedly failed to create or update branch #{branch_name} " \
223
223
  "with commit #{commit.sha}."
224
224
  end
225
225
 
@@ -269,7 +269,7 @@ module Dependabot
269
269
 
270
270
  def add_reviewers_to_pull_request(pull_request)
271
271
  reviewers_hash =
272
- reviewers.keys.map { |k| [k.to_sym, reviewers[k]] }.to_h
272
+ reviewers.keys.to_h { |k| [k.to_sym, reviewers[k]] }
273
273
 
274
274
  github_client_for_source.request_pull_request_review(
275
275
  source.repo,
@@ -299,7 +299,7 @@ module Dependabot
299
299
 
300
300
  def comment_with_invalid_reviewer(pull_request, message)
301
301
  reviewers_hash =
302
- reviewers.keys.map { |k| [k.to_sym, reviewers[k]] }.to_h
302
+ reviewers.keys.to_h { |k| [k.to_sym, reviewers[k]] }
303
303
  reviewers = []
304
304
  reviewers += reviewers_hash[:reviewers] || []
305
305
  reviewers += (reviewers_hash[:team_reviewers] || []).
@@ -315,9 +315,9 @@ module Dependabot
315
315
 
316
316
  msg = "Dependabot tried to add #{reviewers_string} as "
317
317
  msg += reviewers.count > 1 ? "reviewers" : "a reviewer"
318
- msg += " to this PR, but received the following error from GitHub:\n\n"\
318
+ msg += " to this PR, but received the following error from GitHub:\n\n" \
319
319
  "```\n" \
320
- "#{message}\n"\
320
+ "#{message}\n" \
321
321
  "```"
322
322
 
323
323
  github_client_for_source.add_comment(
@@ -105,7 +105,9 @@ module Dependabot
105
105
  new_version_parts = version(dep).split(/[.+]/)
106
106
  old_version_parts = previous_version(dep)&.split(/[.+]/) || []
107
107
  all_parts = new_version_parts.first(3) + old_version_parts.first(3)
108
+ # rubocop:disable Performance/RedundantEqualityComparisonBlock
108
109
  next 0 unless all_parts.all? { |part| part.to_i.to_s == part }
110
+ # rubocop:enable Performance/RedundantEqualityComparisonBlock
109
111
  next 1 if new_version_parts[0] != old_version_parts[0]
110
112
  next 2 if new_version_parts[1] != old_version_parts[1]
111
113
 
@@ -189,7 +189,7 @@ module Dependabot
189
189
  end
190
190
 
191
191
  def parent_node_link?(node)
192
- node.type == :link || node.parent && parent_node_link?(node.parent)
192
+ node.type == :link || (node.parent && parent_node_link?(node.parent))
193
193
  end
194
194
  end
195
195
  end
@@ -63,7 +63,7 @@ module Dependabot
63
63
  def release_cascade
64
64
  return "" unless releases_text && releases_url
65
65
 
66
- msg = "*Sourced from [#{dependency.display_name}'s releases]"\
66
+ msg = "*Sourced from [#{dependency.display_name}'s releases]" \
67
67
  "(#{releases_url}).*\n\n"
68
68
  msg += quote_and_truncate(releases_text)
69
69
  msg = link_issues(text: msg)
@@ -80,8 +80,8 @@ module Dependabot
80
80
  def changelog_cascade
81
81
  return "" unless changelog_url && changelog_text
82
82
 
83
- msg = "*Sourced from "\
84
- "[#{dependency.display_name}'s changelog]"\
83
+ msg = "*Sourced from " \
84
+ "[#{dependency.display_name}'s changelog]" \
85
85
  "(#{changelog_url}).*\n\n"
86
86
  msg += quote_and_truncate(changelog_text)
87
87
  msg = link_issues(text: msg)
@@ -95,8 +95,8 @@ module Dependabot
95
95
  def upgrade_guide_cascade
96
96
  return "" unless upgrade_guide_url && upgrade_guide_text
97
97
 
98
- msg = "*Sourced from "\
99
- "[#{dependency.display_name}'s upgrade guide]"\
98
+ msg = "*Sourced from " \
99
+ "[#{dependency.display_name}'s upgrade guide]" \
100
100
  "(#{upgrade_guide_url}).*\n\n"
101
101
  msg += quote_and_truncate(upgrade_guide_text)
102
102
  msg = link_issues(text: msg)
@@ -112,7 +112,7 @@ module Dependabot
112
112
 
113
113
  msg = ""
114
114
 
115
- commits.reverse.first(10).each do |commit|
115
+ commits.last(10).reverse_each do |commit|
116
116
  title = commit[:message].strip.split("\n").first
117
117
  title = title.slice(0..76) + "..." if title && title.length > 80
118
118
  title = title&.gsub(/(?<=[^\w.-])([_*`~])/, '\\1')
@@ -124,8 +124,8 @@ module Dependabot
124
124
 
125
125
  msg +=
126
126
  if commits.count > 10
127
- "- Additional commits viewable in "\
128
- "[compare view](#{commits_url})\n"
127
+ "- Additional commits viewable in " \
128
+ "[compare view](#{commits_url})\n"
129
129
  else
130
130
  "- See full diff in [compare view](#{commits_url})\n"
131
131
  end
@@ -175,8 +175,8 @@ module Dependabot
175
175
 
176
176
  def vulnerability_source_line(details)
177
177
  if details["source_url"] && details["source_name"]
178
- "*Sourced from [#{details['source_name']}]"\
179
- "(#{details['source_url']}).*\n\n"
178
+ "*Sourced from [#{details['source_name']}]" \
179
+ "(#{details['source_url']}).*\n\n"
180
180
  elsif details["source_name"]
181
181
  "*Sourced from #{details['source_name']}.*\n\n"
182
182
  else
@@ -74,9 +74,9 @@ module Dependabot
74
74
 
75
75
  pr_name +
76
76
  if dependencies.count == 1
77
- "#{dependencies.first.display_name} requirement "\
78
- "#{from_version_msg(old_library_requirement(dependencies.first))}"\
79
- "to #{new_library_requirement(dependencies.first)}"
77
+ "#{dependencies.first.display_name} requirement " \
78
+ "#{from_version_msg(old_library_requirement(dependencies.first))}" \
79
+ "to #{new_library_requirement(dependencies.first)}"
80
80
  else
81
81
  names = dependencies.map(&:name)
82
82
  "requirements for #{names[0..-2].join(', ')} and #{names[-1]}"
@@ -90,19 +90,19 @@ module Dependabot
90
90
  pr_name +
91
91
  if dependencies.count == 1
92
92
  dependency = dependencies.first
93
- "#{dependency.display_name} "\
94
- "#{from_version_msg(previous_version(dependency))}"\
95
- "to #{new_version(dependency)}"
93
+ "#{dependency.display_name} " \
94
+ "#{from_version_msg(previous_version(dependency))}" \
95
+ "to #{new_version(dependency)}"
96
96
  elsif updating_a_property?
97
97
  dependency = dependencies.first
98
- "#{property_name} "\
99
- "#{from_version_msg(previous_version(dependency))}"\
100
- "to #{new_version(dependency)}"
98
+ "#{property_name} " \
99
+ "#{from_version_msg(previous_version(dependency))}" \
100
+ "to #{new_version(dependency)}"
101
101
  elsif updating_a_dependency_set?
102
102
  dependency = dependencies.first
103
- "#{dependency_set.fetch(:group)} dependency set "\
104
- "#{from_version_msg(previous_version(dependency))}"\
105
- "to #{new_version(dependency)}"
103
+ "#{dependency_set.fetch(:group)} dependency set " \
104
+ "#{from_version_msg(previous_version(dependency))}" \
105
+ "to #{new_version(dependency)}"
106
106
  else
107
107
  names = dependencies.map(&:name)
108
108
  "#{names[0..-2].join(', ')} and #{names[-1]}"
@@ -174,8 +174,8 @@ module Dependabot
174
174
  return unless signoff_details.is_a?(Hash)
175
175
  return unless signoff_details[:org_name] && signoff_details[:org_email]
176
176
 
177
- "On-behalf-of: @#{signoff_details[:org_name]} "\
178
- "<#{signoff_details[:org_email]}>"
177
+ "On-behalf-of: @#{signoff_details[:org_name]} " \
178
+ "<#{signoff_details[:org_email]}>"
179
179
  end
180
180
 
181
181
  def requirement_commit_message_intro
@@ -200,8 +200,8 @@ module Dependabot
200
200
  return multidependency_intro if dependencies.count > 1
201
201
 
202
202
  dependency = dependencies.first
203
- msg = "Bumps #{dependency_links.first} "\
204
- "#{from_version_msg(previous_version(dependency))}"\
203
+ msg = "Bumps #{dependency_links.first} " \
204
+ "#{from_version_msg(previous_version(dependency))}" \
205
205
  "to #{new_version(dependency)}."
206
206
 
207
207
  msg += " This release includes the previously tagged commit." if switching_from_ref_to_release?(dependency)
@@ -220,23 +220,23 @@ module Dependabot
220
220
  def multidependency_property_intro
221
221
  dependency = dependencies.first
222
222
 
223
- "Bumps `#{property_name}` "\
224
- "#{from_version_msg(previous_version(dependency))}"\
225
- "to #{new_version(dependency)}."
223
+ "Bumps `#{property_name}` " \
224
+ "#{from_version_msg(previous_version(dependency))}" \
225
+ "to #{new_version(dependency)}."
226
226
  end
227
227
 
228
228
  def dependency_set_intro
229
229
  dependency = dependencies.first
230
230
 
231
- "Bumps `#{dependency_set.fetch(:group)}` "\
232
- "dependency set #{from_version_msg(previous_version(dependency))}"\
233
- "to #{new_version(dependency)}."
231
+ "Bumps `#{dependency_set.fetch(:group)}` " \
232
+ "dependency set #{from_version_msg(previous_version(dependency))}" \
233
+ "to #{new_version(dependency)}."
234
234
  end
235
235
 
236
236
  def multidependency_intro
237
- "Bumps #{dependency_links[0..-2].join(', ')} "\
238
- "and #{dependency_links[-1]}. These "\
239
- "dependencies needed to be updated together."
237
+ "Bumps #{dependency_links[0..-2].join(', ')} " \
238
+ "and #{dependency_links[-1]}. These " \
239
+ "dependencies needed to be updated together."
240
240
  end
241
241
 
242
242
  def from_version_msg(previous_version)
@@ -296,10 +296,10 @@ module Dependabot
296
296
  if dep.removed?
297
297
  "\n\nRemoves `#{dep.display_name}`"
298
298
  else
299
- "\n\nUpdates `#{dep.display_name}` "\
300
- "#{from_version_msg(previous_version(dep))}to "\
301
- "#{new_version(dep)}"\
302
- "#{metadata_links_for_dep(dep)}"
299
+ "\n\nUpdates `#{dep.display_name}` " \
300
+ "#{from_version_msg(previous_version(dep))}to " \
301
+ "#{new_version(dep)}" \
302
+ "#{metadata_links_for_dep(dep)}"
303
303
  end
304
304
  end.join
305
305
  end
@@ -320,9 +320,9 @@ module Dependabot
320
320
  msg = if dep.removed?
321
321
  "\nRemoves `#{dep.display_name}`"
322
322
  else
323
- "\nUpdates `#{dep.display_name}` "\
324
- "#{from_version_msg(previous_version(dep))}"\
325
- "to #{new_version(dep)}"
323
+ "\nUpdates `#{dep.display_name}` " \
324
+ "#{from_version_msg(previous_version(dep))}" \
325
+ "to #{new_version(dep)}"
326
326
  end
327
327
 
328
328
  if vulnerabilities_fixed[dep.name]&.one?
@@ -427,21 +427,21 @@ module Dependabot
427
427
 
428
428
  def docker_digest_from_reqs(requirements)
429
429
  requirements.
430
- map { |r| r.dig(:source, "digest") || r.dig(:source, :digest) }.
431
- compact.first
430
+ filter_map { |r| r.dig(:source, "digest") || r.dig(:source, :digest) }.
431
+ first
432
432
  end
433
433
 
434
434
  def previous_ref(dependency)
435
- previous_refs = dependency.previous_requirements.map do |r|
435
+ previous_refs = dependency.previous_requirements.filter_map do |r|
436
436
  r.dig(:source, "ref") || r.dig(:source, :ref)
437
- end.compact.uniq
437
+ end.uniq
438
438
  return previous_refs.first if previous_refs.count == 1
439
439
  end
440
440
 
441
441
  def new_ref(dependency)
442
- new_refs = dependency.requirements.map do |r|
442
+ new_refs = dependency.requirements.filter_map do |r|
443
443
  r.dig(:source, "ref") || r.dig(:source, :ref)
444
- end.compact.uniq
444
+ end.uniq
445
445
  return new_refs.first if new_refs.count == 1
446
446
  end
447
447
 
@@ -493,7 +493,7 @@ module Dependabot
493
493
 
494
494
  def switching_from_ref_to_release?(dependency)
495
495
  unless dependency.previous_version&.match?(/^[0-9a-f]{40}$/) ||
496
- dependency.previous_version.nil? && previous_ref(dependency)
496
+ (dependency.previous_version.nil? && previous_ref(dependency))
497
497
  return false
498
498
  end
499
499
 
@@ -280,8 +280,7 @@ module Dependabot
280
280
  reject { |c| c.author&.type == "Bot" }.
281
281
  reject { |c| c.commit&.message&.start_with?("Merge") }.
282
282
  map(&:commit).
283
- map(&:message).
284
- compact.
283
+ filter_map(&:message).
285
284
  map(&:strip)
286
285
  end
287
286
 
@@ -292,8 +291,7 @@ module Dependabot
292
291
  @recent_gitlab_commit_messages.
293
292
  reject { |c| c.author_email == dependabot_email }.
294
293
  reject { |c| c.message&.start_with?("merge !") }.
295
- map(&:message).
296
- compact.
294
+ filter_map(&:message).
297
295
  map(&:strip)
298
296
  end
299
297
 
@@ -304,8 +302,7 @@ module Dependabot
304
302
  @recent_azure_commit_messages.
305
303
  reject { |c| azure_commit_author_email(c) == dependabot_email }.
306
304
  reject { |c| c.fetch("comment")&.start_with?("Merge") }.
307
- map { |c| c.fetch("comment") }.
308
- compact.
305
+ filter_map { |c| c.fetch("comment") }.
309
306
  map(&:strip)
310
307
  end
311
308
 
@@ -315,8 +312,7 @@ module Dependabot
315
312
 
316
313
  @recent_bitbucket_commit_messages.
317
314
  reject { |c| bitbucket_commit_author_email(c) == dependabot_email }.
318
- map { |c| c.fetch("message", nil) }.
319
- compact.
315
+ filter_map { |c| c.fetch("message", nil) }.
320
316
  reject { |m| m.start_with?("Merge") }.
321
317
  map(&:strip)
322
318
  end
@@ -327,8 +323,7 @@ module Dependabot
327
323
  @recent_codecommit_commit_messages.commits.
328
324
  reject { |c| c.author.email == dependabot_email }.
329
325
  reject { |c| c.message&.start_with?("Merge") }.
330
- map(&:message).
331
- compact.
326
+ filter_map(&:message).
332
327
  map(&:strip)
333
328
  end
334
329
 
@@ -173,7 +173,7 @@ module Dependabot
173
173
 
174
174
  if e.message.match?(/protected branch/i) ||
175
175
  e.message.match?(/not authorized to push/i) ||
176
- e.message.match?(/must not contain merge commits/) ||
176
+ e.message.include?("must not contain merge commits") ||
177
177
  e.message.match?(/required status check/i)
178
178
  raise BranchProtected
179
179
  end
@@ -51,7 +51,7 @@ module Dependabot
51
51
  # @return [Boolean]
52
52
  def fixed_by?(dependency)
53
53
  # Handle case mismatch between the security advisory and parsed name
54
- return false unless dependency_name.downcase == dependency.name.downcase
54
+ return false unless dependency_name.casecmp(dependency.name).zero?
55
55
  return false unless package_manager == dependency.package_manager
56
56
  # TODO: Support no previous version to the same level as dependency graph
57
57
  # and security alerts. We currently ignore dependency updates without a
@@ -112,13 +112,13 @@ module Dependabot
112
112
  def check_version_requirements
113
113
  unless vulnerable_versions.is_a?(Array) &&
114
114
  vulnerable_versions.all? { |i| requirement_class <= i.class }
115
- raise ArgumentError, "vulnerable_versions must be an array "\
115
+ raise ArgumentError, "vulnerable_versions must be an array " \
116
116
  "of #{requirement_class} instances"
117
117
  end
118
118
 
119
119
  unless safe_versions.is_a?(Array) &&
120
120
  safe_versions.all? { |i| requirement_class <= i.class }
121
- raise ArgumentError, "safe_versions must be an array "\
121
+ raise ArgumentError, "safe_versions must be an array " \
122
122
  "of #{requirement_class} instances"
123
123
  end
124
124
  end
@@ -17,9 +17,9 @@ require "dependabot/version"
17
17
  module Dependabot
18
18
  module SharedHelpers
19
19
  GIT_CONFIG_GLOBAL_PATH = File.expand_path("~/.gitconfig")
20
- USER_AGENT = "dependabot-core/#{Dependabot::VERSION} "\
21
- "#{Excon::USER_AGENT} ruby/#{RUBY_VERSION} "\
22
- "(#{RUBY_PLATFORM}) "\
20
+ USER_AGENT = "dependabot-core/#{Dependabot::VERSION} " \
21
+ "#{Excon::USER_AGENT} ruby/#{RUBY_VERSION} " \
22
+ "(#{RUBY_PLATFORM}) " \
23
23
  "(+https://github.com/dependabot/dependabot-core)"
24
24
  SIGKILL = 9
25
25
 
@@ -32,7 +32,7 @@ module Dependabot
32
32
  reset_git_repo(repo_contents_path)
33
33
  # Handle missing directories by creating an empty one and relying on the
34
34
  # file fetcher to raise a DependencyFileNotFound error
35
- FileUtils.mkdir_p(path) unless Dir.exist?(path)
35
+ FileUtils.mkdir_p(path)
36
36
  Dir.chdir(path) { yield(path) }
37
37
  else
38
38
  in_a_temporary_directory(directory, &block)
@@ -40,7 +40,7 @@ module Dependabot
40
40
  end
41
41
 
42
42
  def self.in_a_temporary_directory(directory = "/")
43
- Dir.mkdir(Utils::BUMP_TMP_DIR_PATH) unless Dir.exist?(Utils::BUMP_TMP_DIR_PATH)
43
+ FileUtils.mkdir_p(Utils::BUMP_TMP_DIR_PATH)
44
44
  tmp_dir = Dir.mktmpdir(Utils::BUMP_TMP_FILE_PREFIX, Utils::BUMP_TMP_DIR_PATH)
45
45
 
46
46
  begin
@@ -188,7 +188,7 @@ module Dependabot
188
188
  # a wrapper binary that only allows non-mutating commands. Without this,
189
189
  # whenever the credentials are deemed to be invalid, they're erased.
190
190
  run_shell_command(
191
- "git config --global credential.helper "\
191
+ "git config --global credential.helper " \
192
192
  "'!#{credential_helper_path} --file #{Dir.pwd}/git.store'",
193
193
  allow_unsafe_shell_command: true
194
194
  )
@@ -224,7 +224,7 @@ module Dependabot
224
224
  next unless cred["username"] && cred["password"]
225
225
 
226
226
  authenticated_url =
227
- "https://#{cred.fetch('username')}:#{cred.fetch('password')}"\
227
+ "https://#{cred.fetch('username')}:#{cred.fetch('password')}" \
228
228
  "@#{cred.fetch('host')}"
229
229
 
230
230
  git_store_content += authenticated_url + "\n"
@@ -241,23 +241,23 @@ module Dependabot
241
241
  # NOTE: we use --global here (rather than --system) so that Dependabot
242
242
  # can be run without privileged access
243
243
  run_shell_command(
244
- "git config --global --replace-all url.https://#{host}/."\
244
+ "git config --global --replace-all url.https://#{host}/." \
245
245
  "insteadOf ssh://git@#{host}/"
246
246
  )
247
247
  run_shell_command(
248
- "git config --global --add url.https://#{host}/."\
248
+ "git config --global --add url.https://#{host}/." \
249
249
  "insteadOf ssh://git@#{host}:"
250
250
  )
251
251
  run_shell_command(
252
- "git config --global --add url.https://#{host}/."\
252
+ "git config --global --add url.https://#{host}/." \
253
253
  "insteadOf git@#{host}:"
254
254
  )
255
255
  run_shell_command(
256
- "git config --global --add url.https://#{host}/."\
256
+ "git config --global --add url.https://#{host}/." \
257
257
  "insteadOf git@#{host}/"
258
258
  )
259
259
  run_shell_command(
260
- "git config --global --add url.https://#{host}/."\
260
+ "git config --global --add url.https://#{host}/." \
261
261
  "insteadOf git://#{host}/"
262
262
  )
263
263
  end
@@ -109,8 +109,8 @@ module Dependabot
109
109
  def initialize(provider:, repo:, directory: nil, branch: nil, commit: nil,
110
110
  hostname: nil, api_endpoint: nil)
111
111
  if (hostname.nil? ^ api_endpoint.nil?) && (provider != "codecommit")
112
- msg = "Both hostname and api_endpoint must be specified if either "\
113
- "are. Alternatively, both may be left blank to use the "\
112
+ msg = "Both hostname and api_endpoint must be specified if either " \
113
+ "are. Alternatively, both may be left blank to use the " \
114
114
  "provider's defaults."
115
115
  raise msg
116
116
  end
@@ -287,7 +287,7 @@ module Dependabot
287
287
 
288
288
  def version_from_requirements
289
289
  @version_from_requirements ||=
290
- dependency.requirements.map { |r| r.fetch(:requirement) }.compact.
290
+ dependency.requirements.filter_map { |r| r.fetch(:requirement) }.
291
291
  flat_map { |req_str| requirement_class.requirements_array(req_str) }.
292
292
  flat_map(&:requirements).
293
293
  reject { |req_array| req_array.first.start_with?("<") }.
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dependabot
4
- VERSION = "0.211.0"
4
+ VERSION = "0.212.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.211.0
4
+ version: 0.212.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-23 00:00:00.000000000 Z
11
+ date: 2022-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -132,14 +132,14 @@ dependencies:
132
132
  requirements:
133
133
  - - '='
134
134
  - !ruby/object:Gem::Version
135
- version: 2.3.0
135
+ version: 2.5.2
136
136
  type: :runtime
137
137
  prerelease: false
138
138
  version_requirements: !ruby/object:Gem::Requirement
139
139
  requirements:
140
140
  - - '='
141
141
  - !ruby/object:Gem::Version
142
- version: 2.3.0
142
+ version: 2.5.2
143
143
  - !ruby/object:Gem::Dependency
144
144
  name: gitlab
145
145
  requirement: !ruby/object:Gem::Requirement
@@ -290,14 +290,14 @@ dependencies:
290
290
  requirements:
291
291
  - - "~>"
292
292
  - !ruby/object:Gem::Version
293
- version: 3.11.1
293
+ version: 3.12.0
294
294
  type: :development
295
295
  prerelease: false
296
296
  version_requirements: !ruby/object:Gem::Requirement
297
297
  requirements:
298
298
  - - "~>"
299
299
  - !ruby/object:Gem::Version
300
- version: 3.11.1
300
+ version: 3.12.0
301
301
  - !ruby/object:Gem::Dependency
302
302
  name: rake
303
303
  requirement: !ruby/object:Gem::Requirement
@@ -346,14 +346,28 @@ dependencies:
346
346
  requirements:
347
347
  - - "~>"
348
348
  - !ruby/object:Gem::Version
349
- version: 1.35.1
349
+ version: 1.36.0
350
350
  type: :development
351
351
  prerelease: false
352
352
  version_requirements: !ruby/object:Gem::Requirement
353
353
  requirements:
354
354
  - - "~>"
355
355
  - !ruby/object:Gem::Version
356
- version: 1.35.1
356
+ version: 1.36.0
357
+ - !ruby/object:Gem::Dependency
358
+ name: rubocop-performance
359
+ requirement: !ruby/object:Gem::Requirement
360
+ requirements:
361
+ - - "~>"
362
+ - !ruby/object:Gem::Version
363
+ version: 1.14.2
364
+ type: :development
365
+ prerelease: false
366
+ version_requirements: !ruby/object:Gem::Requirement
367
+ requirements:
368
+ - - "~>"
369
+ - !ruby/object:Gem::Version
370
+ version: 1.14.2
357
371
  - !ruby/object:Gem::Dependency
358
372
  name: ruby-debug-ide
359
373
  requirement: !ruby/object:Gem::Requirement