public
Rubygem
Description: Merb Core: All you need. None you don't.
Homepage: http://www.merbivore.com
Clone URL: git://github.com/wycats/merb-core.git
Updated GemManagement
fabien (author)
Sat Oct 11 06:37:28 -0700 2008
commit  dad0d934c0294e082d7dc525e61ed547daf4bf64
tree    2e9e0af214840be9b94251d3bf327e8640b3de39
parent  a7fb18c7f3cf24321ccd8a8e03f6ddafcb6be651
...
58
59
60
61
 
62
63
64
...
81
82
83
84
 
85
86
87
...
122
123
124
 
125
126
127
128
129
 
 
 
 
 
130
131
132
...
138
139
140
141
 
142
143
144
...
149
150
151
152
 
153
154
155
156
157
158
159
160
161
 
 
 
 
 
 
 
162
163
 
 
 
 
 
164
165
 
166
167
 
168
169
 
 
 
 
 
 
 
 
 
 
170
171
172
...
178
179
180
181
 
182
183
184
185
186
187
 
 
 
188
189
190
191
192
193
194
...
230
231
232
233
234
235
236
237
238
 
 
 
 
 
 
239
240
241
...
313
314
315
316
 
317
...
58
59
60
 
61
62
63
64
...
81
82
83
 
84
85
86
87
...
122
123
124
125
126
 
 
 
 
127
128
129
130
131
132
133
134
...
140
141
142
 
143
144
145
146
...
151
152
153
 
154
155
156
 
 
 
 
 
 
 
157
158
159
160
161
162
163
164
 
165
166
167
168
169
170
 
171
172
173
174
175
 
176
177
178
179
180
181
182
183
184
185
186
187
188
...
194
195
196
 
197
198
199
200
201
202
 
203
204
205
206
207
 
 
208
209
210
...
246
247
248
 
 
 
 
 
 
249
250
251
252
253
254
255
256
257
...
329
330
331
 
332
333
0
@@ -58,7 +58,7 @@ module GemManagement
0
       installer = Gem::DependencyInstaller.new(options.merge(:user_install => false))
0
       
0
       # Force-refresh certain gems by excluding them from the current index
0
-      if refresh.respond_to?(:include?) && !refresh.empty?
0
+      if !options[:ignore_dependencies] && refresh.respond_to?(:include?) && !refresh.empty?
0
         source_index = installer.instance_variable_get(:@source_index)
0
         source_index.gems.each do |name, spec| 
0
           source_index.gems.delete(name) if refresh.include?(spec.name)
0
@@ -81,7 +81,7 @@ module GemManagement
0
         exception = e
0
       end
0
       if installer.installed_gems.empty? && exception
0
-        error "Failed to install gem '#{gem} (#{version})' (#{exception.message})"
0
+        error "Failed to install gem '#{gem} (#{version || 'any version'})' (#{exception.message})"
0
       end
0
       installer.installed_gems.each do |spec|
0
         success "Successfully installed #{spec.full_name}"
0
@@ -122,11 +122,13 @@ module GemManagement
0
   # install_gem_from_source(source_dir, gem_name)
0
   # install_gem_from_source(source_dir, :skip => [...])
0
   def install_gem_from_source(source_dir, *args)
0
+    installed_gems = []
0
     Dir.chdir(source_dir) do
0
-      options = args.last.is_a?(Hash) ? args.pop : {}
0
-      gem_name    = args[0] || File.basename(source_dir)
0
-      gem_pkg_dir = File.join(source_dir, 'pkg')
0
-      skip_gems   = options.delete(:skip) || []
0
+      opts = args.last.is_a?(Hash) ? args.pop : {}
0
+      gem_name     = args[0] || File.basename(source_dir)
0
+      gem_pkg_dir  = File.join(source_dir, 'pkg')
0
+      gem_pkg_glob = File.join(gem_pkg_dir, "#{gem_name}-*.gem")
0
+      skip_gems    = opts.delete(:skip) || []
0
 
0
       # Cleanup what's already there
0
       clobber(source_dir)
0
@@ -138,7 +140,7 @@ module GemManagement
0
       
0
       if packages.length == 1
0
         # The are no subpackages for the main package
0
-        options[:refresh] = [gem_name]
0
+        refresh = [gem_name]
0
       else
0
         # Gather all packages into the top-level pkg directory
0
         packages.each do |pkg|
0
@@ -149,24 +151,38 @@ module GemManagement
0
         package(source_dir, false)
0
         
0
         # Gather subgems to refresh during installation of the main gem
0
-        options[:refresh] = packages.map do |pkg|
0
+        refresh = packages.map do |pkg|
0
           File.basename(pkg, '.gem')[/^(.*?)-([\d\.]+)$/, 1] rescue nil
0
         end.compact
0
-      end
0
-    
0
-      gem_pkg = Dir[File.join(gem_pkg_dir, "#{gem_name}-*.gem")][0]
0
-      if gem_pkg && File.exists?(gem_pkg)
0
-        # Needs to be executed from the directory that contains all packages
0
-        Dir.chdir(File.dirname(gem_pkg)) do 
0
-          install_gem(gem_pkg, options)
0
+        
0
+        # Install subgems explicitly even if ignore_dependencies is set
0
+        if opts[:ignore_dependencies]
0
+          refresh.each do |name| 
0
+            gem_pkg = Dir[File.join(gem_pkg_dir, "#{name}-*.gem")][0]
0
+            install_pkg(gem_pkg, opts)
0
+          end
0
         end
0
-        options[:refresh]
0
+      end
0
+      
0
+      # Finally install the main gem
0
+      if install_pkg(Dir[gem_pkg_glob][0], opts.merge(:refresh => refresh))
0
+        installed_gems = refresh
0
       else
0
-        []
0
+        installed_gems = []
0
       end
0
     end
0
+    installed_gems
0
   end
0
-
0
+  
0
+  def install_pkg(gem_pkg, opts = {})
0
+    if (gem_pkg && File.exists?(gem_pkg))
0
+      # Needs to be executed from the directory that contains all packages
0
+      Dir.chdir(File.dirname(gem_pkg)) { install_gem(gem_pkg, opts) }
0
+    else
0
+      false
0
+    end
0
+  end
0
+  
0
   # Uninstall a gem.
0
   def uninstall_gem(gem, options = {})
0
     if options[:version] && !options[:version].is_a?(Gem::Requirement)
0
@@ -178,17 +194,17 @@ module GemManagement
0
 
0
   def clobber(source_dir)
0
     Dir.chdir(source_dir) do 
0
-      system "#{Gem.ruby} -S rake -s clobber" if File.exists?('Rakefile')
0
+      system "#{Gem.ruby} -S rake -s clobber" unless File.exists?('Thorfile')
0
     end
0
   end
0
 
0
   def package(source_dir, clobber = true)
0
     Dir.chdir(source_dir) do 
0
-      if File.exists?('Rakefile')
0
+      if File.exists?('Thorfile')
0
+        thor ":package"
0
+      elsif File.exists?('Rakefile')
0
         rake "clobber" if clobber
0
         rake "package"
0
-      elsif
0
-        thor ":package"
0
       end
0
     end
0
     Dir[File.join(source_dir, 'pkg/*.gem')]
0
@@ -230,12 +246,12 @@ module GemManagement
0
       ::Gem.clear_paths; ::Gem.path.unshift(gem_dir)
0
       ::Gem.source_index.refresh!
0
       dependencies.each do |dep|
0
-        if gemspec = ::Gem.source_index.search(dep).last
0
-          if gemspec.loaded_from.index(gem_dir) == 0
0
-            local_specs  << gemspec
0
-          else
0
-            system_specs << gemspec
0
-          end
0
+        gemspecs = ::Gem.source_index.search(dep)
0
+        local = gemspecs.reverse.find { |s| s.loaded_from.index(gem_dir) == 0 }
0
+        if local
0
+          local_specs  << local
0
+        elsif gemspecs.last
0
+          system_specs << gemspecs.last
0
         else
0
           missing_deps << dep
0
         end
0
@@ -313,4 +329,4 @@ TEXT
0
     Gem.source_index.load_gems_in(File.join(dir, 'specifications'))
0
   end
0
   
0
-end
0
+end
0
\ No newline at end of file

Comments