dependabot-bazel 0.351.0 → 0.352.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3719498872307185ea49214b1b7ac4d9be385e1f88de3dd475243e1e6828a43e
4
- data.tar.gz: d4e6d299e8d7f66a35ef8dd53dc90b6d072cd7c4b7f26b3d1c5154ecb9434722
3
+ metadata.gz: cd981b081bfe5c8a8ac42323cd14af68ad628b9ea27b5b419d99ec1310bb92b2
4
+ data.tar.gz: abce68ad678338fb6c3694edad9aa2f5921632a686a317b61645490af9434dc9
5
5
  SHA512:
6
- metadata.gz: 0e3ebcbd2e1d19c4d3bb1c27e3230ea5a881294891db33e8e844321157b31ff8a72f1fb7db198c5a5e4c8d3f1c3fcd137d42e5d8902099e5500c9609344749fd
7
- data.tar.gz: 90609272d6e1707e079c13d3a2648c9dd85892207193dbb926fa8644fbfcd511deacc60b4c16b57dfd022b7b9445fe09fb5057d9e264d0f0695d686cabc5048d
6
+ metadata.gz: b3d9642e5a57c726d7a3ea48c57d6e18e54c7e5e3a709b4b5f4fff4d45dffd7e31e96460f86d2e1dbf02f240c05d664394035488a685add01f9323afbce1dc17
7
+ data.tar.gz: 37787ec309abb2c145663290224edc33921f3a9d79391d4f8db76f5ebd92fea2c59c5289641fb524012c19e1e25071c4decd3723f85bb7bccefc3d8d9fceff70
@@ -0,0 +1,105 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "dependabot/bazel/file_fetcher"
5
+ require "dependabot/bazel/file_fetcher/path_converter"
6
+ require "sorbet-runtime"
7
+
8
+ module Dependabot
9
+ module Bazel
10
+ class FileFetcher < Dependabot::FileFetchers::Base
11
+ # Extracts include() statements from MODULE.bazel files and fetches the included files.
12
+ # Bazel's include() directive allows splitting MODULE.bazel content across multiple files.
13
+ # The include() statement uses Bazel label syntax: include("//path:file.MODULE.bazel")
14
+ # See https://bazel.build/rules/lib/globals/module#include
15
+ class IncludeExtractor
16
+ extend T::Sig
17
+
18
+ sig do
19
+ params(
20
+ module_file: DependencyFile,
21
+ fetcher: FileFetcher
22
+ ).void
23
+ end
24
+ def initialize(module_file:, fetcher:)
25
+ @module_file = module_file
26
+ @fetcher = fetcher
27
+ @visited_files = T.let(Set.new, T::Set[String])
28
+ end
29
+
30
+ # Fetches all files included via include() statements, recursively.
31
+ sig { returns([T::Array[DependencyFile], T::Set[String]]) }
32
+ def fetch_included_files
33
+ files = T.let([], T::Array[DependencyFile])
34
+ directories = T.let(Set.new, T::Set[String])
35
+
36
+ content = T.must(@module_file.content)
37
+ include_paths = extract_include_paths(content)
38
+
39
+ include_paths.each do |path|
40
+ next if @visited_files.include?(path)
41
+
42
+ @visited_files.add(path)
43
+
44
+ fetched_file = @fetcher.send(:fetch_file_if_present, path)
45
+ next unless fetched_file
46
+
47
+ files << fetched_file
48
+
49
+ dir = File.dirname(path)
50
+ directories.add(dir) unless dir == "."
51
+
52
+ nested_files, nested_dirs = fetch_nested_includes(fetched_file)
53
+ files.concat(nested_files)
54
+ nested_dirs.each { |d| directories.add(d) }
55
+ end
56
+
57
+ [files, directories]
58
+ end
59
+
60
+ private
61
+
62
+ sig { returns(DependencyFile) }
63
+ attr_reader :module_file
64
+
65
+ sig { returns(FileFetcher) }
66
+ attr_reader :fetcher
67
+
68
+ sig { returns(T::Set[String]) }
69
+ attr_reader :visited_files
70
+
71
+ # Extracts file paths from include() statements.
72
+ # Only extracts workspace-relative paths (//...) and filters out external repositories.
73
+ sig { params(content: String).returns(T::Array[String]) }
74
+ def extract_include_paths(content)
75
+ paths = []
76
+
77
+ # Match include("//path:file") and include("//path/to:file.MODULE.bazel")
78
+ content.scan(%r{include\s*\(\s*"(//[^"]+)"}) do |match|
79
+ label = match[0]
80
+ path = PathConverter.label_to_path(label)
81
+ paths << path unless path.empty?
82
+ end
83
+
84
+ # Match include(":file") for same-directory includes
85
+ content.scan(/include\s*\(\s*"(:[^"]+)"/) do |match|
86
+ label = match[0]
87
+ context_dir = File.dirname(@module_file.name)
88
+ context_dir = nil if context_dir == "."
89
+ path = PathConverter.label_to_path(label, context_dir: context_dir)
90
+ paths << path unless path.empty?
91
+ end
92
+
93
+ paths.uniq
94
+ end
95
+
96
+ sig { params(included_file: DependencyFile).returns([T::Array[DependencyFile], T::Set[String]]) }
97
+ def fetch_nested_includes(included_file)
98
+ nested_extractor = IncludeExtractor.new(module_file: included_file, fetcher: @fetcher)
99
+ nested_extractor.instance_variable_set(:@visited_files, @visited_files)
100
+ nested_extractor.fetch_included_files
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -14,6 +14,7 @@ module Dependabot
14
14
  require_relative "file_fetcher/module_path_extractor"
15
15
  require_relative "file_fetcher/directory_tree_fetcher"
16
16
  require_relative "file_fetcher/downloader_config_fetcher"
17
+ require_relative "file_fetcher/include_extractor"
17
18
 
18
19
  WORKSPACE_FILES = T.let(%w(WORKSPACE WORKSPACE.bazel).freeze, T::Array[String])
19
20
  MODULE_FILE = T.let("MODULE.bazel", String)
@@ -126,35 +127,82 @@ module Dependabot
126
127
 
127
128
  # Fetches files referenced in MODULE.bazel and their associated BUILD files.
128
129
  # Bazel requires BUILD files to recognize directories as valid packages.
130
+ # Also fetches files included via include() statements.
129
131
  sig { returns(T::Array[DependencyFile]) }
130
132
  def referenced_files_from_modules
131
133
  files = T.let([], T::Array[DependencyFile])
132
134
  directories_with_files = T.let(Set.new, T::Set[String])
133
135
  local_override_directories = T.let(Set.new, T::Set[String])
136
+
137
+ included_module_files = fetch_included_module_files(directories_with_files)
138
+ files += included_module_files
139
+ all_module_files = module_files + included_module_files
140
+
141
+ all_module_files.each do |module_file|
142
+ module_refs = fetch_module_referenced_files(module_file, directories_with_files)
143
+ files += module_refs[:files]
144
+ module_refs[:local_override_dirs].each { |dir| local_override_directories.add(dir) }
145
+ end
146
+
134
147
  tree_fetcher = DirectoryTreeFetcher.new(fetcher: self)
148
+ files += tree_fetcher.fetch_build_files_for_directories(directories_with_files)
149
+ files += fetch_local_override_directory_trees(local_override_directories)
135
150
 
136
- module_files.each do |module_file|
137
- extractor = ModulePathExtractor.new(module_file: module_file)
138
- file_paths, directory_paths = extractor.extract_paths
151
+ files
152
+ end
139
153
 
140
- bzl_fetcher = BzlFileFetcher.new(module_file: module_file, fetcher: self)
141
- bzl_files = bzl_fetcher.fetch_bzl_files
154
+ # Fetches files referenced by a single MODULE.bazel file.
155
+ sig do
156
+ params(
157
+ module_file: DependencyFile,
158
+ directories_with_files: T::Set[String]
159
+ ).returns(T::Hash[Symbol, T.untyped])
160
+ end
161
+ def fetch_module_referenced_files(module_file, directories_with_files)
162
+ files = T.let([], T::Array[DependencyFile])
163
+ local_override_dirs = T.let([], T::Array[String])
142
164
 
143
- bzl_files.each do |file|
144
- dir = File.dirname(file.name)
145
- directories_with_files.add(dir) unless dir == "."
146
- end
165
+ extractor = ModulePathExtractor.new(module_file: module_file)
166
+ file_paths, directory_paths = extractor.extract_paths
147
167
 
148
- files += bzl_files
149
- files += fetch_paths_and_track_directories(file_paths, directories_with_files)
168
+ bzl_fetcher = BzlFileFetcher.new(module_file: module_file, fetcher: self)
169
+ bzl_files = bzl_fetcher.fetch_bzl_files
150
170
 
151
- directory_paths.each { |dir| local_override_directories.add(dir) unless dir == "." }
171
+ bzl_files.each do |file|
172
+ dir = File.dirname(file.name)
173
+ directories_with_files.add(dir) unless dir == "."
152
174
  end
153
175
 
154
- files += tree_fetcher.fetch_build_files_for_directories(directories_with_files)
155
- files += fetch_local_override_directory_trees(local_override_directories)
176
+ files += bzl_files
177
+ files += fetch_paths_and_track_directories(file_paths, directories_with_files)
156
178
 
157
- files
179
+ directory_paths.each { |dir| local_override_dirs << dir unless dir == "." }
180
+
181
+ { files: files, local_override_dirs: local_override_dirs }
182
+ end
183
+
184
+ # Fetches all files included via include() statements from module files.
185
+ sig { params(directories: T::Set[String]).returns(T::Array[DependencyFile]) }
186
+ def fetch_included_module_files(directories)
187
+ included_files = T.let([], T::Array[DependencyFile])
188
+ visited = T.let(Set.new, T::Set[String])
189
+
190
+ module_files.each do |module_file|
191
+ visited.add(module_file.name)
192
+ include_extractor = IncludeExtractor.new(module_file: module_file, fetcher: self)
193
+ new_files, include_dirs = include_extractor.fetch_included_files
194
+
195
+ new_files.each do |file|
196
+ unless visited.include?(file.name)
197
+ included_files << file
198
+ visited.add(file.name)
199
+ end
200
+ end
201
+
202
+ include_dirs.each { |dir| directories.add(dir) }
203
+ end
204
+
205
+ included_files
158
206
  end
159
207
 
160
208
  # Fetches files and tracks their directories for BUILD file resolution.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-bazel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.351.0
4
+ version: 0.352.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.351.0
18
+ version: 0.352.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.351.0
25
+ version: 0.352.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: debug
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -246,6 +246,7 @@ files:
246
246
  - lib/dependabot/bazel/file_fetcher/bzl_file_fetcher.rb
247
247
  - lib/dependabot/bazel/file_fetcher/directory_tree_fetcher.rb
248
248
  - lib/dependabot/bazel/file_fetcher/downloader_config_fetcher.rb
249
+ - lib/dependabot/bazel/file_fetcher/include_extractor.rb
249
250
  - lib/dependabot/bazel/file_fetcher/module_path_extractor.rb
250
251
  - lib/dependabot/bazel/file_fetcher/path_converter.rb
251
252
  - lib/dependabot/bazel/file_parser.rb
@@ -268,7 +269,7 @@ licenses:
268
269
  - MIT
269
270
  metadata:
270
271
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
271
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.351.0
272
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.352.0
272
273
  rdoc_options: []
273
274
  require_paths:
274
275
  - lib