@@ -562,24 +562,95 @@ def self.load(path)
562
562
src . sub! ( /\A #.*/ , '' )
563
563
eval ( src , nil , path )
564
564
end
565
+
566
+ def to_ruby
567
+ <<-GEMSPEC
568
+ Gem::Specification.new do |s|
569
+ s.name = #{ name . dump }
570
+ s.version = #{ version . dump }
571
+ s.summary = #{ summary . dump }
572
+ s.description = #{ description . dump }
573
+ s.homepage = #{ homepage . dump }
574
+ s.authors = #{ authors . inspect }
575
+ s.email = #{ email . inspect }
576
+ s.files = #{ files . inspect }
577
+ end
578
+ GEMSPEC
579
+ end
565
580
end
566
581
end
567
582
568
583
module RbInstall
569
584
module Specs
585
+ class FileCollector
586
+ def initialize ( base_dir )
587
+ @base_dir = base_dir
588
+ end
589
+
590
+ def collect
591
+ ruby_libraries + built_libraries
592
+ end
593
+
594
+ private
595
+ def type
596
+ /\/ (ext|lib)?\/ .*?\z / =~ @base_dir
597
+ $1
598
+ end
599
+
600
+ def ruby_libraries
601
+ case type
602
+ when "ext"
603
+ prefix = "#{ $extout} /common/"
604
+ base = "#{ prefix } #{ relative_base } "
605
+ when "lib"
606
+ base = @base_dir
607
+ prefix = base . sub ( /lib\/ .*?\z / , "" ) + "lib/"
608
+ end
609
+
610
+ Dir . glob ( "#{ base } {.rb,/**/*.rb}" ) . collect do |ruby_source |
611
+ remove_prefix ( prefix , ruby_source )
612
+ end
613
+ end
614
+
615
+ def built_libraries
616
+ case type
617
+ when "ext"
618
+ prefix = "#{ $extout} /#{ CONFIG [ 'arch' ] } /"
619
+ base = "#{ prefix } #{ relative_base } "
620
+ Dir . glob ( "#{ base } {.so,/**/*.so}" ) . collect do |built_library |
621
+ remove_prefix ( prefix , built_library )
622
+ end
623
+ when "lib"
624
+ [ ]
625
+ end
626
+ end
627
+
628
+ def relative_base
629
+ /\/ #{ Regexp . escape ( type ) } \/ (.*?)\z / =~ @base_dir
630
+ $1
631
+ end
632
+
633
+ def remove_prefix ( prefix , string )
634
+ string . sub ( /\A #{ Regexp . escape ( prefix ) } / , "" )
635
+ end
636
+ end
637
+
570
638
class Reader < Struct . new ( :src )
571
639
def gemspec
572
640
@gemspec ||= begin
573
- Gem ::Specification . load ( src ) || raise ( "invalid spec in #{ src } " )
641
+ spec = Gem ::Specification . load ( src ) || raise ( "invalid spec in #{ src } " )
642
+ file_collector = FileCollector . new ( File . dirname ( src ) )
643
+ spec . files = file_collector . collect
644
+ spec
574
645
end
575
646
end
576
647
577
648
def spec_source
578
- File . read src
649
+ @gemspec . to_ruby
579
650
end
580
651
end
581
652
582
- class Generator < Struct . new ( :name , :src , :execs )
653
+ class Generator < Struct . new ( :name , :base_dir , : src, :execs )
583
654
def gemspec
584
655
@gemspec ||= eval spec_source
585
656
end
@@ -591,6 +662,7 @@ def spec_source
591
662
s.version = #{ version . dump }
592
663
s.summary = "This #{ name } is bundled with Ruby"
593
664
s.executables = #{ execs . inspect }
665
+ s.files = #{ files . inspect }
594
666
end
595
667
GEMSPEC
596
668
end
@@ -602,6 +674,11 @@ def version
602
674
} or return
603
675
version . split ( %r"=\s *" , 2 ) [ 1 ] . strip [ /\A ([\' \" ])(.*?)\1 / , 2 ]
604
676
end
677
+
678
+ def files
679
+ file_collector = FileCollector . new ( base_dir )
680
+ file_collector . collect
681
+ end
605
682
end
606
683
end
607
684
end
@@ -615,6 +692,9 @@ def version
615
692
prepare "default gems" , gem_dir , directories
616
693
617
694
spec_dir = File . join ( gem_dir , directories . grep ( /^spec/ ) [ 0 ] )
695
+ default_spec_dir = "#{ spec_dir } /default"
696
+ makedirs ( default_spec_dir )
697
+
618
698
gems = { }
619
699
File . foreach ( File . join ( srcdir , "defs/default_gems" ) ) do |line |
620
700
line . chomp!
@@ -624,11 +704,12 @@ def version
624
704
line . scan ( /\G \s *([^\[ \] \s ]+|\[ ([^\[ \] ]*)\] )/ ) do
625
705
words << ( $2 ? $2. split : $1)
626
706
end
627
- name , src , execs = *words
628
- next unless name and src
707
+ name , base_dir , src , execs = *words
708
+ next unless name and base_dir and src
629
709
630
710
src = File . join ( srcdir , src )
631
- specgen = RbInstall ::Specs ::Generator . new ( name , src , execs || [ ] )
711
+ base_dir = File . join ( srcdir , base_dir )
712
+ specgen = RbInstall ::Specs ::Generator . new ( name , base_dir , src , execs || [ ] )
632
713
gems [ name ] ||= specgen
633
714
end
634
715
@@ -639,10 +720,12 @@ def version
639
720
640
721
gems . sort . each do |name , specgen |
641
722
gemspec = specgen . gemspec
723
+ base_dir = specgen . src . sub ( /\A #{ Regexp . escape ( srcdir ) } \/ / , "" )
642
724
full_name = "#{ gemspec . name } -#{ gemspec . version } "
643
725
644
726
puts "#{ " " *30 } #{ gemspec . name } #{ gemspec . version } "
645
- open_for_install ( File . join ( spec_dir , "#{ full_name } .gemspec" ) , $data_mode) do
727
+ gemspec_path = File . join ( default_spec_dir , "#{ full_name } .gemspec" )
728
+ open_for_install ( gemspec_path , $data_mode) do
646
729
specgen . spec_source
647
730
end
648
731
0 commit comments