bootsnap 1.22.0 → 1.23.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/CHANGELOG.md +5 -0
- data/ext/bootsnap/bootsnap.c +14 -8
- data/lib/bootsnap/compile_cache/iseq.rb +1 -1
- data/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb +1 -1
- data/lib/bootsnap/load_path_cache/path_scanner.rb +65 -51
- data/lib/bootsnap/version.rb +1 -1
- data/lib/bootsnap.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4e0ad269f816c24dc901b6544acb59c5ebd65b22432f39ee69bc3387b9c2b04d
|
|
4
|
+
data.tar.gz: 700f525d90d4e77421ce83e38f8731981a48cc82a8b9a937c29f661972f78d7f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f5859d7fd4b81f1969c55e12b33a957b34b1dc2825d03bc3f7ab60a57d34153cbcdda7a60626ea758fd66877b1b74a58d17b276aa2055f41086488d6ced5317b
|
|
7
|
+
data.tar.gz: c09f2cd48da0ba3bb5e9d3c995ffb86b8b16aec987c311162fc79ca648a66f355e4051d6ae4c5ee486d5ad2d2bc3af32090e15776e1f45129c1ea8c8e6c811ed
|
data/CHANGELOG.md
CHANGED
data/ext/bootsnap/bootsnap.c
CHANGED
|
@@ -194,8 +194,12 @@ bs_rb_scan_dir(VALUE self, VALUE abspath)
|
|
|
194
194
|
struct stat st;
|
|
195
195
|
int dfd = -1;
|
|
196
196
|
|
|
197
|
-
|
|
198
|
-
|
|
197
|
+
while (1) {
|
|
198
|
+
errno = 0;
|
|
199
|
+
|
|
200
|
+
entry = readdir(dirp);
|
|
201
|
+
if (entry == NULL) break;
|
|
202
|
+
|
|
199
203
|
if (entry->d_name[0] == '.') continue;
|
|
200
204
|
|
|
201
205
|
if (RB_UNLIKELY(entry->d_type == DT_UNKNOWN || entry->d_type == DT_LNK)) {
|
|
@@ -212,11 +216,8 @@ bs_rb_scan_dir(VALUE self, VALUE abspath)
|
|
|
212
216
|
}
|
|
213
217
|
|
|
214
218
|
if (fstatat(dfd, entry->d_name, &st, 0)) {
|
|
215
|
-
if (errno == ENOENT)
|
|
216
|
-
|
|
217
|
-
errno = 0;
|
|
218
|
-
continue;
|
|
219
|
-
}
|
|
219
|
+
if (errno == ENOENT) continue; // Broken symlink
|
|
220
|
+
|
|
220
221
|
int err = errno;
|
|
221
222
|
closedir(dirp);
|
|
222
223
|
bs_syserr_fail_dir_entry("fstatat", err, abspath, entry->d_name);
|
|
@@ -249,10 +250,15 @@ bs_rb_scan_dir(VALUE self, VALUE abspath)
|
|
|
249
250
|
}
|
|
250
251
|
}
|
|
251
252
|
|
|
252
|
-
if (
|
|
253
|
+
if (errno) {
|
|
254
|
+
int err = errno;
|
|
255
|
+
closedir(dirp);
|
|
256
|
+
bs_syserr_fail_path("readdir", err, abspath);
|
|
257
|
+
} else if (closedir(dirp)) {
|
|
253
258
|
bs_syserr_fail_path("closedir", errno, abspath);
|
|
254
259
|
return Qundef;
|
|
255
260
|
}
|
|
261
|
+
|
|
256
262
|
return result;
|
|
257
263
|
}
|
|
258
264
|
#endif
|
|
@@ -5,7 +5,7 @@ module Kernel
|
|
|
5
5
|
|
|
6
6
|
alias_method :require, :require # Avoid method redefinition warnings
|
|
7
7
|
|
|
8
|
-
def require(path)
|
|
8
|
+
def require(path)
|
|
9
9
|
return require_without_bootsnap(path) unless Bootsnap::LoadPathCache.enabled?
|
|
10
10
|
|
|
11
11
|
string_path = Bootsnap.rb_get_path(path)
|
|
@@ -18,21 +18,12 @@ module Bootsnap
|
|
|
18
18
|
class << self
|
|
19
19
|
attr_accessor :ignored_directories
|
|
20
20
|
|
|
21
|
-
def ruby_call(
|
|
22
|
-
|
|
23
|
-
return [] unless File.directory?(
|
|
24
|
-
|
|
25
|
-
# If the bundle path is a descendent of this path, we do additional
|
|
26
|
-
# checks to prevent recursing into the bundle path as we recurse
|
|
27
|
-
# through this path. We don't want to scan the bundle path because
|
|
28
|
-
# anything useful in it will be present on other load path items.
|
|
29
|
-
#
|
|
30
|
-
# This can happen if, for example, the user adds '.' to the load path,
|
|
31
|
-
# and the bundle path is '.bundle'.
|
|
32
|
-
contains_bundle_path = BUNDLE_PATH.start_with?(path)
|
|
21
|
+
def ruby_call(root_path)
|
|
22
|
+
root_path, contains_bundle_path, ignored_abs_paths, ignored_dir_names = prepare_scan(root_path)
|
|
23
|
+
return [] unless File.directory?(root_path)
|
|
33
24
|
|
|
34
25
|
requirables = []
|
|
35
|
-
walk(
|
|
26
|
+
walk(root_path, nil, ignored_abs_paths, ignored_dir_names) do |relative_path, absolute_path, is_directory|
|
|
36
27
|
if is_directory
|
|
37
28
|
!contains_bundle_path || !absolute_path.start_with?(BUNDLE_PATH)
|
|
38
29
|
elsif relative_path.end_with?(*REQUIRABLE_EXTENSIONS)
|
|
@@ -42,25 +33,6 @@ module Bootsnap
|
|
|
42
33
|
requirables
|
|
43
34
|
end
|
|
44
35
|
|
|
45
|
-
def walk(absolute_dir_path, relative_dir_path, &block)
|
|
46
|
-
Dir.foreach(absolute_dir_path) do |name|
|
|
47
|
-
next if name.start_with?(".")
|
|
48
|
-
|
|
49
|
-
relative_path = relative_dir_path ? File.join(relative_dir_path, name) : name
|
|
50
|
-
|
|
51
|
-
absolute_path = "#{absolute_dir_path}/#{name}"
|
|
52
|
-
if File.directory?(absolute_path)
|
|
53
|
-
next if ignored_directories.include?(name) || ignored_directories.include?(absolute_path)
|
|
54
|
-
|
|
55
|
-
if yield relative_path, absolute_path, true
|
|
56
|
-
walk(absolute_path, relative_path, &block)
|
|
57
|
-
end
|
|
58
|
-
else
|
|
59
|
-
yield relative_path, absolute_path, false
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
36
|
if RUBY_ENGINE == "ruby" && RUBY_PLATFORM.match?(/darwin|linux|bsd|mswin|mingw|cygwin/)
|
|
65
37
|
require "bootsnap/bootsnap"
|
|
66
38
|
end
|
|
@@ -69,33 +41,35 @@ module Bootsnap
|
|
|
69
41
|
def native_call(root_path)
|
|
70
42
|
# NOTE: if https://bugs.ruby-lang.org/issues/21800 is accepted we should be able
|
|
71
43
|
# to have similar performance with pure Ruby
|
|
72
|
-
|
|
73
|
-
# If the bundle path is a descendent of this path, we do additional
|
|
74
|
-
# checks to prevent recursing into the bundle path as we recurse
|
|
75
|
-
# through this path. We don't want to scan the bundle path because
|
|
76
|
-
# anything useful in it will be present on other load path items.
|
|
77
|
-
#
|
|
78
|
-
# This can happen if, for example, the user adds '.' to the load path,
|
|
79
|
-
# and the bundle path is '.bundle'.
|
|
80
|
-
contains_bundle_path = BUNDLE_PATH.start_with?(root_path)
|
|
44
|
+
root_path, contains_bundle_path, ignored_abs_paths, ignored_dir_names = prepare_scan(root_path)
|
|
81
45
|
|
|
82
46
|
all_requirables, queue = Native.scan_dir(root_path)
|
|
83
47
|
all_requirables.each(&:freeze)
|
|
84
48
|
|
|
85
49
|
queue.reject! do |dir|
|
|
86
|
-
|
|
87
|
-
|
|
50
|
+
if ignored_dir_names&.include?(dir)
|
|
51
|
+
true
|
|
52
|
+
elsif ignored_abs_paths || contains_bundle_path
|
|
53
|
+
absolute_dir = File.join(root_path, dir)
|
|
54
|
+
ignored_abs_paths&.include?(absolute_dir) ||
|
|
55
|
+
(contains_bundle_path && absolute_dir.start_with?(BUNDLE_PATH))
|
|
56
|
+
end
|
|
88
57
|
end
|
|
89
58
|
|
|
90
|
-
while (
|
|
91
|
-
|
|
92
|
-
dirs
|
|
93
|
-
dirs.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
59
|
+
while (relative_path = queue.pop)
|
|
60
|
+
absolute_base = File.join(root_path, relative_path)
|
|
61
|
+
requirables, dirs = Native.scan_dir(absolute_base)
|
|
62
|
+
dirs.reject! do |dir|
|
|
63
|
+
if ignored_dir_names&.include?(dir)
|
|
64
|
+
true
|
|
65
|
+
elsif ignored_abs_paths || contains_bundle_path
|
|
66
|
+
absolute_dir = File.join(absolute_base, dir)
|
|
67
|
+
ignored_abs_paths&.include?(absolute_dir) ||
|
|
68
|
+
(contains_bundle_path && absolute_dir.start_with?(BUNDLE_PATH))
|
|
69
|
+
end
|
|
98
70
|
end
|
|
71
|
+
dirs.map! { |f| File.join(relative_path, f).freeze }
|
|
72
|
+
requirables.map! { |f| File.join(relative_path, f).freeze }
|
|
99
73
|
|
|
100
74
|
all_requirables.concat(requirables)
|
|
101
75
|
queue.concat(dirs)
|
|
@@ -107,6 +81,46 @@ module Bootsnap
|
|
|
107
81
|
else
|
|
108
82
|
alias_method :call, :ruby_call
|
|
109
83
|
end
|
|
84
|
+
|
|
85
|
+
private
|
|
86
|
+
|
|
87
|
+
def prepare_scan(root_path)
|
|
88
|
+
root_path = File.expand_path(root_path.to_s).freeze
|
|
89
|
+
|
|
90
|
+
# If the bundle path is a descendent of this path, we do additional
|
|
91
|
+
# checks to prevent recursing into the bundle path as we recurse
|
|
92
|
+
# through this path. We don't want to scan the bundle path because
|
|
93
|
+
# anything useful in it will be present on other load path items.
|
|
94
|
+
#
|
|
95
|
+
# This can happen if, for example, the user adds '.' to the load path,
|
|
96
|
+
# and the bundle path is '.bundle'.
|
|
97
|
+
contains_bundle_path = BUNDLE_PATH.start_with?(root_path)
|
|
98
|
+
|
|
99
|
+
ignored_abs_paths, ignored_dir_names = ignored_directories.partition { |p| File.absolute_path?(p) }
|
|
100
|
+
ignored_abs_paths = nil if ignored_abs_paths.empty?
|
|
101
|
+
ignored_dir_names = nil if ignored_dir_names.empty?
|
|
102
|
+
|
|
103
|
+
[root_path, contains_bundle_path, ignored_abs_paths, ignored_dir_names]
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def walk(absolute_dir_path, relative_dir_path, ignored_abs_paths, ignored_dir_names, &block)
|
|
107
|
+
Dir.foreach(absolute_dir_path) do |name|
|
|
108
|
+
next if name.start_with?(".")
|
|
109
|
+
|
|
110
|
+
relative_path = relative_dir_path ? File.join(relative_dir_path, name) : name
|
|
111
|
+
|
|
112
|
+
absolute_path = File.join(absolute_dir_path, name)
|
|
113
|
+
if File.directory?(absolute_path)
|
|
114
|
+
next if ignored_dir_names&.include?(name) || ignored_abs_paths&.include?(absolute_path)
|
|
115
|
+
|
|
116
|
+
if yield relative_path, absolute_path, true
|
|
117
|
+
walk(absolute_path, relative_path, ignored_abs_paths, ignored_dir_names, &block)
|
|
118
|
+
end
|
|
119
|
+
else
|
|
120
|
+
yield relative_path, absolute_path, false
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
110
124
|
end
|
|
111
125
|
end
|
|
112
126
|
end
|
data/lib/bootsnap/version.rb
CHANGED
data/lib/bootsnap.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: bootsnap
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.23.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Burke Libbey
|
|
@@ -73,14 +73,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
73
73
|
requirements:
|
|
74
74
|
- - ">="
|
|
75
75
|
- !ruby/object:Gem::Version
|
|
76
|
-
version: 2.
|
|
76
|
+
version: 2.7.0
|
|
77
77
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
78
|
requirements:
|
|
79
79
|
- - ">="
|
|
80
80
|
- !ruby/object:Gem::Version
|
|
81
81
|
version: '0'
|
|
82
82
|
requirements: []
|
|
83
|
-
rubygems_version:
|
|
83
|
+
rubygems_version: 3.6.9
|
|
84
84
|
specification_version: 4
|
|
85
85
|
summary: Boot large ruby/rails apps faster
|
|
86
86
|
test_files: []
|