Skip to content

Commit 025fbc3

Browse files
committed
Multi-directory support
1 parent 787ad93 commit 025fbc3

5 files changed

Lines changed: 93 additions & 31 deletions

File tree

gradle/lib/dependabot/gradle/file_fetcher.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class FileFetcher < Dependabot::FileFetchers::Base
2424
T.let(%w(settings.gradle settings.gradle.kts).freeze, T::Array[String])
2525

2626
SUPPORTED_WRAPPER_PROPERTIES_FILE_PATH =
27-
%w(/gradle/wrapper/gradle-wrapper.properties).freeze
27+
%w(gradle/wrapper/gradle-wrapper.properties).freeze
2828

2929
# For now Gradle only supports library .toml files in the main gradle folder
3030
SUPPORTED_VERSION_CATALOG_FILE_PATH =
@@ -149,8 +149,6 @@ def subproject_buildfiles(root_dir)
149149

150150
sig { params(root_dir: String).returns(T.nilable(DependencyFile)) }
151151
def wrapper_properties_file(root_dir)
152-
return nil unless root_dir == "."
153-
154152
gradle_wrapper_properties_file(root_dir)
155153
rescue Dependabot::DependencyFileNotFound
156154
# Wrapper file is optional for Gradle

gradle/lib/dependabot/gradle/update_checker/requirements_updater.rb

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -115,27 +115,36 @@ def update_dynamic_requirement(req_string)
115115

116116
sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
117117
def updated_distribution_requirements
118-
req_version = T.must(requirements[0])
118+
version = T.let(nil, T.nilable(String))
119+
distribution_url = T.let(nil, T.nilable(String))
120+
checksum = T.let(nil, T.nilable(String))
121+
checksum_url = T.let(nil, T.nilable(String))
119122

120-
requirement = req_version[:requirement]
121-
updated_requirement = update_exact_requirement(requirement)
122-
123-
distribution_url = req_version[:source][:url]
124-
updated_distribution_url = distribution_url.gsub(requirement, updated_requirement)
125-
126-
req_version = req_version.merge(
127-
requirement: updated_requirement,
128-
source: req_version[:source].merge(url: updated_distribution_url)
129-
)
130-
return [req_version] unless requirements.size > 1
131-
132-
req_checksum = T.must(requirements[1])
133-
checksum_url, checksum = DistributionsFinder.resolve_checksum(updated_distribution_url)
134-
req_checksum = req_checksum.merge(
135-
requirement: checksum,
136-
source: req_checksum[:source].merge(url: checksum_url)
137-
)
138-
[req_version, req_checksum]
123+
requirements.map do |req|
124+
source = req[:source]
125+
next req unless source
126+
127+
case source[:property]
128+
when "distributionUrl"
129+
if version.nil?
130+
requirement = req[:requirement]
131+
version = update_exact_requirement(requirement)
132+
distribution_url = source[:url].gsub(requirement, version)
133+
end
134+
req.merge(
135+
requirement: version,
136+
source: source.merge(url: distribution_url)
137+
)
138+
when "distributionUrlSha256Sum"
139+
checksum_url, checksum = DistributionsFinder.resolve_checksum(T.must(distribution_url)) if checksum.nil?
140+
req.merge(
141+
requirement: checksum,
142+
source: source.merge(url: checksum_url)
143+
)
144+
else
145+
next req
146+
end
147+
end
139148
end
140149

141150
sig { override.returns(T::Class[Version]) }

gradle/spec/dependabot/gradle/file_fetcher_spec.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ def stub_no_content_request(path)
136136
before do
137137
stub_content_request("buildSrc?ref=sha", "contents_java.json")
138138
stub_content_request("buildSrc/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
139+
stub_no_content_request("buildSrc/gradle/wrapper?ref=sha")
139140
stub_no_content_request("buildSrc/gradle.lockfile?ref=sha")
140141
end
141142

@@ -167,6 +168,7 @@ def stub_no_content_request(path)
167168
stub_content_request("?ref=sha", "contents_java_with_buildsrc_and_settings.json")
168169
stub_content_request("settings.gradle?ref=sha", "contents_java_settings_explicit_buildsrc.json")
169170
stub_content_request("included?ref=sha", "contents_java.json")
171+
stub_no_content_request("included/gradle/wrapper?ref=sha")
170172
stub_content_request("included/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
171173
stub_no_content_request("included/gradle.lockfile?ref=sha")
172174
end
@@ -191,6 +193,7 @@ def stub_no_content_request(path)
191193
stub_content_request("app/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
192194
stub_no_content_request("app/gradle.lockfile?ref=sha")
193195
stub_content_request("included?ref=sha", "contents_java_with_settings.json")
196+
stub_no_content_request("included/gradle/wrapper?ref=sha")
194197
stub_content_request("included/settings.gradle?ref=sha", "contents_java_simple_settings.json")
195198
stub_content_request("included/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
196199
stub_no_content_request("included/gradle.lockfile?ref=sha")
@@ -218,12 +221,14 @@ def stub_no_content_request(path)
218221
stub_content_request("app/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
219222
stub_no_content_request("app/gradle.lockfile?ref=sha")
220223
stub_content_request("included?ref=sha", "contents_java_with_settings.json")
224+
stub_no_content_request("included/gradle/wrapper?ref=sha")
221225
stub_content_request("included/settings.gradle?ref=sha", "contents_java_simple_settings.json")
222226
stub_content_request("included/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
223227
stub_no_content_request("included/gradle.lockfile?ref=sha")
224228
stub_content_request("included/app/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
225229
stub_no_content_request("included/app/gradle.lockfile?ref=sha")
226230
stub_content_request("included2?ref=sha", "contents_java_with_settings.json")
231+
stub_no_content_request("included2/gradle/wrapper?ref=sha")
227232
stub_content_request("included2/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
228233
stub_no_content_request("included2/gradle.lockfile?ref=sha")
229234
stub_content_request("included2/settings.gradle?ref=sha", "contents_java_simple_settings.json")
@@ -253,22 +258,26 @@ def stub_no_content_request(path)
253258
stub_content_request("app/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
254259
stub_no_content_request("app/gradle.lockfile?ref=sha")
255260
stub_content_request("included?ref=sha", "contents_java_with_settings.json")
261+
stub_no_content_request("included/gradle/wrapper?ref=sha")
256262
stub_content_request("included/settings.gradle?ref=sha", "contents_java_settings_1_included_build.json")
257263
stub_content_request("included/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
258264
stub_no_content_request("included/gradle.lockfile?ref=sha")
259265
stub_content_request("included/app/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
260266
stub_no_content_request("included/app/gradle.lockfile?ref=sha")
261267
stub_content_request("included/included?ref=sha", "contents_java_with_settings.json")
268+
stub_no_content_request("included/included/gradle/wrapper?ref=sha")
262269
stub_content_request("included/included/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
263270
stub_no_content_request("included/included/gradle.lockfile?ref=sha")
264271
stub_content_request("included/included/settings.gradle?ref=sha",
265272
"contents_java_settings_1_included_build.json")
266273
stub_content_request("included/included/app/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
267274
stub_no_content_request("included/included/app/gradle.lockfile?ref=sha")
268275
stub_content_request("included/included/included?ref=sha", "contents_java_with_buildsrc.json")
276+
stub_no_content_request("included/included/included/gradle/wrapper?ref=sha")
269277
stub_content_request("included/included/included/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
270278
stub_no_content_request("included/included/included/gradle.lockfile?ref=sha")
271279
stub_content_request("included/included/included/buildSrc?ref=sha", "contents_java.json")
280+
stub_no_content_request("included/included/included/buildSrc/gradle/wrapper?ref=sha")
272281
stub_content_request("included/included/included/buildSrc/build.gradle?ref=sha",
273282
"contents_java_basic_buildfile.json")
274283
end
@@ -298,6 +307,7 @@ def stub_no_content_request(path)
298307
stub_content_request("app/build.gradle?ref=sha", "contents_java_basic_buildfile.json")
299308
stub_no_content_request("app/gradle.lockfile?ref=sha")
300309
stub_content_request("included?ref=sha", "contents_java.json")
310+
stub_no_content_request("included/gradle/wrapper?ref=sha")
301311
stub_content_request("included/build.gradle?ref=sha", "contents_java_buildfile_with_script_plugins.json")
302312
stub_no_content_request("included/gradle.lockfile?ref=sha")
303313
stub_content_request("included/gradle/dependencies.gradle?ref=sha", "contents_java_simple_settings.json")

gradle/spec/dependabot/gradle/file_parser_spec.rb

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -818,12 +818,12 @@
818818
end
819819

820820
describe "wrapper properties file" do
821-
shared_examples "wrapper_properties_test" do |version, type, checksum|
821+
shared_examples "wrapper_properties_test" do |folder, version, type, checksum|
822822
describe "gradle #{version}, distribution #{type}" do
823823
let(:files) do
824824
[
825825
Dependabot::DependencyFile.new(
826-
name: "gradle/wrapper/gradle-wrapper.properties",
826+
name: "#{folder}gradle/wrapper/gradle-wrapper.properties",
827827
content: fixture("wrapper_properties_file",
828828
"gradle-wrapper-#{version}-#{type}#{checksum ? '-checksum' : ''}.properties")
829829
)
@@ -839,7 +839,7 @@
839839
requirements = [
840840
{
841841
requirement: version,
842-
file: "gradle/wrapper/gradle-wrapper.properties",
842+
file: "#{folder}gradle/wrapper/gradle-wrapper.properties",
843843
groups: [],
844844
source: {
845845
type: "gradle-distribution",
@@ -851,7 +851,7 @@
851851
if checksum
852852
requirements << {
853853
requirement: checksum,
854-
file: "gradle/wrapper/gradle-wrapper.properties",
854+
file: "#{folder}gradle/wrapper/gradle-wrapper.properties",
855855
groups: [],
856856
source: {
857857
type: "gradle-distribution",
@@ -870,11 +870,14 @@
870870
end
871871
end
872872

873-
it_behaves_like "wrapper_properties_test", "8.14.2", "bin", nil
874-
it_behaves_like "wrapper_properties_test", "8.14.2", "all", nil
875-
it_behaves_like "wrapper_properties_test", "9.0.0", "bin",
873+
it_behaves_like "wrapper_properties_test", "/", "8.14.2", "bin", nil
874+
it_behaves_like "wrapper_properties_test", "/", "8.14.2", "all", nil
875+
it_behaves_like "wrapper_properties_test", "/", "9.0.0", "bin",
876876
"8fad3d78296ca518113f3d29016617c7f9367dc005f932bd9d93bf45ba46072b"
877-
it_behaves_like "wrapper_properties_test", "9.0.0", "all",
877+
it_behaves_like "wrapper_properties_test", "/", "9.0.0", "all",
878+
"f759b8dd5204e2e3fa4ca3e73f452f087153cf81bac9561eeb854229cc2c5365"
879+
it_behaves_like "wrapper_properties_test", "/buildSrc/", "8.14.2", "bin", nil
880+
it_behaves_like "wrapper_properties_test", "/buildSrc/", "9.0.0", "all",
878881
"f759b8dd5204e2e3fa4ca3e73f452f087153cf81bac9561eeb854229cc2c5365"
879882
end
880883

gradle/spec/dependabot/gradle/update_checker/requirements_updater_spec.rb

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,48 @@
226226
])
227227
end
228228
end
229+
230+
context "when multiple properties files" do
231+
let(:requirements) do
232+
[distribution_req, checksum_req, distribution_req.merge(
233+
file: "another/gradle/wrapper/gradle-wrapper.properties"
234+
)]
235+
end
236+
237+
it "does not update the requirement" do
238+
expect(updater.updated_requirements).not_to eq(requirements)
239+
expect(updater.updated_requirements).to eq([
240+
{
241+
requirement: "9.0.0",
242+
file: "gradle/wrapper/gradle-wrapper.properties",
243+
source: {
244+
type: "gradle-distribution",
245+
url: "https://services.gradle.org/distributions/gradle-9.0.0-all.zip",
246+
property: "distributionUrl"
247+
},
248+
groups: []
249+
}, {
250+
requirement: "f759b8dd5204e2e3fa4ca3e73f452f087153cf81bac9561eeb854229cc2c5365",
251+
file: "gradle/wrapper/gradle-wrapper.properties",
252+
source: {
253+
type: "gradle-distribution",
254+
url: "https://services.gradle.org/distributions/gradle-9.0.0-all.zip.sha256",
255+
property: "distributionUrlSha256Sum"
256+
},
257+
groups: []
258+
}, {
259+
requirement: "9.0.0",
260+
file: "another/gradle/wrapper/gradle-wrapper.properties",
261+
source: {
262+
type: "gradle-distribution",
263+
url: "https://services.gradle.org/distributions/gradle-9.0.0-all.zip",
264+
property: "distributionUrl"
265+
},
266+
groups: []
267+
}
268+
])
269+
end
270+
end
229271
end
230272
end
231273
end

0 commit comments

Comments
 (0)