rubygems-update 1.3.6 → 1.3.7
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rubygems-update might be problematic. Click here for more details.
- data.tar.gz.sig +0 -0
- data/ChangeLog +86 -0
- data/History.txt +34 -1
- data/Manifest.txt +6 -1
- data/Rakefile +79 -34
- data/lib/rubygems.rb +52 -30
- data/lib/rubygems/builder.rb +2 -0
- data/lib/rubygems/command.rb +12 -0
- data/lib/rubygems/command_manager.rb +17 -12
- data/lib/rubygems/commands/contents_command.rb +1 -1
- data/lib/rubygems/commands/dependency_command.rb +3 -1
- data/lib/rubygems/commands/environment_command.rb +3 -2
- data/lib/rubygems/commands/fetch_command.rb +7 -3
- data/lib/rubygems/commands/install_command.rb +2 -1
- data/lib/rubygems/commands/query_command.rb +16 -3
- data/lib/rubygems/commands/server_command.rb +5 -3
- data/lib/rubygems/commands/setup_command.rb +1 -1
- data/lib/rubygems/commands/unpack_command.rb +35 -23
- data/lib/rubygems/commands/update_command.rb +1 -1
- data/lib/rubygems/defaults.rb +4 -6
- data/lib/rubygems/dependency.rb +32 -6
- data/lib/rubygems/dependency_installer.rb +10 -3
- data/lib/rubygems/doc_manager.rb +5 -2
- data/lib/rubygems/errors.rb +35 -0
- data/lib/rubygems/exceptions.rb +10 -1
- data/lib/rubygems/indexer.rb +1 -1
- data/lib/rubygems/installer.rb +6 -5
- data/lib/rubygems/package.rb +6 -3
- data/lib/rubygems/package/f_sync_dir.rb +4 -3
- data/lib/rubygems/package/tar_header.rb +4 -3
- data/lib/rubygems/package/tar_output.rb +4 -3
- data/lib/rubygems/package/tar_reader.rb +4 -3
- data/lib/rubygems/package/tar_writer.rb +4 -3
- data/lib/rubygems/package_task.rb +4 -3
- data/lib/rubygems/platform.rb +4 -1
- data/lib/rubygems/remote_fetcher.rb +9 -3
- data/lib/rubygems/requirement.rb +5 -0
- data/lib/rubygems/security.rb +3 -3
- data/lib/rubygems/server.rb +33 -18
- data/lib/rubygems/source_index.rb +4 -4
- data/lib/rubygems/source_info_cache.rb +4 -2
- data/lib/rubygems/spec_fetcher.rb +33 -11
- data/lib/rubygems/specification.rb +40 -32
- data/lib/rubygems/test_utilities.rb +2 -2
- data/lib/rubygems/validator.rb +3 -4
- data/lib/rubygems/version.rb +1 -1
- data/test/gem_package_tar_test_case.rb +2 -2
- data/test/gemutilities.rb +15 -9
- data/test/insure_session.rb +1 -1
- data/test/plugin/exception/rubygems_plugin.rb +2 -0
- data/test/plugin/load/rubygems_plugin.rb +1 -0
- data/test/plugin/standarderror/rubygems_plugin.rb +2 -0
- data/test/rubygems/commands/crash_command.rb +5 -0
- data/test/rubygems_plugin.rb +5 -0
- data/test/simple_gem.rb +15 -15
- data/test/test_gem.rb +45 -2
- data/test/test_gem_command_manager.rb +14 -0
- data/test/test_gem_commands_contents_command.rb +7 -5
- data/test/test_gem_commands_environment_command.rb +3 -1
- data/test/test_gem_commands_fetch_command.rb +21 -1
- data/test/test_gem_commands_install_command.rb +2 -4
- data/test/test_gem_commands_query_command.rb +33 -6
- data/test/test_gem_commands_server_command.rb +9 -2
- data/test/test_gem_commands_uninstall_command.rb +4 -2
- data/test/test_gem_commands_unpack_command.rb +46 -2
- data/test/test_gem_config_file.rb +2 -0
- data/test/test_gem_dependency.rb +11 -0
- data/test/test_gem_doc_manager.rb +1 -1
- data/test/test_gem_indexer.rb +2 -2
- data/test/test_gem_installer.rb +1 -1
- data/test/test_gem_package_tar_input.rb +1 -1
- data/test/test_gem_package_tar_writer.rb +3 -3
- data/test/test_gem_platform.rb +19 -0
- data/test/test_gem_server.rb +11 -0
- data/test/test_gem_source_index.rb +2 -2
- data/test/test_gem_spec_fetcher.rb +42 -0
- data/test/test_gem_specification.rb +46 -7
- data/util/{gem_prelude.rb.template → gem_prelude.rb} +53 -23
- metadata +16 -6
- metadata.gz.sig +0 -0
@@ -85,10 +85,10 @@ class Gem::SourceIndex
|
|
85
85
|
def load_specification(file_name)
|
86
86
|
return nil unless file_name and File.exist? file_name
|
87
87
|
|
88
|
-
spec_code = if
|
89
|
-
File.read file_name
|
90
|
-
else
|
88
|
+
spec_code = if defined? Encoding then
|
91
89
|
File.read file_name, :encoding => 'UTF-8'
|
90
|
+
else
|
91
|
+
File.read file_name
|
92
92
|
end.untaint
|
93
93
|
|
94
94
|
begin
|
@@ -414,7 +414,7 @@ class Gem::SourceIndex
|
|
414
414
|
end
|
415
415
|
|
416
416
|
def ==(other) # :nodoc:
|
417
|
-
self.class === other and @gems == other.gems
|
417
|
+
self.class === other and @gems == other.gems
|
418
418
|
end
|
419
419
|
|
420
420
|
def dump
|
@@ -285,17 +285,19 @@ class Gem::SourceInfoCache
|
|
285
285
|
cache_data.map do |source_uri, sic_entry|
|
286
286
|
next unless Gem.sources.include? source_uri
|
287
287
|
# TODO - Remove this gunk after 2008/11
|
288
|
-
unless pattern.kind_of?
|
289
|
-
pattern = Gem::Dependency.new
|
288
|
+
unless pattern.kind_of? Gem::Dependency then
|
289
|
+
pattern = Gem::Dependency.new pattern, Gem::Requirement.default
|
290
290
|
end
|
291
291
|
sic_entry.source_index.search pattern, platform_only
|
292
292
|
end.flatten.compact
|
293
293
|
end
|
294
294
|
|
295
|
+
##
|
295
296
|
# Searches all source indexes for +pattern+. If +only_platform+ is true,
|
296
297
|
# only gems matching Gem.platforms will be selected. Returns an Array of
|
297
298
|
# pairs containing the Gem::Specification found and the source_uri it was
|
298
299
|
# found at.
|
300
|
+
|
299
301
|
def search_with_source(pattern, only_platform = false, all = false)
|
300
302
|
read_all_cache_data if all
|
301
303
|
|
@@ -3,6 +3,7 @@ require 'fileutils'
|
|
3
3
|
|
4
4
|
require 'rubygems/remote_fetcher'
|
5
5
|
require 'rubygems/user_interaction'
|
6
|
+
require 'rubygems/errors'
|
6
7
|
|
7
8
|
##
|
8
9
|
# SpecFetcher handles metadata updates from remote gem repositories.
|
@@ -53,7 +54,7 @@ class Gem::SpecFetcher
|
|
53
54
|
end
|
54
55
|
|
55
56
|
##
|
56
|
-
#
|
57
|
+
# Returns the local directory to write +uri+ to.
|
57
58
|
|
58
59
|
def cache_dir(uri)
|
59
60
|
File.join @dir, "#{uri.host}%#{uri.port}", File.dirname(uri.path)
|
@@ -65,22 +66,28 @@ class Gem::SpecFetcher
|
|
65
66
|
# false, all platforms are returned. If +prerelease+ is true,
|
66
67
|
# prerelease versions are included.
|
67
68
|
|
68
|
-
def
|
69
|
-
specs_and_sources =
|
69
|
+
def fetch_with_errors(dependency, all = false, matching_platform = true, prerelease = false)
|
70
|
+
specs_and_sources, errors = find_matching_with_errors dependency, all, matching_platform, prerelease
|
70
71
|
|
71
|
-
specs_and_sources.map do |spec_tuple, source_uri|
|
72
|
+
ss = specs_and_sources.map do |spec_tuple, source_uri|
|
72
73
|
[fetch_spec(spec_tuple, URI.parse(source_uri)), source_uri]
|
73
74
|
end
|
74
75
|
|
76
|
+
return [ss, errors]
|
77
|
+
|
75
78
|
rescue Gem::RemoteFetcher::FetchError => e
|
76
79
|
raise unless warn_legacy e do
|
77
80
|
require 'rubygems/source_info_cache'
|
78
81
|
|
79
|
-
return Gem::SourceInfoCache.search_with_source(dependency,
|
80
|
-
matching_platform, all)
|
82
|
+
return [Gem::SourceInfoCache.search_with_source(dependency,
|
83
|
+
matching_platform, all), nil]
|
81
84
|
end
|
82
85
|
end
|
83
86
|
|
87
|
+
def fetch(*args)
|
88
|
+
fetch_with_errors(*args).first
|
89
|
+
end
|
90
|
+
|
84
91
|
def fetch_spec(spec, source_uri)
|
85
92
|
spec = spec - [nil, 'ruby', '']
|
86
93
|
spec_file_name = "#{spec.join '-'}.gemspec"
|
@@ -117,16 +124,27 @@ class Gem::SpecFetcher
|
|
117
124
|
# matching released versions are returned. If +matching_platform+
|
118
125
|
# is false, gems for all platforms are returned.
|
119
126
|
|
120
|
-
def
|
127
|
+
def find_matching_with_errors(dependency, all = false, matching_platform = true, prerelease = false)
|
121
128
|
found = {}
|
122
129
|
|
130
|
+
rejected_specs = {}
|
131
|
+
|
123
132
|
list(all, prerelease).each do |source_uri, specs|
|
124
133
|
found[source_uri] = specs.select do |spec_name, version, spec_platform|
|
125
|
-
dependency
|
126
|
-
|
134
|
+
if dependency.match?(spec_name, version)
|
135
|
+
if matching_platform and !Gem::Platform.match(spec_platform)
|
136
|
+
pm = (rejected_specs[dependency] ||= Gem::PlatformMismatch.new(spec_name, version))
|
137
|
+
pm.add_platform spec_platform
|
138
|
+
false
|
139
|
+
else
|
140
|
+
true
|
141
|
+
end
|
142
|
+
end
|
127
143
|
end
|
128
144
|
end
|
129
145
|
|
146
|
+
errors = rejected_specs.values
|
147
|
+
|
130
148
|
specs_and_sources = []
|
131
149
|
|
132
150
|
found.each do |source_uri, specs|
|
@@ -134,7 +152,11 @@ class Gem::SpecFetcher
|
|
134
152
|
specs_and_sources.push(*specs.map { |spec| [spec, uri_str] })
|
135
153
|
end
|
136
154
|
|
137
|
-
specs_and_sources
|
155
|
+
[specs_and_sources, errors]
|
156
|
+
end
|
157
|
+
|
158
|
+
def find_matching(*args)
|
159
|
+
find_matching_with_errors(*args).first
|
138
160
|
end
|
139
161
|
|
140
162
|
##
|
@@ -184,7 +206,7 @@ class Gem::SpecFetcher
|
|
184
206
|
cache = { :latest => @latest_specs,
|
185
207
|
:prerelease => @prerelease_specs,
|
186
208
|
:all => @specs }[type]
|
187
|
-
|
209
|
+
|
188
210
|
Gem.sources.each do |source_uri|
|
189
211
|
source_uri = URI.parse source_uri
|
190
212
|
|
@@ -504,8 +504,8 @@ class Gem::Specification
|
|
504
504
|
gemspec = nil
|
505
505
|
raise "NESTED Specification.load calls not allowed!" if @@gather
|
506
506
|
@@gather = proc { |gs| gemspec = gs }
|
507
|
-
data = File.read
|
508
|
-
eval
|
507
|
+
data = File.read filename
|
508
|
+
eval data, nil, filename
|
509
509
|
gemspec
|
510
510
|
ensure
|
511
511
|
@@gather = nil
|
@@ -524,7 +524,7 @@ class Gem::Specification
|
|
524
524
|
# Sets the rubygems_version to the current RubyGems version
|
525
525
|
|
526
526
|
def mark_version
|
527
|
-
@rubygems_version = Gem::
|
527
|
+
@rubygems_version = Gem::VERSION
|
528
528
|
end
|
529
529
|
|
530
530
|
##
|
@@ -677,33 +677,43 @@ class Gem::Specification
|
|
677
677
|
}
|
678
678
|
end
|
679
679
|
|
680
|
-
def
|
680
|
+
def encode_with coder # :nodoc:
|
681
681
|
mark_version
|
682
682
|
|
683
683
|
attributes = @@attributes.map { |name,| name.to_s }.sort
|
684
684
|
attributes = attributes - %w[name version platform]
|
685
685
|
|
686
|
+
coder.add 'name', @name
|
687
|
+
coder.add 'version', @version
|
688
|
+
platform = case @original_platform
|
689
|
+
when nil, '' then
|
690
|
+
'ruby'
|
691
|
+
when String then
|
692
|
+
@original_platform
|
693
|
+
else
|
694
|
+
@original_platform.to_s
|
695
|
+
end
|
696
|
+
coder.add 'platform', platform
|
697
|
+
|
698
|
+
attributes.each do |name|
|
699
|
+
coder.add name, instance_variable_get("@#{name}")
|
700
|
+
end
|
701
|
+
end
|
702
|
+
|
703
|
+
def to_yaml(opts = {}) # :nodoc:
|
704
|
+
return super if YAML.const_defined?(:ENGINE) && !YAML::ENGINE.syck?
|
705
|
+
|
686
706
|
yaml = YAML.quick_emit object_id, opts do |out|
|
687
707
|
out.map taguri, to_yaml_style do |map|
|
688
|
-
map
|
689
|
-
map.add 'version', @version
|
690
|
-
platform = case @original_platform
|
691
|
-
when nil, '' then
|
692
|
-
'ruby'
|
693
|
-
when String then
|
694
|
-
@original_platform
|
695
|
-
else
|
696
|
-
@original_platform.to_s
|
697
|
-
end
|
698
|
-
map.add 'platform', platform
|
699
|
-
|
700
|
-
attributes.each do |name|
|
701
|
-
map.add name, instance_variable_get("@#{name}")
|
702
|
-
end
|
708
|
+
encode_with map
|
703
709
|
end
|
704
710
|
end
|
705
711
|
end
|
706
712
|
|
713
|
+
def init_with coder # :nodoc:
|
714
|
+
yaml_initialize coder.tag, coder.map
|
715
|
+
end
|
716
|
+
|
707
717
|
def yaml_initialize(tag, vals) # :nodoc:
|
708
718
|
vals.each do |ivar, val|
|
709
719
|
instance_variable_set "@#{ivar}", val
|
@@ -759,7 +769,7 @@ class Gem::Specification
|
|
759
769
|
result << " s.specification_version = #{specification_version}"
|
760
770
|
result << nil
|
761
771
|
|
762
|
-
result << " if Gem::Version.new(Gem::
|
772
|
+
result << " if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then"
|
763
773
|
|
764
774
|
unless dependencies.empty? then
|
765
775
|
dependencies.each do |dep|
|
@@ -804,9 +814,9 @@ class Gem::Specification
|
|
804
814
|
extend Gem::UserInteraction
|
805
815
|
normalize
|
806
816
|
|
807
|
-
if rubygems_version != Gem::
|
817
|
+
if rubygems_version != Gem::VERSION then
|
808
818
|
raise Gem::InvalidSpecificationException,
|
809
|
-
"expected RubyGems version #{Gem::
|
819
|
+
"expected RubyGems version #{Gem::VERSION}, was #{rubygems_version}"
|
810
820
|
end
|
811
821
|
|
812
822
|
@@required_attributes.each do |symbol|
|
@@ -1052,7 +1062,7 @@ class Gem::Specification
|
|
1052
1062
|
#
|
1053
1063
|
# Do not set this, it is set automatically when the gem is packaged.
|
1054
1064
|
|
1055
|
-
required_attribute :rubygems_version, Gem::
|
1065
|
+
required_attribute :rubygems_version, Gem::VERSION
|
1056
1066
|
|
1057
1067
|
##
|
1058
1068
|
# :attr_accessor: specification_version
|
@@ -1481,14 +1491,12 @@ class Gem::Specification
|
|
1481
1491
|
end
|
1482
1492
|
|
1483
1493
|
overwrite_accessor :files do
|
1484
|
-
|
1485
|
-
|
1486
|
-
|
1487
|
-
|
1488
|
-
|
1489
|
-
|
1490
|
-
|
1494
|
+
# DO NOT CHANGE TO ||= ! This is not a normal accessor. (yes, it sucks)
|
1495
|
+
@files = [@files,
|
1496
|
+
@test_files,
|
1497
|
+
add_bindir(@executables),
|
1498
|
+
@extra_rdoc_files,
|
1499
|
+
@extensions,
|
1500
|
+
].flatten.uniq.compact
|
1491
1501
|
end
|
1492
|
-
|
1493
1502
|
end
|
1494
|
-
|
@@ -11,9 +11,9 @@ require 'rubygems/remote_fetcher'
|
|
11
11
|
# @fetcher = Gem::FakeFetcher.new
|
12
12
|
# @fetcher.data['http://gems.example.com/yaml'] = source_index.to_yaml
|
13
13
|
# Gem::RemoteFetcher.fetcher = @fetcher
|
14
|
-
#
|
14
|
+
#
|
15
15
|
# # invoke RubyGems code
|
16
|
-
#
|
16
|
+
#
|
17
17
|
# paths = @fetcher.paths
|
18
18
|
# assert_equal 'http://gems.example.com/yaml', paths.shift
|
19
19
|
# assert paths.empty?, paths.join(', ')
|
data/lib/rubygems/validator.rb
CHANGED
@@ -10,12 +10,11 @@ require 'digest'
|
|
10
10
|
require 'rubygems/format'
|
11
11
|
require 'rubygems/installer'
|
12
12
|
|
13
|
-
# Load test-unit 2.x if it's a gem
|
14
13
|
begin
|
15
|
-
|
14
|
+
gem 'test-unit'
|
16
15
|
rescue Gem::LoadError
|
17
|
-
|
18
|
-
end
|
16
|
+
# Ignore - use the test-unit library that's part of the standard library
|
17
|
+
end
|
19
18
|
|
20
19
|
##
|
21
20
|
# Validator performs various gem file and gem database validation
|
data/lib/rubygems/version.rb
CHANGED
@@ -35,7 +35,7 @@ class TarTestCase < RubyGemTestCase
|
|
35
35
|
linkname 100
|
36
36
|
magic 6
|
37
37
|
version 2
|
38
|
-
uname 32
|
38
|
+
uname 32
|
39
39
|
gname 32
|
40
40
|
devmajor 8
|
41
41
|
devminor 8
|
@@ -54,7 +54,7 @@ class TarTestCase < RubyGemTestCase
|
|
54
54
|
next
|
55
55
|
end
|
56
56
|
|
57
|
-
assert_equal expected[offset, length], actual[offset, length],
|
57
|
+
assert_equal expected[offset, length], actual[offset, length],
|
58
58
|
"Field #{name} of the tar header differs."
|
59
59
|
|
60
60
|
offset += length
|
data/test/gemutilities.rb
CHANGED
@@ -8,18 +8,17 @@ else
|
|
8
8
|
require 'rubygems'
|
9
9
|
end
|
10
10
|
require 'fileutils'
|
11
|
-
|
12
|
-
gem 'minitest', '>= 1.3.1'
|
13
|
-
require 'minitest/unit'
|
14
|
-
rescue Gem::LoadError
|
15
|
-
warn "Install minitest gem >= 1.3.1"
|
16
|
-
raise
|
17
|
-
end
|
11
|
+
require 'minitest/autorun'
|
18
12
|
require 'tmpdir'
|
19
13
|
require 'uri'
|
20
14
|
require 'rubygems/package'
|
21
15
|
require 'rubygems/test_utilities'
|
22
16
|
require 'pp'
|
17
|
+
require 'yaml'
|
18
|
+
begin
|
19
|
+
YAML::ENGINE.yamler = 'psych'
|
20
|
+
rescue LoadError
|
21
|
+
end if YAML.const_defined? :ENGINE
|
23
22
|
|
24
23
|
begin
|
25
24
|
gem 'rdoc'
|
@@ -71,6 +70,13 @@ class RubyGemTestCase < MiniTest::Unit::TestCase
|
|
71
70
|
|
72
71
|
Gem.ensure_gem_subdirectories @gemhome
|
73
72
|
|
73
|
+
@orig_ruby = if ruby = ENV['RUBY'] then
|
74
|
+
Gem.class_eval { ruby, @ruby = @ruby, ruby }
|
75
|
+
ruby
|
76
|
+
end
|
77
|
+
|
78
|
+
Gem.ensure_gem_subdirectories @gemhome
|
79
|
+
|
74
80
|
@orig_ENV_HOME = ENV['HOME']
|
75
81
|
ENV['HOME'] = @userhome
|
76
82
|
Gem.instance_variable_set :@user_home, nil
|
@@ -147,6 +153,8 @@ class RubyGemTestCase < MiniTest::Unit::TestCase
|
|
147
153
|
|
148
154
|
Gem.clear_paths
|
149
155
|
|
156
|
+
Gem.class_eval { @ruby = ruby } if ruby = @orig_ruby
|
157
|
+
|
150
158
|
if @orig_ENV_HOME then
|
151
159
|
ENV['HOME'] = @orig_ENV_HOME
|
152
160
|
else
|
@@ -578,5 +586,3 @@ Also, a list:
|
|
578
586
|
|
579
587
|
end
|
580
588
|
|
581
|
-
MiniTest::Unit.autorun
|
582
|
-
|
data/test/insure_session.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
TestGem::TEST_PLUGIN_LOAD = :loaded
|
data/test/rubygems_plugin.rb
CHANGED
data/test/simple_gem.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
SIMPLE_GEM = <<-GEMDATA
|
2
|
-
MD5SUM = "
|
2
|
+
MD5SUM = "b12a4d48febeb2289c539c2574c4b6f8"
|
3
3
|
if $0 == __FILE__
|
4
4
|
require 'optparse'
|
5
|
-
|
5
|
+
|
6
6
|
options = {}
|
7
7
|
ARGV.options do |opts|
|
8
8
|
opts.on_tail("--help", "show this message") {puts opts; exit}
|
@@ -13,45 +13,45 @@ SIMPLE_GEM = <<-GEMDATA
|
|
13
13
|
end
|
14
14
|
|
15
15
|
require 'rubygems'
|
16
|
-
@directory = options[:directory] || Gem.dir
|
16
|
+
@directory = options[:directory] || Gem.dir
|
17
17
|
@force = options[:force]
|
18
|
-
|
19
|
-
gem = Gem::Installer.new(__FILE__).install(@force, @directory)
|
18
|
+
|
19
|
+
gem = Gem::Installer.new(__FILE__).install(@force, @directory)
|
20
20
|
if options[:gen_rdoc]
|
21
21
|
Gem::DocManager.new(gem).generate_rdoc
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
__END__
|
26
|
-
--- !ruby/object:Gem::Specification
|
26
|
+
--- !ruby/object:Gem::Specification
|
27
27
|
rubygems_version: "1.0"
|
28
28
|
name: testing
|
29
|
-
version: !ruby/object:Gem::Version
|
29
|
+
version: !ruby/object:Gem::Version
|
30
30
|
version: 1.2.3
|
31
31
|
date: 2004-03-18 22:01:52.859121 -05:00
|
32
|
-
platform:
|
32
|
+
platform:
|
33
33
|
summary: This exercise the gem testing stuff.
|
34
|
-
require_paths:
|
34
|
+
require_paths:
|
35
35
|
- lib
|
36
|
-
files:
|
36
|
+
files:
|
37
37
|
- lib/foo.rb
|
38
38
|
- lib/test
|
39
39
|
- lib/test.rb
|
40
40
|
- lib/test/wow.rb
|
41
41
|
autorequire: test
|
42
42
|
test_suite_file: foo
|
43
|
-
requirements:
|
43
|
+
requirements:
|
44
44
|
- a computer processor
|
45
|
-
---
|
46
|
-
-
|
45
|
+
---
|
46
|
+
-
|
47
47
|
size: 109
|
48
48
|
mode: 420
|
49
49
|
path: lib/foo.rb
|
50
|
-
-
|
50
|
+
-
|
51
51
|
size: 0
|
52
52
|
mode: 420
|
53
53
|
path: lib/test.rb
|
54
|
-
-
|
54
|
+
-
|
55
55
|
size: 15
|
56
56
|
mode: 420
|
57
57
|
path: lib/test/wow.rb
|