rubygems-update 0.9.2 → 0.9.3
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.
Potentially problematic release.
This version of rubygems-update might be problematic. Click here for more details.
- data/ChangeLog +60 -0
- data/lib/rubygems.rb +18 -15
- data/lib/rubygems/builder.rb +29 -23
- data/lib/rubygems/{cmd_manager.rb → command_manager.rb} +35 -24
- data/lib/rubygems/commands/build_command.rb +57 -0
- data/lib/rubygems/commands/cert_command.rb +83 -0
- data/lib/rubygems/commands/check_command.rb +74 -0
- data/lib/rubygems/commands/cleanup_command.rb +75 -0
- data/lib/rubygems/commands/contents_command.rb +66 -0
- data/lib/rubygems/commands/dependency_command.rb +105 -0
- data/lib/rubygems/commands/environment_command.rb +59 -0
- data/lib/rubygems/commands/help_command.rb +82 -0
- data/lib/rubygems/commands/install_command.rb +139 -0
- data/lib/rubygems/commands/list_command.rb +33 -0
- data/lib/rubygems/commands/outdated_command.rb +21 -0
- data/lib/rubygems/commands/pristine_command.rb +103 -0
- data/lib/rubygems/commands/query_command.rb +86 -0
- data/lib/rubygems/commands/rdoc_command.rb +75 -0
- data/lib/rubygems/commands/search_command.rb +35 -0
- data/lib/rubygems/commands/sources_command.rb +73 -0
- data/lib/rubygems/commands/specification_command.rb +58 -0
- data/lib/rubygems/commands/uninstall_command.rb +51 -0
- data/lib/rubygems/commands/unpack_command.rb +76 -0
- data/lib/rubygems/commands/update_command.rb +102 -0
- data/lib/rubygems/digest/digest_adapter.rb +40 -0
- data/lib/rubygems/digest/md5.rb +20 -0
- data/lib/rubygems/digest/sha1.rb +17 -0
- data/lib/rubygems/digest/sha2.rb +17 -0
- data/lib/rubygems/format.rb +1 -1
- data/lib/rubygems/gem_commands.rb +6 -1407
- data/lib/rubygems/gem_runner.rb +2 -2
- data/lib/rubygems/installer.rb +13 -5
- data/lib/rubygems/open-uri.rb +2 -2
- data/lib/rubygems/package.rb +13 -14
- data/lib/rubygems/rubygems_version.rb +1 -1
- data/lib/rubygems/source_index.rb +4 -4
- data/lib/rubygems/specification.rb +5 -0
- data/lib/rubygems/validator.rb +8 -8
- data/setup.rb +806 -588
- data/test/gemutilities.rb +2 -2
- data/test/test_builder.rb +15 -0
- data/test/test_check_command.rb +1 -1
- data/test/test_command.rb +1 -1
- data/test/test_gem_digest.rb +44 -0
- data/test/test_gem_outdated_command.rb +2 -1
- data/test/test_gem_sources_command.rb +11 -6
- data/test/test_installer.rb +1 -1
- data/test/test_open_uri.rb +14 -0
- data/test/test_parse_commands.rb +25 -25
- data/test/test_process_commands.rb +5 -5
- data/test/test_specific_extras.rb +1 -1
- data/test/test_validator.rb +3 -3
- metadata +30 -4
@@ -0,0 +1,33 @@
|
|
1
|
+
module Gem
|
2
|
+
module Commands
|
3
|
+
class ListCommand < QueryCommand
|
4
|
+
include CommandAids
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
super(
|
8
|
+
'list',
|
9
|
+
'Display all gems whose name starts with STRING'
|
10
|
+
)
|
11
|
+
remove_option('--name-matches')
|
12
|
+
end
|
13
|
+
|
14
|
+
def defaults_str
|
15
|
+
"--local --no-details"
|
16
|
+
end
|
17
|
+
|
18
|
+
def usage
|
19
|
+
"#{program_name} [STRING]"
|
20
|
+
end
|
21
|
+
|
22
|
+
def arguments
|
23
|
+
"STRING start of gem name to look for"
|
24
|
+
end
|
25
|
+
|
26
|
+
def execute
|
27
|
+
string = get_one_optional_argument || ''
|
28
|
+
options[:name] = /^#{string}/i
|
29
|
+
super
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Gem
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
class OutdatedCommand < Command
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
super 'outdated', 'Display all gems that need updates'
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute
|
11
|
+
locals = Gem::SourceIndex.from_installed_gems
|
12
|
+
locals.outdated.each do |name|
|
13
|
+
local = locals.search(/^#{name}$/).last
|
14
|
+
remote = Gem::SourceInfoCache.search(/^#{name}$/).last
|
15
|
+
say "#{local.name} (#{local.version} < #{remote.version})"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module Gem
|
2
|
+
module Commands
|
3
|
+
class PristineCommand < Command
|
4
|
+
include VersionOption
|
5
|
+
include CommandAids
|
6
|
+
def initialize
|
7
|
+
super('pristine',
|
8
|
+
'Restores gem directories to pristine condition from files located in the gem cache',
|
9
|
+
{
|
10
|
+
:version => "> 0.0.0"
|
11
|
+
})
|
12
|
+
add_option('--all',
|
13
|
+
'Restore all installed gems to pristine', 'condition'
|
14
|
+
) do |value, options|
|
15
|
+
options[:all] = value
|
16
|
+
end
|
17
|
+
add_version_option('restore to', 'pristine condition')
|
18
|
+
end
|
19
|
+
|
20
|
+
def defaults_str
|
21
|
+
"--all"
|
22
|
+
end
|
23
|
+
|
24
|
+
def usage
|
25
|
+
"#{program_name} [args]"
|
26
|
+
end
|
27
|
+
|
28
|
+
def arguments
|
29
|
+
"GEMNAME The gem to restore to pristine condition (unless --all)"
|
30
|
+
end
|
31
|
+
|
32
|
+
def execute
|
33
|
+
say "Restoring gem(s) to pristine condition..."
|
34
|
+
if options[:all]
|
35
|
+
all_gems = true
|
36
|
+
specs = Gem::SourceIndex.from_installed_gems.collect do |name, spec|
|
37
|
+
spec
|
38
|
+
end
|
39
|
+
else
|
40
|
+
all_gems = false
|
41
|
+
gem_name = get_one_gem_name
|
42
|
+
specs = Gem::SourceIndex.from_installed_gems.search(gem_name, options[:version])
|
43
|
+
end
|
44
|
+
|
45
|
+
if specs.empty?
|
46
|
+
fail "Failed to find gem #{gem_name} #{options[:version]} to restore to pristine condition"
|
47
|
+
end
|
48
|
+
install_dir = Gem.dir # TODO use installer option
|
49
|
+
raise Gem::FilePermissionError.new(install_dir) unless File.writable?(install_dir)
|
50
|
+
|
51
|
+
gems_were_pristine = true
|
52
|
+
|
53
|
+
specs.each do |spec|
|
54
|
+
installer = Gem::Installer.new nil, :wrappers => true # HACK ugly TODO use installer option
|
55
|
+
|
56
|
+
gem_file = File.join(install_dir, "cache", "#{spec.full_name}.gem")
|
57
|
+
security_policy = nil # TODO use installer option
|
58
|
+
format = Gem::Format.from_file_by_path(gem_file, security_policy)
|
59
|
+
target_directory = File.join(install_dir, "gems", format.spec.full_name).untaint
|
60
|
+
pristine_files = format.file_entries.collect {|data| data[0]["path"]}
|
61
|
+
file_map = {}
|
62
|
+
format.file_entries.each {|entry, file_data| file_map[entry["path"]] = file_data}
|
63
|
+
require 'fileutils'
|
64
|
+
|
65
|
+
Dir.chdir target_directory do
|
66
|
+
deployed_files = Dir.glob(File.join("**", "*")) +
|
67
|
+
Dir.glob(File.join("**", ".*"))
|
68
|
+
to_redeploy = (pristine_files - deployed_files).collect {|path| path.untaint}
|
69
|
+
if to_redeploy.length > 0
|
70
|
+
gems_were_pristine = false
|
71
|
+
say "Restoring #{to_redeploy.length} file#{to_redeploy.length == 1 ? "" : "s"} to #{spec.full_name}..."
|
72
|
+
to_redeploy.each do |path|
|
73
|
+
say " #{path}"
|
74
|
+
FileUtils.mkdir_p File.dirname(path)
|
75
|
+
File.open(path, "wb") do |out|
|
76
|
+
out.write file_map[path]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
installer.generate_bin spec, install_dir
|
83
|
+
end
|
84
|
+
|
85
|
+
say "Rebuilt all bin stubs"
|
86
|
+
|
87
|
+
if gems_were_pristine
|
88
|
+
if all_gems
|
89
|
+
say "All installed gem files are already in pristine condition"
|
90
|
+
else
|
91
|
+
say "#{specs[0].full_name} is already in pristine condition"
|
92
|
+
end
|
93
|
+
else
|
94
|
+
if all_gems
|
95
|
+
say "All installed gem files restored to pristine condition"
|
96
|
+
else
|
97
|
+
say "#{specs[0].full_name} restored to pristine condition"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Gem
|
2
|
+
module Commands
|
3
|
+
class QueryCommand < Command
|
4
|
+
include LocalRemoteOptions
|
5
|
+
|
6
|
+
def initialize(name='query', summary='Query gem information in local or remote repositories')
|
7
|
+
super(name,
|
8
|
+
summary,
|
9
|
+
{:name=>/.*/, :domain=>:local, :details=>false}
|
10
|
+
)
|
11
|
+
add_option('-n', '--name-matches REGEXP', 'Name of gem(s) to query on matches the provided REGEXP') do |value, options|
|
12
|
+
options[:name] = /#{value}/i
|
13
|
+
end
|
14
|
+
add_option('-d', '--[no-]details', 'Display detailed information of gem(s)') do |value, options|
|
15
|
+
options[:details] = value
|
16
|
+
end
|
17
|
+
add_local_remote_options
|
18
|
+
end
|
19
|
+
|
20
|
+
def defaults_str
|
21
|
+
"--local --name-matches '.*' --no-details"
|
22
|
+
end
|
23
|
+
|
24
|
+
def execute
|
25
|
+
if local?
|
26
|
+
say
|
27
|
+
say "*** LOCAL GEMS ***"
|
28
|
+
output_query_results(Gem::cache.search(options[:name]))
|
29
|
+
end
|
30
|
+
if remote?
|
31
|
+
say
|
32
|
+
say "*** REMOTE GEMS ***"
|
33
|
+
output_query_results(Gem::SourceInfoCache.search(options[:name]))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def output_query_results(gemspecs)
|
40
|
+
gem_list_with_version = {}
|
41
|
+
gemspecs.flatten.each do |gemspec|
|
42
|
+
gem_list_with_version[gemspec.name] ||= []
|
43
|
+
gem_list_with_version[gemspec.name] << gemspec
|
44
|
+
end
|
45
|
+
|
46
|
+
gem_list_with_version = gem_list_with_version.sort do |first, second|
|
47
|
+
first[0].downcase <=> second[0].downcase
|
48
|
+
end
|
49
|
+
gem_list_with_version.each do |gem_name, list_of_matching|
|
50
|
+
say
|
51
|
+
list_of_matching = list_of_matching.sort_by { |x| x.version }.reverse
|
52
|
+
seen_versions = []
|
53
|
+
list_of_matching.delete_if do |item|
|
54
|
+
if(seen_versions.member?(item.version))
|
55
|
+
true
|
56
|
+
else
|
57
|
+
seen_versions << item.version
|
58
|
+
false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
say "#{gem_name} (#{list_of_matching.map{|gem| gem.version.to_s}.join(", ")})"
|
62
|
+
say format_text(list_of_matching[0].summary, 68, 4)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
##
|
67
|
+
# Used for wrapping and indenting text
|
68
|
+
#
|
69
|
+
def format_text(text, wrap, indent=0)
|
70
|
+
result = []
|
71
|
+
pattern = Regexp.new("^(.{0,#{wrap}})[ \n]")
|
72
|
+
work = text.dup
|
73
|
+
while work.length > wrap
|
74
|
+
if work =~ pattern
|
75
|
+
result << $1
|
76
|
+
work.slice!(0, $&.length)
|
77
|
+
else
|
78
|
+
result << work.slice!(0, wrap)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
result << work if work.length.nonzero?
|
82
|
+
result.join("\n").gsub(/^/, " " * indent)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Gem
|
2
|
+
module Commands
|
3
|
+
class RdocCommand < Command
|
4
|
+
include VersionOption
|
5
|
+
include CommandAids
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
super('rdoc',
|
9
|
+
'Generates RDoc for pre-installed gems',
|
10
|
+
{
|
11
|
+
:version => "> 0.0.0",
|
12
|
+
:include_rdoc => true,
|
13
|
+
:include_ri => true,
|
14
|
+
})
|
15
|
+
add_option('--all',
|
16
|
+
'Generate RDoc/RI documentation for all',
|
17
|
+
'installed gems') do |value, options|
|
18
|
+
options[:all] = value
|
19
|
+
end
|
20
|
+
add_option('--[no-]rdoc',
|
21
|
+
'Include RDoc generated documents') do
|
22
|
+
|value, options|
|
23
|
+
options[:include_rdoc] = value
|
24
|
+
end
|
25
|
+
add_option('--[no-]ri',
|
26
|
+
'Include RI generated documents'
|
27
|
+
) do |value, options|
|
28
|
+
options[:include_ri] = value
|
29
|
+
end
|
30
|
+
add_version_option('rdoc')
|
31
|
+
end
|
32
|
+
|
33
|
+
def defaults_str
|
34
|
+
"--version '> 0.0.0' --rdoc --ri"
|
35
|
+
end
|
36
|
+
|
37
|
+
def usage
|
38
|
+
"#{program_name} [args]"
|
39
|
+
end
|
40
|
+
|
41
|
+
def arguments
|
42
|
+
"GEMNAME The gem to generate RDoc for (unless --all)"
|
43
|
+
end
|
44
|
+
|
45
|
+
def execute
|
46
|
+
if options[:all]
|
47
|
+
specs = Gem::SourceIndex.from_installed_gems.collect { |name, spec|
|
48
|
+
spec
|
49
|
+
}
|
50
|
+
else
|
51
|
+
gem_name = get_one_gem_name
|
52
|
+
specs = Gem::SourceIndex.from_installed_gems.search(
|
53
|
+
gem_name, options[:version])
|
54
|
+
end
|
55
|
+
|
56
|
+
if specs.empty?
|
57
|
+
fail "Failed to find gem #{gem_name} to generate RDoc for #{options[:version]}"
|
58
|
+
end
|
59
|
+
if options[:include_ri]
|
60
|
+
specs.each do |spec|
|
61
|
+
Gem::DocManager.new(spec).generate_ri
|
62
|
+
end
|
63
|
+
end
|
64
|
+
if options[:include_rdoc]
|
65
|
+
specs.each do |spec|
|
66
|
+
Gem::DocManager.new(spec).generate_rdoc
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
true
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Gem
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
class SearchCommand < QueryCommand
|
5
|
+
include CommandAids
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
super(
|
9
|
+
'search',
|
10
|
+
'Display all gems whose name contains STRING'
|
11
|
+
)
|
12
|
+
remove_option('--name-matches')
|
13
|
+
end
|
14
|
+
|
15
|
+
def defaults_str
|
16
|
+
"--local --no-details"
|
17
|
+
end
|
18
|
+
|
19
|
+
def usage
|
20
|
+
"#{program_name} [STRING]"
|
21
|
+
end
|
22
|
+
|
23
|
+
def arguments
|
24
|
+
"STRING fragment of gem name to look for"
|
25
|
+
end
|
26
|
+
|
27
|
+
def execute
|
28
|
+
string = get_one_optional_argument
|
29
|
+
options[:name] = /#{string}/i
|
30
|
+
super
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Gem
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
class SourcesCommand < Command
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
super 'sources', 'Manage the sources RubyGems will search forgems'
|
8
|
+
|
9
|
+
add_option '-a', '--add SOURCE_URI', 'Add source' do |value, options|
|
10
|
+
options[:add] = value
|
11
|
+
end
|
12
|
+
|
13
|
+
add_option '-l', '--list', 'List sources' do |value, options|
|
14
|
+
options[:list] = value
|
15
|
+
end
|
16
|
+
|
17
|
+
add_option '-r', '--remove SOURCE_URI', 'Remove source' do |value, options|
|
18
|
+
options[:remove] = value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def defaults_str
|
23
|
+
'--list'
|
24
|
+
end
|
25
|
+
|
26
|
+
def execute
|
27
|
+
if options[:add] then
|
28
|
+
source_uri = options[:add]
|
29
|
+
|
30
|
+
sice = Gem::SourceInfoCacheEntry.new nil, nil
|
31
|
+
begin
|
32
|
+
sice.refresh source_uri
|
33
|
+
rescue ArgumentError
|
34
|
+
say "#{source_uri} is not a URI"
|
35
|
+
rescue Gem::RemoteFetcher::FetchError => e
|
36
|
+
say "Error fetching #{source_uri}:\n\t#{e.message}"
|
37
|
+
else
|
38
|
+
Gem::SourceInfoCache.cache_data[source_uri] = sice
|
39
|
+
Gem::SourceInfoCache.cache.update
|
40
|
+
Gem::SourceInfoCache.cache.flush
|
41
|
+
|
42
|
+
say "#{source_uri} added to sources"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
if options[:remove] then
|
47
|
+
source_uri = options[:remove]
|
48
|
+
|
49
|
+
unless Gem::SourceInfoCache.cache_data.include? source_uri then
|
50
|
+
say "source #{source_uri} not present in cache"
|
51
|
+
else
|
52
|
+
Gem::SourceInfoCache.cache_data.delete source_uri
|
53
|
+
Gem::SourceInfoCache.cache.update
|
54
|
+
Gem::SourceInfoCache.cache.flush
|
55
|
+
say "#{source_uri} removed from sources"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
if options[:list] or not (options[:add] or options[:remove]) then
|
60
|
+
say "*** CURRENT SOURCES ***"
|
61
|
+
say
|
62
|
+
|
63
|
+
Gem::SourceInfoCache.cache_data.keys.each do |source_uri|
|
64
|
+
say source_uri
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Gem
|
2
|
+
module Commands
|
3
|
+
class SpecificationCommand < Command
|
4
|
+
include VersionOption
|
5
|
+
include LocalRemoteOptions
|
6
|
+
include CommandAids
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super('specification', 'Display gem specification (in yaml)',
|
10
|
+
{:domain=>:local, :version=>"> 0.0.0"})
|
11
|
+
add_version_option('examine')
|
12
|
+
add_local_remote_options
|
13
|
+
add_option('--all', 'Output specifications for all versions of',
|
14
|
+
'the gem') do |value, options|
|
15
|
+
options[:all] = true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def defaults_str
|
20
|
+
"--local --version '(latest)'"
|
21
|
+
end
|
22
|
+
|
23
|
+
def usage
|
24
|
+
"#{program_name} GEMFILE"
|
25
|
+
end
|
26
|
+
|
27
|
+
def arguments
|
28
|
+
"GEMFILE Name of a .gem file to examine"
|
29
|
+
end
|
30
|
+
|
31
|
+
def execute
|
32
|
+
if local?
|
33
|
+
gem = get_one_gem_name
|
34
|
+
gem_specs = Gem::SourceIndex.from_installed_gems.search(gem, options[:version])
|
35
|
+
unless gem_specs.empty?
|
36
|
+
require 'yaml'
|
37
|
+
output = lambda { |spec| say spec.to_yaml; say "\n" }
|
38
|
+
if options[:all]
|
39
|
+
gem_specs.each(&output)
|
40
|
+
else
|
41
|
+
spec = gem_specs.sort_by { |spec| spec.version }.last
|
42
|
+
output[spec]
|
43
|
+
end
|
44
|
+
else
|
45
|
+
alert_error "Unknown gem #{gem}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
if remote?
|
50
|
+
say "(Remote 'info' operation is not yet implemented.)"
|
51
|
+
# NOTE: when we do implement remote info, make sure we don't
|
52
|
+
# duplicate huge swabs of local data. If it's the same, just
|
53
|
+
# say it's the same.
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|