bootsnap 0.3.0 → 0.3.1
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
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c6a61ff4456f0b745e1872ed315eef0d9a644c7
|
4
|
+
data.tar.gz: 0515f1b08b95f0d88fb32829f6c99a07494af996
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ce3ba2a352a495e8d8f421ca404273013fcf5ee524e224086e78c4fc106de7505e703481f664fb11068735ead27e4e4b606dc1a67c17fc138b6bf58bcf11c58
|
7
|
+
data.tar.gz: fb992465d5f226f6f2d26ecf7491db4d41c4061a3e0742d9991f202c9c7db209a13e4ec40e5fe9f210e4c5119ada8e1b56637f764b55ef4640d655c91587eb1e
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# 0.3.1
|
2
|
+
|
3
|
+
* Don't whitelist paths under `RbConfig::CONFIG['prefix']` as stable; instead use `['libdir']` (#41).
|
4
|
+
* Catch `EOFError` when reading load-path-cache and regenerate cache.
|
5
|
+
* Support relative paths in load-path-cache.
|
6
|
+
|
1
7
|
# 0.3.0
|
2
8
|
|
3
9
|
* Migrate CompileCache from xattr as a cache backend to a cache directory
|
@@ -46,7 +46,7 @@ module Bootsnap
|
|
46
46
|
# Try to resolve this feature to an absolute path without traversing the
|
47
47
|
# loadpath.
|
48
48
|
def find(feature)
|
49
|
-
reinitialize if stale?
|
49
|
+
reinitialize if dir_changed? || stale?
|
50
50
|
feature = feature.to_s
|
51
51
|
return feature if feature.start_with?(SLASH)
|
52
52
|
return File.expand_path(feature) if feature.start_with?('./')
|
@@ -116,6 +116,16 @@ module Bootsnap
|
|
116
116
|
|
117
117
|
private
|
118
118
|
|
119
|
+
def dir_changed?
|
120
|
+
@prev_dir ||= Dir.pwd
|
121
|
+
if @prev_dir == Dir.pwd
|
122
|
+
false
|
123
|
+
else
|
124
|
+
@prev_dir = Dir.pwd
|
125
|
+
true
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
119
129
|
def push_paths_locked(*paths)
|
120
130
|
@store.transaction do
|
121
131
|
paths.map(&:to_s).each do |path|
|
@@ -124,7 +134,7 @@ module Bootsnap
|
|
124
134
|
entries, dirs = p.entries_and_dirs(@store)
|
125
135
|
# push -> low precedence -> set only if unset
|
126
136
|
dirs.each { |dir| @dirs[dir] ||= true }
|
127
|
-
entries.each { |rel| @index[rel] ||=
|
137
|
+
entries.each { |rel| @index[rel] ||= p.expanded_path }
|
128
138
|
end
|
129
139
|
end
|
130
140
|
end
|
@@ -137,7 +147,7 @@ module Bootsnap
|
|
137
147
|
entries, dirs = p.entries_and_dirs(@store)
|
138
148
|
# unshift -> high precedence -> unconditional set
|
139
149
|
dirs.each { |dir| @dirs[dir] = true }
|
140
|
-
entries.each { |rel| @index[rel] =
|
150
|
+
entries.each { |rel| @index[rel] = p.expanded_path }
|
141
151
|
end
|
142
152
|
end
|
143
153
|
end
|
@@ -30,34 +30,42 @@ module Bootsnap
|
|
30
30
|
false
|
31
31
|
end
|
32
32
|
|
33
|
+
def relative?
|
34
|
+
!path.start_with?(SLASH)
|
35
|
+
end
|
36
|
+
|
33
37
|
# Return a list of all the requirable files and all of the subdirectories
|
34
38
|
# of this +Path+.
|
35
39
|
def entries_and_dirs(store)
|
36
40
|
if stable?
|
37
41
|
# the cached_mtime field is unused for 'stable' paths, but is
|
38
42
|
# set to zero anyway, just in case we change the stability heuristics.
|
39
|
-
_, entries, dirs = store.get(
|
43
|
+
_, entries, dirs = store.get(expanded_path)
|
40
44
|
return [entries, dirs] if entries # cache hit
|
41
45
|
entries, dirs = scan!
|
42
|
-
store.set(
|
46
|
+
store.set(expanded_path, [0, entries, dirs])
|
43
47
|
return [entries, dirs]
|
44
48
|
end
|
45
49
|
|
46
|
-
cached_mtime, entries, dirs = store.get(
|
50
|
+
cached_mtime, entries, dirs = store.get(expanded_path)
|
47
51
|
|
48
|
-
current_mtime = latest_mtime(
|
52
|
+
current_mtime = latest_mtime(expanded_path, dirs || [])
|
49
53
|
return [[], []] if current_mtime == -1 # path does not exist
|
50
54
|
return [entries, dirs] if cached_mtime == current_mtime
|
51
55
|
|
52
56
|
entries, dirs = scan!
|
53
|
-
store.set(
|
57
|
+
store.set(expanded_path, [current_mtime, entries, dirs])
|
54
58
|
[entries, dirs]
|
55
59
|
end
|
56
60
|
|
61
|
+
def expanded_path
|
62
|
+
File.expand_path(path)
|
63
|
+
end
|
64
|
+
|
57
65
|
private
|
58
66
|
|
59
67
|
def scan! # (expensive) returns [entries, dirs]
|
60
|
-
PathScanner.call(
|
68
|
+
PathScanner.call(expanded_path)
|
61
69
|
end
|
62
70
|
|
63
71
|
# last time a directory was modified in this subtree. +dirs+ should be a
|
@@ -83,15 +91,15 @@ module Bootsnap
|
|
83
91
|
VOLATILE = :volatile
|
84
92
|
|
85
93
|
# Built-in ruby lib stuff doesn't change, but things can occasionally be
|
86
|
-
# installed into sitedir, which
|
87
|
-
|
88
|
-
|
94
|
+
# installed into sitedir, which generally lives under libdir.
|
95
|
+
RUBY_LIBDIR = RbConfig::CONFIG['libdir']
|
96
|
+
RUBY_SITEDIR = RbConfig::CONFIG['sitedir']
|
89
97
|
|
90
98
|
def stability
|
91
99
|
@stability ||= begin
|
92
|
-
if Gem.path.detect { |p|
|
100
|
+
if Gem.path.detect { |p| expanded_path.start_with?(p.to_s) }
|
93
101
|
STABLE
|
94
|
-
elsif
|
102
|
+
elsif expanded_path.start_with?(RUBY_LIBDIR) && !expanded_path.start_with?(RUBY_SITEDIR)
|
95
103
|
STABLE
|
96
104
|
else
|
97
105
|
VOLATILE
|
@@ -3,8 +3,6 @@ require_relative '../load_path_cache'
|
|
3
3
|
module Bootsnap
|
4
4
|
module LoadPathCache
|
5
5
|
module PathScanner
|
6
|
-
RelativePathNotSupported = Class.new(StandardError)
|
7
|
-
|
8
6
|
REQUIRABLES_AND_DIRS = "/**/*{#{DOT_RB},#{DL_EXTENSIONS.join(',')},/}"
|
9
7
|
IS_DIR = %r{(.*)/\z}
|
10
8
|
NORMALIZE_NATIVE_EXTENSIONS = !DL_EXTENSIONS.include?(LoadPathCache::DOT_SO)
|
@@ -13,7 +11,6 @@ module Bootsnap
|
|
13
11
|
|
14
12
|
def self.call(path)
|
15
13
|
path = path.to_s
|
16
|
-
raise RelativePathNotSupported unless path.start_with?(SLASH)
|
17
14
|
|
18
15
|
relative_slice = (path.size + 1)..-1
|
19
16
|
# If the bundle path is a descendent of this path, we do additional
|
@@ -59,7 +59,7 @@ module Bootsnap
|
|
59
59
|
@data = begin
|
60
60
|
MessagePack.load(File.binread(@store_path))
|
61
61
|
# handle malformed data due to upgrade incompatability
|
62
|
-
rescue Errno::ENOENT, MessagePack::MalformedFormatError, MessagePack::UnknownExtTypeError
|
62
|
+
rescue Errno::ENOENT, MessagePack::MalformedFormatError, MessagePack::UnknownExtTypeError, EOFError
|
63
63
|
{}
|
64
64
|
end
|
65
65
|
end
|
data/lib/bootsnap/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bootsnap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Burke Libbey
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|