slimgems 1.3.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (185) hide show
  1. data/ChangeLog +5811 -0
  2. data/History.txt +887 -0
  3. data/LICENSE.txt +51 -0
  4. data/README.md +87 -0
  5. data/Rakefile +120 -0
  6. data/bin/gem +25 -0
  7. data/bin/update_slimgems +35 -0
  8. data/bootstrap/Rakefile +4 -0
  9. data/hide_lib_for_update/note.txt +5 -0
  10. data/lib/gauntlet_rubygems.rb +50 -0
  11. data/lib/rbconfig/datadir.rb +20 -0
  12. data/lib/rubygems.rb +1220 -0
  13. data/lib/rubygems/builder.rb +102 -0
  14. data/lib/rubygems/command.rb +534 -0
  15. data/lib/rubygems/command_manager.rb +182 -0
  16. data/lib/rubygems/commands/build_command.rb +53 -0
  17. data/lib/rubygems/commands/cert_command.rb +86 -0
  18. data/lib/rubygems/commands/check_command.rb +80 -0
  19. data/lib/rubygems/commands/cleanup_command.rb +106 -0
  20. data/lib/rubygems/commands/contents_command.rb +98 -0
  21. data/lib/rubygems/commands/dependency_command.rb +195 -0
  22. data/lib/rubygems/commands/environment_command.rb +132 -0
  23. data/lib/rubygems/commands/fetch_command.rb +67 -0
  24. data/lib/rubygems/commands/generate_index_command.rb +133 -0
  25. data/lib/rubygems/commands/help_command.rb +172 -0
  26. data/lib/rubygems/commands/install_command.rb +178 -0
  27. data/lib/rubygems/commands/list_command.rb +35 -0
  28. data/lib/rubygems/commands/lock_command.rb +110 -0
  29. data/lib/rubygems/commands/mirror_command.rb +111 -0
  30. data/lib/rubygems/commands/outdated_command.rb +33 -0
  31. data/lib/rubygems/commands/owner_command.rb +75 -0
  32. data/lib/rubygems/commands/pristine_command.rb +93 -0
  33. data/lib/rubygems/commands/push_command.rb +56 -0
  34. data/lib/rubygems/commands/query_command.rb +280 -0
  35. data/lib/rubygems/commands/rdoc_command.rb +91 -0
  36. data/lib/rubygems/commands/search_command.rb +31 -0
  37. data/lib/rubygems/commands/server_command.rb +86 -0
  38. data/lib/rubygems/commands/setup_command.rb +387 -0
  39. data/lib/rubygems/commands/sources_command.rb +157 -0
  40. data/lib/rubygems/commands/specification_command.rb +125 -0
  41. data/lib/rubygems/commands/stale_command.rb +27 -0
  42. data/lib/rubygems/commands/uninstall_command.rb +83 -0
  43. data/lib/rubygems/commands/unpack_command.rb +121 -0
  44. data/lib/rubygems/commands/update_command.rb +212 -0
  45. data/lib/rubygems/commands/which_command.rb +86 -0
  46. data/lib/rubygems/config_file.rb +345 -0
  47. data/lib/rubygems/custom_require.rb +44 -0
  48. data/lib/rubygems/defaults.rb +101 -0
  49. data/lib/rubygems/dependency.rb +227 -0
  50. data/lib/rubygems/dependency_installer.rb +286 -0
  51. data/lib/rubygems/dependency_list.rb +208 -0
  52. data/lib/rubygems/doc_manager.rb +242 -0
  53. data/lib/rubygems/errors.rb +35 -0
  54. data/lib/rubygems/exceptions.rb +91 -0
  55. data/lib/rubygems/ext.rb +18 -0
  56. data/lib/rubygems/ext/builder.rb +56 -0
  57. data/lib/rubygems/ext/configure_builder.rb +25 -0
  58. data/lib/rubygems/ext/ext_conf_builder.rb +24 -0
  59. data/lib/rubygems/ext/rake_builder.rb +39 -0
  60. data/lib/rubygems/format.rb +81 -0
  61. data/lib/rubygems/gem_openssl.rb +92 -0
  62. data/lib/rubygems/gem_path_searcher.rb +100 -0
  63. data/lib/rubygems/gem_runner.rb +79 -0
  64. data/lib/rubygems/gemcutter_utilities.rb +49 -0
  65. data/lib/rubygems/indexer.rb +720 -0
  66. data/lib/rubygems/install_update_options.rb +125 -0
  67. data/lib/rubygems/installer.rb +604 -0
  68. data/lib/rubygems/local_remote_options.rb +135 -0
  69. data/lib/rubygems/old_format.rb +153 -0
  70. data/lib/rubygems/package.rb +97 -0
  71. data/lib/rubygems/package/f_sync_dir.rb +23 -0
  72. data/lib/rubygems/package/tar_header.rb +266 -0
  73. data/lib/rubygems/package/tar_input.rb +222 -0
  74. data/lib/rubygems/package/tar_output.rb +144 -0
  75. data/lib/rubygems/package/tar_reader.rb +106 -0
  76. data/lib/rubygems/package/tar_reader/entry.rb +141 -0
  77. data/lib/rubygems/package/tar_writer.rb +241 -0
  78. data/lib/rubygems/package_task.rb +126 -0
  79. data/lib/rubygems/platform.rb +183 -0
  80. data/lib/rubygems/remote_fetcher.rb +414 -0
  81. data/lib/rubygems/require_paths_builder.rb +18 -0
  82. data/lib/rubygems/requirement.rb +153 -0
  83. data/lib/rubygems/security.rb +814 -0
  84. data/lib/rubygems/server.rb +872 -0
  85. data/lib/rubygems/source_index.rb +597 -0
  86. data/lib/rubygems/source_info_cache.rb +395 -0
  87. data/lib/rubygems/source_info_cache_entry.rb +56 -0
  88. data/lib/rubygems/spec_fetcher.rb +337 -0
  89. data/lib/rubygems/specification.rb +1486 -0
  90. data/lib/rubygems/test_utilities.rb +147 -0
  91. data/lib/rubygems/text.rb +65 -0
  92. data/lib/rubygems/uninstaller.rb +278 -0
  93. data/lib/rubygems/user_interaction.rb +527 -0
  94. data/lib/rubygems/validator.rb +240 -0
  95. data/lib/rubygems/version.rb +316 -0
  96. data/lib/rubygems/version_option.rb +65 -0
  97. data/lib/ubygems.rb +10 -0
  98. data/setup.rb +42 -0
  99. data/test/bogussources.rb +8 -0
  100. data/test/data/gem-private_key.pem +27 -0
  101. data/test/data/gem-public_cert.pem +20 -0
  102. data/test/fake_certlib/openssl.rb +7 -0
  103. data/test/foo/discover.rb +0 -0
  104. data/test/functional.rb +92 -0
  105. data/test/gem_installer_test_case.rb +97 -0
  106. data/test/gem_package_tar_test_case.rb +132 -0
  107. data/test/gemutilities.rb +605 -0
  108. data/test/insure_session.rb +43 -0
  109. data/test/mockgemui.rb +56 -0
  110. data/test/plugin/exception/rubygems_plugin.rb +2 -0
  111. data/test/plugin/load/rubygems_plugin.rb +1 -0
  112. data/test/plugin/standarderror/rubygems_plugin.rb +2 -0
  113. data/test/private_key.pem +27 -0
  114. data/test/public_cert.pem +20 -0
  115. data/test/rubygems_plugin.rb +21 -0
  116. data/test/simple_gem.rb +66 -0
  117. data/test/test_config.rb +12 -0
  118. data/test/test_gem.rb +766 -0
  119. data/test/test_gem_builder.rb +27 -0
  120. data/test/test_gem_command.rb +178 -0
  121. data/test/test_gem_command_manager.rb +207 -0
  122. data/test/test_gem_commands_build_command.rb +74 -0
  123. data/test/test_gem_commands_cert_command.rb +124 -0
  124. data/test/test_gem_commands_check_command.rb +18 -0
  125. data/test/test_gem_commands_contents_command.rb +156 -0
  126. data/test/test_gem_commands_dependency_command.rb +216 -0
  127. data/test/test_gem_commands_environment_command.rb +144 -0
  128. data/test/test_gem_commands_fetch_command.rb +76 -0
  129. data/test/test_gem_commands_generate_index_command.rb +135 -0
  130. data/test/test_gem_commands_install_command.rb +315 -0
  131. data/test/test_gem_commands_list_command.rb +36 -0
  132. data/test/test_gem_commands_lock_command.rb +68 -0
  133. data/test/test_gem_commands_mirror_command.rb +60 -0
  134. data/test/test_gem_commands_outdated_command.rb +40 -0
  135. data/test/test_gem_commands_owner_command.rb +105 -0
  136. data/test/test_gem_commands_pristine_command.rb +108 -0
  137. data/test/test_gem_commands_push_command.rb +81 -0
  138. data/test/test_gem_commands_query_command.rb +426 -0
  139. data/test/test_gem_commands_server_command.rb +59 -0
  140. data/test/test_gem_commands_sources_command.rb +209 -0
  141. data/test/test_gem_commands_specification_command.rb +139 -0
  142. data/test/test_gem_commands_stale_command.rb +38 -0
  143. data/test/test_gem_commands_uninstall_command.rb +83 -0
  144. data/test/test_gem_commands_unpack_command.rb +199 -0
  145. data/test/test_gem_commands_update_command.rb +353 -0
  146. data/test/test_gem_commands_which_command.rb +66 -0
  147. data/test/test_gem_config_file.rb +287 -0
  148. data/test/test_gem_dependency.rb +149 -0
  149. data/test/test_gem_dependency_installer.rb +661 -0
  150. data/test/test_gem_dependency_list.rb +230 -0
  151. data/test/test_gem_doc_manager.rb +31 -0
  152. data/test/test_gem_ext_configure_builder.rb +84 -0
  153. data/test/test_gem_ext_ext_conf_builder.rb +173 -0
  154. data/test/test_gem_ext_rake_builder.rb +81 -0
  155. data/test/test_gem_format.rb +70 -0
  156. data/test/test_gem_gem_path_searcher.rb +78 -0
  157. data/test/test_gem_gem_runner.rb +45 -0
  158. data/test/test_gem_gemcutter_utilities.rb +103 -0
  159. data/test/test_gem_indexer.rb +673 -0
  160. data/test/test_gem_install_update_options.rb +68 -0
  161. data/test/test_gem_installer.rb +857 -0
  162. data/test/test_gem_local_remote_options.rb +97 -0
  163. data/test/test_gem_package_tar_header.rb +130 -0
  164. data/test/test_gem_package_tar_input.rb +112 -0
  165. data/test/test_gem_package_tar_output.rb +97 -0
  166. data/test/test_gem_package_tar_reader.rb +46 -0
  167. data/test/test_gem_package_tar_reader_entry.rb +109 -0
  168. data/test/test_gem_package_tar_writer.rb +144 -0
  169. data/test/test_gem_package_task.rb +59 -0
  170. data/test/test_gem_platform.rb +264 -0
  171. data/test/test_gem_remote_fetcher.rb +740 -0
  172. data/test/test_gem_requirement.rb +292 -0
  173. data/test/test_gem_server.rb +356 -0
  174. data/test/test_gem_silent_ui.rb +113 -0
  175. data/test/test_gem_source_index.rb +461 -0
  176. data/test/test_gem_spec_fetcher.rb +410 -0
  177. data/test/test_gem_specification.rb +1291 -0
  178. data/test/test_gem_stream_ui.rb +218 -0
  179. data/test/test_gem_text.rb +43 -0
  180. data/test/test_gem_uninstaller.rb +146 -0
  181. data/test/test_gem_validator.rb +63 -0
  182. data/test/test_gem_version.rb +181 -0
  183. data/test/test_gem_version_option.rb +89 -0
  184. data/test/test_kernel.rb +59 -0
  185. metadata +413 -0
@@ -0,0 +1,51 @@
1
+ RubyGems (and SlimGems) is copyrighted free software by Chad Fowler, Rich Kilmer,
2
+ Jim Weirich and others. You can redistribute it under the conditions below:
3
+
4
+ 1. You may make and give away verbatim copies of the source form of the
5
+ software without restriction, provided that you duplicate all of the
6
+ original copyright notices and associated disclaimers.
7
+
8
+ 2. You may modify your copy of the software in any way, provided that
9
+ you do at least ONE of the following:
10
+
11
+ a) place your modifications in the Public Domain or otherwise
12
+ make them Freely Available, such as by posting said
13
+ modifications to Usenet or an equivalent medium, or by allowing
14
+ the author to include your modifications in the software.
15
+
16
+ b) use the modified software only within your corporation or
17
+ organization.
18
+
19
+ c) rename any non-standard executables so the names do not conflict
20
+ with standard executables, which must also be provided.
21
+
22
+ d) make other distribution arrangements with the author.
23
+
24
+ 3. You may distribute the software in object code or executable
25
+ form, provided that you do at least ONE of the following:
26
+
27
+ a) distribute the executables and library files of the software,
28
+ together with instructions (in the manual page or equivalent)
29
+ on where to get the original distribution.
30
+
31
+ b) accompany the distribution with the machine-readable source of
32
+ the software.
33
+
34
+ c) give non-standard executables non-standard names, with
35
+ instructions on where to get the original software distribution.
36
+
37
+ d) make other distribution arrangements with the author.
38
+
39
+ 4. You may modify and include the part of the software into any other
40
+ software (possibly commercial).
41
+
42
+ 5. The scripts and library files supplied as input to or produced as
43
+ output from the software do not automatically fall under the
44
+ copyright of the software, but belong to whomever generated them,
45
+ and may be sold commercially, and may be aggregated with this
46
+ software.
47
+
48
+ 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
49
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
50
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
51
+ PURPOSE.
@@ -0,0 +1,87 @@
1
+ # SlimGems
2
+
3
+ * Website: http://slimgems.github.com/
4
+ * Github: http://github.com/slimgems/slimgems
5
+ * Get gems from: http://rubygems.org
6
+
7
+ ## Description
8
+
9
+ SlimGems is a drop-in replacement for RubyGems, a package management framework
10
+ for Ruby. We forked the project at 1.3.7, which was a great stable release.
11
+
12
+ SlimGems focuses on maintaining a sane and stable API. We believe that the
13
+ project has been put through enough stress testing by the community to lock
14
+ into the current API functionality for the forseeable future. We will also
15
+ continue to improve the runtime performance over time; we can do this
16
+ without changing the API.
17
+
18
+ ## Project Goals
19
+
20
+ 1. A fast package manager that "Just Works". We will attempt to make SlimGems
21
+ as fast as possible and believe it can be done without breaking the existing
22
+ API.
23
+
24
+ 2. A consistent and stable API. Deprecations will not occur without ample
25
+ warning to library developers *before* a release. Deprecations will not
26
+ necessarily mean removed methods or runtime warnings, and we will consult
27
+ with the community if widely used APIs ever need to be removed.
28
+
29
+ 3. Receptive and friendly project maintainers. We will listen to your bugs
30
+ and suggestions without deriding you. We believe the community deserves
31
+ a voice in matters that affect package management tools, and we respect
32
+ that voice.
33
+
34
+ 4. Improved communication with the community about future plans. We believe
35
+ it's important to keep the community informed about major changes. We will
36
+ discuss our rationale for any changes that might cause problems for other
37
+ library developers.
38
+
39
+ ## What Do I Have to do Differently to Use SlimGems?
40
+
41
+ Nothing. We maintain the same install paths, APIs and overall runtime environment
42
+ that RubyGems had. The only difference is that we have no intention on changing
43
+ this environment in future upgrades. You can upgrade safely knowing that the
44
+ newer versions of SlimGems will still be compatible with all of your code.
45
+
46
+ In short, yes, "require 'rubygems'" still works.
47
+
48
+ ## Installing and Upgrading
49
+
50
+ If you're on RubyGems, you can easily upgrade to SlimGems by typing:
51
+
52
+ $ gem install slimgems
53
+
54
+ You can do this from SlimGems too, but if you have SlimGems already, upgrading
55
+ works better with:
56
+
57
+ $ gem update --system
58
+
59
+ If you don't have any RubyGems or SlimGems install, there is still the pre-gem
60
+ approach to getting software, doing it manually:
61
+
62
+ 1. Download from: http://github.com/slimgems/slimgems
63
+ 2. Unpack into a directory and cd there
64
+ 3. Install with: ruby setup.rb # you may need admin/root privilege
65
+
66
+ For more details and other options, see:
67
+
68
+ ruby setup.rb --help
69
+
70
+ ## Uninstalling
71
+
72
+ If SlimGems isn't for you, you can downgrade back to RubyGems by performing
73
+ the following intuitive command:
74
+
75
+ $ gem uninstall slimgems
76
+
77
+ Again, you might need to have administrator privileges (sudo) to run these
78
+ commands.
79
+
80
+ ## Notes about this SlimGems Fork
81
+
82
+ SlimGems is a RubyGems fork of RubyGems 1.3.7 and a limited set of backports
83
+ from 1.5.2. SlimGems is maintained by Loren Segal and others. SlimGems will
84
+ provide continual improvements with a stable API.
85
+
86
+ You can download the original RubyGems project at
87
+ http://rubyforge.org/projects/rubygems
@@ -0,0 +1,120 @@
1
+ # -*- ruby -*-
2
+
3
+ $:.unshift 'lib'
4
+
5
+ require 'rubygems'
6
+ require 'rubygems/package_task'
7
+ require 'rake/testtask'
8
+
9
+ task :default => :test
10
+ desc "Run just the functional tests"
11
+ Rake::TestTask.new(:test_functional) do |t|
12
+ t.options = '--seed=1'
13
+ t.ruby_opts = ['--disable-gems'] if RUBY_VERSION >= "1.9.1"
14
+ t.test_files = FileList['test/functional*.rb']
15
+ end
16
+
17
+ Rake::TestTask.new(:test) do |t|
18
+ t.options = '--seed=1'
19
+ t.ruby_opts = ['--disable-gems'] if RUBY_VERSION >= "1.9.1"
20
+ t.test_files = FileList['test/test_*.rb']
21
+ end
22
+
23
+ # These tasks expect to have the following directory structure:
24
+ #
25
+ # git/git.rubini.us/code # Rubinius git HEAD checkout
26
+ # svn/ruby/trunk # ruby subversion HEAD checkout
27
+ # svn/rubygems/trunk # SlimGems subversion HEAD checkout
28
+ #
29
+ # If you don't have this directory structure, set RUBY_PATH and/or
30
+ # RUBINIUS_PATH.
31
+
32
+ def rsync_with dir
33
+ rsync_options = "-avP --exclude '*svn*' --exclude '*swp' --exclude '*rbc'" +
34
+ " --exclude '*.rej' --exclude '*.orig' --exclude 'lib/rubygems/defaults/*'"
35
+ sh "rsync #{rsync_options} bin/gem #{dir}/bin/gem"
36
+ sh "rsync #{rsync_options} lib/ #{dir}/lib"
37
+ sh "rsync #{rsync_options} test/ #{dir}/test/rubygems"
38
+ sh "rsync #{rsync_options} util/gem_prelude.rb #{dir}/gem_prelude.rb"
39
+ end
40
+
41
+ def diff_with dir
42
+ diff_options = "-urpN --exclude '*svn*' --exclude '*swp' --exclude '*rbc'"
43
+ sh "diff #{diff_options} bin/gem #{dir}/bin/gem; true"
44
+ sh "diff #{diff_options} lib/ubygems.rb #{dir}/lib/ubygems.rb; true"
45
+ sh "diff #{diff_options} lib/rubygems.rb #{dir}/lib/rubygems.rb; true"
46
+ sh "diff #{diff_options} lib/rubygems #{dir}/lib/rubygems; true"
47
+ sh "diff #{diff_options} lib/rbconfig #{dir}/lib/rbconfig; true"
48
+ sh "diff #{diff_options} test #{dir}/test/rubygems; true"
49
+ sh "diff #{diff_options} util/gem_prelude.rb #{dir}/gem_prelude.rb; true"
50
+ end
51
+
52
+ rubinius_dir = ENV['RUBINIUS_PATH'] || '../../../git/git.rubini.us/code'
53
+ ruby_dir = ENV['RUBY_PATH'] || '../../ruby/trunk'
54
+
55
+ desc "Updates Ruby HEAD with the currently checked-out copy."
56
+ task :update_ruby do
57
+ rsync_with ruby_dir
58
+ end
59
+
60
+ desc "Updates Rubinius HEAD with the currently checked-out copy."
61
+ task :update_rubinius do
62
+ rsync_with rubinius_dir
63
+ end
64
+
65
+ desc "Diffs Ruby HEAD with the currently checked-out copy."
66
+ task :diff_ruby do
67
+ diff_with ruby_dir
68
+ end
69
+
70
+ desc "Diffs Rubinius HEAD with the currently checked-out copy."
71
+ task :diff_rubinius do
72
+ diff_with rubinius_dir
73
+ end
74
+
75
+ desc "Get coverage for a specific test."
76
+ task "rcov:for", [:test] do |task, args|
77
+ mgem = Gem.source_index.find_name("minitest").first rescue nil
78
+ rgem = Gem.source_index.find_name(/rcov/).first
79
+ libs = rgem.require_paths.map { |p| File.join rgem.full_gem_path, p }
80
+ rcov = File.join rgem.full_gem_path, rgem.bindir, rgem.default_executable
81
+
82
+ if mgem
83
+ libs << mgem.require_paths.map { |p| File.join mgem.full_gem_path, p }
84
+ end
85
+
86
+ libs << "lib:test"
87
+
88
+ flags = []
89
+ flags << "-I" << libs.flatten.join(":")
90
+
91
+ rflags = []
92
+ rflags << "-i" << "lib/rubygems"
93
+
94
+ ruby "#{flags.join ' '} #{rcov} #{rflags.join ' '} #{args[:test]}"
95
+ end
96
+
97
+ task :graph do
98
+ $: << File.expand_path("~/Work/p4/zss/src/graph/dev/lib")
99
+ require 'graph'
100
+ deps = Graph.new
101
+ deps.rotate
102
+
103
+ current = nil
104
+ `rake -P -s`.each_line do |line|
105
+ case line
106
+ when /^rake (.+)/
107
+ current = $1
108
+ deps[current] if current # force the node to exist, in case of a leaf
109
+ when /^\s+(.+)/
110
+ deps[current] << $1 if current
111
+ else
112
+ warn "unparsed: #{line.chomp}"
113
+ end
114
+ end
115
+
116
+
117
+ deps.boxes
118
+ deps.save "graph", nil
119
+ end
120
+
data/bin/gem ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ #--
3
+ # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
4
+ # All rights reserved.
5
+ # See LICENSE.txt for permissions.
6
+ #++
7
+
8
+ $:.unshift(File.dirname(__FILE__) + '/../lib/')
9
+ require 'rubygems'
10
+ require 'rubygems/gem_runner'
11
+
12
+ required_version = Gem::Requirement.new ">= 1.8.6"
13
+
14
+ unless required_version.satisfied_by? Gem.ruby_version then
15
+ abort "Expected Ruby Version #{required_version}, is #{Gem.ruby_version}"
16
+ end
17
+
18
+ args = ARGV.clone
19
+
20
+ begin
21
+ Gem::GemRunner.new.run args
22
+ rescue Gem::SystemExitException => e
23
+ exit e.exit_code
24
+ end
25
+
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+ #--
3
+ # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
4
+ # All rights reserved.
5
+ # See LICENSE.txt for permissions.
6
+ #++
7
+
8
+ require 'rubygems'
9
+
10
+ if ARGV.include? '-h' or ARGV.include? '--help' then
11
+ $stderr.puts "#{Gem::GEM_NAME}_update [options]"
12
+ $stderr.puts
13
+ $stderr.puts "This will install the latest version of #{Gem::NAME}."
14
+ $stderr.puts
15
+ $stderr.puts "\t--version=X.Y\tUpdate #{Gem::GEM_NAME} from the X.Y version."
16
+ exit
17
+ end
18
+
19
+ unless ARGV.grep(/--version=([\d\.]*)/).empty? then
20
+ exec Gem.ruby, '-S', $PROGRAM_NAME, "_#{$1}_"
21
+ end
22
+
23
+ update_specs = Gem.source_index.find_name('Gem::GEM_NAME')
24
+ update_spec = update_specs.sort_by {|s| s.version.to_s }.last
25
+ if update_spec.nil?
26
+ puts "Error: Cannot find #{Gem::NAME} Update Path!"
27
+ puts
28
+ puts "#{Gem::NAME} has already been updated."
29
+ puts "The #{Gem::GEM_NAME} gem may now be uninstalled."
30
+ puts "E.g. gem uninstall #{Gem::GEM_NAME}"
31
+ else
32
+ Dir.chdir update_spec.full_gem_path
33
+ system(Gem.ruby, 'setup.rb', *ARGV)
34
+ end
35
+
@@ -0,0 +1,4 @@
1
+ task :default => :install
2
+ task :install do
3
+ require File.dirname(__FILE__) + '/../setup'
4
+ end
@@ -0,0 +1,5 @@
1
+ This directory exists to prevent rubygems-update from being used as real code.
2
+
3
+ If you haven't, you probably want to run `update_rubygems`.
4
+
5
+ You can gem uninstall rubygems-update after doing that.
@@ -0,0 +1,50 @@
1
+ require 'rubygems'
2
+ require 'gauntlet'
3
+
4
+ ##
5
+ # GemGauntlet validates all current gems. Currently these packages are
6
+ # borked:
7
+ #
8
+ # Asami-0.04 : No such file or directory - bin/Asami.rb
9
+ # ObjectGraph-1.0.1 : No such file or directory - bin/objectgraph
10
+ # evil-ruby-0.1.0 : authors must be Array of Strings
11
+ # fresh_cookies-1.0.0 : authors must be Array of Strings
12
+ # plugems_deploy-0.2.0 : authors must be Array of Strings
13
+ # pmsrb-0.2.0 : authors must be Array of Strings
14
+ # pqa-1.6 : authors must be Array of Strings
15
+ # rant-0.5.7 : authors must be Array of Strings
16
+ # rvsh-0.4.5 : No such file or directory - bin/rvsh
17
+ # xen-0.1.2.1 : authors must be Array of Strings
18
+
19
+ class GemGauntlet < Gauntlet
20
+ def run(name)
21
+ warn name
22
+
23
+ spec = begin
24
+ Gem::Specification.load 'gemspec'
25
+ rescue SyntaxError
26
+ Gem::Specification.from_yaml File.read('gemspec')
27
+ end
28
+ spec.validate
29
+
30
+ self.data[name] = false
31
+ self.dirty = true
32
+ rescue SystemCallError, Gem::InvalidSpecificationException => e
33
+ self.data[name] = e.message
34
+ self.dirty = true
35
+ end
36
+
37
+ def should_skip?(name)
38
+ self.data[name] == false
39
+ end
40
+
41
+ def report
42
+ self.data.sort.reject { |k,v| !v }.each do |k,v|
43
+ puts "%-21s: %s" % [k, v]
44
+ end
45
+ end
46
+ end
47
+
48
+ gauntlet = GemGauntlet.new
49
+ gauntlet.run_the_gauntlet ARGV.shift
50
+ gauntlet.report
@@ -0,0 +1,20 @@
1
+ #--
2
+ # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #++
6
+
7
+ module RbConfig
8
+
9
+ ##
10
+ # Return the path to the data directory associated with the given package
11
+ # name. Normally this is just
12
+ # "#{RbConfig::CONFIG['datadir']}/#{package_name}", but may be modified by
13
+ # packages like SlimGems to handle versioned data directories.
14
+
15
+ def self.datadir(package_name)
16
+ File.join(CONFIG['datadir'], package_name)
17
+ end unless RbConfig.respond_to?(:datadir)
18
+
19
+ end
20
+
@@ -0,0 +1,1220 @@
1
+ # -*- ruby -*-
2
+ # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+
6
+ gem_disabled = !defined? Gem
7
+
8
+ unless gem_disabled
9
+ # Nuke the Quickloader stuff
10
+ Gem::QuickLoader.remove if defined?(Gem::QuickLoader)
11
+ end
12
+
13
+ require 'rubygems/defaults'
14
+ require 'thread'
15
+
16
+ ##
17
+ # SlimGems is the Ruby standard for publishing and managing third party
18
+ # libraries.
19
+ #
20
+ # For user documentation, see:
21
+ #
22
+ # * <tt>gem help</tt> and <tt>gem help [command]</tt>
23
+ # * {SlimGems User Guide}[http://docs.rubygems.org/read/book/1]
24
+ # * {Frequently Asked Questions}[http://docs.rubygems.org/read/book/3]
25
+ #
26
+ # For gem developer documentation see:
27
+ #
28
+ # * {Creating Gems}[http://docs.rubygems.org/read/chapter/5]
29
+ # * Gem::Specification
30
+ # * Gem::Version for version dependency notes
31
+ #
32
+ # Further SlimGems documentation can be found at:
33
+ #
34
+ # * {SlimGems API}[http://rubygems.rubyforge.org/rdoc] (also available from
35
+ # <tt>gem server</tt>)
36
+ # * {SlimGems Bookshelf}[http://rubygem.org]
37
+ #
38
+ # == SlimGems Plugins
39
+ #
40
+ # As of #{Gem::NAME} 1.3.2, SlimGems will load plugins installed in gems or
41
+ # $LOAD_PATH. Plugins must be named 'rubygems_plugin' (.rb, .so, etc) and
42
+ # placed at the root of your gem's #require_path. Plugins are discovered via
43
+ # Gem::find_files then loaded. Take care when implementing a plugin as your
44
+ # plugin file may be loaded multiple times if multiple versions of your gem
45
+ # are installed.
46
+ #
47
+ # For an example plugin, see the graph gem which adds a `gem graph` command.
48
+ #
49
+ # == SlimGems Defaults, Packaging
50
+ #
51
+ # SlimGems defaults are stored in rubygems/defaults.rb. If you're packaging
52
+ # #{Gem::NAME} or implementing Ruby you can change SlimGems' defaults.
53
+ #
54
+ # For SlimGems packagers, provide lib/rubygems/operating_system.rb and
55
+ # override any defaults from lib/rubygems/defaults.rb.
56
+ #
57
+ # For Ruby implementers, provide lib/rubygems/#{RUBY_ENGINE}.rb and override
58
+ # any defaults from lib/rubygems/defaults.rb.
59
+ #
60
+ # If you need SlimGems to perform extra work on install or uninstall, your
61
+ # defaults override file can set pre and post install and uninstall hooks.
62
+ # See Gem::pre_install, Gem::pre_uninstall, Gem::post_install,
63
+ # Gem::post_uninstall.
64
+ #
65
+ # == Bugs
66
+ #
67
+ # You can submit bugs to the
68
+ # {SlimGems bug tracker}[http://rubyforge.org/tracker/?atid=575&group_id=126]
69
+ # on RubyForge
70
+ #
71
+ # == Credits
72
+ #
73
+ # SlimGems is currently maintained by Eric Hodel.
74
+ #
75
+ # SlimGems was originally developed at RubyConf 2003 by:
76
+ #
77
+ # * Rich Kilmer -- rich(at)infoether.com
78
+ # * Chad Fowler -- chad(at)chadfowler.com
79
+ # * David Black -- dblack(at)wobblini.net
80
+ # * Paul Brannan -- paul(at)atdesk.com
81
+ # * Jim Weirch -- jim(at)weirichhouse.org
82
+ #
83
+ # Contributors:
84
+ #
85
+ # * Gavin Sinclair -- gsinclair(at)soyabean.com.au
86
+ # * George Marrows -- george.marrows(at)ntlworld.com
87
+ # * Dick Davies -- rasputnik(at)hellooperator.net
88
+ # * Mauricio Fernandez -- batsman.geo(at)yahoo.com
89
+ # * Simon Strandgaard -- neoneye(at)adslhome.dk
90
+ # * Dave Glasser -- glasser(at)mit.edu
91
+ # * Paul Duncan -- pabs(at)pablotron.org
92
+ # * Ville Aine -- vaine(at)cs.helsinki.fi
93
+ # * Eric Hodel -- drbrain(at)segment7.net
94
+ # * Daniel Berger -- djberg96(at)gmail.com
95
+ # * Phil Hagelberg -- technomancy(at)gmail.com
96
+ # * Ryan Davis -- ryand-ruby(at)zenspider.com
97
+ #
98
+ # (If your name is missing, PLEASE let us know!)
99
+ #
100
+ # Thanks!
101
+ #
102
+ # -The SlimGems Team
103
+
104
+ module Gem
105
+ NAME = 'SlimGems'
106
+ GEM_NAME = 'slimgems'
107
+ VERSION = '1.3.8'
108
+ SlimGemsVersion = RubyGemsVersion = VERSION
109
+
110
+ ##
111
+ # Raised when SlimGems is unable to load or activate a gem. Contains the
112
+ # name and version requirements of the gem that either conflicts with
113
+ # already activated gems or that SlimGems is otherwise unable to activate.
114
+
115
+ class LoadError < ::LoadError
116
+ # Name of gem
117
+ attr_accessor :name
118
+
119
+ # Version requirement of gem
120
+ attr_accessor :version_requirement
121
+ end
122
+
123
+ ##
124
+ # Configuration settings from ::RbConfig
125
+
126
+ ConfigMap = {} unless defined?(ConfigMap)
127
+
128
+ require 'rbconfig'
129
+
130
+ ConfigMap.merge!(
131
+ :EXEEXT => RbConfig::CONFIG["EXEEXT"],
132
+ :RUBY_SO_NAME => RbConfig::CONFIG["RUBY_SO_NAME"],
133
+ :arch => RbConfig::CONFIG["arch"],
134
+ :bindir => RbConfig::CONFIG["bindir"],
135
+ :datadir => RbConfig::CONFIG["datadir"],
136
+ :libdir => RbConfig::CONFIG["libdir"],
137
+ :ruby_install_name => RbConfig::CONFIG["ruby_install_name"],
138
+ :ruby_version => RbConfig::CONFIG["ruby_version"],
139
+ :rubylibprefix => RbConfig::CONFIG["rubylibprefix"],
140
+ :sitedir => RbConfig::CONFIG["sitedir"],
141
+ :sitelibdir => RbConfig::CONFIG["sitelibdir"],
142
+ :vendordir => RbConfig::CONFIG["vendordir"] ,
143
+ :vendorlibdir => RbConfig::CONFIG["vendorlibdir"]
144
+ )
145
+
146
+ ##
147
+ # Default directories in a gem repository
148
+
149
+ DIRECTORIES = %w[cache doc gems specifications] unless defined?(DIRECTORIES)
150
+
151
+ RubyGemsPackageVersion = VERSION
152
+ # :startdoc:
153
+
154
+ ##
155
+ # An Array of Regexps that match windows ruby platforms.
156
+
157
+ WIN_PATTERNS = [
158
+ /bccwin/i,
159
+ /cygwin/i,
160
+ /djgpp/i,
161
+ /mingw/i,
162
+ /mswin/i,
163
+ /wince/i,
164
+ ]
165
+
166
+ @@source_index = nil
167
+ @@win_platform = nil
168
+
169
+ @configuration = nil
170
+ @loaded_specs = {}
171
+ @loaded_stacks = {}
172
+ @platforms = []
173
+ @ruby = nil
174
+ @sources = []
175
+
176
+ @post_build_hooks ||= []
177
+ @post_install_hooks ||= []
178
+ @post_uninstall_hooks ||= []
179
+ @pre_uninstall_hooks ||= []
180
+ @pre_install_hooks ||= []
181
+
182
+ ##
183
+ # Activates an installed gem matching +gem+. The gem must satisfy
184
+ # +version_requirements+.
185
+ #
186
+ # Returns true if the gem is activated, false if it is already
187
+ # loaded, or an exception otherwise.
188
+ #
189
+ # Gem#activate adds the library paths in +gem+ to $LOAD_PATH. Before a Gem
190
+ # is activated its required Gems are activated. If the version information
191
+ # is omitted, the highest version Gem of the supplied name is loaded. If a
192
+ # Gem is not found that meets the version requirements or a required Gem is
193
+ # not found, a Gem::LoadError is raised.
194
+ #
195
+ # More information on version requirements can be found in the
196
+ # Gem::Requirement and Gem::Version documentation.
197
+
198
+ def self.activate(gem, *version_requirements)
199
+ if version_requirements.last.is_a?(Hash)
200
+ options = version_requirements.pop
201
+ else
202
+ options = {}
203
+ end
204
+
205
+ sources = options[:sources] || []
206
+
207
+ if version_requirements.empty? then
208
+ version_requirements = Gem::Requirement.default
209
+ end
210
+
211
+ unless gem.respond_to?(:name) and
212
+ gem.respond_to?(:requirement) then
213
+ gem = Gem::Dependency.new(gem, version_requirements)
214
+ end
215
+
216
+ matches = Gem.source_index.find_name(gem.name, gem.requirement)
217
+ report_activate_error(gem) if matches.empty?
218
+
219
+ if @loaded_specs[gem.name] then
220
+ # This gem is already loaded. If the currently loaded gem is not in the
221
+ # list of candidate gems, then we have a version conflict.
222
+ existing_spec = @loaded_specs[gem.name]
223
+
224
+ unless matches.any? { |spec| spec.version == existing_spec.version } then
225
+ sources_message = sources.map { |spec| spec.full_name }
226
+ stack_message = @loaded_stacks[gem.name].map { |spec| spec.full_name }
227
+
228
+ msg = "can't activate #{gem} for #{sources_message.inspect}, "
229
+ msg << "already activated #{existing_spec.full_name} for "
230
+ msg << "#{stack_message.inspect}"
231
+
232
+ e = Gem::LoadError.new msg
233
+ e.name = gem.name
234
+ e.version_requirement = gem.requirement
235
+
236
+ raise e
237
+ end
238
+
239
+ return false
240
+ end
241
+
242
+ # new load
243
+ spec = matches.last
244
+ return false if spec.loaded?
245
+
246
+ spec.loaded = true
247
+ @loaded_specs[spec.name] = spec
248
+ @loaded_stacks[spec.name] = sources.dup
249
+
250
+ # Load dependent gems first
251
+ spec.runtime_dependencies.each do |dep_gem|
252
+ activate dep_gem, :sources => [spec, *sources]
253
+ end
254
+
255
+ # bin directory must come before library directories
256
+ spec.require_paths.unshift spec.bindir if spec.bindir
257
+
258
+ require_paths = spec.require_paths.map do |path|
259
+ File.join spec.full_gem_path, path
260
+ end
261
+
262
+ # gem directories must come after -I and ENV['RUBYLIB']
263
+ insert_index = load_path_insert_index
264
+
265
+ if insert_index then
266
+ # gem directories must come after -I and ENV['RUBYLIB']
267
+ $LOAD_PATH.insert(insert_index, *require_paths)
268
+ else
269
+ # we are probably testing in core, -I and RUBYLIB don't apply
270
+ $LOAD_PATH.unshift(*require_paths)
271
+ end
272
+
273
+ return true
274
+ end
275
+
276
+ ##
277
+ # An Array of all possible load paths for all versions of all gems in the
278
+ # Gem installation.
279
+
280
+ def self.all_load_paths
281
+ result = []
282
+
283
+ Gem.path.each do |gemdir|
284
+ each_load_path all_partials(gemdir) do |load_path|
285
+ result << load_path
286
+ end
287
+ end
288
+
289
+ result
290
+ end
291
+
292
+ ##
293
+ # Return all the partial paths in +gemdir+.
294
+
295
+ def self.all_partials(gemdir)
296
+ Dir[File.join(gemdir, 'gems/*')]
297
+ end
298
+
299
+ private_class_method :all_partials
300
+
301
+ ##
302
+ # See if a given gem is available.
303
+
304
+ def self.available?(gem, *requirements)
305
+ requirements = Gem::Requirement.default if requirements.empty?
306
+
307
+ unless gem.respond_to?(:name) and
308
+ gem.respond_to?(:requirement) then
309
+ gem = Gem::Dependency.new gem, requirements
310
+ end
311
+
312
+ !Gem.source_index.search(gem).empty?
313
+ end
314
+
315
+ ##
316
+ # Find the full path to the executable for gem +name+. If the +exec_name+
317
+ # is not given, the gem's default_executable is chosen, otherwise the
318
+ # specified executable's path is returned. +version_requirements+ allows
319
+ # you to specify specific gem versions.
320
+
321
+ def self.bin_path(name, exec_name = nil, *version_requirements)
322
+ version_requirements = Gem::Requirement.default if
323
+ version_requirements.empty?
324
+ specs = Gem.source_index.find_name(name, version_requirements)
325
+
326
+ raise Gem::GemNotFoundException,
327
+ "can't find gem #{name} (#{version_requirements})" if specs.empty?
328
+
329
+ specs = specs.find_all do |spec|
330
+ spec.executables.include?(exec_name)
331
+ end if exec_name
332
+
333
+ unless spec = specs.last
334
+ msg = "can't find gem #{name} (#{version_requirements}) with executable #{exec_name}"
335
+ raise Gem::GemNotFoundException, msg
336
+ end
337
+
338
+ exec_name ||= spec.default_executable
339
+
340
+ unless exec_name
341
+ msg = "no default executable for #{spec.full_name} and none given"
342
+ raise Gem::Exception, msg
343
+ end
344
+
345
+ File.join(spec.full_gem_path, spec.bindir, exec_name)
346
+ end
347
+
348
+ ##
349
+ # The mode needed to read a file as straight binary.
350
+
351
+ def self.binary_mode
352
+ 'rb'
353
+ end
354
+
355
+ ##
356
+ # The path where gem executables are to be installed.
357
+
358
+ def self.bindir(install_dir=Gem.dir)
359
+ return File.join(install_dir, 'bin') unless
360
+ install_dir.to_s == Gem.default_dir
361
+ Gem.default_bindir
362
+ end
363
+
364
+ ##
365
+ # Reset the +dir+ and +path+ values. The next time +dir+ or +path+
366
+ # is requested, the values will be calculated from scratch. This is
367
+ # mainly used by the unit tests to provide test isolation.
368
+
369
+ def self.clear_paths
370
+ @gem_home = nil
371
+ @gem_path = nil
372
+ @user_home = nil
373
+
374
+ @@source_index = nil
375
+
376
+ @searcher = nil
377
+ end
378
+
379
+ ##
380
+ # The path to standard location of the user's .gemrc file.
381
+
382
+ def self.config_file
383
+ File.join Gem.user_home, '.gemrc'
384
+ end
385
+
386
+ ##
387
+ # The standard configuration object for gems.
388
+
389
+ def self.configuration
390
+ @configuration ||= Gem::ConfigFile.new []
391
+ end
392
+
393
+ ##
394
+ # Use the given configuration object (which implements the ConfigFile
395
+ # protocol) as the standard configuration object.
396
+
397
+ def self.configuration=(config)
398
+ @configuration = config
399
+ end
400
+
401
+ ##
402
+ # The path the the data directory specified by the gem name. If the
403
+ # package is not available as a gem, return nil.
404
+
405
+ def self.datadir(gem_name)
406
+ spec = @loaded_specs[gem_name]
407
+ return nil if spec.nil?
408
+ File.join(spec.full_gem_path, 'data', gem_name)
409
+ end
410
+
411
+ ##
412
+ # A Zlib::Deflate.deflate wrapper
413
+
414
+ def self.deflate(data)
415
+ require 'zlib'
416
+ Zlib::Deflate.deflate data
417
+ end
418
+
419
+ ##
420
+ # The path where gems are to be installed.
421
+
422
+ def self.dir
423
+ @gem_home ||= nil
424
+ set_home(ENV['GEM_HOME'] || Gem.configuration.home || default_dir) unless @gem_home
425
+ @gem_home
426
+ end
427
+
428
+ ##
429
+ # Expand each partial gem path with each of the required paths specified
430
+ # in the Gem spec. Each expanded path is yielded.
431
+
432
+ def self.each_load_path(partials)
433
+ partials.each do |gp|
434
+ base = File.basename(gp)
435
+ specfn = File.join(dir, "specifications", base + ".gemspec")
436
+ if File.exist?(specfn)
437
+ spec = eval(File.read(specfn))
438
+ spec.require_paths.each do |rp|
439
+ yield(File.join(gp, rp))
440
+ end
441
+ else
442
+ filename = File.join(gp, 'lib')
443
+ yield(filename) if File.exist?(filename)
444
+ end
445
+ end
446
+ end
447
+
448
+ private_class_method :each_load_path
449
+
450
+ ##
451
+ # Quietly ensure the named Gem directory contains all the proper
452
+ # subdirectories. If we can't create a directory due to a permission
453
+ # problem, then we will silently continue.
454
+
455
+ def self.ensure_gem_subdirectories(gemdir)
456
+ require 'fileutils'
457
+
458
+ Gem::DIRECTORIES.each do |filename|
459
+ fn = File.join gemdir, filename
460
+ FileUtils.mkdir_p fn rescue nil unless File.exist? fn
461
+ end
462
+ end
463
+
464
+ ##
465
+ # Returns a list of paths matching +glob+ that can be used by a gem to pick
466
+ # up features from other gems. For example:
467
+ #
468
+ # Gem.find_files('rdoc/discover').each do |path| load path end
469
+ #
470
+ # if +check_load_path+ is true (the default), then find_files also searches
471
+ # $LOAD_PATH for files as well as gems.
472
+ #
473
+ # Note that find_files will return all files even if they are from different
474
+ # versions of the same gem.
475
+
476
+ def self.find_files(glob, check_load_path=true)
477
+ files = []
478
+
479
+ if check_load_path
480
+ files = $LOAD_PATH.map { |load_path|
481
+ Dir["#{File.expand_path glob, load_path}#{Gem.suffix_pattern}"]
482
+ }.flatten.select { |file| File.file? file.untaint }
483
+ end
484
+
485
+ specs = searcher.find_all glob
486
+
487
+ specs.each do |spec|
488
+ files.concat searcher.matching_files(spec, glob)
489
+ end
490
+
491
+ # $LOAD_PATH might contain duplicate entries or reference
492
+ # the spec dirs directly, so we prune.
493
+ files.uniq! if check_load_path
494
+
495
+ return files
496
+ end
497
+
498
+ ##
499
+ # Finds the user's home directory.
500
+ #--
501
+ # Some comments from the ruby-talk list regarding finding the home
502
+ # directory:
503
+ #
504
+ # I have HOME, USERPROFILE and HOMEDRIVE + HOMEPATH. Ruby seems
505
+ # to be depending on HOME in those code samples. I propose that
506
+ # it should fallback to USERPROFILE and HOMEDRIVE + HOMEPATH (at
507
+ # least on Win32).
508
+
509
+ def self.find_home
510
+ unless RUBY_VERSION > '1.9' then
511
+ ['HOME', 'USERPROFILE'].each do |homekey|
512
+ return File.expand_path(ENV[homekey]) if ENV[homekey]
513
+ end
514
+
515
+ if ENV['HOMEDRIVE'] && ENV['HOMEPATH'] then
516
+ return File.expand_path("#{ENV['HOMEDRIVE']}#{ENV['HOMEPATH']}")
517
+ end
518
+ end
519
+
520
+ File.expand_path "~"
521
+ rescue
522
+ if File::ALT_SEPARATOR then
523
+ drive = ENV['HOMEDRIVE'] || ENV['SystemDrive']
524
+ File.join(drive.to_s, '/')
525
+ else
526
+ "/"
527
+ end
528
+ end
529
+
530
+ private_class_method :find_home
531
+
532
+ ##
533
+ # Zlib::GzipReader wrapper that unzips +data+.
534
+
535
+ def self.gunzip(data)
536
+ require 'stringio'
537
+ require 'zlib'
538
+ data = StringIO.new data
539
+
540
+ Zlib::GzipReader.new(data).read
541
+ end
542
+
543
+ ##
544
+ # Zlib::GzipWriter wrapper that zips +data+.
545
+
546
+ def self.gzip(data)
547
+ require 'stringio'
548
+ require 'zlib'
549
+ zipped = StringIO.new
550
+
551
+ Zlib::GzipWriter.wrap zipped do |io| io.write data end
552
+
553
+ zipped.string
554
+ end
555
+
556
+ ##
557
+ # A Zlib::Inflate#inflate wrapper
558
+
559
+ def self.inflate(data)
560
+ require 'zlib'
561
+ Zlib::Inflate.inflate data
562
+ end
563
+
564
+ ##
565
+ # Get the default SlimGems API host. This is normally
566
+ # <tt>https://rubygems.org</tt>.
567
+
568
+ def self.host
569
+ @host ||= "https://rubygems.org"
570
+ end
571
+
572
+ ## Set the default SlimGems API host.
573
+
574
+ def self.host= host
575
+ @host = host
576
+ end
577
+
578
+ ##
579
+ # Return a list of all possible load paths for the latest version for all
580
+ # gems in the Gem installation.
581
+
582
+ def self.latest_load_paths
583
+ result = []
584
+
585
+ Gem.path.each do |gemdir|
586
+ each_load_path(latest_partials(gemdir)) do |load_path|
587
+ result << load_path
588
+ end
589
+ end
590
+
591
+ result
592
+ end
593
+
594
+ ##
595
+ # Return only the latest partial paths in the given +gemdir+.
596
+
597
+ def self.latest_partials(gemdir)
598
+ latest = {}
599
+ all_partials(gemdir).each do |gp|
600
+ base = File.basename(gp)
601
+ if base =~ /(.*)-((\d+\.)*\d+)/ then
602
+ name, version = $1, $2
603
+ ver = Gem::Version.new(version)
604
+ if latest[name].nil? || ver > latest[name][0]
605
+ latest[name] = [ver, gp]
606
+ end
607
+ end
608
+ end
609
+ latest.collect { |k,v| v[1] }
610
+ end
611
+
612
+ private_class_method :latest_partials
613
+
614
+ ##
615
+ # The index to insert activated gem paths into the $LOAD_PATH.
616
+ #
617
+ # Defaults to the site lib directory unless gem_prelude.rb has loaded paths,
618
+ # then it inserts the activated gem's paths before the gem_prelude.rb paths
619
+ # so you can override the gem_prelude.rb default $LOAD_PATH paths.
620
+
621
+ def self.load_path_insert_index
622
+ index = $LOAD_PATH.index ConfigMap[:sitelibdir]
623
+ end
624
+
625
+ def self.remove_prelude_paths
626
+ Gem::QuickLoader::GemLoadPaths.each do |path|
627
+ $LOAD_PATH.delete(path)
628
+ end
629
+ end
630
+
631
+ ##
632
+ # Loads YAML, preferring Psych
633
+
634
+ def self.load_yaml
635
+ require 'psych'
636
+ rescue ::LoadError
637
+ ensure
638
+ require 'yaml'
639
+ end
640
+
641
+ ##
642
+ # The file name and line number of the caller of the caller of this method.
643
+
644
+ def self.location_of_caller
645
+ caller[1] =~ /(.*?):(\d+).*?$/i
646
+ file = $1
647
+ lineno = $2.to_i
648
+
649
+ [file, lineno]
650
+ end
651
+
652
+ ##
653
+ # The version of the Marshal format for your Ruby.
654
+
655
+ def self.marshal_version
656
+ "#{Marshal::MAJOR_VERSION}.#{Marshal::MINOR_VERSION}"
657
+ end
658
+
659
+ ##
660
+ # Array of paths to search for Gems.
661
+
662
+ def self.path
663
+ @gem_path ||= nil
664
+
665
+ unless @gem_path then
666
+ paths = [ENV['GEM_PATH'] || Gem.configuration.path || default_path]
667
+
668
+ if defined?(APPLE_GEM_HOME) and not ENV['GEM_PATH'] then
669
+ paths << APPLE_GEM_HOME
670
+ end
671
+
672
+ set_paths paths.compact.join(File::PATH_SEPARATOR)
673
+ end
674
+
675
+ @gem_path
676
+ end
677
+
678
+ ##
679
+ # Set array of platforms this SlimGems supports (primarily for testing).
680
+
681
+ def self.platforms=(platforms)
682
+ @platforms = platforms
683
+ end
684
+
685
+ ##
686
+ # Array of platforms this SlimGems supports.
687
+
688
+ def self.platforms
689
+ @platforms ||= []
690
+ if @platforms.empty?
691
+ @platforms = [Gem::Platform::RUBY, Gem::Platform.local]
692
+ end
693
+ @platforms
694
+ end
695
+
696
+ ##
697
+ # Adds a post-build hook that will be passed an Gem::Installer instance
698
+ # when Gem::Installer#install is called. The hook is called after the gem
699
+ # has been extracted and extensions have been built but before the
700
+ # executables or gemspec has been written. If the hook returns +false+ then
701
+ # the gem's files will be removed and the install will be aborted.
702
+
703
+ def self.post_build(&hook)
704
+ @post_build_hooks << hook
705
+ end
706
+
707
+ ##
708
+ # Adds a post-install hook that will be passed an Gem::Installer instance
709
+ # when Gem::Installer#install is called
710
+
711
+ def self.post_install(&hook)
712
+ @post_install_hooks << hook
713
+ end
714
+
715
+ ##
716
+ # Adds a post-uninstall hook that will be passed a Gem::Uninstaller instance
717
+ # and the spec that was uninstalled when Gem::Uninstaller#uninstall is
718
+ # called
719
+
720
+ def self.post_uninstall(&hook)
721
+ @post_uninstall_hooks << hook
722
+ end
723
+
724
+ ##
725
+ # Adds a pre-install hook that will be passed an Gem::Installer instance
726
+ # when Gem::Installer#install is called
727
+
728
+ def self.pre_install(&hook)
729
+ @pre_install_hooks << hook
730
+ end
731
+
732
+ ##
733
+ # Adds a pre-uninstall hook that will be passed an Gem::Uninstaller instance
734
+ # and the spec that will be uninstalled when Gem::Uninstaller#uninstall is
735
+ # called
736
+
737
+ def self.pre_uninstall(&hook)
738
+ @pre_uninstall_hooks << hook
739
+ end
740
+
741
+ ##
742
+ # The directory prefix this SlimGems was installed at.
743
+
744
+ def self.prefix
745
+ dir = File.dirname File.expand_path(__FILE__)
746
+ prefix = File.dirname dir
747
+
748
+ if prefix == File.expand_path(ConfigMap[:sitelibdir]) or
749
+ prefix == File.expand_path(ConfigMap[:libdir]) or
750
+ 'lib' != File.basename(dir) then
751
+ nil
752
+ else
753
+ prefix
754
+ end
755
+ end
756
+
757
+ ##
758
+ # Promotes the load paths of the +gem_name+ over the load paths of
759
+ # +over_name+. Useful for allowing one gem to override features in another
760
+ # using #find_files.
761
+
762
+ def self.promote_load_path(gem_name, over_name)
763
+ gem = Gem.loaded_specs[gem_name]
764
+ over = Gem.loaded_specs[over_name]
765
+
766
+ raise ArgumentError, "gem #{gem_name} is not activated" if gem.nil?
767
+ raise ArgumentError, "gem #{over_name} is not activated" if over.nil?
768
+
769
+ last_gem_path = File.join gem.full_gem_path, gem.require_paths.last
770
+
771
+ over_paths = over.require_paths.map do |path|
772
+ File.join over.full_gem_path, path
773
+ end
774
+
775
+ over_paths.each do |path|
776
+ $LOAD_PATH.delete path
777
+ end
778
+
779
+ gem = $LOAD_PATH.index(last_gem_path) + 1
780
+
781
+ $LOAD_PATH.insert(gem, *over_paths)
782
+ end
783
+
784
+ ##
785
+ # Refresh source_index from disk and clear searcher.
786
+
787
+ def self.refresh
788
+ source_index.refresh!
789
+
790
+ @searcher = nil
791
+ end
792
+
793
+ ##
794
+ # Safely read a file in binary mode on all platforms.
795
+
796
+ def self.read_binary(path)
797
+ File.open path, binary_mode do |f| f.read end
798
+ end
799
+
800
+ ##
801
+ # Report a load error during activation. The message of load error
802
+ # depends on whether it was a version mismatch or if there are not gems of
803
+ # any version by the requested name.
804
+
805
+ def self.report_activate_error(gem)
806
+ matches = Gem.source_index.find_name(gem.name)
807
+
808
+ if matches.empty? then
809
+ error = Gem::LoadError.new(
810
+ "Could not find RubyGem #{gem.name} (#{gem.requirement})\n")
811
+ else
812
+ error = Gem::LoadError.new(
813
+ "RubyGem version error: " +
814
+ "#{gem.name}(#{matches.first.version} not #{gem.requirement})\n")
815
+ end
816
+
817
+ error.name = gem.name
818
+ error.version_requirement = gem.requirement
819
+ raise error
820
+ end
821
+
822
+ private_class_method :report_activate_error
823
+
824
+ ##
825
+ # Full path to +libfile+ in +gemname+. Searches for the latest gem unless
826
+ # +requirements+ is given.
827
+
828
+ def self.required_location(gemname, libfile, *requirements)
829
+ requirements = Gem::Requirement.default if requirements.empty?
830
+
831
+ matches = Gem.source_index.find_name gemname, requirements
832
+
833
+ return nil if matches.empty?
834
+
835
+ spec = matches.last
836
+ spec.require_paths.each do |path|
837
+ result = File.join spec.full_gem_path, path, libfile
838
+ return result if File.exist? result
839
+ end
840
+
841
+ nil
842
+ end
843
+
844
+ ##
845
+ # The path to the running Ruby interpreter.
846
+
847
+ def self.ruby
848
+ if @ruby.nil? then
849
+ @ruby = File.join(ConfigMap[:bindir],
850
+ ConfigMap[:ruby_install_name])
851
+ @ruby << ConfigMap[:EXEEXT]
852
+
853
+ # escape string in case path to ruby executable contain spaces.
854
+ @ruby.sub!(/.*\s.*/m, '"\&"')
855
+ end
856
+
857
+ @ruby
858
+ end
859
+
860
+ ##
861
+ # A Gem::Version for the currently running ruby.
862
+
863
+ def self.ruby_version
864
+ return @ruby_version if defined? @ruby_version
865
+ version = RUBY_VERSION.dup
866
+
867
+ if defined?(RUBY_PATCHLEVEL) && RUBY_PATCHLEVEL != -1 then
868
+ version << ".#{RUBY_PATCHLEVEL}"
869
+ elsif defined?(RUBY_REVISION) then
870
+ version << ".dev.#{RUBY_REVISION}"
871
+ end
872
+
873
+ @ruby_version = Gem::Version.new version
874
+ end
875
+
876
+ ##
877
+ # The GemPathSearcher object used to search for matching installed gems.
878
+
879
+ def self.searcher
880
+ @searcher ||= Gem::GemPathSearcher.new
881
+ end
882
+
883
+ ##
884
+ # Set the Gem home directory (as reported by Gem.dir).
885
+
886
+ def self.set_home(home)
887
+ home = home.gsub File::ALT_SEPARATOR, File::SEPARATOR if File::ALT_SEPARATOR
888
+ @gem_home = home
889
+ end
890
+
891
+ private_class_method :set_home
892
+
893
+ ##
894
+ # Set the Gem search path (as reported by Gem.path).
895
+
896
+ def self.set_paths(gpaths)
897
+ if gpaths
898
+ @gem_path = gpaths.split(File::PATH_SEPARATOR)
899
+
900
+ if File::ALT_SEPARATOR then
901
+ @gem_path.map! do |path|
902
+ path.gsub File::ALT_SEPARATOR, File::SEPARATOR
903
+ end
904
+ end
905
+
906
+ @gem_path << Gem.dir
907
+ else
908
+ # TODO: should this be Gem.default_path instead?
909
+ @gem_path = [Gem.dir]
910
+ end
911
+
912
+ @gem_path.uniq!
913
+ end
914
+
915
+ private_class_method :set_paths
916
+
917
+ ##
918
+ # Returns the Gem::SourceIndex of specifications that are in the Gem.path
919
+
920
+ def self.source_index
921
+ @@source_index ||= SourceIndex.from_installed_gems
922
+ end
923
+
924
+ ##
925
+ # Returns an Array of sources to fetch remote gems from. If the sources
926
+ # list is empty, attempts to load the "sources" gem, then uses
927
+ # default_sources if it is not installed.
928
+
929
+ def self.sources
930
+ if !@sources || @sources.empty? then
931
+ @sources = default_sources
932
+ end
933
+
934
+ @sources
935
+ end
936
+
937
+ ##
938
+ # Need to be able to set the sources without calling
939
+ # Gem.sources.replace since that would cause an infinite loop.
940
+
941
+ def self.sources=(new_sources)
942
+ @sources = new_sources
943
+ end
944
+
945
+ ##
946
+ # Glob pattern for require-able path suffixes.
947
+
948
+ def self.suffix_pattern
949
+ @suffix_pattern ||= "{#{suffixes.join(',')}}"
950
+ end
951
+
952
+ ##
953
+ # Suffixes for require-able paths.
954
+
955
+ def self.suffixes
956
+ ['', '.rb', '.rbw', '.so', '.bundle', '.dll', '.sl', '.jar']
957
+ end
958
+
959
+ ##
960
+ # Prints the amount of time the supplied block takes to run using the debug
961
+ # UI output.
962
+
963
+ def self.time(msg, width = 0, display = Gem.configuration.verbose)
964
+ now = Time.now
965
+
966
+ value = yield
967
+
968
+ elapsed = Time.now - now
969
+
970
+ ui.say "%2$*1$s: %3$3.3fs" % [-width, msg, elapsed] if display
971
+
972
+ value
973
+ end
974
+
975
+ ##
976
+ # Lazily loads DefaultUserInteraction and returns the default UI.
977
+
978
+ def self.ui
979
+ require 'rubygems/user_interaction'
980
+
981
+ Gem::DefaultUserInteraction.ui
982
+ end
983
+
984
+ ##
985
+ # Use the +home+ and +paths+ values for Gem.dir and Gem.path. Used mainly
986
+ # by the unit tests to provide environment isolation.
987
+
988
+ def self.use_paths(home, paths=[])
989
+ clear_paths
990
+ set_home(home) if home
991
+ set_paths(paths.join(File::PATH_SEPARATOR)) if paths
992
+ end
993
+
994
+ ##
995
+ # The home directory for the user.
996
+
997
+ def self.user_home
998
+ @user_home ||= find_home
999
+ end
1000
+
1001
+ ##
1002
+ # Is this a windows platform?
1003
+
1004
+ def self.win_platform?
1005
+ if @@win_platform.nil? then
1006
+ @@win_platform = !!WIN_PATTERNS.find { |r| RUBY_PLATFORM =~ r }
1007
+ end
1008
+
1009
+ @@win_platform
1010
+ end
1011
+
1012
+ ##
1013
+ # Find all 'rubygems_plugin' files and load them
1014
+
1015
+ def self.load_plugin_files(plugins)
1016
+ plugins.each do |plugin|
1017
+
1018
+ # Skip older versions of the GemCutter plugin: Its commands are in
1019
+ # SlimGems proper now.
1020
+
1021
+ next if plugin =~ /gemcutter-0\.[0-3]/
1022
+
1023
+ begin
1024
+ load plugin
1025
+ rescue ::Exception => e
1026
+ details = "#{plugin.inspect}: #{e.message} (#{e.class})"
1027
+ warn "Error loading #{Gem::NAME} plugin #{details}"
1028
+ end
1029
+ end
1030
+ end
1031
+
1032
+ ##
1033
+ # Find all 'rubygems_plugin' files in installed gems and load them
1034
+
1035
+ def self.load_plugins
1036
+ load_plugin_files find_files('rubygems_plugin', false)
1037
+ end
1038
+
1039
+ ##
1040
+ # Find all 'rubygems_plugin' files in $LOAD_PATH and load them
1041
+
1042
+ def self.load_env_plugins
1043
+ path = "rubygems_plugin"
1044
+
1045
+ files = []
1046
+ $LOAD_PATH.each do |load_path|
1047
+ globbed = Dir["#{File.expand_path path, load_path}#{Gem.suffix_pattern}"]
1048
+
1049
+ globbed.each do |load_path_file|
1050
+ files << load_path_file if File.file?(load_path_file.untaint)
1051
+ end
1052
+ end
1053
+
1054
+ load_plugin_files files
1055
+ end
1056
+
1057
+ class << self
1058
+
1059
+ ##
1060
+ # Hash of loaded Gem::Specification keyed by name
1061
+
1062
+ attr_reader :loaded_specs
1063
+
1064
+ ##
1065
+ # The list of hooks to be run before Gem::Install#install finishes
1066
+ # installation
1067
+
1068
+ attr_reader :post_build_hooks
1069
+
1070
+ ##
1071
+ # The list of hooks to be run before Gem::Install#install does any work
1072
+
1073
+ attr_reader :post_install_hooks
1074
+
1075
+ ##
1076
+ # The list of hooks to be run before Gem::Uninstall#uninstall does any
1077
+ # work
1078
+
1079
+ attr_reader :post_uninstall_hooks
1080
+
1081
+ ##
1082
+ # The list of hooks to be run after Gem::Install#install is finished
1083
+
1084
+ attr_reader :pre_install_hooks
1085
+
1086
+ ##
1087
+ # The list of hooks to be run after Gem::Uninstall#uninstall is finished
1088
+
1089
+ attr_reader :pre_uninstall_hooks
1090
+
1091
+ # :stopdoc:
1092
+
1093
+ alias cache source_index # an alias for the old name
1094
+
1095
+ # :startdoc:
1096
+
1097
+ end
1098
+
1099
+ ##
1100
+ # Location of Marshal quick gemspecs on remote repositories
1101
+
1102
+ MARSHAL_SPEC_DIR = "quick/Marshal.#{Gem.marshal_version}/"
1103
+
1104
+ ##
1105
+ # Location of legacy YAML quick gemspecs on remote repositories
1106
+
1107
+ YAML_SPEC_DIR = 'quick/'
1108
+
1109
+ root = ''
1110
+ autoload :Version, 'rubygems/version'
1111
+ autoload :Requirement, 'rubygems/requirement'
1112
+ autoload :Dependency, 'rubygems/dependency'
1113
+ autoload :GemPathSearcher, 'rubygems/gem_path_searcher'
1114
+ autoload :SpecFetcher, 'rubygems/spec_fetcher'
1115
+ autoload :UserInteraction, 'rubygems/user_interaction'
1116
+ autoload :Specification, 'rubygems/specification'
1117
+ autoload :Cache, 'rubygems/source_index'
1118
+ autoload :SourceIndex, 'rubygems/source_index'
1119
+ autoload :Platform, 'rubygems/platform'
1120
+ autoload :Builder, 'rubygems/builder'
1121
+ autoload :ConfigFile, 'rubygems/config_file'
1122
+ end
1123
+
1124
+ module ::Kernel
1125
+
1126
+ remove_method :gem if respond_to?(:gem, true) # defined in gem_prelude.rb on 1.9
1127
+
1128
+ ##
1129
+ # Use Kernel#gem to activate a specific version of +gem_name+.
1130
+ #
1131
+ # +version_requirements+ is a list of version requirements that the
1132
+ # specified gem must match, most commonly "= example.version.number". See
1133
+ # Gem::Requirement for how to specify a version requirement.
1134
+ #
1135
+ # If you will be activating the latest version of a gem, there is no need to
1136
+ # call Kernel#gem, Kernel#require will do the right thing for you.
1137
+ #
1138
+ # Kernel#gem returns true if the gem was activated, otherwise false. If the
1139
+ # gem could not be found, didn't match the version requirements, or a
1140
+ # different version was already activated, an exception will be raised.
1141
+ #
1142
+ # Kernel#gem should be called *before* any require statements (otherwise
1143
+ # SlimGems may load a conflicting library version).
1144
+ #
1145
+ # In older SlimGems versions, the environment variable GEM_SKIP could be
1146
+ # used to skip activation of specified gems, for example to test out changes
1147
+ # that haven't been installed yet. Now SlimGems defers to -I and the
1148
+ # RUBYLIB environment variable to skip activation of a gem.
1149
+ #
1150
+ # Example:
1151
+ #
1152
+ # GEM_SKIP=libA:libB ruby -I../libA -I../libB ./mycode.rb
1153
+
1154
+ def gem(gem_name, *version_requirements) # :doc:
1155
+ skip_list = (ENV['GEM_SKIP'] || "").split(/:/)
1156
+ raise Gem::LoadError, "skipping #{gem_name}" if skip_list.include? gem_name
1157
+ Gem.activate(gem_name, *version_requirements)
1158
+ end
1159
+
1160
+ private :gem
1161
+
1162
+ end
1163
+
1164
+ ##
1165
+ # Return the path to the data directory associated with the named package. If
1166
+ # the package is loaded as a gem, return the gem specific data directory.
1167
+ # Otherwise return a path to the share area as define by
1168
+ # "#{ConfigMap[:datadir]}/#{package_name}".
1169
+
1170
+ def RbConfig.datadir(package_name)
1171
+ Gem.datadir(package_name) ||
1172
+ File.join(Gem::ConfigMap[:datadir], package_name)
1173
+ end
1174
+
1175
+ require 'rubygems/exceptions'
1176
+
1177
+ begin
1178
+ ##
1179
+ # Defaults the operating system (or packager) wants to provide for SlimGems.
1180
+
1181
+ require 'rubygems/defaults/operating_system'
1182
+ rescue LoadError
1183
+ end
1184
+
1185
+ if defined?(RUBY_ENGINE) then
1186
+ begin
1187
+ ##
1188
+ # Defaults the ruby implementation wants to provide for SlimGems
1189
+
1190
+ require "rubygems/defaults/#{RUBY_ENGINE}"
1191
+ rescue LoadError
1192
+ end
1193
+ end
1194
+
1195
+ require 'rubygems/config_file'
1196
+
1197
+ class << Gem
1198
+ remove_method :try_activate if Gem.respond_to?(:try_activate, true)
1199
+
1200
+ def try_activate(path)
1201
+ spec = Gem.searcher.find(path)
1202
+ return false unless spec
1203
+
1204
+ Gem.activate(spec.name, "= #{spec.version}")
1205
+ return true
1206
+ end
1207
+ end
1208
+
1209
+ ##
1210
+ # Enables the require hook for SlimGems.
1211
+ #
1212
+ # if --disable-rubygems was used, then the prelude wasn't loaded, so
1213
+ # we need to load the custom_require now.
1214
+
1215
+ if gem_disabled
1216
+ require 'rubygems/custom_require'
1217
+ end
1218
+
1219
+ Gem.clear_paths
1220
+