linecache 0.46 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/ChangeLog +642 -0
- data/NEWS +12 -7
- data/README +16 -37
- data/Rakefile +40 -58
- data/ext/{extconf.rb → linecache/extconf.rb} +1 -1
- data/ext/{trace_nums.c → linecache/trace_nums.c} +0 -0
- data/ext/{trace_nums.h → linecache/trace_nums.h} +0 -0
- data/lib/linecache.rb +66 -82
- data/lib/linecache/trace_nums.rb +11 -0
- data/lib/{tracelines.rb → linecache/tracelines.rb} +4 -5
- data/lib/{version.rb → linecache/version.rb} +1 -1
- data/test/test-lnum.rb +1 -1
- data/test/test-tracelines.rb +2 -2
- metadata +41 -68
data/NEWS
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
+
1.3.1
|
2
|
+
15-09-19
|
3
|
+
|
4
|
+
- JRuby fix, sync with ruby-2.1 and ruby-1.9
|
5
|
+
|
1
6
|
0.46
|
2
7
|
06-12-19
|
3
|
-
- A require_relative dependency snuck in.
|
8
|
+
- A require_relative dependency snuck in.
|
4
9
|
Add a rbx-require-relative to handle this.
|
5
10
|
|
6
11
|
0.45
|
@@ -12,7 +17,7 @@
|
|
12
17
|
06-12-08
|
13
18
|
- tolerance for finding windows extension in lib rather than ext.
|
14
19
|
|
15
|
-
0.41
|
20
|
+
0.41
|
16
21
|
- add test/data/* to gem.
|
17
22
|
|
18
23
|
0.4
|
@@ -21,19 +26,19 @@
|
|
21
26
|
0.3
|
22
27
|
- Add tracelines: get line numbers that can be stopped at.
|
23
28
|
|
24
|
-
- Add routines to allow line-number
|
25
|
-
remapping and filename remapping.
|
29
|
+
- Add routines to allow line-number
|
30
|
+
remapping and filename remapping.
|
26
31
|
|
27
32
|
- Add access methods to get the number of lines in a file.
|
28
33
|
|
29
34
|
0.2
|
30
35
|
- Make this work with ruby-debug-base. Add reload-on-change parameters.
|
31
|
-
add checkcache, cache, cached? sha1, and stat methods.
|
32
|
-
|
36
|
+
add checkcache, cache, cached? sha1, and stat methods.
|
37
|
+
|
33
38
|
- Use SCRIPT_LINES__.
|
34
39
|
|
35
40
|
0.1
|
36
41
|
|
37
42
|
- Initial release of LineCache, a module for reading and caching lines.
|
38
43
|
|
39
|
-
$Id
|
44
|
+
$Id$
|
data/README
CHANGED
@@ -1,50 +1,29 @@
|
|
1
|
-
= LineCache - A module to read and cache file information of a Ruby program.
|
2
|
-
|
3
|
-
== SYNOPSIS
|
4
|
-
|
5
1
|
The LineCache module allows one to get any line from any file, caching
|
6
2
|
the lines and file information on first access to the file. Although
|
7
3
|
the file may be any file, the common use is when the file is a Ruby
|
8
4
|
script since parsing of the file is done to figure out where the
|
9
|
-
statement boundaries are.
|
5
|
+
statement boundaries are, and we also cache syntax formatting.
|
10
6
|
|
11
7
|
The routines here may be is useful when a small random sets of lines
|
12
8
|
are read from a single file, in particular in a debugger to show
|
13
9
|
source lines.
|
14
10
|
|
15
|
-
|
16
|
-
|
17
|
-
require 'linecache'
|
18
|
-
lines = LineCache::getlines('/tmp/myruby.rb')
|
19
|
-
# The following lines have same effect as the above.
|
20
|
-
$: << '/tmp'
|
21
|
-
Dir.chdir('/tmp') {lines = LineCache::getlines('myruby.rb')
|
22
|
-
|
23
|
-
line = LineCache::getline('/tmp/myruby.rb', 6)
|
24
|
-
# Note lines[6] == line (if /tmp/myruby.rb has 6 lines)
|
25
|
-
|
26
|
-
LineCache::clear_file_cache
|
27
|
-
LineCache::clear_file_cache('/tmp/myruby.rb')
|
28
|
-
LineCache::update_cache # Check for modifications of all cached files.
|
29
|
-
|
30
|
-
== Credits
|
31
|
-
|
32
|
-
This is a port of the module of the same name from the Python distribution.
|
33
|
-
|
34
|
-
The idea for how TraceLineNumbers works, and some code was taken
|
35
|
-
from ParseTree by Ryan Davis.
|
36
|
-
|
37
|
-
== Other stuff
|
11
|
+
*Example*:
|
38
12
|
|
39
|
-
|
40
|
-
|
41
|
-
|
13
|
+
```ruby
|
14
|
+
require 'linecache'
|
15
|
+
lines = LineCache::getlines('/tmp/myruby.rb')
|
16
|
+
# The following lines have same effect as the above.
|
17
|
+
$: << '/tmp'
|
18
|
+
Dir.chdir('/tmp') {lines = LineCache::getlines('myruby.rb')
|
42
19
|
|
43
|
-
|
20
|
+
line = LineCache::getline('/tmp/myruby.rb', 6)
|
21
|
+
# Note lines[6] == line (if /tmp/myruby.rb has 6 lines)
|
44
22
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
23
|
+
LineCache::clear_file_cache
|
24
|
+
LineCache::clear_file_cache('/tmp/myruby.rb')
|
25
|
+
LineCache::update_cache # Check for modifications of all cached files.
|
26
|
+
```
|
49
27
|
|
50
|
-
|
28
|
+
Git branches *ruby-1.9* and *ruby-2.1* for code for those respective
|
29
|
+
Ruby versions. A patched version of Ruby is needed for this to work. The patches sources are [here](https://code.google.com/p/ruby-19-debugger/).
|
data/Rakefile
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
2
|
# -*- Ruby -*-
|
3
3
|
require 'rubygems'
|
4
|
-
require '
|
5
|
-
require '
|
4
|
+
require 'rubygems/package_task'
|
5
|
+
require 'rdoc/task'
|
6
6
|
require 'rake/testtask'
|
7
7
|
|
8
8
|
SO_NAME = 'trace_nums.so'
|
9
9
|
|
10
10
|
ROOT_DIR = File.dirname(__FILE__)
|
11
|
-
load File.join %W(#{ROOT_DIR} lib version.rb)
|
11
|
+
load File.join %W(#{ROOT_DIR} lib linecache version.rb)
|
12
12
|
|
13
13
|
PKG_VERSION = LineCache::VERSION
|
14
14
|
PKG_NAME = 'linecache'
|
@@ -23,18 +23,18 @@ FILES = FileList[
|
|
23
23
|
'NEWS',
|
24
24
|
'README',
|
25
25
|
'Rakefile',
|
26
|
-
'ext/trace_nums.c',
|
27
|
-
'ext/trace_nums.h',
|
28
|
-
'ext/extconf.rb',
|
29
|
-
'lib
|
26
|
+
'ext/linecache/trace_nums.c',
|
27
|
+
'ext/linecache/trace_nums.h',
|
28
|
+
'ext/linecache/extconf.rb',
|
29
|
+
'lib/**/*.rb',
|
30
30
|
'test/*.rb',
|
31
31
|
'test/data/*.rb',
|
32
32
|
'test/short-file'
|
33
|
-
]
|
33
|
+
]
|
34
34
|
|
35
35
|
desc 'Test everything'
|
36
36
|
Rake::TestTask.new(:test) do |t|
|
37
|
-
t.libs << '
|
37
|
+
t.libs << 'ext'
|
38
38
|
t.pattern = 'test/test-*.rb'
|
39
39
|
t.options = '--verbose' if $VERBOSE
|
40
40
|
end
|
@@ -42,7 +42,7 @@ task :test => :lib
|
|
42
42
|
|
43
43
|
desc 'Create the core ruby-debug shared library extension'
|
44
44
|
task :lib do
|
45
|
-
Dir.chdir('ext') do
|
45
|
+
Dir.chdir('ext/linecache') do
|
46
46
|
system("#{Gem.ruby} extconf.rb && make")
|
47
47
|
end
|
48
48
|
end
|
@@ -51,9 +51,9 @@ end
|
|
51
51
|
desc 'Test everything - same as test.'
|
52
52
|
task :check => :test
|
53
53
|
|
54
|
-
desc 'Create a GNU-style ChangeLog via
|
54
|
+
desc 'Create a GNU-style ChangeLog via git2cl'
|
55
55
|
task :ChangeLog do
|
56
|
-
system('
|
56
|
+
system('git log --pretty --numstat --summary | git2cl > ChangeLog')
|
57
57
|
end
|
58
58
|
|
59
59
|
gem_file = nil
|
@@ -61,7 +61,7 @@ gem_file = nil
|
|
61
61
|
# Base GEM Specification
|
62
62
|
default_spec = Gem::Specification.new do |spec|
|
63
63
|
spec.name = 'linecache'
|
64
|
-
|
64
|
+
|
65
65
|
spec.homepage = 'http://rubyforge.org/projects/rocky-hacks/linecache'
|
66
66
|
spec.summary = 'Read file with caching'
|
67
67
|
spec.description = <<-EOF
|
@@ -73,19 +73,18 @@ EOF
|
|
73
73
|
|
74
74
|
spec.author = 'R. Bernstein'
|
75
75
|
spec.email = 'rockyb@rubyforge.net'
|
76
|
+
spec.licenses = ['GPL2']
|
76
77
|
spec.platform = Gem::Platform::RUBY
|
77
78
|
spec.require_path = 'lib'
|
78
|
-
spec.files = FILES.to_a
|
79
|
-
spec.
|
80
|
-
spec.extensions = ['ext/extconf.rb']
|
79
|
+
spec.files = FILES.to_a
|
80
|
+
spec.extensions = ['ext/linecache/extconf.rb']
|
81
81
|
|
82
82
|
spec.required_ruby_version = '>= 1.8.7'
|
83
83
|
spec.date = Time.now
|
84
|
-
|
85
|
-
|
84
|
+
|
86
85
|
# rdoc
|
87
86
|
spec.has_rdoc = true
|
88
|
-
spec.extra_rdoc_files = ['README', 'lib/linecache.rb', 'lib/tracelines.rb']
|
87
|
+
spec.extra_rdoc_files = ['README', 'lib/linecache.rb', 'lib/linecache/tracelines.rb']
|
89
88
|
|
90
89
|
spec.test_files = FileList['test/*.rb']
|
91
90
|
gem_file = "#{spec.name}-#{spec.version}.gem"
|
@@ -93,7 +92,7 @@ EOF
|
|
93
92
|
end
|
94
93
|
|
95
94
|
# Rake task to build the default package
|
96
|
-
|
95
|
+
Gem::PackageTask.new(default_spec) do |pkg|
|
97
96
|
pkg.need_tar = true
|
98
97
|
end
|
99
98
|
|
@@ -105,7 +104,6 @@ win_spec.extensions = []
|
|
105
104
|
## win_spec.platform = Gem::Platform::WIN32 # deprecated
|
106
105
|
win_spec.platform = 'mswin32'
|
107
106
|
win_spec.files += ["lib/#{SO_NAME}"]
|
108
|
-
win_spec.add_dependency('rbx-require-relative', '> 0.0.4')
|
109
107
|
|
110
108
|
desc 'Create Windows Gem'
|
111
109
|
task :win32_gem do
|
@@ -124,29 +122,8 @@ task :win32_gem do
|
|
124
122
|
rm(target)
|
125
123
|
end
|
126
124
|
|
127
|
-
desc 'Publish linecache to RubyForge.'
|
128
|
-
task :publish do
|
129
|
-
require 'rake/contrib/sshpublisher'
|
130
|
-
|
131
|
-
# Get ruby-debug path.
|
132
|
-
ruby_debug_path = File.expand_path(File.dirname(__FILE__))
|
133
|
-
|
134
|
-
publisher = Rake::SshDirPublisher.new('rockyb@rubyforge.org',
|
135
|
-
'/var/www/gforge-projects/rocky-hacks/linecache', ruby_debug_path)
|
136
|
-
end
|
137
|
-
|
138
|
-
desc 'Remove residue from running patch'
|
139
|
-
task :rm_patch_residue do
|
140
|
-
FileUtils.rm_rf Dir.glob('**/*.{rej,orig}'), :verbose => true
|
141
|
-
end
|
142
|
-
|
143
|
-
desc 'Remove ~ backup files'
|
144
|
-
task :rm_tilde_backups do
|
145
|
-
FileUtils.rm_rf Dir.glob('**/*~'), :verbose => true
|
146
|
-
end
|
147
|
-
|
148
125
|
desc 'Remove built files'
|
149
|
-
task :clean => [:clobber_package, :clobber_rdoc, :rm_patch_residue,
|
126
|
+
task :clean => [:clobber_package, :clobber_rdoc, :rm_patch_residue,
|
150
127
|
:rm_tilde_backups] do
|
151
128
|
cd 'ext' do
|
152
129
|
if File.exists?('Makefile')
|
@@ -159,24 +136,22 @@ task :clean => [:clobber_package, :clobber_rdoc, :rm_patch_residue,
|
|
159
136
|
end
|
160
137
|
|
161
138
|
# --------- RDoc Documentation ------
|
162
|
-
|
163
|
-
|
139
|
+
require 'rdoc/task'
|
140
|
+
desc "Generate rdoc documentation"
|
141
|
+
Rake::RDocTask.new("rdoc") do |rdoc|
|
164
142
|
rdoc.rdoc_dir = 'doc'
|
165
|
-
rdoc.title = "
|
166
|
-
rdoc.options << '--main' << 'README'
|
167
|
-
rdoc.rdoc_files.include('ext/**/*.c',
|
168
|
-
'lib/*.rb',
|
169
|
-
'README',
|
170
|
-
'COPYING')
|
171
|
-
end
|
143
|
+
rdoc.title = "LineCache #{LineCache::VERSION} Documentation"
|
172
144
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
145
|
+
# Show source inline with line numbers
|
146
|
+
rdoc.options += %w(--inline-source --line-numbers)
|
147
|
+
|
148
|
+
# Make the README file the start page for the generated html
|
149
|
+
rdoc.options += %w(--main README)
|
150
|
+
|
151
|
+
rdoc.rdoc_files.include('lib/*.rb', 'README', 'COPYING')
|
179
152
|
end
|
153
|
+
desc "Same as rdoc"
|
154
|
+
task :doc => :rdoc
|
180
155
|
|
181
156
|
desc 'Install the gem locally'
|
182
157
|
task :install => :gem do
|
@@ -185,3 +160,10 @@ task :install => :gem do
|
|
185
160
|
end
|
186
161
|
end
|
187
162
|
|
163
|
+
namespace :jruby do
|
164
|
+
jruby_spec = default_spec.clone
|
165
|
+
jruby_spec.platform = "java"
|
166
|
+
jruby_spec.files = jruby_spec.files.reject {|f| f =~ /^ext/ }
|
167
|
+
jruby_spec.extensions = []
|
168
|
+
Gem::PackageTask.new(jruby_spec) {}
|
169
|
+
end
|
File without changes
|
File without changes
|
data/lib/linecache.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
#
|
4
|
-
# Copyright (C) 2007, 2008, 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
|
2
|
+
#
|
3
|
+
# Copyright (C) 2007, 2008, 2010-2012 Rocky Bernstein <rockyb@rubyforge.net>
|
5
4
|
#
|
6
5
|
# This program is free software; you can redistribute it and/or modify
|
7
6
|
# it under the terms of the GNU General Public License as published by
|
@@ -22,12 +21,12 @@
|
|
22
21
|
# Author:: Rocky Bernstein (mailto:rockyb@rubyforge.net)
|
23
22
|
#
|
24
23
|
# = linecache
|
25
|
-
# A module to read and cache lines of a Ruby program.
|
24
|
+
# A module to read and cache lines of a Ruby program.
|
26
25
|
|
27
26
|
# == SYNOPSIS
|
28
27
|
#
|
29
28
|
# The LineCache module allows one to get any line from any file,
|
30
|
-
# caching lines of the file on first access to the file. Although the
|
29
|
+
# caching lines of the file on first access to the file. Although the
|
31
30
|
# file may be any file, the common use is when the file is a Ruby
|
32
31
|
# script since parsing of the file is done to figure out where the
|
33
32
|
# statement boundaries are.
|
@@ -62,27 +61,24 @@ SCRIPT_LINES__ = {} unless defined? SCRIPT_LINES__
|
|
62
61
|
require 'digest/sha1'
|
63
62
|
require 'set'
|
64
63
|
|
65
|
-
|
66
|
-
require '
|
67
|
-
require_relative 'tracelines'
|
68
|
-
require_relative 'version'
|
64
|
+
require 'linecache/tracelines'
|
65
|
+
require 'linecache/version'
|
69
66
|
# require 'ruby-debug' ; Debugger.start
|
70
67
|
|
71
68
|
# = module LineCache
|
72
|
-
# A module to read and cache lines of a Ruby program.
|
69
|
+
# A module to read and cache lines of a Ruby program.
|
73
70
|
module LineCache
|
74
71
|
LineCacheInfo = Struct.new(:stat, :line_numbers, :lines, :path, :sha1) unless
|
75
72
|
defined?(LineCacheInfo)
|
76
|
-
|
77
|
-
# The file cache. The key is a name as would be given by Ruby for
|
78
|
-
# __FILE__. The value is a LineCacheInfo object.
|
79
|
-
@@file_cache = {}
|
80
|
-
@@script_cache = {}
|
81
73
|
|
74
|
+
# The file cache. The key is a name as would be given by Ruby for
|
75
|
+
# __FILE__. The value is a LineCacheInfo object.
|
76
|
+
@@file_cache = {}
|
77
|
+
@@script_cache = {}
|
82
78
|
|
83
79
|
# Used for CodeRay syntax highlighting
|
84
80
|
@@ruby_highlighter = nil
|
85
|
-
|
81
|
+
|
86
82
|
# Maps a string filename (a String) to a key in @@file_cache (a
|
87
83
|
# String).
|
88
84
|
#
|
@@ -95,9 +91,9 @@ module LineCache
|
|
95
91
|
# Another related use is when a template system is used. Here we'll
|
96
92
|
# probably want to remap not only the file name but also line
|
97
93
|
# ranges. Will probably use this for that, but I'm not sure.
|
98
|
-
@@file2file_remap = {}
|
94
|
+
@@file2file_remap = {}
|
99
95
|
@@file2file_remap_lines = {}
|
100
|
-
@@script2file = {}
|
96
|
+
@@script2file = {}
|
101
97
|
|
102
98
|
module_function
|
103
99
|
|
@@ -108,10 +104,11 @@ module LineCache
|
|
108
104
|
end
|
109
105
|
at_exit { remove_script_temps }
|
110
106
|
|
111
|
-
|
112
|
-
# Clear the file cache entirely.
|
107
|
+
|
108
|
+
# Clear the file cache. If no filename is given clear it entirely.
|
109
|
+
# if a filename is given, clear just that filename.
|
113
110
|
def clear_file_cache(filename=nil)
|
114
|
-
if filename
|
111
|
+
if filename
|
115
112
|
if @@file_cache[filename]
|
116
113
|
@@file_cache.delete(filename)
|
117
114
|
end
|
@@ -124,7 +121,7 @@ module LineCache
|
|
124
121
|
|
125
122
|
# Remove syntax-formatted lines in the cache. Use this
|
126
123
|
# when you change the CodeRay syntax or Token formatting
|
127
|
-
# and want to redo how files may have previously been
|
124
|
+
# and want to redo how files may have previously been
|
128
125
|
# syntax marked.
|
129
126
|
def clear_file_format_cache
|
130
127
|
@@file_cache.each_pair do |fname, cache_info|
|
@@ -137,7 +134,7 @@ module LineCache
|
|
137
134
|
|
138
135
|
# Remove syntax-formatted lines in the cache. Use this
|
139
136
|
# when you change the CodeRay syntax or Token formatting
|
140
|
-
# and want to redo how files may have previously been
|
137
|
+
# and want to redo how files may have previously been
|
141
138
|
# syntax marked.
|
142
139
|
def clear_file_format_cache
|
143
140
|
@@file_cache.each_pair do |fname, cache_info|
|
@@ -165,13 +162,13 @@ module LineCache
|
|
165
162
|
# is found, it will be kept. Return a list of invalidated filenames.
|
166
163
|
# nil is returned if a filename was given but not found cached.
|
167
164
|
def checkcache(filename=nil, opts=false)
|
168
|
-
use_script_lines =
|
165
|
+
use_script_lines =
|
169
166
|
if opts.kind_of?(Hash)
|
170
167
|
opts[:use_script_lines]
|
171
168
|
else
|
172
169
|
opts
|
173
170
|
end
|
174
|
-
|
171
|
+
|
175
172
|
if !filename
|
176
173
|
filenames = @@file_cache.keys()
|
177
174
|
elsif @@file_cache.member?(filename)
|
@@ -188,7 +185,7 @@ module LineCache
|
|
188
185
|
cache_info = @@file_cache[filename].stat
|
189
186
|
stat = File.stat(path)
|
190
187
|
if cache_info
|
191
|
-
if stat &&
|
188
|
+
if stat &&
|
192
189
|
(cache_info.size != stat.size or cache_info.mtime != stat.mtime)
|
193
190
|
result << filename
|
194
191
|
update_cache(filename, opts)
|
@@ -210,17 +207,6 @@ module LineCache
|
|
210
207
|
script
|
211
208
|
end
|
212
209
|
|
213
|
-
# Cache file name or script object if it's not already cached.
|
214
|
-
# Return the expanded filename for it in the cache if a filename,
|
215
|
-
# or the script, or nil if we can't find the file.
|
216
|
-
def cache(file_or_script, reload_on_change=false)
|
217
|
-
if file_or_script.kind_of?(String)
|
218
|
-
cache_file(file_or_script, reload_on_change)
|
219
|
-
else
|
220
|
-
cache_script(file_or_script)
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
210
|
# Cache filename if it's not already cached.
|
225
211
|
# Return the expanded filename for it in the cache
|
226
212
|
# or nil if we can't find the file.
|
@@ -254,12 +240,12 @@ module LineCache
|
|
254
240
|
nil
|
255
241
|
end
|
256
242
|
end
|
257
|
-
|
243
|
+
|
258
244
|
# Return true if file_or_script is cached
|
259
245
|
def cached?(file_or_script)
|
260
|
-
if file_or_script.kind_of?(String)
|
246
|
+
if file_or_script.kind_of?(String)
|
261
247
|
@@file_cache.member?(unmap_file(file_or_script))
|
262
|
-
else
|
248
|
+
else
|
263
249
|
cached_script?(file_or_script)
|
264
250
|
end
|
265
251
|
end
|
@@ -267,7 +253,7 @@ module LineCache
|
|
267
253
|
def cached_script?(filename)
|
268
254
|
SCRIPT_LINES__.member?(unmap_file(filename))
|
269
255
|
end
|
270
|
-
|
256
|
+
|
271
257
|
def empty?(filename)
|
272
258
|
filename=unmap_file(filename)
|
273
259
|
!!@@file_cache[filename].lines[:plain]
|
@@ -276,22 +262,22 @@ module LineCache
|
|
276
262
|
# Get line +line_number+ from file named +filename+. Return nil if
|
277
263
|
# there was a problem. If a file named filename is not found, the
|
278
264
|
# function will look for it in the $: array.
|
279
|
-
#
|
265
|
+
#
|
280
266
|
# Examples:
|
281
|
-
#
|
267
|
+
#
|
282
268
|
# lines = LineCache::getline('/tmp/myfile.rb')
|
283
269
|
# # Same as above
|
284
270
|
# $: << '/tmp'
|
285
271
|
# lines = LineCache.getlines('myfile.rb')
|
286
272
|
#
|
287
273
|
def getline(file_or_script, line_number, opts=true)
|
288
|
-
reload_on_change =
|
274
|
+
reload_on_change =
|
289
275
|
if opts.kind_of?(Hash)
|
290
276
|
opts[:reload_on_change]
|
291
277
|
else
|
292
278
|
opts
|
293
279
|
end
|
294
|
-
lines =
|
280
|
+
lines =
|
295
281
|
if file_or_script.kind_of?(String)
|
296
282
|
filename = unmap_file(file_or_script)
|
297
283
|
filename, line_number = unmap_file_line(filename, line_number)
|
@@ -311,7 +297,7 @@ module LineCache
|
|
311
297
|
# if we can't get lines
|
312
298
|
def getlines(filename, opts=false)
|
313
299
|
if opts.kind_of?(Hash)
|
314
|
-
reload_on_change, use_script_lines =
|
300
|
+
reload_on_change, use_script_lines =
|
315
301
|
[opts[:reload_on_change], opts[:use_script_lines]]
|
316
302
|
else
|
317
303
|
reload_on_change, use_script_lines = [opts, false]
|
@@ -322,7 +308,7 @@ module LineCache
|
|
322
308
|
if @@file_cache.member?(filename)
|
323
309
|
lines = @@file_cache[filename].lines
|
324
310
|
if opts[:output] && !lines[format]
|
325
|
-
lines[format] =
|
311
|
+
lines[format] =
|
326
312
|
highlight_string(lines[:plain].join(''), format).split(/\n/)
|
327
313
|
end
|
328
314
|
return lines[format]
|
@@ -365,7 +351,7 @@ module LineCache
|
|
365
351
|
def remap_file_lines(from_file, to_file, range, start)
|
366
352
|
range = (range..range) if range.kind_of?(Fixnum)
|
367
353
|
to_file = from_file unless to_file
|
368
|
-
if @@file2file_remap_lines[to_file]
|
354
|
+
if @@file2file_remap_lines[to_file]
|
369
355
|
# FIXME: need to check for overwriting ranges: whether
|
370
356
|
# they intersect or one encompasses another.
|
371
357
|
@@file2file_remap_lines[to_file] << [from_file, range, start]
|
@@ -374,12 +360,12 @@ module LineCache
|
|
374
360
|
end
|
375
361
|
end
|
376
362
|
module_function :remap_file_lines
|
377
|
-
|
363
|
+
|
378
364
|
# Return SHA1 of filename.
|
379
365
|
def sha1(filename)
|
380
366
|
filename = unmap_file(filename)
|
381
367
|
return nil unless @@file_cache.member?(filename)
|
382
|
-
return @@file_cache[filename].sha1.hexdigest if
|
368
|
+
return @@file_cache[filename].sha1.hexdigest if
|
383
369
|
@@file_cache[filename].sha1
|
384
370
|
sha1 = Digest::SHA1.new
|
385
371
|
@@file_cache[filename].lines[:plain].each do |line|
|
@@ -388,7 +374,7 @@ module LineCache
|
|
388
374
|
@@file_cache[filename].sha1 = sha1
|
389
375
|
sha1.hexdigest
|
390
376
|
end
|
391
|
-
|
377
|
+
|
392
378
|
# Return the number of lines in filename
|
393
379
|
def size(file_or_script)
|
394
380
|
cache(file_or_script)
|
@@ -418,13 +404,13 @@ module LineCache
|
|
418
404
|
return nil unless fullname
|
419
405
|
e = @@file_cache[filename]
|
420
406
|
unless e.line_numbers
|
421
|
-
e.line_numbers =
|
407
|
+
e.line_numbers =
|
422
408
|
TraceLineNumbers.lnums_for_str_array(e.lines[:plain])
|
423
409
|
e.line_numbers = false unless e.line_numbers
|
424
410
|
end
|
425
411
|
e.line_numbers
|
426
412
|
end
|
427
|
-
|
413
|
+
|
428
414
|
def unmap_file(file)
|
429
415
|
@@file2file_remap[file] ? @@file2file_remap[file] : file
|
430
416
|
end
|
@@ -434,8 +420,8 @@ module LineCache
|
|
434
420
|
if @@file2file_remap_lines[file]
|
435
421
|
@@file2file_remap_lines[file].each do |from_file, range, start|
|
436
422
|
if range === line
|
437
|
-
from_file = from_file || file
|
438
|
-
return [from_file, start+line-range.begin]
|
423
|
+
from_file = from_file || file
|
424
|
+
return [from_file, start+line-range.begin]
|
439
425
|
end
|
440
426
|
end
|
441
427
|
end
|
@@ -443,15 +429,15 @@ module LineCache
|
|
443
429
|
end
|
444
430
|
|
445
431
|
# Update a cache entry. If something is wrong, return nil. Return
|
446
|
-
# true if the cache was updated and false if not.
|
432
|
+
# true if the cache was updated and false if not.
|
447
433
|
def update_script_cache(script, opts)
|
448
434
|
# return false unless script_is_eval?(script)
|
449
435
|
# string = opts[:string] || script.eval_source
|
450
436
|
lines = {:plain => string.split(/\n/)}
|
451
437
|
lines[opts[:output]] = highlight_string(string, opts[:output]) if
|
452
438
|
opts[:output]
|
453
|
-
@@script_cache[script] =
|
454
|
-
LineCacheInfo.new(nil, nil, lines, nil, opts[:sha1],
|
439
|
+
@@script_cache[script] =
|
440
|
+
LineCacheInfo.new(nil, nil, lines, nil, opts[:sha1],
|
455
441
|
opts[:compiled_method])
|
456
442
|
return true
|
457
443
|
end
|
@@ -472,13 +458,13 @@ module LineCache
|
|
472
458
|
|
473
459
|
@@file_cache.delete(filename)
|
474
460
|
path = File.expand_path(filename)
|
475
|
-
|
461
|
+
|
476
462
|
if use_script_lines
|
477
463
|
list = [filename]
|
478
464
|
list << @@file2file_remap[path] if @@file2file_remap[path]
|
479
|
-
list.each do |name|
|
465
|
+
list.each do |name|
|
480
466
|
if !SCRIPT_LINES__[name].nil? && SCRIPT_LINES__[name] != true
|
481
|
-
begin
|
467
|
+
begin
|
482
468
|
stat = File.stat(name)
|
483
469
|
rescue
|
484
470
|
stat = nil
|
@@ -486,7 +472,7 @@ module LineCache
|
|
486
472
|
raw_lines = SCRIPT_LINES__[name]
|
487
473
|
lines = {:plain => raw_lines}
|
488
474
|
lines[opts[:output]] =
|
489
|
-
highlight_string(raw_lines.join, opts[:output]).split(/\n/) if
|
475
|
+
highlight_string(raw_lines.join, opts[:output]).split(/\n/) if
|
490
476
|
opts[:output]
|
491
477
|
@@file_cache[filename] = LineCacheInfo.new(stat, nil, lines, path, nil)
|
492
478
|
@@file2file_remap[path] = filename
|
@@ -494,7 +480,7 @@ module LineCache
|
|
494
480
|
end
|
495
481
|
end
|
496
482
|
end
|
497
|
-
|
483
|
+
|
498
484
|
if File.exist?(path)
|
499
485
|
stat = File.stat(path)
|
500
486
|
elsif File.basename(filename) == filename
|
@@ -510,15 +496,13 @@ module LineCache
|
|
510
496
|
return false unless stat
|
511
497
|
end
|
512
498
|
begin
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
opts[:output]
|
521
|
-
rescue
|
499
|
+
# (GF) rewind does not work in JRuby with a jar:file:... filename
|
500
|
+
# (GF) read file once and only create string if required by opts[:output]
|
501
|
+
lines = { :plain => File.readlines(path) }
|
502
|
+
if opts[:output]
|
503
|
+
lines[opts[:output]] = highlight_string(lines[:plain].join, opts[:output]).split(/\n/)
|
504
|
+
end
|
505
|
+
rescue
|
522
506
|
## print '*** cannot open', path, ':', msg
|
523
507
|
return nil
|
524
508
|
end
|
@@ -531,15 +515,15 @@ module LineCache
|
|
531
515
|
end
|
532
516
|
|
533
517
|
# example usage
|
534
|
-
if __FILE__ == $0
|
535
|
-
def yes_no(var)
|
518
|
+
if __FILE__ == $0
|
519
|
+
def yes_no(var)
|
536
520
|
return var ? "" : "not "
|
537
521
|
end
|
538
522
|
|
539
523
|
lines = LineCache::getlines(__FILE__)
|
540
524
|
puts "#{__FILE__} has #{LineCache.size(__FILE__)} lines"
|
541
525
|
line = LineCache::getline(__FILE__, 6)
|
542
|
-
puts "The 6th line is\n#{line}"
|
526
|
+
puts "The 6th line is\n#{line}"
|
543
527
|
line = LineCache::remap_file(__FILE__, 'another_name')
|
544
528
|
puts LineCache::getline('another_name', 7)
|
545
529
|
|
@@ -547,21 +531,21 @@ if __FILE__ == $0
|
|
547
531
|
LineCache::update_cache(__FILE__)
|
548
532
|
LineCache::checkcache(__FILE__)
|
549
533
|
puts "#{__FILE__} has #{LineCache::size(__FILE__)} lines"
|
550
|
-
puts "#{__FILE__} trace line numbers:\n" +
|
534
|
+
puts "#{__FILE__} trace line numbers:\n" +
|
551
535
|
"#{LineCache::trace_line_numbers(__FILE__).to_a.sort.inspect}"
|
552
|
-
puts("#{__FILE__} is %scached." %
|
536
|
+
puts("#{__FILE__} is %scached." %
|
553
537
|
yes_no(LineCache::cached?(__FILE__)))
|
554
538
|
puts LineCache::stat(__FILE__).inspect
|
555
539
|
puts "Full path: #{LineCache::path(__FILE__)}"
|
556
540
|
LineCache::checkcache # Check all files in the cache
|
557
|
-
LineCache::clear_file_cache
|
558
|
-
puts("#{__FILE__} is now %scached." %
|
541
|
+
LineCache::clear_file_cache
|
542
|
+
puts("#{__FILE__} is now %scached." %
|
559
543
|
yes_no(LineCache::cached?(__FILE__)))
|
560
544
|
digest = SCRIPT_LINES__.select{|k,v| k =~ /digest.rb$/}
|
561
545
|
puts digest.first[0] if digest
|
562
546
|
line = LineCache::getline(__FILE__, 7)
|
563
|
-
puts "The 7th line is\n#{line}"
|
547
|
+
puts "The 7th line is\n#{line}"
|
564
548
|
LineCache::remap_file_lines(__FILE__, 'test2', (10..20), 6)
|
565
|
-
|
566
|
-
puts "Remapped
|
549
|
+
line = LineCache::getline('test2', 11)
|
550
|
+
puts "Remapped 11th line of test2 is\n#{line}"
|
567
551
|
end
|