Fix up Rubinius specific library specs.
[rbx.git] / lib / rubygems / builder.rb
blob6fd8528f56b270b3598922c2a87bab9d3a6140c8
1 #--
2 # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
3 # All rights reserved.
4 # See LICENSE.txt for permissions.
5 #++
7 module Gem
9   ##
10   # The Builder class processes RubyGem specification files
11   # to produce a .gem file.
12   #
13   class Builder
14   
15     include UserInteraction
16     ##
17     # Constructs a builder instance for the provided specification
18     #
19     # spec:: [Gem::Specification] The specification instance
20     #
21     def initialize(spec)
22       require "yaml"
23       require "rubygems/package"
24       require "rubygems/security"
26       @spec = spec
27     end
29     ##
30     # Builds the gem from the specification.  Returns the name of the file
31     # written.
32     #
33     def build
34       @spec.mark_version
35       @spec.validate
36       @signer = sign
37       write_package
38       say success
39       @spec.file_name
40     end
41     
42     def success
43       <<-EOM
44   Successfully built RubyGem
45   Name: #{@spec.name}
46   Version: #{@spec.version}
47   File: #{@spec.full_name+'.gem'}
48 EOM
49     end
51     private
53     def sign
54       # if the signing key was specified, then load the file, and swap
55       # to the public key (TODO: we should probably just omit the
56       # signing key in favor of the signing certificate, but that's for
57       # the future, also the signature algorithm should be configurable)
58       signer = nil
59       if @spec.respond_to?(:signing_key) && @spec.signing_key
60         signer = Gem::Security::Signer.new(@spec.signing_key, @spec.cert_chain)
61         @spec.signing_key = nil
62         @spec.cert_chain = signer.cert_chain.map { |cert| cert.to_s }
63       end
64       signer
65     end
67     def write_package
68       open @spec.file_name, 'wb' do |gem_io|
69         Gem::Package.open gem_io, 'w', @signer do |pkg|
70           pkg.metadata = @spec.to_yaml
72           @spec.files.each do |file|
73             next if File.directory? file
75             stat = File.stat file
76             mode = stat.mode & 0777
77             size = stat.size
79             pkg.add_file_simple file, mode, size do |tar_io|
80               tar_io.write open(file, "rb") { |f| f.read }
81             end
82           end
83         end
84       end
85     end
86   end
87 end