dependabot-nuget 0.238.0 → 0.239.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 +4 -4
- data/lib/dependabot/nuget/file_fetcher.rb +12 -19
- data/lib/dependabot/nuget/requirement.rb +5 -1
- data/lib/dependabot/nuget/update_checker/nupkg_fetcher.rb +92 -87
- data/lib/dependabot/nuget/update_checker/nuspec_fetcher.rb +56 -59
- data/lib/dependabot/nuget/update_checker/repository_finder.rb +4 -0
- metadata +7 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2bf5bdfc4f365f5d04c30193e1b44e7a82ddb5816461148e4172cabc1a86bea3
|
|
4
|
+
data.tar.gz: 0ca7483d0fdc3d3a7dc2af7c8f475e7b02a121d4a8a5c58f495ff857d32c3dad
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a0bd5448386d99ac0fa6a27ea6f5ec137885cd8a208762602d69284c1cdea6bb9e521a885b9a50cb42eb45b2de9ec760def87940c15023a910f7f9455a612fc9
|
|
7
|
+
data.tar.gz: 4096cfc58f861ec2f4f5d7a4022fd06f001d0f4421130bf0708e877a93ce2e12e722259d60b29f8303375d2e3cdc5f595e396cb4273d5c1e03a34e23a3a154ec
|
|
@@ -30,12 +30,10 @@ module Dependabot
|
|
|
30
30
|
"Repo must contain a .proj file, .(cs|vb|fs)proj file, or a packages.config."
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
# rubocop:disable Metrics/AbcSize
|
|
34
33
|
sig { override.returns(T::Array[DependencyFile]) }
|
|
35
34
|
def fetch_files
|
|
36
35
|
fetched_files = []
|
|
37
36
|
fetched_files += project_files
|
|
38
|
-
fetched_files += project_files.filter_map { |f| directory_packages_props_file_from_project_file(f) }
|
|
39
37
|
fetched_files += directory_build_files
|
|
40
38
|
fetched_files += imported_property_files
|
|
41
39
|
|
|
@@ -47,7 +45,7 @@ module Dependabot
|
|
|
47
45
|
|
|
48
46
|
# dedup files based on their absolute path
|
|
49
47
|
fetched_files = fetched_files.uniq do |fetched_file|
|
|
50
|
-
Pathname.new(
|
|
48
|
+
Pathname.new(fetched_file.directory).join(fetched_file.name).cleanpath.to_path
|
|
51
49
|
end
|
|
52
50
|
|
|
53
51
|
if project_files.none? && packages_config_files.none?
|
|
@@ -61,7 +59,6 @@ module Dependabot
|
|
|
61
59
|
|
|
62
60
|
fetched_files
|
|
63
61
|
end
|
|
64
|
-
# rubocop:enable Metrics/AbcSize
|
|
65
62
|
|
|
66
63
|
private
|
|
67
64
|
|
|
@@ -72,8 +69,9 @@ module Dependabot
|
|
|
72
69
|
project_files += csproj_file
|
|
73
70
|
project_files += vbproj_file
|
|
74
71
|
project_files += fsproj_file
|
|
75
|
-
|
|
76
72
|
project_files += sln_project_files
|
|
73
|
+
project_files += proj_files
|
|
74
|
+
project_files += project_files.filter_map { |f| directory_packages_props_file_from_project_file(f) }
|
|
77
75
|
project_files
|
|
78
76
|
end
|
|
79
77
|
rescue Octokit::NotFound, Gitlab::Error::NotFound
|
|
@@ -120,22 +118,15 @@ module Dependabot
|
|
|
120
118
|
@directory_build_files ||= fetch_directory_build_files
|
|
121
119
|
end
|
|
122
120
|
|
|
123
|
-
# rubocop:disable Metrics/AbcSize
|
|
124
121
|
def fetch_directory_build_files
|
|
125
122
|
attempted_dirs = []
|
|
126
123
|
directory_build_files = []
|
|
127
124
|
directory_path = Pathname.new(directory)
|
|
128
125
|
|
|
129
126
|
# find all build files (Directory.Build.props/.targets) relative to the given project file
|
|
130
|
-
project_files.map { |f|
|
|
127
|
+
project_files.map { |f| Pathname.new(f.directory).join(f.name).dirname }.uniq.each do |dir|
|
|
131
128
|
# Simulate MSBuild walking up the directory structure looking for a file
|
|
132
|
-
|
|
133
|
-
candidate_dir = dir.split("/").first(i + 1).join("/")
|
|
134
|
-
candidate_dir = "/#{candidate_dir}" unless candidate_dir.start_with?("/")
|
|
135
|
-
candidate_dir
|
|
136
|
-
end.reverse
|
|
137
|
-
|
|
138
|
-
possible_dirs.each do |possible_dir|
|
|
129
|
+
dir.descend.each do |possible_dir|
|
|
139
130
|
break if attempted_dirs.include?(possible_dir)
|
|
140
131
|
|
|
141
132
|
attempted_dirs << possible_dir
|
|
@@ -150,7 +141,6 @@ module Dependabot
|
|
|
150
141
|
|
|
151
142
|
directory_build_files
|
|
152
143
|
end
|
|
153
|
-
# rubocop:enable Metrics/AbcSize
|
|
154
144
|
|
|
155
145
|
def sln_project_files
|
|
156
146
|
return [] unless sln_files
|
|
@@ -196,18 +186,21 @@ module Dependabot
|
|
|
196
186
|
@fsproj_file ||= find_and_fetch_with_suffix(".fsproj")
|
|
197
187
|
end
|
|
198
188
|
|
|
189
|
+
def proj_files
|
|
190
|
+
@proj_files ||= find_and_fetch_with_suffix(".proj")
|
|
191
|
+
end
|
|
192
|
+
|
|
199
193
|
def directory_packages_props_file_from_project_file(project_file)
|
|
200
194
|
# walk up the tree from each project file stopping at the first `Directory.Packages.props` file found
|
|
201
195
|
# https://learn.microsoft.com/en-us/nuget/consume-packages/central-package-management#central-package-management-rules
|
|
202
196
|
|
|
203
197
|
found_directory_packages_props_file = nil
|
|
204
198
|
directory_path = Pathname.new(directory)
|
|
205
|
-
full_project_dir =
|
|
206
|
-
full_project_dir.
|
|
199
|
+
full_project_dir = Pathname.new(project_file.directory).join(project_file.name).dirname
|
|
200
|
+
full_project_dir.ascend.each do |base|
|
|
207
201
|
break if found_directory_packages_props_file
|
|
208
202
|
|
|
209
|
-
|
|
210
|
-
candidate_file_path = Pathname.new(base + "/Directory.Packages.props").cleanpath.to_path
|
|
203
|
+
candidate_file_path = Pathname.new(base).join("Directory.Packages.props").cleanpath.to_path
|
|
211
204
|
candidate_directory = Pathname.new(File.dirname(candidate_file_path))
|
|
212
205
|
relative_candidate_directory = candidate_directory.relative_path_from(directory_path)
|
|
213
206
|
candidate_file = repo_contents(dir: relative_candidate_directory).find do |f|
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# typed: true
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
|
+
require "sorbet-runtime"
|
|
5
|
+
|
|
6
|
+
require "dependabot/requirement"
|
|
4
7
|
require "dependabot/utils"
|
|
5
8
|
require "dependabot/nuget/version"
|
|
6
9
|
|
|
@@ -8,7 +11,7 @@ require "dependabot/nuget/version"
|
|
|
8
11
|
# https://docs.microsoft.com/en-us/nuget/reference/package-versioning
|
|
9
12
|
module Dependabot
|
|
10
13
|
module Nuget
|
|
11
|
-
class Requirement <
|
|
14
|
+
class Requirement < Dependabot::Requirement
|
|
12
15
|
def self.parse(obj)
|
|
13
16
|
return ["=", Nuget::Version.new(obj.to_s)] if obj.is_a?(Gem::Version)
|
|
14
17
|
|
|
@@ -25,6 +28,7 @@ module Dependabot
|
|
|
25
28
|
# For consistency with other languages, we define a requirements array.
|
|
26
29
|
# Dotnet doesn't have an `OR` separator for requirements, so it always
|
|
27
30
|
# contains a single element.
|
|
31
|
+
sig { override.params(requirement_string: T.nilable(String)).returns(T::Array[Requirement]) }
|
|
28
32
|
def self.requirements_array(requirement_string)
|
|
29
33
|
[new(requirement_string)]
|
|
30
34
|
end
|
|
@@ -1,111 +1,116 @@
|
|
|
1
|
-
# typed:
|
|
1
|
+
# typed: true
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
require "nokogiri"
|
|
5
5
|
require "zip"
|
|
6
6
|
require "stringio"
|
|
7
|
-
require "dependabot/nuget/update_checker"
|
|
8
7
|
|
|
9
8
|
module Dependabot
|
|
10
9
|
module Nuget
|
|
11
|
-
class
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
nupkg_buffer || fetch_nupkg_buffer_from_repository(repository_details, package_id, package_version)
|
|
19
|
-
end
|
|
10
|
+
class NupkgFetcher
|
|
11
|
+
require_relative "repository_finder"
|
|
12
|
+
|
|
13
|
+
def self.fetch_nupkg_buffer(dependency_urls, package_id, package_version)
|
|
14
|
+
# check all repositories for the first one that has the nupkg
|
|
15
|
+
dependency_urls.reduce(nil) do |nupkg_buffer, repository_details|
|
|
16
|
+
nupkg_buffer || fetch_nupkg_buffer_from_repository(repository_details, package_id, package_version)
|
|
20
17
|
end
|
|
18
|
+
end
|
|
21
19
|
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
def self.fetch_nupkg_url_from_repository(repository_details, package_id, package_version)
|
|
21
|
+
return unless package_id && package_version && !package_version.empty?
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
feed_url = repository_details[:repository_url]
|
|
24
|
+
repository_type = repository_details[:repository_type]
|
|
27
25
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
26
|
+
azure_devops_match = try_match_azure_url(feed_url)
|
|
27
|
+
package_url = if azure_devops_match
|
|
28
|
+
get_azure_package_url(azure_devops_match, package_id, package_version)
|
|
29
|
+
elsif repository_type == "v2"
|
|
30
|
+
get_nuget_v2_package_url(feed_url, package_id, package_version)
|
|
31
|
+
elsif repository_type == "v3"
|
|
32
|
+
get_nuget_v3_package_url(repository_details, package_id, package_version)
|
|
33
|
+
else
|
|
34
|
+
raise Dependabot::DependencyFileNotResolvable, "Unexpected NuGet feed format: #{feed_url}"
|
|
35
|
+
end
|
|
38
36
|
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
package_url
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def self.fetch_nupkg_buffer_from_repository(repository_details, package_id, package_version)
|
|
41
|
+
package_url = fetch_nupkg_url_from_repository(repository_details, package_id, package_version)
|
|
42
|
+
return unless package_url
|
|
43
|
+
|
|
44
|
+
auth_header = repository_details[:auth_header]
|
|
45
|
+
fetch_stream(package_url, auth_header)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def self.try_match_azure_url(feed_url)
|
|
49
|
+
# if url is azure devops
|
|
50
|
+
azure_devops_regexs = [
|
|
51
|
+
%r{https://pkgs\.dev\.azure\.com/(?<organization>[^/]+)/(?<project>[^/]+)/_packaging/(?<feedId>[^/]+)/nuget/v3/index\.json},
|
|
52
|
+
%r{https://pkgs\.dev\.azure\.com/(?<organization>[^/]+)/_packaging/(?<feedId>[^/]+)/nuget/v3/index\.json(?<project>)},
|
|
53
|
+
%r{https://(?<organization>[^\.\/]+)\.pkgs\.visualstudio\.com/_packaging/(?<feedId>[^/]+)/nuget/v3/index\.json(?<project>)}
|
|
54
|
+
]
|
|
55
|
+
regex = azure_devops_regexs.find { |reg| reg.match(feed_url) }
|
|
56
|
+
return unless regex
|
|
57
|
+
|
|
58
|
+
regex.match(feed_url)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def self.get_azure_package_url(azure_devops_match, package_id, package_version)
|
|
62
|
+
organization = azure_devops_match[:organization]
|
|
63
|
+
project = azure_devops_match[:project]
|
|
64
|
+
feed_id = azure_devops_match[:feedId]
|
|
41
65
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
%r{https://pkgs\.dev\.azure\.com/(?<organization>[^/]+)/_packaging/(?<feedId>[^/]+)/nuget/v3/index\.json(?<project>)},
|
|
47
|
-
%r{https://(?<organization>[^\.\/]+)\.pkgs\.visualstudio\.com/_packaging/(?<feedId>[^/]+)/nuget/v3/index\.json(?<project>)}
|
|
48
|
-
]
|
|
49
|
-
regex = azure_devops_regexs.find { |reg| reg.match(feed_url) }
|
|
50
|
-
return unless regex
|
|
51
|
-
|
|
52
|
-
regex.match(feed_url)
|
|
66
|
+
if project.empty?
|
|
67
|
+
"https://pkgs.dev.azure.com/#{organization}/_apis/packaging/feeds/#{feed_id}/nuget/packages/#{package_id}/versions/#{package_version}/content?sourceProtocolVersion=nuget&api-version=7.0-preview"
|
|
68
|
+
else
|
|
69
|
+
"https://pkgs.dev.azure.com/#{organization}/#{project}/_apis/packaging/feeds/#{feed_id}/nuget/packages/#{package_id}/versions/#{package_version}/content?sourceProtocolVersion=nuget&api-version=7.0-preview"
|
|
53
70
|
end
|
|
71
|
+
end
|
|
54
72
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
73
|
+
def self.get_nuget_v3_package_url(repository_details, package_id, package_version)
|
|
74
|
+
base_url = repository_details[:base_url].delete_suffix("/")
|
|
75
|
+
package_id_downcased = package_id.downcase
|
|
76
|
+
"#{base_url}/#{package_id_downcased}/#{package_version}/#{package_id_downcased}.#{package_version}.nupkg"
|
|
77
|
+
end
|
|
59
78
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
79
|
+
def self.get_nuget_v2_package_url(feed_url, package_id, package_version)
|
|
80
|
+
base_url = feed_url
|
|
81
|
+
base_url += "/" unless base_url.end_with?("/")
|
|
82
|
+
package_id_downcased = package_id.downcase
|
|
83
|
+
"#{base_url}/package/#{package_id_downcased}/#{package_version}"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def self.fetch_stream(stream_url, auth_header, max_redirects = 5)
|
|
87
|
+
current_url = stream_url
|
|
88
|
+
current_redirects = 0
|
|
89
|
+
|
|
90
|
+
loop do
|
|
91
|
+
connection = Excon.new(current_url, persistent: true)
|
|
92
|
+
|
|
93
|
+
package_data = StringIO.new
|
|
94
|
+
response_block = lambda do |chunk, _remaining_bytes, _total_bytes|
|
|
95
|
+
package_data.write(chunk)
|
|
64
96
|
end
|
|
65
|
-
end
|
|
66
97
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
98
|
+
response = connection.request(
|
|
99
|
+
method: :get,
|
|
100
|
+
headers: auth_header,
|
|
101
|
+
response_block: response_block
|
|
102
|
+
)
|
|
72
103
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
package_id_downcased = package_id.downcase
|
|
77
|
-
"#{base_url}/package/#{package_id_downcased}/#{package_version}"
|
|
78
|
-
end
|
|
104
|
+
if response.status == 303
|
|
105
|
+
current_redirects += 1
|
|
106
|
+
return nil if current_redirects > max_redirects
|
|
79
107
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
package_data = StringIO.new
|
|
88
|
-
response_block = lambda do |chunk, _remaining_bytes, _total_bytes|
|
|
89
|
-
package_data.write(chunk)
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
response = connection.request(
|
|
93
|
-
method: :get,
|
|
94
|
-
headers: auth_header,
|
|
95
|
-
response_block: response_block
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
if response.status == 303
|
|
99
|
-
current_redirects += 1
|
|
100
|
-
return nil if current_redirects > max_redirects
|
|
101
|
-
|
|
102
|
-
current_url = response.headers["Location"]
|
|
103
|
-
elsif response.status == 200
|
|
104
|
-
package_data.rewind
|
|
105
|
-
return package_data
|
|
106
|
-
else
|
|
107
|
-
return nil
|
|
108
|
-
end
|
|
108
|
+
current_url = response.headers["Location"]
|
|
109
|
+
elsif response.status == 200
|
|
110
|
+
package_data.rewind
|
|
111
|
+
return package_data
|
|
112
|
+
else
|
|
113
|
+
return nil
|
|
109
114
|
end
|
|
110
115
|
end
|
|
111
116
|
end
|
|
@@ -1,85 +1,82 @@
|
|
|
1
|
-
# typed:
|
|
1
|
+
# typed: true
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
require "nokogiri"
|
|
5
5
|
require "zip"
|
|
6
6
|
require "stringio"
|
|
7
|
-
require "dependabot/nuget/update_checker"
|
|
8
7
|
|
|
9
8
|
module Dependabot
|
|
10
9
|
module Nuget
|
|
11
|
-
class
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
require_relative "repository_finder"
|
|
10
|
+
class NuspecFetcher
|
|
11
|
+
require_relative "nupkg_fetcher"
|
|
12
|
+
require_relative "repository_finder"
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
end
|
|
14
|
+
def self.fetch_nuspec(dependency_urls, package_id, package_version)
|
|
15
|
+
# check all repositories for the first one that has the nuspec
|
|
16
|
+
dependency_urls.reduce(nil) do |nuspec_xml, repository_details|
|
|
17
|
+
nuspec_xml || fetch_nuspec_from_repository(repository_details, package_id, package_version)
|
|
21
18
|
end
|
|
19
|
+
end
|
|
22
20
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
feed_url = repository_details[:repository_url]
|
|
27
|
-
auth_header = repository_details[:auth_header]
|
|
21
|
+
def self.fetch_nuspec_from_repository(repository_details, package_id, package_version)
|
|
22
|
+
return unless package_id && package_version && !package_version.empty?
|
|
28
23
|
|
|
29
|
-
|
|
24
|
+
feed_url = repository_details[:repository_url]
|
|
25
|
+
auth_header = repository_details[:auth_header]
|
|
30
26
|
|
|
31
|
-
|
|
32
|
-
# this is an azure devops url we can extract the nuspec from the nupkg
|
|
33
|
-
package_data = NupkgFetcher.fetch_nupkg_buffer_from_repository(repository_details, package_id,
|
|
34
|
-
package_version)
|
|
35
|
-
return if package_data.nil?
|
|
27
|
+
nuspec_xml = nil
|
|
36
28
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
package_id_downcased = package_id.downcase
|
|
43
|
-
nuspec_url = "#{base_url}/#{package_id_downcased}/#{package_version}/#{package_id_downcased}.nuspec"
|
|
29
|
+
if azure_package_feed?(feed_url)
|
|
30
|
+
# this is an azure devops url we can extract the nuspec from the nupkg
|
|
31
|
+
package_data = NupkgFetcher.fetch_nupkg_buffer_from_repository(repository_details, package_id,
|
|
32
|
+
package_version)
|
|
33
|
+
return if package_data.nil?
|
|
44
34
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
35
|
+
nuspec_string = extract_nuspec(package_data, package_id)
|
|
36
|
+
nuspec_xml = Nokogiri::XML(nuspec_string)
|
|
37
|
+
else
|
|
38
|
+
# we can use the normal nuget apis to get the nuspec and list out the dependencies
|
|
39
|
+
base_url = feed_url.gsub("/index.json", "-flatcontainer")
|
|
40
|
+
package_id_downcased = package_id.downcase
|
|
41
|
+
nuspec_url = "#{base_url}/#{package_id_downcased}/#{package_version}/#{package_id_downcased}.nuspec"
|
|
49
42
|
|
|
50
|
-
|
|
43
|
+
nuspec_response = Dependabot::RegistryClient.get(
|
|
44
|
+
url: nuspec_url,
|
|
45
|
+
headers: auth_header
|
|
46
|
+
)
|
|
51
47
|
|
|
52
|
-
|
|
53
|
-
nuspec_xml = Nokogiri::XML(nuspec_response_body)
|
|
54
|
-
end
|
|
48
|
+
return unless nuspec_response.status == 200
|
|
55
49
|
|
|
56
|
-
|
|
57
|
-
nuspec_xml
|
|
50
|
+
nuspec_response_body = remove_wrapping_zero_width_chars(nuspec_response.body)
|
|
51
|
+
nuspec_xml = Nokogiri::XML(nuspec_response_body)
|
|
58
52
|
end
|
|
59
53
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
%r{https://pkgs\.dev\.azure\.com/(?<organization>[^/]+)/(?<project>[^/]+)/_packaging/(?<feedId>[^/]+)/nuget/v3/index\.json},
|
|
64
|
-
%r{https://pkgs\.dev\.azure\.com/(?<organization>[^/]+)/_packaging/(?<feedId>[^/]+)/nuget/v3/index\.json(?<project>)},
|
|
65
|
-
%r{https://(?<organization>[^\.\/]+)\.pkgs\.visualstudio\.com/_packaging/(?<feedId>[^/]+)/nuget/v3/index\.json(?<project>)}
|
|
66
|
-
]
|
|
67
|
-
azure_devops_regexs.any? { |reg| reg.match(feed_url) }
|
|
68
|
-
end
|
|
54
|
+
nuspec_xml.remove_namespaces!
|
|
55
|
+
nuspec_xml
|
|
56
|
+
end
|
|
69
57
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
58
|
+
def self.azure_package_feed?(feed_url)
|
|
59
|
+
# if url is azure devops
|
|
60
|
+
azure_devops_regexs = [
|
|
61
|
+
%r{https://pkgs\.dev\.azure\.com/(?<organization>[^/]+)/(?<project>[^/]+)/_packaging/(?<feedId>[^/]+)/nuget/v3/index\.json},
|
|
62
|
+
%r{https://pkgs\.dev\.azure\.com/(?<organization>[^/]+)/_packaging/(?<feedId>[^/]+)/nuget/v3/index\.json(?<project>)},
|
|
63
|
+
%r{https://(?<organization>[^\.\/]+)\.pkgs\.visualstudio\.com/_packaging/(?<feedId>[^/]+)/nuget/v3/index\.json(?<project>)}
|
|
64
|
+
]
|
|
65
|
+
azure_devops_regexs.any? { |reg| reg.match(feed_url) }
|
|
66
|
+
end
|
|
77
67
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
68
|
+
def self.extract_nuspec(zip_stream, package_id)
|
|
69
|
+
Zip::File.open_buffer(zip_stream) do |zip|
|
|
70
|
+
nuspec_entry = zip.find { |entry| entry.name == "#{package_id}.nuspec" }
|
|
71
|
+
return nuspec_entry.get_input_stream.read if nuspec_entry
|
|
82
72
|
end
|
|
73
|
+
nil
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def self.remove_wrapping_zero_width_chars(string)
|
|
77
|
+
string.force_encoding("UTF-8").encode
|
|
78
|
+
.gsub(/\A[\u200B-\u200D\uFEFF]/, "")
|
|
79
|
+
.gsub(/[\u200B-\u200D\uFEFF]\Z/, "")
|
|
83
80
|
end
|
|
84
81
|
end
|
|
85
82
|
end
|
|
@@ -26,6 +26,7 @@ module Dependabot
|
|
|
26
26
|
|
|
27
27
|
def self.get_default_repository_details(dependency_name)
|
|
28
28
|
{
|
|
29
|
+
base_url: "https://api.nuget.org/v3-flatcontainer/",
|
|
29
30
|
repository_url: DEFAULT_REPOSITORY_URL,
|
|
30
31
|
versions_url: "https://api.nuget.org/v3-flatcontainer/" \
|
|
31
32
|
"#{dependency_name.downcase}/index.json",
|
|
@@ -60,9 +61,11 @@ module Dependabot
|
|
|
60
61
|
|
|
61
62
|
body = remove_wrapping_zero_width_chars(response.body)
|
|
62
63
|
base_url = base_url_from_v3_metadata(JSON.parse(body))
|
|
64
|
+
resolved_base_url = base_url || repo_details.fetch(:url).gsub("/index.json", "-flatcontainer")
|
|
63
65
|
search_url = search_url_from_v3_metadata(JSON.parse(body))
|
|
64
66
|
|
|
65
67
|
details = {
|
|
68
|
+
base_url: resolved_base_url,
|
|
66
69
|
repository_url: repo_details.fetch(:url),
|
|
67
70
|
auth_header: auth_header_for_token(repo_details.fetch(:token)),
|
|
68
71
|
repository_type: "v3"
|
|
@@ -120,6 +123,7 @@ module Dependabot
|
|
|
120
123
|
base_url ||= repo_details.fetch(:url)
|
|
121
124
|
|
|
122
125
|
{
|
|
126
|
+
base_url: base_url,
|
|
123
127
|
repository_url: base_url,
|
|
124
128
|
versions_url: File.join(
|
|
125
129
|
base_url,
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dependabot-nuget
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.239.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-12-
|
|
11
|
+
date: 2023-12-28 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: dependabot-common
|
|
@@ -16,14 +16,14 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - '='
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 0.
|
|
19
|
+
version: 0.239.0
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - '='
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 0.
|
|
26
|
+
version: 0.239.0
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rubyzip
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -134,14 +134,14 @@ dependencies:
|
|
|
134
134
|
requirements:
|
|
135
135
|
- - "~>"
|
|
136
136
|
- !ruby/object:Gem::Version
|
|
137
|
-
version: 1.
|
|
137
|
+
version: 1.58.0
|
|
138
138
|
type: :development
|
|
139
139
|
prerelease: false
|
|
140
140
|
version_requirements: !ruby/object:Gem::Requirement
|
|
141
141
|
requirements:
|
|
142
142
|
- - "~>"
|
|
143
143
|
- !ruby/object:Gem::Version
|
|
144
|
-
version: 1.
|
|
144
|
+
version: 1.58.0
|
|
145
145
|
- !ruby/object:Gem::Dependency
|
|
146
146
|
name: rubocop-performance
|
|
147
147
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -267,7 +267,7 @@ licenses:
|
|
|
267
267
|
- Nonstandard
|
|
268
268
|
metadata:
|
|
269
269
|
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
|
270
|
-
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.
|
|
270
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.239.0
|
|
271
271
|
post_install_message:
|
|
272
272
|
rdoc_options: []
|
|
273
273
|
require_paths:
|