豆豆友情提示:这是一个非官方 GitHub 代理镜像,主要用于网络测试或访问加速。请勿在此进行登录、注册或处理任何敏感信息。进行这些操作请务必访问官方网站 github.com。 Raw 内容也通过此代理提供。
Skip to content

Commit d24302f

Browse files
committed
Adding GroupDependencySelector filter to group pull request
1 parent 4746cf8 commit d24302f

File tree

2 files changed

+115
-0
lines changed

2 files changed

+115
-0
lines changed

updater/lib/dependabot/updater/operations/create_group_update_pull_request.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# frozen_string_literal: true
33

44
require "dependabot/updater/group_update_creation"
5+
require "dependabot/updater/group_dependency_selector"
56
require "sorbet-runtime"
67

78
# This class implements our strategy for creating a single Pull Request which
@@ -123,6 +124,17 @@ def dependency_change
123124
dependency_change.merge_changes!(T.must(dependency_changes[1..-1])) if dependency_changes.count > 1
124125
@dependency_change = T.let(dependency_change, T.nilable(Dependabot::DependencyChange))
125126
end
127+
128+
# Apply GroupDependencySelector filtering to ensure only group-eligible dependencies
129+
if @dependency_change
130+
selector = Dependabot::Updater::GroupDependencySelector.new(
131+
group: group,
132+
dependency_snapshot: dependency_snapshot
133+
)
134+
selector.filter_to_group!(@dependency_change)
135+
end
136+
137+
@dependency_change
126138
end
127139

128140
sig { void }

updater/spec/dependabot/updater/operations/create_group_update_pull_request_spec.rb

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
require "dependabot/service"
1111
require "dependabot/updater/error_handler"
1212
require "dependabot/updater/operations/create_group_update_pull_request"
13+
require "dependabot/updater/group_dependency_selector"
1314
require "dependabot/dependency_change_builder"
1415
require "dependabot/notices"
1516

@@ -173,6 +174,108 @@
173174
create_group_update_pull_request.perform
174175
end
175176
end
177+
178+
context "when GroupDependencySelector filtering is enabled" do
179+
let(:dependency_b) do
180+
Dependabot::Dependency.new(
181+
name: "dummy-pkg-b",
182+
version: "1.0.0",
183+
requirements: [{
184+
file: "Gemfile",
185+
requirement: "~> 1.0.0",
186+
groups: ["default"],
187+
source: nil
188+
}],
189+
package_manager: "bundler",
190+
metadata: { all_versions: ["1.0.0"] }
191+
)
192+
end
193+
194+
let(:dependency_group) do
195+
Dependabot::DependencyGroup.new(
196+
name: "dummy-group",
197+
rules: { "patterns" => ["dummy-pkg-a"] }
198+
)
199+
end
200+
201+
let(:stub_dependency_change_with_multiple_deps) do
202+
Dependabot::DependencyChange.new(
203+
job: job,
204+
updated_dependencies: [dependency, dependency_b],
205+
updated_dependency_files: []
206+
)
207+
end
208+
209+
before do
210+
Dependabot::Experiments.register(:group_membership_enforcement, true)
211+
# Mock the job to allow all updates for simplicity
212+
allow(job).to receive(:allowed_update?).and_return(true)
213+
end
214+
215+
it "filters out dependencies not in the group" do
216+
# Override the dependency change builder to return our test change
217+
allow(create_group_update_pull_request).to receive(:compile_all_dependency_changes_for)
218+
.with(dependency_group)
219+
.and_return(stub_dependency_change_with_multiple_deps)
220+
221+
result = create_group_update_pull_request.send(:dependency_change)
222+
223+
# Only dummy-pkg-a should remain after filtering (dummy-pkg-b should be filtered out)
224+
expect(result.updated_dependencies.map(&:name)).to eq(["dummy-pkg-a"])
225+
end
226+
227+
it "does not filter when group_membership_enforcement is disabled" do
228+
Dependabot::Experiments.register(:group_membership_enforcement, false)
229+
230+
# Override the dependency change builder to return our test change
231+
allow(create_group_update_pull_request).to receive(:compile_all_dependency_changes_for)
232+
.with(dependency_group)
233+
.and_return(stub_dependency_change_with_multiple_deps)
234+
235+
result = create_group_update_pull_request.send(:dependency_change)
236+
237+
# Both dependencies should remain when filtering is disabled
238+
expect(result.updated_dependencies.map(&:name)).to contain_exactly("dummy-pkg-a", "dummy-pkg-b")
239+
end
240+
241+
it "handles empty dependency changes gracefully" do
242+
empty_change = Dependabot::DependencyChange.new(
243+
job: job,
244+
updated_dependencies: [],
245+
updated_dependency_files: []
246+
)
247+
248+
allow(create_group_update_pull_request).to receive(:compile_all_dependency_changes_for)
249+
.with(dependency_group)
250+
.and_return(empty_change)
251+
252+
result = create_group_update_pull_request.send(:dependency_change)
253+
254+
expect(result.updated_dependencies).to be_empty
255+
end
256+
257+
it "preserves dependency files during filtering" do
258+
dependency_file = instance_double(
259+
Dependabot::DependencyFile,
260+
name: "Gemfile.lock",
261+
directory: "."
262+
)
263+
change_with_files = Dependabot::DependencyChange.new(
264+
job: job,
265+
updated_dependencies: [dependency, dependency_b],
266+
updated_dependency_files: [dependency_file]
267+
)
268+
269+
allow(create_group_update_pull_request).to receive(:compile_all_dependency_changes_for)
270+
.with(dependency_group)
271+
.and_return(change_with_files)
272+
273+
result = create_group_update_pull_request.send(:dependency_change)
274+
275+
# Files should be preserved even after dependency filtering
276+
expect(result.updated_dependency_files).to eq([dependency_file])
277+
end
278+
end
176279
end
177280
end
178281
end

0 commit comments

Comments
 (0)