rubygems-update 1.3.2 → 1.3.3
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 +61 -0
- data/Manifest.txt +1 -0
- data/doc/release_notes/rel_1_3_3.rdoc +95 -0
- data/lib/rubygems.rb +25 -4
- data/lib/rubygems/command_manager.rb +8 -8
- data/lib/rubygems/commands/cleanup_command.rb +11 -5
- data/lib/rubygems/commands/install_command.rb +1 -1
- data/lib/rubygems/commands/server_command.rb +23 -1
- data/lib/rubygems/commands/specification_command.rb +30 -3
- data/lib/rubygems/doc_manager.rb +4 -8
- data/lib/rubygems/ext/configure_builder.rb +1 -0
- data/lib/rubygems/ext/rake_builder.rb +1 -1
- data/lib/rubygems/package_task.rb +9 -8
- data/lib/rubygems/requirement.rb +1 -1
- data/lib/rubygems/rubygems_version.rb +1 -1
- data/lib/rubygems/server.rb +188 -4
- data/lib/rubygems/specification.rb +28 -20
- data/lib/rubygems/uninstaller.rb +13 -13
- data/lib/rubygems/version.rb +30 -8
- data/test/test_gem.rb +8 -0
- data/test/test_gem_commands_server_command.rb +26 -0
- data/test/test_gem_commands_specification_command.rb +13 -0
- data/test/test_gem_server.rb +10 -0
- data/test/test_gem_specification.rb +50 -26
- data/test/test_gem_uninstaller.rb +30 -0
- data/test/test_gem_version.rb +12 -0
- data/test/test_kernel.rb +3 -1
- metadata +4 -3
- metadata.gz.sig +0 -0
@@ -11,6 +11,7 @@ class Gem::Ext::ConfigureBuilder < Gem::Ext::Builder
|
|
11
11
|
def self.build(extension, directory, dest_path, results)
|
12
12
|
unless File.exist?('Makefile') then
|
13
13
|
cmd = "sh ./configure --prefix=#{dest_path}"
|
14
|
+
cmd << " #{Gem::Command.build_args.join ' '}" unless Gem::Command.build_args.empty?
|
14
15
|
|
15
16
|
run cmd, results
|
16
17
|
end
|
@@ -19,7 +19,7 @@ class Gem::Ext::RakeBuilder < Gem::Ext::Builder
|
|
19
19
|
# Deal with possible spaces in the path, e.g. C:/Program Files
|
20
20
|
dest_path = '"' + dest_path + '"' if dest_path.include?(' ')
|
21
21
|
|
22
|
-
cmd = ENV['rake'] || Gem.bin_path('rake') rescue Gem.default_exec_format % 'rake'
|
22
|
+
cmd = ENV['rake'] || "#{Gem.ruby} -rubygems #{Gem.bin_path('rake')}" rescue Gem.default_exec_format % 'rake'
|
23
23
|
cmd += " RUBYARCHDIR=#{dest_path} RUBYLIBDIR=#{dest_path}" # ENV is frozen
|
24
24
|
|
25
25
|
run cmd, results
|
@@ -31,8 +31,8 @@ require 'rake/packagetask'
|
|
31
31
|
# Create a package based upon a Gem::Specification. Gem packages, as well as
|
32
32
|
# zip files and tar/gzipped packages can be produced by this task.
|
33
33
|
#
|
34
|
-
# In addition to the Rake targets generated by
|
35
|
-
# Gem::
|
34
|
+
# In addition to the Rake targets generated by Rake::PackageTask, a
|
35
|
+
# Gem::PackageTask will also generate the following tasks:
|
36
36
|
#
|
37
37
|
# [<b>"<em>package_dir</em>/<em>name</em>-<em>version</em>.gem"</b>]
|
38
38
|
# Create a RubyGems package with the given name and version.
|
@@ -40,7 +40,8 @@ require 'rake/packagetask'
|
|
40
40
|
# Example using a Gem::Specification:
|
41
41
|
#
|
42
42
|
# require 'rubygems'
|
43
|
-
#
|
43
|
+
# require 'rubygems/package_task'
|
44
|
+
#
|
44
45
|
# spec = Gem::Specification.new do |s|
|
45
46
|
# s.platform = Gem::Platform::RUBY
|
46
47
|
# s.summary = "Ruby based make-like utility."
|
@@ -52,7 +53,7 @@ require 'rake/packagetask'
|
|
52
53
|
# s.files = PKG_FILES
|
53
54
|
# s.description = <<-EOF
|
54
55
|
# Rake is a Make-like program implemented in Ruby. Tasks
|
55
|
-
# and dependencies are specified in standard Ruby syntax.
|
56
|
+
# and dependencies are specified in standard Ruby syntax.
|
56
57
|
# EOF
|
57
58
|
# end
|
58
59
|
#
|
@@ -76,7 +77,7 @@ class Gem::PackageTask < Rake::PackageTask
|
|
76
77
|
# to define the task.
|
77
78
|
|
78
79
|
def initialize(gem_spec)
|
79
|
-
init
|
80
|
+
init gem_spec
|
80
81
|
yield self if block_given?
|
81
82
|
define if block_given?
|
82
83
|
end
|
@@ -85,7 +86,7 @@ class Gem::PackageTask < Rake::PackageTask
|
|
85
86
|
# Initialization tasks without the "yield self" or define operations.
|
86
87
|
|
87
88
|
def init(gem)
|
88
|
-
super
|
89
|
+
super gem.name, gem.version
|
89
90
|
@gem_spec = gem
|
90
91
|
@package_files += gem_spec.files if gem_spec.files
|
91
92
|
end
|
@@ -108,10 +109,10 @@ class Gem::PackageTask < Rake::PackageTask
|
|
108
109
|
}
|
109
110
|
end
|
110
111
|
end
|
111
|
-
|
112
|
+
|
112
113
|
def gem_file
|
113
114
|
"#{@gem_spec.full_name}.gem"
|
114
115
|
end
|
115
|
-
|
116
|
+
|
116
117
|
end
|
117
118
|
|
data/lib/rubygems/requirement.rb
CHANGED
@@ -26,7 +26,7 @@ class Gem::Requirement
|
|
26
26
|
"<" => lambda { |v, r| v < r },
|
27
27
|
">=" => lambda { |v, r| v >= r },
|
28
28
|
"<=" => lambda { |v, r| v <= r },
|
29
|
-
"~>" => lambda { |v, r| v >= r && v < r.bump }
|
29
|
+
"~>" => lambda { |v, r| v = v.release; v >= r && v < r.bump }
|
30
30
|
}
|
31
31
|
|
32
32
|
OP_RE = OPS.keys.map{ |k| Regexp.quote k }.join '|'
|
data/lib/rubygems/server.rb
CHANGED
@@ -17,6 +17,7 @@ require 'rubygems/doc_manager'
|
|
17
17
|
# name/version/platform index
|
18
18
|
# * "/quick/" - Individual gemspecs
|
19
19
|
# * "/gems" - Direct access to download the installable gems
|
20
|
+
# * "/rdoc?q=" - Search for installed rdoc documentation
|
20
21
|
# * legacy indexes:
|
21
22
|
# * "/Marshal.#{Gem.marshal_version}" - Full SourceIndex dump of metadata
|
22
23
|
# for installed gems
|
@@ -32,9 +33,20 @@ require 'rubygems/doc_manager'
|
|
32
33
|
|
33
34
|
class Gem::Server
|
34
35
|
|
36
|
+
include ERB::Util
|
35
37
|
include Gem::UserInteraction
|
36
38
|
|
37
|
-
|
39
|
+
SEARCH = <<-SEARCH
|
40
|
+
<form class="headerSearch" name="headerSearchForm" method="get" action="/rdoc">
|
41
|
+
<div id="search" style="float:right">
|
42
|
+
<span>Filter/Search</span>
|
43
|
+
<input id="q" type="text" style="width:10em" name="q"/>
|
44
|
+
<button type="submit" style="display:none" />
|
45
|
+
</div>
|
46
|
+
</form>
|
47
|
+
SEARCH
|
48
|
+
|
49
|
+
DOC_TEMPLATE = <<-'DOC_TEMPLATE'
|
38
50
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
39
51
|
<!DOCTYPE html
|
40
52
|
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
@@ -47,6 +59,7 @@ class Gem::Server
|
|
47
59
|
</head>
|
48
60
|
<body>
|
49
61
|
<div id="fileHeader">
|
62
|
+
<%= SEARCH %>
|
50
63
|
<h1>RubyGems Documentation Index</h1>
|
51
64
|
</div>
|
52
65
|
<!-- banner header -->
|
@@ -114,10 +127,10 @@ class Gem::Server
|
|
114
127
|
</div>
|
115
128
|
</body>
|
116
129
|
</html>
|
117
|
-
|
130
|
+
DOC_TEMPLATE
|
118
131
|
|
119
132
|
# CSS is copy & paste from rdoc-style.css, RDoc V1.0.1 - 20041108
|
120
|
-
RDOC_CSS = <<-
|
133
|
+
RDOC_CSS = <<-RDOC_CSS
|
121
134
|
body {
|
122
135
|
font-family: Verdana,Arial,Helvetica,sans-serif;
|
123
136
|
font-size: 90%;
|
@@ -325,7 +338,92 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
|
|
325
338
|
.ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
|
326
339
|
.ruby-regexp { color: #ffa07a; background: transparent; }
|
327
340
|
.ruby-value { color: #7fffd4; background: transparent; }
|
328
|
-
|
341
|
+
RDOC_CSS
|
342
|
+
|
343
|
+
RDOC_NO_DOCUMENTATION = <<-'NO_DOC'
|
344
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
345
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
346
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
347
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
348
|
+
<head>
|
349
|
+
<title>Found documentation</title>
|
350
|
+
<link rel="stylesheet" href="gem-server-rdoc-style.css" type="text/css" media="screen" />
|
351
|
+
</head>
|
352
|
+
<body>
|
353
|
+
<div id="fileHeader">
|
354
|
+
<%= SEARCH %>
|
355
|
+
<h1>No documentation found</h1>
|
356
|
+
</div>
|
357
|
+
|
358
|
+
<div id="bodyContent">
|
359
|
+
<div id="contextContent">
|
360
|
+
<div id="description">
|
361
|
+
<p>No gems matched <%= h query.inspect %></p>
|
362
|
+
|
363
|
+
<p>
|
364
|
+
Back to <a href="/">complete gem index</a>
|
365
|
+
</p>
|
366
|
+
|
367
|
+
</div>
|
368
|
+
</div>
|
369
|
+
</div>
|
370
|
+
<div id="validator-badges">
|
371
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
372
|
+
</div>
|
373
|
+
</body>
|
374
|
+
</html>
|
375
|
+
NO_DOC
|
376
|
+
|
377
|
+
RDOC_SEARCH_TEMPLATE = <<-'RDOC_SEARCH'
|
378
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
379
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
380
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
381
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
382
|
+
<head>
|
383
|
+
<title>Found documentation</title>
|
384
|
+
<link rel="stylesheet" href="gem-server-rdoc-style.css" type="text/css" media="screen" />
|
385
|
+
</head>
|
386
|
+
<body>
|
387
|
+
<div id="fileHeader">
|
388
|
+
<%= SEARCH %>
|
389
|
+
<h1>Found documentation</h1>
|
390
|
+
</div>
|
391
|
+
<!-- banner header -->
|
392
|
+
|
393
|
+
<div id="bodyContent">
|
394
|
+
<div id="contextContent">
|
395
|
+
<div id="description">
|
396
|
+
<h1>Summary</h1>
|
397
|
+
<p><%=doc_items.length%> documentation topics found.</p>
|
398
|
+
<h1>Topics</h1>
|
399
|
+
|
400
|
+
<dl>
|
401
|
+
<% doc_items.each do |doc_item| %>
|
402
|
+
<dt>
|
403
|
+
<b><%=doc_item[:name]%></b>
|
404
|
+
<a href="<%=doc_item[:url]%>">[rdoc]</a>
|
405
|
+
</dt>
|
406
|
+
<dd>
|
407
|
+
<%=doc_item[:summary]%>
|
408
|
+
<br/>
|
409
|
+
<br/>
|
410
|
+
</dd>
|
411
|
+
<% end %>
|
412
|
+
</dl>
|
413
|
+
|
414
|
+
<p>
|
415
|
+
Back to <a href="/">complete gem index</a>
|
416
|
+
</p>
|
417
|
+
|
418
|
+
</div>
|
419
|
+
</div>
|
420
|
+
</div>
|
421
|
+
<div id="validator-badges">
|
422
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
423
|
+
</div>
|
424
|
+
</body>
|
425
|
+
</html>
|
426
|
+
RDOC_SEARCH
|
329
427
|
|
330
428
|
def self.run(options)
|
331
429
|
new(options[:gemdir], options[:port], options[:daemon]).run
|
@@ -533,6 +631,90 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
|
|
533
631
|
res.body = result
|
534
632
|
end
|
535
633
|
|
634
|
+
##
|
635
|
+
# Can be used for quick navigation to the rdoc documentation. You can then
|
636
|
+
# define a search shortcut for your browser. E.g. in Firefox connect
|
637
|
+
# 'shortcut:rdoc' to http://localhost:8808/rdoc?q=%s template. Then you can
|
638
|
+
# directly open the ActionPack documentation by typing 'rdoc actionp'. If
|
639
|
+
# there are multiple hits for the search term, they are presented as a list
|
640
|
+
# with links.
|
641
|
+
#
|
642
|
+
# Search algorithm aims for an intuitive search:
|
643
|
+
# 1. first try to find the gems and documentation folders which name
|
644
|
+
# starts with the search term
|
645
|
+
# 2. search for entries, that *contain* the search term
|
646
|
+
# 3. show all the gems
|
647
|
+
#
|
648
|
+
# If there is only one search hit, user is immediately redirected to the
|
649
|
+
# documentation for the particular gem, otherwise a list with results is
|
650
|
+
# shown.
|
651
|
+
#
|
652
|
+
# === Additional trick - install documentation for ruby core
|
653
|
+
#
|
654
|
+
# Note: please adjust paths accordingly use for example 'locate yaml.rb' and
|
655
|
+
# 'gem environment' to identify directories, that are specific for your
|
656
|
+
# local installation
|
657
|
+
#
|
658
|
+
# 1. install ruby sources
|
659
|
+
# cd /usr/src
|
660
|
+
# sudo apt-get source ruby
|
661
|
+
#
|
662
|
+
# 2. generate documentation
|
663
|
+
# rdoc -o /usr/lib/ruby/gems/1.8/doc/core/rdoc \
|
664
|
+
# /usr/lib/ruby/1.8 ruby1.8-1.8.7.72
|
665
|
+
#
|
666
|
+
# By typing 'rdoc core' you can now access the core documentation
|
667
|
+
|
668
|
+
def rdoc(req, res)
|
669
|
+
query = req.query['q']
|
670
|
+
show_rdoc_for_pattern("#{query}*", res) && return
|
671
|
+
show_rdoc_for_pattern("*#{query}*", res) && return
|
672
|
+
|
673
|
+
template = ERB.new RDOC_NO_DOCUMENTATION
|
674
|
+
|
675
|
+
res['content-type'] = 'text/html'
|
676
|
+
res.body = template.result binding
|
677
|
+
end
|
678
|
+
|
679
|
+
##
|
680
|
+
# Returns true and prepares http response, if rdoc for the requested gem
|
681
|
+
# name pattern was found.
|
682
|
+
#
|
683
|
+
# The search is based on the file system content, not on the gems metadata.
|
684
|
+
# This allows additional documentation folders like 'core' for the ruby core
|
685
|
+
# documentation - just put it underneath the main doc folder.
|
686
|
+
|
687
|
+
def show_rdoc_for_pattern(pattern, res)
|
688
|
+
found_gems = Dir.glob("#{@gem_dir}/doc/#{pattern}").select {|path|
|
689
|
+
File.exist? File.join(path, 'rdoc/index.html')
|
690
|
+
}
|
691
|
+
case found_gems.length
|
692
|
+
when 0
|
693
|
+
return false
|
694
|
+
when 1
|
695
|
+
new_path = File.basename(found_gems[0])
|
696
|
+
res.status = 302
|
697
|
+
res['Location'] = "/doc_root/#{new_path}/rdoc/index.html"
|
698
|
+
return true
|
699
|
+
else
|
700
|
+
doc_items = []
|
701
|
+
found_gems.each do |file_name|
|
702
|
+
base_name = File.basename(file_name)
|
703
|
+
doc_items << {
|
704
|
+
:name => base_name,
|
705
|
+
:url => "/doc_root/#{base_name}/rdoc/index.html",
|
706
|
+
:summary => ''
|
707
|
+
}
|
708
|
+
end
|
709
|
+
|
710
|
+
template = ERB.new(RDOC_SEARCH_TEMPLATE)
|
711
|
+
res['content-type'] = 'text/html'
|
712
|
+
result = template.result binding
|
713
|
+
res.body = result
|
714
|
+
return true
|
715
|
+
end
|
716
|
+
end
|
717
|
+
|
536
718
|
def run
|
537
719
|
@server.listen nil, @port
|
538
720
|
|
@@ -564,6 +746,8 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
|
|
564
746
|
|
565
747
|
@server.mount_proc "/", method(:root)
|
566
748
|
|
749
|
+
@server.mount_proc "/rdoc", method(:rdoc)
|
750
|
+
|
567
751
|
paths = { "/gems" => "/cache/", "/doc_root" => "/doc/" }
|
568
752
|
paths.each do |mount_point, mount_dir|
|
569
753
|
@server.mount(mount_point, WEBrick::HTTPServlet::FileHandler,
|
@@ -10,19 +10,7 @@ require 'rubygems/requirement'
|
|
10
10
|
require 'rubygems/platform'
|
11
11
|
|
12
12
|
# :stopdoc:
|
13
|
-
# Time::today has been deprecated in 0.9.5 and will be removed.
|
14
|
-
if RUBY_VERSION < '1.9' then
|
15
|
-
def Time.today
|
16
|
-
file, lineno = location_of_caller
|
17
|
-
warn "#{file}:#{lineno}:Warning: Time::today is deprecated and will be removed in RubyGems 1.4."
|
18
|
-
|
19
|
-
t = Time.now
|
20
|
-
t - ((t.to_f + t.gmt_offset) % 86400)
|
21
|
-
end unless defined? Time.today
|
22
|
-
end
|
23
|
-
|
24
13
|
class Date; end # for ruby_code if date.rb wasn't required
|
25
|
-
|
26
14
|
# :startdoc:
|
27
15
|
|
28
16
|
##
|
@@ -621,7 +609,11 @@ class Gem::Specification
|
|
621
609
|
# The directory that this gem was installed into.
|
622
610
|
|
623
611
|
def installation_path
|
624
|
-
|
612
|
+
unless @loaded_from then
|
613
|
+
raise Gem::Exception, "spec #{full_name} is not from an installed gem"
|
614
|
+
end
|
615
|
+
|
616
|
+
File.expand_path File.dirname(File.dirname(@loaded_from))
|
625
617
|
end
|
626
618
|
|
627
619
|
##
|
@@ -822,7 +814,9 @@ class Gem::Specification
|
|
822
814
|
|
823
815
|
@files.delete_if do |file| File.directory? file end
|
824
816
|
@test_files.delete_if do |file| File.directory? file end
|
825
|
-
@executables.delete_if do |file|
|
817
|
+
@executables.delete_if do |file|
|
818
|
+
File.directory? File.join(bindir, file)
|
819
|
+
end
|
826
820
|
@extra_rdoc_files.delete_if do |file| File.directory? file end
|
827
821
|
@extensions.delete_if do |file| File.directory? file end
|
828
822
|
|
@@ -883,7 +877,8 @@ class Gem::Specification
|
|
883
877
|
'"FIXME" or "TODO" is not a summary'
|
884
878
|
end
|
885
879
|
|
886
|
-
|
880
|
+
if homepage and not homepage.empty? and
|
881
|
+
homepage !~ /\A[a-z][a-z\d+.-]*:/i then
|
887
882
|
raise Gem::InvalidSpecificationException,
|
888
883
|
"\"#{homepage}\" is not a URI"
|
889
884
|
end
|
@@ -899,9 +894,6 @@ class Gem::Specification
|
|
899
894
|
alert_warning 'description and summary are identical'
|
900
895
|
end
|
901
896
|
|
902
|
-
alert_warning "RDoc will not be generated (has_rdoc == false)" unless
|
903
|
-
has_rdoc
|
904
|
-
|
905
897
|
alert_warning "deprecated autorequire specified" if autorequire
|
906
898
|
|
907
899
|
executables.each do |executable|
|
@@ -1144,9 +1136,11 @@ class Gem::Specification
|
|
1144
1136
|
##
|
1145
1137
|
# :attr_accessor: has_rdoc
|
1146
1138
|
#
|
1147
|
-
#
|
1139
|
+
# Deprecated and ignored, defaults to true.
|
1140
|
+
#
|
1141
|
+
# Formerly used to indicate this gem was RDoc-capable.
|
1148
1142
|
|
1149
|
-
attribute :has_rdoc,
|
1143
|
+
attribute :has_rdoc, true
|
1150
1144
|
|
1151
1145
|
##
|
1152
1146
|
# True if this gem supports RDoc
|
@@ -1305,6 +1299,20 @@ class Gem::Specification
|
|
1305
1299
|
|
1306
1300
|
attribute_alias_singular :test_file, :test_files
|
1307
1301
|
|
1302
|
+
##
|
1303
|
+
# has_rdoc is now ignored
|
1304
|
+
|
1305
|
+
overwrite_accessor :has_rdoc do
|
1306
|
+
true
|
1307
|
+
end
|
1308
|
+
|
1309
|
+
##
|
1310
|
+
# has_rdoc is now ignored
|
1311
|
+
|
1312
|
+
overwrite_accessor :has_rdoc= do |value|
|
1313
|
+
@has_rdoc = true
|
1314
|
+
end
|
1315
|
+
|
1308
1316
|
overwrite_accessor :version= do |version|
|
1309
1317
|
@version = Gem::Version.create(version)
|
1310
1318
|
self.required_rubygems_version = '> 1.3.1' if @version.prerelease?
|
data/lib/rubygems/uninstaller.rb
CHANGED
@@ -106,8 +106,8 @@ class Gem::Uninstaller
|
|
106
106
|
hook.call self
|
107
107
|
end
|
108
108
|
|
109
|
-
|
110
|
-
remove spec, specs
|
109
|
+
remove_executables @spec
|
110
|
+
remove @spec, specs
|
111
111
|
|
112
112
|
Gem.post_uninstall_hooks.each do |hook|
|
113
113
|
hook.call self
|
@@ -120,29 +120,29 @@ class Gem::Uninstaller
|
|
120
120
|
# Removes installed executables and batch files (windows only) for
|
121
121
|
# +gemspec+.
|
122
122
|
|
123
|
-
def remove_executables(
|
124
|
-
return if
|
123
|
+
def remove_executables(spec)
|
124
|
+
return if spec.nil?
|
125
125
|
|
126
|
-
|
127
|
-
bindir = @bin_dir ? @bin_dir :
|
126
|
+
unless spec.executables.empty? then
|
127
|
+
bindir = @bin_dir ? @bin_dir : Gem.bindir(spec.installation_path)
|
128
128
|
|
129
|
-
list = @source_index.find_name(
|
130
|
-
spec.version ==
|
129
|
+
list = @source_index.find_name(spec.name).delete_if { |spec|
|
130
|
+
spec.version == spec.version
|
131
131
|
}
|
132
132
|
|
133
|
-
executables =
|
133
|
+
executables = spec.executables.clone
|
134
134
|
|
135
135
|
list.each do |spec|
|
136
136
|
spec.executables.each do |exe_name|
|
137
|
-
executables.delete
|
137
|
+
executables.delete exe_name
|
138
138
|
end
|
139
139
|
end
|
140
140
|
|
141
|
-
return if executables.
|
141
|
+
return if executables.empty?
|
142
142
|
|
143
143
|
answer = if @force_executables.nil? then
|
144
144
|
ask_yes_no("Remove executables:\n" \
|
145
|
-
"\t#{
|
145
|
+
"\t#{spec.executables.join(", ")}\n\nin addition to the gem?",
|
146
146
|
true) # " # appease ruby-mode - don't ask
|
147
147
|
else
|
148
148
|
@force_executables
|
@@ -153,7 +153,7 @@ class Gem::Uninstaller
|
|
153
153
|
else
|
154
154
|
raise Gem::FilePermissionError, bindir unless File.writable? bindir
|
155
155
|
|
156
|
-
|
156
|
+
spec.executables.each do |exe_name|
|
157
157
|
say "Removing #{exe_name}"
|
158
158
|
FileUtils.rm_f File.join(bindir, exe_name)
|
159
159
|
FileUtils.rm_f File.join(bindir, "#{exe_name}.bat")
|