dependabot-common 0.95.36 → 0.95.37

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7db5f548a509fa4a954f5dfc09a8060fa2fa1d66894841a322cca8b318735e2
4
- data.tar.gz: ea1c16837ad111d6bfd7bd0f29accc8970514916dcb0610bceb9b80d079c5c38
3
+ metadata.gz: 0f84e3f8b023a6cf787eca7dc3ed71b932495d297d8b36c732427998dd243c87
4
+ data.tar.gz: a60c2c05ab9c9107513daf426405881603d3dc6ceb68d0ed20c39f856fa94ab7
5
5
  SHA512:
6
- metadata.gz: 11f31cbda75c5525f50277fd340664f7cc0cd4ad51ff466fb1450fb275d006338234723db123a0e6cfc37f449ee365988a59d6e6715edbdda81ab492e7c15f54
7
- data.tar.gz: 95dbed990f5ffe66e8ecf352a6906b1481a1d424bf9be8007cf8472525837998b77f6cf49f0e5bc6845019f790d1c7ad024cb415b3295be2f4581a889e064933
6
+ metadata.gz: b9cd41a89bb9ba29d7fd78c96e064585a29ffb86fb7174cf79d1fc015ce3cbb304210095b2c5cac385b0370cb5818ba89c8768e990ec0a89d8f980b816291a28
7
+ data.tar.gz: cfb13c360a37753c3a1373b93b1ff00b9f1705016defa754169008a263e1d767233c27ae1f7fdb3bdd9a8cc251fbc02da97b491c17ac59a853c5e51c7daa1dab
@@ -7,12 +7,13 @@ require "dependabot/metadata_finders"
7
7
  require "dependabot/errors"
8
8
  require "dependabot/utils"
9
9
  require "dependabot/source"
10
+ require "dependabot/dependency"
11
+ require "dependabot/git_metadata_fetcher"
10
12
 
11
13
  # rubocop:disable Metrics/ClassLength
12
14
  module Dependabot
13
15
  class GitCommitChecker
14
16
  VERSION_REGEX = /(?<version>[0-9]+\.[0-9]+(?:\.[a-zA-Z0-9\-]+)*)$/.freeze
15
- KNOWN_HOSTS = /github\.com|bitbucket\.org|gitlab.com/.freeze
16
17
 
17
18
  def initialize(dependency:, credentials:, ignored_versions: [],
18
19
  requirement_class: nil, version_class: nil)
@@ -137,99 +138,19 @@ module Dependabot
137
138
  end
138
139
 
139
140
  def local_upload_pack
140
- @local_upload_pack ||=
141
- fetch_upload_pack_for(dependency_source_details.fetch(:url))
141
+ local_repo_git_metadata_fetcher.upload_pack
142
142
  end
143
143
 
144
144
  def local_tags
145
- return [] unless local_upload_pack
145
+ tags = local_repo_git_metadata_fetcher.tags
146
146
 
147
- tags_for_upload_pack(local_upload_pack)
148
- end
149
-
150
- def tags_for_upload_pack(upload_pack)
151
- peeled_lines = []
152
- unpeeled_lines = []
153
-
154
- upload_pack.lines.each do |line|
155
- next unless line.split(" ").last.start_with?("refs/tags")
156
-
157
- if line.strip.end_with?("^{}") then peeled_lines << line
158
- else unpeeled_lines << line
147
+ if dependency_source_details&.fetch(:ref, nil)&.start_with?("tags/")
148
+ tags = tags.map do |tag|
149
+ tag.dup.tap { |t| t.name = "tags/#{tag.name}" }
159
150
  end
160
151
  end
161
152
 
162
- unpeeled_lines.map do |line|
163
- tag_name = line.split(" refs/tags/").last.strip
164
- tag_sha = sha_for_update_pack_line(line)
165
- peeled_line = peeled_lines.find do |pl|
166
- pl.split(" refs/tags/").last.strip == "#{tag_name}^{}"
167
- end
168
-
169
- commit_sha =
170
- peeled_line ? sha_for_update_pack_line(peeled_line) : tag_sha
171
-
172
- if dependency_source_details&.fetch(:ref, nil)&.start_with?("tags/")
173
- tag_name = "tags/#{tag_name}"
174
- end
175
-
176
- OpenStruct.new(name: tag_name, tag_sha: tag_sha, commit_sha: commit_sha)
177
- end
178
- end
179
-
180
- # rubocop:disable Metrics/CyclomaticComplexity
181
- # rubocop:disable Metrics/PerceivedComplexity
182
- def fetch_upload_pack_for(uri)
183
- response = Excon.get(
184
- service_pack_uri(uri),
185
- idempotent: true,
186
- **SharedHelpers.excon_defaults
187
- )
188
-
189
- return response.body if response.status == 200
190
- if response.status >= 500 && uri.match?(KNOWN_HOSTS)
191
- raise "Server error at #{uri}: #{response.body}"
192
- end
193
-
194
- raise Dependabot::GitDependenciesNotReachable, [uri]
195
- rescue Excon::Error::Socket, Excon::Error::Timeout
196
- retry_count ||= 0
197
- retry_count += 1
198
-
199
- sleep(rand(0.9)) && retry if retry_count < 2 && uri.match?(KNOWN_HOSTS)
200
- raise if uri.match?(KNOWN_HOSTS)
201
-
202
- raise Dependabot::GitDependenciesNotReachable, [uri]
203
- end
204
- # rubocop:enable Metrics/CyclomaticComplexity
205
- # rubocop:enable Metrics/PerceivedComplexity
206
-
207
- def service_pack_uri(uri)
208
- service_pack_uri = uri_with_auth(uri)
209
- service_pack_uri = service_pack_uri.gsub(%r{/$}, "")
210
- service_pack_uri += ".git" unless service_pack_uri.end_with?(".git")
211
- service_pack_uri + "/info/refs?service=git-upload-pack"
212
- end
213
-
214
- def uri_with_auth(uri)
215
- bare_uri =
216
- if uri.include?("git@") then uri.split("git@").last.sub(":", "/")
217
- else uri.sub(%r{.*?://}, "")
218
- end
219
- cred = credentials.select { |c| c["type"] == "git_source" }.
220
- find { |c| bare_uri.start_with?(c["host"]) }
221
-
222
- if bare_uri.match?(%r{[^/]+:[^/]+@})
223
- # URI already has authentication details
224
- "https://#{bare_uri}"
225
- elsif cred
226
- # URI doesn't have authentication details, but we have credentials
227
- auth_string = "#{cred.fetch('username')}:#{cred.fetch('password')}"
228
- "https://#{auth_string}@#{bare_uri}"
229
- else
230
- # No credentials, so just return the https URI
231
- "https://#{bare_uri}"
232
- end
153
+ tags
233
154
  end
234
155
 
235
156
  def commit_included_in_tag?(tag:, commit:, allow_identical: false)
@@ -363,9 +284,17 @@ module Dependabot
363
284
  end
364
285
 
365
286
  def listing_tags
366
- return [] unless listing_upload_pack
287
+ return [] unless listing_source_url
367
288
 
368
- tags_for_upload_pack(listing_upload_pack)
289
+ tags = listing_repo_git_metadata_fetcher.tags
290
+
291
+ if dependency_source_details&.fetch(:ref, nil)&.start_with?("tags/")
292
+ tags = tags.map do |tag|
293
+ tag.dup.tap { |t| t.name = "tags/#{tag.name}" }
294
+ end
295
+ end
296
+
297
+ tags
369
298
  rescue GitDependenciesNotReachable
370
299
  []
371
300
  end
@@ -373,7 +302,7 @@ module Dependabot
373
302
  def listing_upload_pack
374
303
  return unless listing_source_url
375
304
 
376
- @listing_upload_pack ||= fetch_upload_pack_for(listing_source_url)
305
+ listing_repo_git_metadata_fetcher.upload_pack
377
306
  end
378
307
 
379
308
  def ignore_reqs
@@ -414,6 +343,22 @@ module Dependabot
414
343
  def sha_for_update_pack_line(line)
415
344
  line.split(" ").first.chars.last(40).join
416
345
  end
346
+
347
+ def local_repo_git_metadata_fetcher
348
+ @local_repo_git_metadata_fetcher ||=
349
+ GitMetadataFetcher.new(
350
+ url: dependency_source_details.fetch(:url),
351
+ credentials: credentials
352
+ )
353
+ end
354
+
355
+ def listing_repo_git_metadata_fetcher
356
+ @listing_repo_git_metadata_fetcher ||=
357
+ GitMetadataFetcher.new(
358
+ url: listing_source_url,
359
+ credentials: credentials
360
+ )
361
+ end
417
362
  end
418
363
  end
419
364
  # rubocop:enable Metrics/ClassLength
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "dependabot/errors"
5
+
6
+ module Dependabot
7
+ class GitMetadataFetcher
8
+ KNOWN_HOSTS = /github\.com|bitbucket\.org|gitlab.com/.freeze
9
+
10
+ def initialize(url:, credentials:)
11
+ @url = url
12
+ @credentials = credentials
13
+ end
14
+
15
+ def upload_pack
16
+ @upload_pack ||= fetch_upload_pack_for(url)
17
+ end
18
+
19
+ def tags
20
+ return [] unless upload_pack
21
+
22
+ @tags ||= tags_for_upload_pack(upload_pack)
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :url, :credentials
28
+
29
+ # rubocop:disable Metrics/CyclomaticComplexity
30
+ # rubocop:disable Metrics/PerceivedComplexity
31
+ def fetch_upload_pack_for(uri)
32
+ response = Excon.get(
33
+ service_pack_uri(uri),
34
+ idempotent: true,
35
+ **SharedHelpers.excon_defaults
36
+ )
37
+
38
+ return response.body if response.status == 200
39
+ if response.status >= 500 && uri.match?(KNOWN_HOSTS)
40
+ raise "Server error at #{uri}: #{response.body}"
41
+ end
42
+
43
+ raise Dependabot::GitDependenciesNotReachable, [uri]
44
+ rescue Excon::Error::Socket, Excon::Error::Timeout
45
+ retry_count ||= 0
46
+ retry_count += 1
47
+
48
+ sleep(rand(0.9)) && retry if retry_count < 2 && uri.match?(KNOWN_HOSTS)
49
+ raise if uri.match?(KNOWN_HOSTS)
50
+
51
+ raise Dependabot::GitDependenciesNotReachable, [uri]
52
+ end
53
+ # rubocop:enable Metrics/CyclomaticComplexity
54
+ # rubocop:enable Metrics/PerceivedComplexity
55
+
56
+ def tags_for_upload_pack(upload_pack)
57
+ peeled_lines = []
58
+
59
+ result = upload_pack.lines.each_with_object({}) do |line, res|
60
+ next unless line.split(" ").last.start_with?("refs/tags")
61
+
62
+ peeled_lines << line && next if line.strip.end_with?("^{}")
63
+
64
+ tag_name = line.split(" refs/tags/").last.strip
65
+ sha = sha_for_update_pack_line(line)
66
+
67
+ res[tag_name] =
68
+ OpenStruct.new(name: tag_name, tag_sha: sha, commit_sha: sha)
69
+ end
70
+
71
+ # Loop through the peeled lines, updating the commit_sha for any matching
72
+ # tags in our results hash
73
+ peeled_lines.each do |line|
74
+ tag_name = line.split(" refs/tags/").last.strip.gsub(/\^{}$/, "")
75
+ next unless result[tag_name]
76
+
77
+ result[tag_name].commit_sha = sha_for_update_pack_line(line)
78
+ end
79
+
80
+ result.values
81
+ end
82
+
83
+ def service_pack_uri(uri)
84
+ service_pack_uri = uri_with_auth(uri)
85
+ service_pack_uri = service_pack_uri.gsub(%r{/$}, "")
86
+ service_pack_uri += ".git" unless service_pack_uri.end_with?(".git")
87
+ service_pack_uri + "/info/refs?service=git-upload-pack"
88
+ end
89
+
90
+ def uri_with_auth(uri)
91
+ bare_uri =
92
+ if uri.include?("git@") then uri.split("git@").last.sub(":", "/")
93
+ else uri.sub(%r{.*?://}, "")
94
+ end
95
+ cred = credentials.select { |c| c["type"] == "git_source" }.
96
+ find { |c| bare_uri.start_with?(c["host"]) }
97
+
98
+ if bare_uri.match?(%r{[^/]+:[^/]+@})
99
+ # URI already has authentication details
100
+ "https://#{bare_uri}"
101
+ elsif cred
102
+ # URI doesn't have authentication details, but we have credentials
103
+ auth_string = "#{cred.fetch('username')}:#{cred.fetch('password')}"
104
+ "https://#{auth_string}@#{bare_uri}"
105
+ else
106
+ # No credentials, so just return the https URI
107
+ "https://#{bare_uri}"
108
+ end
109
+ end
110
+
111
+ def sha_for_update_pack_line(line)
112
+ line.split(" ").first.chars.last(40).join
113
+ end
114
+ end
115
+ end
@@ -4,6 +4,7 @@ require "dependabot/clients/github_with_retries"
4
4
  require "dependabot/clients/gitlab"
5
5
  require "dependabot/clients/bitbucket"
6
6
  require "dependabot/shared_helpers"
7
+ require "dependabot/git_metadata_fetcher"
7
8
  require "dependabot/metadata_finders/base"
8
9
 
9
10
  module Dependabot
@@ -125,21 +126,11 @@ module Dependabot
125
126
  def fetch_dependency_tags
126
127
  return [] unless source
127
128
 
128
- case source.provider
129
- when "github"
130
- github_client.tags(source.repo, per_page: 100).map(&:name)
131
- when "bitbucket"
132
- bitbucket_client.tags(source.repo).map { |tag| tag["name"] }
133
- when "gitlab"
134
- gitlab_client.tags(source.repo).map(&:name)
135
- when "azure"
136
- [] # TODO: Fetch Azure tags
137
- else raise "Unexpected source provider '#{source.provider}'"
138
- end
139
- rescue Octokit::NotFound, Gitlab::Error::NotFound,
140
- Dependabot::Clients::Bitbucket::NotFound,
141
- Dependabot::Clients::Bitbucket::Unauthorized,
142
- Dependabot::Clients::Bitbucket::Forbidden
129
+ GitMetadataFetcher.
130
+ new(url: source.url, credentials: credentials).
131
+ tags.
132
+ map(&:name)
133
+ rescue Dependabot::GitDependenciesNotReachable
143
134
  []
144
135
  end
145
136
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dependabot
4
- VERSION = "0.95.36"
4
+ VERSION = "0.95.37"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.95.36
4
+ version: 0.95.37
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -328,6 +328,7 @@ files:
328
328
  - lib/dependabot/file_updaters/README.md
329
329
  - lib/dependabot/file_updaters/base.rb
330
330
  - lib/dependabot/git_commit_checker.rb
331
+ - lib/dependabot/git_metadata_fetcher.rb
331
332
  - lib/dependabot/metadata_finders.rb
332
333
  - lib/dependabot/metadata_finders/README.md
333
334
  - lib/dependabot/metadata_finders/base.rb