dependabot-common 0.227.0 → 0.228.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e7821b483eacc96c321f9dba2b95892317ba3c73f530820c5490677488c3399
4
- data.tar.gz: bc801665fabf999aac3d5065b1e2689fc98df6b98baa082e64da043fc1ef7995
3
+ metadata.gz: 70404b8169c3449d3f94e10dff1619ea5fc634e5e395bb4a5548e354f7bdccc4
4
+ data.tar.gz: e8d018a0410888b3ec3c2de47dd950e7327a66d86bdff74f42a4d154ed82fe51
5
5
  SHA512:
6
- metadata.gz: 2e1fb470523d4ea14fbe43f15155f089489fec19354aeb391d5bfa860944ea3286ed40db48630b7861dbcf6cdb2534a637d8f76e3ce322b14a9d0a8365c885a9
7
- data.tar.gz: f486b2b36383f38064575b3022929ce110cab12ef863762dbae31a8d36691e0a8af59e2252a31b960a3b53d31f1ab8758f10411a8a53a3e12a50ff007a96f410
6
+ metadata.gz: a78e38bc65d7f81ec5adcd9554a51e620d83ab5c60c1861e45e60e6e8f8d62088f641e9d5b6eb8883aba1cfa618b0f0c3e125f8b5f52a0e20d32dc88dc7d4fdd
7
+ data.tar.gz: 2915d63900f5dabd640d05ad36ca5e8dcc57348b941bc9c1547f245ce31f22f3bf5ee4951fbb4883f773dc57ad351932196a8c01451541172c603541d924735b
@@ -373,7 +373,7 @@ module Dependabot
373
373
  end
374
374
 
375
375
  def tags_creation_forbidden?(response)
376
- return if response.body.empty?
376
+ return false if response.body.empty?
377
377
 
378
378
  message = JSON.parse(response.body).fetch("message", nil)
379
379
  message&.include?("TF401289")
@@ -7,6 +7,11 @@ module Dependabot
7
7
  class GitlabWithRetries
8
8
  RETRYABLE_ERRORS = [Gitlab::Error::BadGateway].freeze
9
9
 
10
+ class ContentEncoding
11
+ BASE64 = "base64"
12
+ TEXT = "text"
13
+ end
14
+
10
15
  #######################
11
16
  # Constructor methods #
12
17
  #######################
@@ -60,6 +65,24 @@ module Dependabot
60
65
  @client = ::Gitlab::Client.new(args)
61
66
  end
62
67
 
68
+ # Create commit in gitlab repo with correctly mapped file actions
69
+ #
70
+ # @param [String] repo
71
+ # @param [String] branch_name
72
+ # @param [String] commit_message
73
+ # @param [Array<Dependabot::DependencyFile>] files
74
+ # @param [Hash] options
75
+ # @return [Gitlab::ObjectifiedHash]
76
+ def create_commit(repo, branch_name, commit_message, files, **options)
77
+ @client.create_commit(
78
+ repo,
79
+ branch_name,
80
+ commit_message,
81
+ file_actions(files),
82
+ **options
83
+ )
84
+ end
85
+
63
86
  def method_missing(method_name, *args, &block)
64
87
  retry_connection_failures do
65
88
  if @client.respond_to?(method_name)
@@ -85,6 +108,47 @@ module Dependabot
85
108
  retry_attempt <= @max_retries ? retry : raise
86
109
  end
87
110
  end
111
+
112
+ private
113
+
114
+ # Array of file actions for a commit
115
+ #
116
+ # @param [Array<Dependabot::DependencyFile>] files
117
+ # @return [Array<Hash>]
118
+ def file_actions(files)
119
+ files.map do |file|
120
+ {
121
+ action: file_action(file),
122
+ encoding: file_encoding(file),
123
+ file_path: file.type == "symlink" ? file.symlink_target : file.path,
124
+ content: file.content
125
+ }
126
+ end
127
+ end
128
+
129
+ # Single file action
130
+ #
131
+ # @param [Dependabot::DependencyFile] file
132
+ # @return [String]
133
+ def file_action(file)
134
+ if file.operation == Dependabot::DependencyFile::Operation::DELETE
135
+ "delete"
136
+ elsif file.operation == Dependabot::DependencyFile::Operation::CREATE
137
+ "create"
138
+ else
139
+ "update"
140
+ end
141
+ end
142
+
143
+ # Encoding option for gitlab commit operation
144
+ #
145
+ # @param [Dependabot::DependencyFile] file
146
+ # @return [String]
147
+ def file_encoding(file)
148
+ return ContentEncoding::BASE64 if file.content_encoding == Dependabot::DependencyFile::ContentEncoding::BASE64
149
+
150
+ ContentEncoding::TEXT
151
+ end
88
152
  end
89
153
  end
90
154
  end
@@ -157,14 +157,14 @@ module Dependabot
157
157
  previous_refs = previous_requirements.filter_map do |r|
158
158
  r.dig(:source, "ref") || r.dig(:source, :ref)
159
159
  end.uniq
160
- return previous_refs.first if previous_refs.count == 1
160
+ previous_refs.first if previous_refs.count == 1
161
161
  end
162
162
 
163
163
  def new_ref
164
164
  new_refs = requirements.filter_map do |r|
165
165
  r.dig(:source, "ref") || r.dig(:source, :ref)
166
166
  end.uniq
167
- return new_refs.first if new_refs.count == 1
167
+ new_refs.first if new_refs.count == 1
168
168
  end
169
169
 
170
170
  def ref_changed?
@@ -9,12 +9,21 @@ require "yaml"
9
9
 
10
10
  module Dependabot
11
11
  class DependencyGroup
12
- attr_reader :name, :rules, :dependencies
12
+ attr_reader :name, :rules, :dependencies, :handled_dependencies
13
13
 
14
14
  def initialize(name:, rules:)
15
15
  @name = name
16
16
  @rules = rules
17
17
  @dependencies = []
18
+ @handled_dependencies = Set.new
19
+ end
20
+
21
+ def add_to_handled(*dependencies)
22
+ @handled_dependencies += dependencies.map(&:name)
23
+ end
24
+
25
+ def add_all_to_handled
26
+ @handled_dependencies += dependencies.map(&:name)
18
27
  end
19
28
 
20
29
  def contains?(dependency)
@@ -333,14 +333,14 @@ module Dependabot
333
333
  previous_refs = dependency.previous_requirements.filter_map do |r|
334
334
  r.dig(:source, "ref") || r.dig(:source, :ref)
335
335
  end.uniq
336
- return previous_refs.first if previous_refs.count == 1
336
+ previous_refs.first if previous_refs.count == 1
337
337
  end
338
338
 
339
339
  def new_ref
340
340
  new_refs = dependency.requirements.filter_map do |r|
341
341
  r.dig(:source, "ref") || r.dig(:source, :ref)
342
342
  end.uniq
343
- return new_refs.first if new_refs.count == 1
343
+ new_refs.first if new_refs.count == 1
344
344
  end
345
345
 
346
346
  def ref_changed?
@@ -140,14 +140,14 @@ module Dependabot
140
140
  previous_refs = dependency.previous_requirements.filter_map do |r|
141
141
  r.dig(:source, "ref") || r.dig(:source, :ref)
142
142
  end.uniq
143
- return previous_refs.first if previous_refs.count == 1
143
+ previous_refs.first if previous_refs.count == 1
144
144
  end
145
145
 
146
146
  def new_ref
147
147
  new_refs = dependency.requirements.filter_map do |r|
148
148
  r.dig(:source, "ref") || r.dig(:source, :ref)
149
149
  end.uniq
150
- return new_refs.first if new_refs.count == 1
150
+ new_refs.first if new_refs.count == 1
151
151
  end
152
152
 
153
153
  # TODO: Refactor me so that Composer doesn't need to be special cased
@@ -139,7 +139,7 @@ module Dependabot
139
139
  previous_refs = dependency.previous_requirements.filter_map do |r|
140
140
  r.dig(:source, "ref") || r.dig(:source, :ref)
141
141
  end.uniq
142
- return previous_refs.first if previous_refs.count == 1
142
+ previous_refs.first if previous_refs.count == 1
143
143
  end
144
144
 
145
145
  def new_ref
@@ -148,7 +148,7 @@ module Dependabot
148
148
  new_refs = dependency.requirements.filter_map do |r|
149
149
  r.dig(:source, "ref") || r.dig(:source, :ref)
150
150
  end.uniq
151
- return new_refs.first if new_refs.count == 1
151
+ new_refs.first if new_refs.count == 1
152
152
  end
153
153
 
154
154
  def tag_matches_version?(tag, version)
@@ -189,7 +189,7 @@ module Dependabot
189
189
  end
190
190
 
191
191
  def version_regex(version)
192
- /(?:[^0-9\.]|\A)#{Regexp.escape(version || "unknown")}\z/
192
+ /(?:[^0-9\.]|\A)#{Regexp.escape(version || 'unknown')}\z/
193
193
  end
194
194
 
195
195
  def version_class
@@ -285,14 +285,14 @@ module Dependabot
285
285
  previous_refs = dependency.previous_requirements.filter_map do |r|
286
286
  r.dig(:source, "ref") || r.dig(:source, :ref)
287
287
  end.uniq
288
- return previous_refs.first if previous_refs.count == 1
288
+ previous_refs.first if previous_refs.count == 1
289
289
  end
290
290
 
291
291
  def new_ref
292
292
  new_refs = dependency.requirements.filter_map do |r|
293
293
  r.dig(:source, "ref") || r.dig(:source, :ref)
294
294
  end.uniq
295
- return new_refs.first if new_refs.count == 1
295
+ new_refs.first if new_refs.count == 1
296
296
  end
297
297
 
298
298
  def ref_changed?
@@ -131,14 +131,14 @@ module Dependabot
131
131
  previous_refs = dependency.previous_requirements.filter_map do |r|
132
132
  r.dig(:source, "ref") || r.dig(:source, :ref)
133
133
  end.uniq
134
- return previous_refs.first if previous_refs.count == 1
134
+ previous_refs.first if previous_refs.count == 1
135
135
  end
136
136
 
137
137
  def new_ref(dependency)
138
138
  new_refs = dependency.requirements.filter_map do |r|
139
139
  r.dig(:source, "ref") || r.dig(:source, :ref)
140
140
  end.uniq
141
- return new_refs.first if new_refs.count == 1
141
+ new_refs.first if new_refs.count == 1
142
142
  end
143
143
 
144
144
  def ref_changed?(dependency)
@@ -99,32 +99,10 @@ module Dependabot
99
99
  source.repo,
100
100
  branch_name,
101
101
  commit_message,
102
- file_actions
102
+ files
103
103
  )
104
104
  end
105
105
 
106
- def file_actions
107
- files.map do |file|
108
- {
109
- action: file_action(file),
110
- file_path: file.type == "symlink" ? file.symlink_target : file.path,
111
- content: file.content,
112
- encoding: file.content_encoding
113
- }
114
- end
115
- end
116
-
117
- # @param [DependencyFile] file
118
- def file_action(file)
119
- if file.operation == Dependabot::DependencyFile::Operation::DELETE
120
- "delete"
121
- elsif file.operation == Dependabot::DependencyFile::Operation::CREATE
122
- "create"
123
- else
124
- "update"
125
- end
126
- end
127
-
128
106
  def create_submodule_update_commit
129
107
  file = files.first
130
108
 
@@ -622,7 +622,8 @@ module Dependabot
622
622
 
623
623
  req = old_reqs.first.fetch(:requirement)
624
624
  return req if req
625
- return dependency.previous_ref if dependency.ref_changed?
625
+
626
+ dependency.previous_ref if dependency.ref_changed?
626
627
  end
627
628
 
628
629
  def new_library_requirement(dependency)
@@ -649,7 +650,7 @@ module Dependabot
649
650
  # Reject any nested child gemspecs/vendored git dependencies
650
651
  root_files = files.map(&:name).
651
652
  select { |p| Pathname.new(p).dirname.to_s == "." }
652
- return true if root_files.select { |nm| nm.end_with?(".gemspec") }.any?
653
+ return true if root_files.any? { |nm| nm.end_with?(".gemspec") }
653
654
 
654
655
  dependencies.any? { |d| d.humanized_previous_version.nil? }
655
656
  end
@@ -68,33 +68,11 @@ module Dependabot
68
68
  source.repo,
69
69
  merge_request.source_branch,
70
70
  commit_being_updated.title,
71
- file_actions,
71
+ files,
72
72
  force: true,
73
73
  start_branch: merge_request.target_branch
74
74
  )
75
75
  end
76
-
77
- def file_actions
78
- files.map do |file|
79
- {
80
- action: file_action(file),
81
- file_path: file.type == "symlink" ? file.symlink_target : file.path,
82
- content: file.content,
83
- encoding: file.content_encoding
84
- }
85
- end
86
- end
87
-
88
- # @param [DependencyFile] file
89
- def file_action(file)
90
- if file.operation == Dependabot::DependencyFile::Operation::DELETE
91
- "delete"
92
- elsif file.operation == Dependabot::DependencyFile::Operation::CREATE
93
- "create"
94
- else
95
- "update"
96
- end
97
- end
98
76
  end
99
77
  end
100
78
  end
@@ -17,7 +17,7 @@ require "dependabot"
17
17
 
18
18
  module Dependabot
19
19
  module SharedHelpers
20
- GIT_CONFIG_GLOBAL_PATH = File.expand_path("~/.gitconfig")
20
+ GIT_CONFIG_GLOBAL_PATH = File.expand_path(".gitconfig", Utils::BUMP_TMP_DIR_PATH)
21
21
  USER_AGENT = "dependabot-core/#{Dependabot::VERSION} " \
22
22
  "#{Excon::USER_AGENT} ruby/#{RUBY_VERSION} " \
23
23
  "(#{RUBY_PLATFORM}) " \
@@ -182,13 +182,23 @@ module Dependabot
182
182
  end
183
183
 
184
184
  def self.with_git_configured(credentials:)
185
- backup_git_config_path, safe_directories = stash_global_git_config
186
- configure_git_to_use_https_with_credentials(credentials, safe_directories)
187
- yield
185
+ safe_directories = find_safe_directories
186
+
187
+ FileUtils.mkdir_p(Utils::BUMP_TMP_DIR_PATH)
188
+
189
+ previous_config = ENV.fetch("GIT_CONFIG_GLOBAL", nil)
190
+
191
+ begin
192
+ ENV["GIT_CONFIG_GLOBAL"] = GIT_CONFIG_GLOBAL_PATH
193
+ configure_git_to_use_https_with_credentials(credentials, safe_directories)
194
+ yield
195
+ ensure
196
+ ENV["GIT_CONFIG_GLOBAL"] = previous_config
197
+ end
188
198
  rescue Errno::ENOSPC => e
189
199
  raise Dependabot::OutOfDisk, e.message
190
200
  ensure
191
- reset_global_git_config(backup_git_config_path)
201
+ FileUtils.rm_f(GIT_CONFIG_GLOBAL_PATH)
192
202
  end
193
203
 
194
204
  # Handle SCP-style git URIs
@@ -221,7 +231,6 @@ module Dependabot
221
231
  )
222
232
 
223
233
  # see https://github.blog/2022-04-12-git-security-vulnerability-announced/
224
- safe_directories ||= []
225
234
  safe_directories.each do |path|
226
235
  run_shell_command("git config --global --add safe.directory #{path}")
227
236
  end
@@ -296,30 +305,12 @@ module Dependabot
296
305
  end
297
306
  end
298
307
 
299
- def self.stash_global_git_config
300
- return unless File.exist?(GIT_CONFIG_GLOBAL_PATH)
301
-
302
- contents = File.read(GIT_CONFIG_GLOBAL_PATH)
303
- digest = Digest::SHA2.hexdigest(contents)[0...10]
304
- backup_path = GIT_CONFIG_GLOBAL_PATH + ".backup-#{digest}"
305
-
308
+ def self.find_safe_directories
306
309
  # to preserve safe directories from global .gitconfig
307
310
  output, process = Open3.capture2("git config --global --get-all safe.directory")
308
311
  safe_directories = []
309
312
  safe_directories = output.split("\n").compact if process.success?
310
-
311
- FileUtils.mv(GIT_CONFIG_GLOBAL_PATH, backup_path)
312
- [backup_path, safe_directories]
313
- end
314
-
315
- def self.reset_global_git_config(backup_path)
316
- if backup_path.nil?
317
- FileUtils.rm(GIT_CONFIG_GLOBAL_PATH)
318
- return
319
- end
320
- return unless File.exist?(backup_path)
321
-
322
- FileUtils.mv(backup_path, GIT_CONFIG_GLOBAL_PATH)
313
+ safe_directories
323
314
  end
324
315
 
325
316
  def self.run_shell_command(command,
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "tmpdir"
3
4
  require "set"
4
5
 
5
6
  # TODO: in due course, these "registries" should live in a wrapper gem, not
@@ -7,7 +8,7 @@ require "set"
7
8
  module Dependabot
8
9
  module Utils
9
10
  BUMP_TMP_FILE_PREFIX = "dependabot_"
10
- BUMP_TMP_DIR_PATH = "tmp"
11
+ BUMP_TMP_DIR_PATH = File.expand_path(Dir::Tmpname.create("", "tmp") { nil })
11
12
 
12
13
  @version_classes = {}
13
14
 
data/lib/dependabot.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dependabot
4
- VERSION = "0.227.0"
4
+ VERSION = "0.228.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.227.0
4
+ version: 0.228.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-18 00:00:00.000000000 Z
11
+ date: 2023-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-codecommit
@@ -332,14 +332,14 @@ dependencies:
332
332
  requirements:
333
333
  - - "~>"
334
334
  - !ruby/object:Gem::Version
335
- version: 1.50.0
335
+ version: 1.56.0
336
336
  type: :development
337
337
  prerelease: false
338
338
  version_requirements: !ruby/object:Gem::Requirement
339
339
  requirements:
340
340
  - - "~>"
341
341
  - !ruby/object:Gem::Version
342
- version: 1.50.0
342
+ version: 1.56.0
343
343
  - !ruby/object:Gem::Dependency
344
344
  name: rubocop-performance
345
345
  requirement: !ruby/object:Gem::Requirement
@@ -486,7 +486,7 @@ licenses:
486
486
  - Nonstandard
487
487
  metadata:
488
488
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
489
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.227.0
489
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.228.0
490
490
  post_install_message:
491
491
  rdoc_options: []
492
492
  require_paths: