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 +4 -4
- data/lib/dependabot/bazel/file_fetcher/include_extractor.rb +105 -0
- data/lib/dependabot/bazel/file_fetcher.rb +63 -15
- metadata +5 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cd981b081bfe5c8a8ac42323cd14af68ad628b9ea27b5b419d99ec1310bb92b2
|
|
4
|
+
data.tar.gz: abce68ad678338fb6c3694edad9aa2f5921632a686a317b61645490af9434dc9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
file_paths, directory_paths = extractor.extract_paths
|
|
151
|
+
files
|
|
152
|
+
end
|
|
139
153
|
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
144
|
-
|
|
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
|
-
|
|
149
|
-
|
|
168
|
+
bzl_fetcher = BzlFileFetcher.new(module_file: module_file, fetcher: self)
|
|
169
|
+
bzl_files = bzl_fetcher.fetch_bzl_files
|
|
150
170
|
|
|
151
|
-
|
|
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 +=
|
|
155
|
-
files +=
|
|
176
|
+
files += bzl_files
|
|
177
|
+
files += fetch_paths_and_track_directories(file_paths, directories_with_files)
|
|
156
178
|
|
|
157
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|