dependabot-common 0.211.0 → 0.213.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/lib/dependabot/clients/azure.rb +1 -1
  3. data/lib/dependabot/clients/bitbucket.rb +10 -3
  4. data/lib/dependabot/config/file.rb +1 -1
  5. data/lib/dependabot/config/ignore_condition.rb +1 -1
  6. data/lib/dependabot/dependency.rb +27 -12
  7. data/lib/dependabot/errors.rb +10 -10
  8. data/lib/dependabot/experiments.rb +19 -0
  9. data/lib/dependabot/file_fetchers/base.rb +146 -83
  10. data/lib/dependabot/file_parsers/base/dependency_set.rb +107 -42
  11. data/lib/dependabot/file_updaters/vendor_updater.rb +2 -0
  12. data/lib/dependabot/git_commit_checker.rb +29 -13
  13. data/lib/dependabot/git_metadata_fetcher.rb +3 -3
  14. data/lib/dependabot/metadata_finders/base/changelog_finder.rb +5 -5
  15. data/lib/dependabot/metadata_finders/base/changelog_pruner.rb +4 -4
  16. data/lib/dependabot/metadata_finders/base/commits_finder.rb +4 -4
  17. data/lib/dependabot/metadata_finders/base/release_finder.rb +4 -4
  18. data/lib/dependabot/pull_request_creator/branch_namer.rb +25 -16
  19. data/lib/dependabot/pull_request_creator/github.rb +5 -5
  20. data/lib/dependabot/pull_request_creator/labeler.rb +8 -6
  21. data/lib/dependabot/pull_request_creator/message_builder/issue_linker.rb +5 -5
  22. data/lib/dependabot/pull_request_creator/message_builder/link_and_mention_sanitizer.rb +34 -6
  23. data/lib/dependabot/pull_request_creator/message_builder/metadata_presenter.rb +11 -13
  24. data/lib/dependabot/pull_request_creator/message_builder.rb +117 -45
  25. data/lib/dependabot/pull_request_creator/pr_name_prefixer.rb +8 -12
  26. data/lib/dependabot/pull_request_creator.rb +6 -3
  27. data/lib/dependabot/pull_request_updater/azure.rb +1 -1
  28. data/lib/dependabot/pull_request_updater/github.rb +16 -13
  29. data/lib/dependabot/pull_request_updater.rb +2 -1
  30. data/lib/dependabot/security_advisory.rb +3 -3
  31. data/lib/dependabot/shared_helpers.rb +12 -12
  32. data/lib/dependabot/source.rb +11 -11
  33. data/lib/dependabot/update_checkers/base.rb +2 -2
  34. data/lib/dependabot/version.rb +1 -1
  35. metadata +17 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e1b0e492dee111c834810de7850faa8a0bb5150e281d5eb32e8b44802f2be1f
4
- data.tar.gz: 2c9c14aeb59e0d6c33b1630c5425529dff45624f9b1657390ae644dd8d0abbbf
3
+ metadata.gz: 23fa5c7ea872ca0849f22018af9b0811ad9044f03a4e7d59aa023b3dd80bd4e6
4
+ data.tar.gz: cea778ebef75ccec5afcd3e5932af78d9711c51c4c864ea02d65930fce8ca4dc
5
5
  SHA512:
6
- metadata.gz: 821283e91686501710d6146944b8b10f559cd7ed9e0084edfc5176027083c24b26918a273c823f5fd829f575d5e1a29ead356db403307ba0e36147de30e9e3de
7
- data.tar.gz: 768791aeb20b739bd36d4b788164f5d9e11f096879b7ac517cc4fbaa81462f58e1e1cb1d03a8fce5183b0af4da2ac5458a482dc31ee36cc6d5bf09697300c5ef
6
+ metadata.gz: b14ad55cbabd2a49bd35c7f8012f95972515eead80a71363353a8978286e9d756fd97da5442cb3013acdebfb1a77c7f8f7c450bac553a2d6f52b12687fcf2d43
7
+ data.tar.gz: 86cbba3afb724d1ee0b6c1fd0bb357a33c288263b3032e0ef029e099b5d7f7d8d5104526a8890d6233fdb8850b56ecd05cb0746bd8e6fe8fd84338db8caa28dd
@@ -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
@@ -144,7 +144,14 @@ module Dependabot
144
144
  end
145
145
  # rubocop:enable Metrics/ParameterLists
146
146
 
147
+ def current_user
148
+ base_url = "https://api.bitbucket.org/2.0/user?fields=uuid"
149
+ response = get(base_url)
150
+ JSON.parse(response.body).fetch("uuid")
151
+ end
152
+
147
153
  def default_reviewers(repo)
154
+ current_uuid = current_user
148
155
  path = "#{repo}/default-reviewers?pagelen=100&fields=values.uuid,next"
149
156
  reviewers_url = base_url + path
150
157
 
@@ -153,7 +160,7 @@ module Dependabot
153
160
  reviewer_data = []
154
161
 
155
162
  default_reviewers.each do |reviewer|
156
- reviewer_data.append({ uuid: reviewer.fetch("uuid") })
163
+ reviewer_data.append({ uuid: reviewer.fetch("uuid") }) unless current_uuid == reviewer.fetch("uuid")
157
164
  end
158
165
 
159
166
  reviewer_data
@@ -189,8 +196,8 @@ module Dependabot
189
196
  raise NotFound if response.status == 404
190
197
 
191
198
  if response.status >= 400
192
- raise "Unhandled Bitbucket error!\n"\
193
- "Status: #{response.status}\n"\
199
+ raise "Unhandled Bitbucket error!\n" \
200
+ "Status: #{response.status}\n" \
194
201
  "Body: #{response.body}"
195
202
  end
196
203
 
@@ -71,7 +71,7 @@ module Dependabot
71
71
  commit_message = cfg&.dig(:"commit-message") || {}
72
72
  Dependabot::Config::UpdateConfig::CommitMessageOptions.new(
73
73
  prefix: commit_message[:prefix],
74
- prefix_development: commit_message[:"prefix-development"],
74
+ prefix_development: commit_message[:"prefix-development"] || commit_message[:prefix],
75
75
  include: commit_message[:include]
76
76
  )
77
77
  end
@@ -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)
@@ -37,11 +37,11 @@ module Dependabot
37
37
 
38
38
  attr_reader :name, :version, :requirements, :package_manager,
39
39
  :previous_version, :previous_requirements,
40
- :subdependency_metadata
40
+ :subdependency_metadata, :metadata
41
41
 
42
42
  def initialize(name:, requirements:, package_manager:, version: nil,
43
43
  previous_version: nil, previous_requirements: nil,
44
- subdependency_metadata: [], removed: false)
44
+ subdependency_metadata: [], removed: false, metadata: {})
45
45
  @name = name
46
46
  @version = version
47
47
  @requirements = requirements.map { |req| symbolize_keys(req) }
@@ -54,6 +54,7 @@ module Dependabot
54
54
  map { |h| symbolize_keys(h) }
55
55
  end
56
56
  @removed = removed
57
+ @metadata = symbolize_keys(metadata || {})
57
58
 
58
59
  check_values
59
60
  end
@@ -105,6 +106,22 @@ module Dependabot
105
106
  display_name_builder.call(name)
106
107
  end
107
108
 
109
+ # Returns all detected versions of the dependency. Only ecosystems that
110
+ # support this feature will return more than the current version.
111
+ def all_versions
112
+ all_versions = metadata[:all_versions]
113
+ return [version].compact unless all_versions
114
+
115
+ all_versions.filter_map(&:version)
116
+ end
117
+
118
+ # This dependency is being indirectly updated by an update to another
119
+ # dependency. We don't need to try and update it ourselves but want to
120
+ # surface it to the user in the PR.
121
+ def informational_only?
122
+ metadata[:information_only]
123
+ end
124
+
108
125
  def ==(other)
109
126
  other.instance_of?(self.class) && to_h == other.to_h
110
127
  end
@@ -120,9 +137,7 @@ module Dependabot
120
137
  private
121
138
 
122
139
  def check_values
123
- if [version, previous_version].any? { |v| v == "" }
124
- raise ArgumentError, "blank strings must not be provided as versions"
125
- end
140
+ raise ArgumentError, "blank strings must not be provided as versions" if [version, previous_version].any?("")
126
141
 
127
142
  check_requirement_fields
128
143
  check_subdependency_metadata
@@ -130,8 +145,8 @@ module Dependabot
130
145
 
131
146
  def check_requirement_fields
132
147
  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) }
148
+ unless requirement_fields.all?(Array) &&
149
+ requirement_fields.flatten.all?(Hash)
135
150
  raise ArgumentError, "requirements must be an array of hashes"
136
151
  end
137
152
 
@@ -139,9 +154,9 @@ module Dependabot
139
154
  optional_keys = %i(metadata)
140
155
  unless requirement_fields.flatten.
141
156
  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: "\
157
+ raise ArgumentError, "each requirement must have the following " \
158
+ "required keys: #{required_keys.join(', ')}." \
159
+ "Optionally, it may have the following keys: " \
145
160
  "#{optional_keys.join(', ')}."
146
161
  end
147
162
 
@@ -154,13 +169,13 @@ module Dependabot
154
169
  return unless subdependency_metadata
155
170
 
156
171
  unless subdependency_metadata.is_a?(Array) &&
157
- subdependency_metadata.all? { |r| r.is_a?(Hash) }
172
+ subdependency_metadata.all?(Hash)
158
173
  raise ArgumentError, "subdependency_metadata must be an array of hashes"
159
174
  end
160
175
  end
161
176
 
162
177
  def symbolize_keys(hash)
163
- hash.keys.map { |k| [k.to_sym, hash[k]] }.to_h
178
+ hash.keys.to_h { |k| [k.to_sym, hash[k]] }
164
179
  end
165
180
  end
166
181
  end
@@ -4,9 +4,9 @@ require "dependabot/utils"
4
4
 
5
5
  module Dependabot
6
6
  class DependabotError < StandardError
7
- BASIC_AUTH_REGEX = %r{://(?<auth>[^:]*:[^@%\s]+(@|%40))}.freeze
7
+ BASIC_AUTH_REGEX = %r{://(?<auth>[^:]*:[^@%\s]+(@|%40))}
8
8
  # Remove any path segment from fury.io sources
9
- FURY_IO_PATH_REGEX = %r{fury\.io/(?<path>.+)}.freeze
9
+ FURY_IO_PATH_REGEX = %r{fury\.io/(?<path>.+)}
10
10
 
11
11
  def initialize(message = nil)
12
12
  super(sanitize_message(message))
@@ -18,7 +18,7 @@ module Dependabot
18
18
  return message unless message.is_a?(String)
19
19
 
20
20
  path_regex =
21
- Regexp.escape(Utils::BUMP_TMP_DIR_PATH) + "\/" +
21
+ Regexp.escape(Utils::BUMP_TMP_DIR_PATH) + "\\/" +
22
22
  Regexp.escape(Utils::BUMP_TMP_FILE_PREFIX) + "[a-zA-Z0-9-]*"
23
23
 
24
24
  message = message.gsub(/#{path_regex}/, "dependabot_tmp_dir").strip
@@ -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
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dependabot
4
+ module Experiments
5
+ @experiments = {}
6
+
7
+ def self.reset!
8
+ @experiments = {}
9
+ end
10
+
11
+ def self.register(name, value)
12
+ @experiments[name.to_sym] = value
13
+ end
14
+
15
+ def self.enabled?(name)
16
+ !!@experiments[name.to_sym]
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "stringio"
3
4
  require "dependabot/config"
4
5
  require "dependabot/dependency_file"
5
6
  require "dependabot/source"
@@ -69,6 +70,7 @@ module Dependabot
69
70
  end
70
71
 
71
72
  def commit
73
+ return cloned_commit if cloned_commit
72
74
  return source.commit if source.commit
73
75
 
74
76
  branch = target_branch || default_branch_for_repo
@@ -84,7 +86,11 @@ module Dependabot
84
86
  def clone_repo_contents
85
87
  @clone_repo_contents ||=
86
88
  _clone_repo_contents(target_directory: repo_contents_path)
87
- rescue Dependabot::SharedHelpers::HelperSubprocessFailed
89
+ rescue Dependabot::SharedHelpers::HelperSubprocessFailed => e
90
+ if e.message.include?("fatal: Remote branch #{target_branch} not found in upstream origin")
91
+ raise Dependabot::BranchNotFound, target_branch
92
+ end
93
+
88
94
  raise Dependabot::RepoNotFound, source
89
95
  end
90
96
 
@@ -141,7 +147,7 @@ module Dependabot
141
147
 
142
148
  path = Pathname.new(File.join(directory, filename)).cleanpath.to_path
143
149
  content = _fetch_file_content(path, fetch_submodules: fetch_submodules)
144
- type = @linked_paths.key?(path.gsub(%r{^/}, "")) ? "symlink" : type
150
+ type = "symlink" if @linked_paths.key?(path.gsub(%r{^/}, ""))
145
151
 
146
152
  DependencyFile.new(
147
153
  name: Pathname.new(filename).cleanpath.to_path,
@@ -168,6 +174,97 @@ module Dependabot
168
174
  end
169
175
  end
170
176
 
177
+ def cloned_commit
178
+ return if repo_contents_path.nil? || !File.directory?(File.join(repo_contents_path, ".git"))
179
+
180
+ SharedHelpers.with_git_configured(credentials: credentials) do
181
+ Dir.chdir(repo_contents_path) do
182
+ return SharedHelpers.run_shell_command("git rev-parse HEAD")&.strip
183
+ end
184
+ end
185
+ end
186
+
187
+ def default_branch_for_repo
188
+ @default_branch_for_repo ||= client_for_provider.
189
+ fetch_default_branch(repo)
190
+ rescue *CLIENT_NOT_FOUND_ERRORS
191
+ raise Dependabot::RepoNotFound, source
192
+ end
193
+
194
+ def update_linked_paths(repo, path, commit, github_response)
195
+ case github_response.type
196
+ when "submodule"
197
+ sub_source = Source.from_url(github_response.submodule_git_url)
198
+ return unless sub_source
199
+
200
+ @linked_paths[path] = {
201
+ repo: sub_source.repo,
202
+ provider: sub_source.provider,
203
+ commit: github_response.sha,
204
+ path: "/"
205
+ }
206
+ when "symlink"
207
+ updated_path = File.join(File.dirname(path), github_response.target)
208
+ @linked_paths[path] = {
209
+ repo: repo,
210
+ provider: "github",
211
+ commit: commit,
212
+ path: Pathname.new(updated_path).cleanpath.to_path
213
+ }
214
+ end
215
+ end
216
+
217
+ def recurse_submodules_when_cloning?
218
+ false
219
+ end
220
+
221
+ def client_for_provider
222
+ case source.provider
223
+ when "github" then github_client
224
+ when "gitlab" then gitlab_client
225
+ when "azure" then azure_client
226
+ when "bitbucket" then bitbucket_client
227
+ when "codecommit" then codecommit_client
228
+ else raise "Unsupported provider '#{source.provider}'."
229
+ end
230
+ end
231
+
232
+ def github_client
233
+ @github_client ||=
234
+ Dependabot::Clients::GithubWithRetries.for_source(
235
+ source: source,
236
+ credentials: credentials
237
+ )
238
+ end
239
+
240
+ def gitlab_client
241
+ @gitlab_client ||=
242
+ Dependabot::Clients::GitlabWithRetries.for_source(
243
+ source: source,
244
+ credentials: credentials
245
+ )
246
+ end
247
+
248
+ def azure_client
249
+ @azure_client ||=
250
+ Dependabot::Clients::Azure.
251
+ for_source(source: source, credentials: credentials)
252
+ end
253
+
254
+ def bitbucket_client
255
+ # TODO: When self-hosted Bitbucket is supported this should use
256
+ # `Bitbucket.for_source`
257
+ @bitbucket_client ||=
258
+ Dependabot::Clients::BitbucketWithRetries.
259
+ for_bitbucket_dot_org(credentials: credentials)
260
+ end
261
+
262
+ def codecommit_client
263
+ @codecommit_client ||=
264
+ Dependabot::Clients::CodeCommit.
265
+ for_source(source: source, credentials: credentials)
266
+ end
267
+
171
268
  #################################################
172
269
  # INTERNAL METHODS (not for use by sub-classes) #
173
270
  #################################################
@@ -233,8 +330,8 @@ module Dependabot
233
330
  repo_path = File.join(clone_repo_contents, relative_path)
234
331
  return [] unless Dir.exist?(repo_path)
235
332
 
236
- Dir.entries(repo_path).map do |name|
237
- next if [".", ".."].include?(name)
333
+ Dir.entries(repo_path).filter_map do |name|
334
+ next if name == "." || name == ".."
238
335
 
239
336
  absolute_path = File.join(repo_path, name)
240
337
  type = if File.symlink?(absolute_path)
@@ -251,29 +348,6 @@ module Dependabot
251
348
  type: type,
252
349
  size: 0 # NOTE: added for parity with github contents API
253
350
  )
254
- end.compact
255
- end
256
-
257
- def update_linked_paths(repo, path, commit, github_response)
258
- case github_response.type
259
- when "submodule"
260
- sub_source = Source.from_url(github_response.submodule_git_url)
261
- return unless sub_source
262
-
263
- @linked_paths[path] = {
264
- repo: sub_source.repo,
265
- provider: sub_source.provider,
266
- commit: github_response.sha,
267
- path: "/"
268
- }
269
- when "symlink"
270
- updated_path = File.join(File.dirname(path), github_response.target)
271
- @linked_paths[path] = {
272
- repo: repo,
273
- provider: "github",
274
- commit: commit,
275
- path: Pathname.new(updated_path).cleanpath.to_path
276
- }
277
351
  end
278
352
  end
279
353
 
@@ -473,13 +547,6 @@ module Dependabot
473
547
  end
474
548
  # rubocop:enable Metrics/AbcSize
475
549
 
476
- def default_branch_for_repo
477
- @default_branch_for_repo ||= client_for_provider.
478
- fetch_default_branch(repo)
479
- rescue *CLIENT_NOT_FOUND_ERRORS
480
- raise Dependabot::RepoNotFound, source
481
- end
482
-
483
550
  # Update the @linked_paths hash by exploiting a side-effect of
484
551
  # recursively calling `repo_contents` for each directory up the tree
485
552
  # until a submodule or symlink is found
@@ -504,6 +571,10 @@ module Dependabot
504
571
  max_by(&:length)
505
572
  end
506
573
 
574
+ # rubocop:disable Metrics/AbcSize
575
+ # rubocop:disable Metrics/MethodLength
576
+ # rubocop:disable Metrics/PerceivedComplexity
577
+ # rubocop:disable Metrics/BlockLength
507
578
  def _clone_repo_contents(target_directory:)
508
579
  SharedHelpers.with_git_configured(credentials: credentials) do
509
580
  path = target_directory || File.join("tmp", source.repo)
@@ -512,62 +583,54 @@ module Dependabot
512
583
  return path if Dir.exist?(File.join(path, ".git"))
513
584
 
514
585
  FileUtils.mkdir_p(path)
515
- br_opt = " --branch #{source.branch} --single-branch" if source.branch
586
+
587
+ clone_options = StringIO.new
588
+ clone_options << "--no-tags --depth 1"
589
+ clone_options << if recurse_submodules_when_cloning?
590
+ " --recurse-submodules --shallow-submodules"
591
+ else
592
+ " --no-recurse-submodules"
593
+ end
594
+ clone_options << " --branch #{source.branch} --single-branch" if source.branch
516
595
  SharedHelpers.run_shell_command(
517
596
  <<~CMD
518
- git clone --no-tags --no-recurse-submodules --depth 1#{br_opt} #{source.url} #{path}
597
+ git clone #{clone_options.string} #{source.url} #{path}
519
598
  CMD
520
599
  )
521
- path
522
- end
523
- end
524
-
525
- def client_for_provider
526
- case source.provider
527
- when "github" then github_client
528
- when "gitlab" then gitlab_client
529
- when "azure" then azure_client
530
- when "bitbucket" then bitbucket_client
531
- when "codecommit" then codecommit_client
532
- else raise "Unsupported provider '#{source.provider}'."
533
- end
534
- end
535
-
536
- def github_client
537
- @github_client ||=
538
- Dependabot::Clients::GithubWithRetries.for_source(
539
- source: source,
540
- credentials: credentials
541
- )
542
- end
543
-
544
- def gitlab_client
545
- @gitlab_client ||=
546
- Dependabot::Clients::GitlabWithRetries.for_source(
547
- source: source,
548
- credentials: credentials
549
- )
550
- end
551
600
 
552
- def azure_client
553
- @azure_client ||=
554
- Dependabot::Clients::Azure.
555
- for_source(source: source, credentials: credentials)
556
- end
557
-
558
- def bitbucket_client
559
- # TODO: When self-hosted Bitbucket is supported this should use
560
- # `Bitbucket.for_source`
561
- @bitbucket_client ||=
562
- Dependabot::Clients::BitbucketWithRetries.
563
- for_bitbucket_dot_org(credentials: credentials)
564
- end
601
+ if source.commit
602
+ # This code will only be called for testing. Production will never pass a commit
603
+ # since Dependabot always wants to use the latest commit on a branch.
604
+ Dir.chdir(path) do
605
+ fetch_options = StringIO.new
606
+ fetch_options << "--depth 1"
607
+ fetch_options << if recurse_submodules_when_cloning?
608
+ " --recurse-submodules=on-demand"
609
+ else
610
+ " --no-recurse-submodules"
611
+ end
612
+ # Need to fetch the commit due to the --depth 1 above.
613
+ SharedHelpers.run_shell_command("git fetch #{fetch_options.string} origin #{source.commit}")
614
+
615
+ reset_options = StringIO.new
616
+ reset_options << "--hard"
617
+ reset_options << if recurse_submodules_when_cloning?
618
+ " --recurse-submodules"
619
+ else
620
+ " --no-recurse-submodules"
621
+ end
622
+ # Set HEAD to this commit so later calls so git reset HEAD will work.
623
+ SharedHelpers.run_shell_command("git reset #{reset_options.string} #{source.commit}")
624
+ end
625
+ end
565
626
 
566
- def codecommit_client
567
- @codecommit_client ||=
568
- Dependabot::Clients::CodeCommit.
569
- for_source(source: source, credentials: credentials)
627
+ path
628
+ end
570
629
  end
630
+ # rubocop:enable Metrics/AbcSize
631
+ # rubocop:enable Metrics/MethodLength
632
+ # rubocop:enable Metrics/PerceivedComplexity
633
+ # rubocop:enable Metrics/BlockLength
571
634
  end
572
635
  end
573
636
  end