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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1ab247855b4e6a35b2db80b44f2d3da184fd9780e9a4faa3d35d952e15398839
4
- data.tar.gz: c8fd54ed988e11df7e934e9ff4f30f7dfb6440b4b9a2ecd2eaf3dbf9aefa61fd
3
+ metadata.gz: 4e0ad269f816c24dc901b6544acb59c5ebd65b22432f39ee69bc3387b9c2b04d
4
+ data.tar.gz: 700f525d90d4e77421ce83e38f8731981a48cc82a8b9a937c29f661972f78d7f
5
5
  SHA512:
6
- metadata.gz: 4a7225b866cbe788281af91aa690c75191e19bc09f4d8695a58557e024193d4b0924bbf9892cbb84dad93658eda9ff46c609b113c0b588660ac318e0b9176f1f
7
- data.tar.gz: cadb844c862e9185befec65d7fa53beb6940945ebbddbea48ab30fd22b88f19aa773baa856c414522f5acf1a1c2a8aeafa75d72fb5a86cde5ebc8557172d049c
6
+ metadata.gz: f5859d7fd4b81f1969c55e12b33a957b34b1dc2825d03bc3f7ab60a57d34153cbcdda7a60626ea758fd66877b1b74a58d17b276aa2055f41086488d6ced5317b
7
+ data.tar.gz: c09f2cd48da0ba3bb5e9d3c995ffb86b8b16aec987c311162fc79ca648a66f355e4051d6ae4c5ee486d5ad2d2bc3af32090e15776e1f45129c1ea8c8e6c811ed
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Unreleased
2
2
 
3
+ # 1.23.0
4
+
5
+ * Require Ruby 2.7.
6
+ * Fix support for absolute paths in `BOOTSNAP_IGNORE_DIRECTORIES`.
7
+
3
8
  # 1.22.0
4
9
 
5
10
  * Better fix for the `opendir` crash.
@@ -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
- errno = 0;
198
- while ((entry = readdir(dirp))) {
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
- // Broken symlinK
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 (closedir(dirp)) {
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
@@ -97,7 +97,7 @@ module Bootsnap
97
97
  end
98
98
 
99
99
  def compile_option=(hash)
100
- super(hash)
100
+ super
101
101
  Bootsnap::CompileCache::ISeq.compile_option_updated
102
102
  end
103
103
  end
@@ -5,7 +5,7 @@ module Kernel
5
5
 
6
6
  alias_method :require, :require # Avoid method redefinition warnings
7
7
 
8
- def require(path) # rubocop:disable Lint/DuplicateMethods
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(path)
22
- path = File.expand_path(path.to_s).freeze
23
- return [] unless File.directory?(path)
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(path, nil) do |relative_path, absolute_path, is_directory|
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
- ignored_directories.include?(dir) ||
87
- (contains_bundle_path && dir.start_with?(BUNDLE_PATH))
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 (path = queue.pop)
91
- requirables, dirs = Native.scan_dir(File.join(root_path, path))
92
- dirs.reject! { |dir| ignored_directories.include?(dir) }
93
- dirs.map! { |f| File.join(path, f).freeze }
94
- requirables.map! { |f| File.join(path, f).freeze }
95
-
96
- if contains_bundle_path
97
- dirs.reject! { |dir| dir.start_with?(BUNDLE_PATH) }
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bootsnap
4
- VERSION = "1.22.0"
4
+ VERSION = "1.23.0"
5
5
  end
data/lib/bootsnap.rb CHANGED
@@ -150,7 +150,7 @@ module Bootsnap
150
150
  end
151
151
 
152
152
  # Allow the C extension to redefine `rb_get_path` without warning.
153
- alias_method :rb_get_path, :rb_get_path # rubocop:disable Lint/DuplicateMethods
153
+ alias_method :rb_get_path, :rb_get_path
154
154
 
155
155
  private
156
156
 
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.22.0
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.6.0
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: 4.0.3
83
+ rubygems_version: 3.6.9
84
84
  specification_version: 4
85
85
  summary: Boot large ruby/rails apps faster
86
86
  test_files: []