<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/install/installer/opal_init.rb</filename>
    </added>
    <added>
      <filename>opal_install.log</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,2 +1,2 @@
 $:.unshift(File.dirname(__FILE__))
-require 'log4r'
+#require 'log4r'</diff>
      <filename>bootstrap/development/opals/sources/log4r-0.0.0/opal_init.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1,2 @@
-require 'rake'
+$:.unshift(File.join(File.dirname(__FILE__),'lib'))
+</diff>
      <filename>bootstrap/development/opals/sources/rake-0.0.0/opal_init.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,2 @@
 rspec_lib_lib_dir = File.expand_path(File.join(File.dirname(__FILE__),'lib/lib'))
 $:.unshift(rspec_lib_lib_dir)
-require 'lib/spec'</diff>
      <filename>bootstrap/development/opals/sources/rspec-0.0.0/opal_init.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1 @@
-require 'test/spec'
\ No newline at end of file
+$:.unshift(File.join(File.dirname(__FILE__),'lib'))</diff>
      <filename>bootstrap/development/opals/sources/test-spec-0.0.0/opal_init.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,2 +1 @@
-require 'test/spec'
-require 'yard'
+$:.unshift(File.join(File.dirname(__FILE__),'lib'))</diff>
      <filename>bootstrap/development/opals/sources/yard-0.0.0/opal_init.rb</filename>
    </modified>
    <modified>
      <diff>@@ -102,6 +102,8 @@ module Opal
         FileUtils.mkdir(directory_name_installer_image)
         # Copy install instructions
         FileUtils.cp(File.join(Opal::Configuration.root,'INSTALL'), directory_name_installer_image)
+        # Copy version
+        FileUtils.cp(File.join(Opal::Configuration.lib_directory,'version.rb'),directory_name_installer_image)
         # Copy installer
         FileUtils.cp(File.join(lib_installer_directory,'install_rubyopals'),directory_name_installer_image)
         # Copy install hook
@@ -116,11 +118,14 @@ module Opal
       def create_rubyopals_opal
         opal_logger.debug(&quot;Opal::Build::Builder:create_rubyopals_opal&quot;)
         name_with_version = versioned_name(RUBYOPALS_BASE_OPAL_NAME, RUBYOPALS_VERSION)
-        FileUtils.rm_rf(File.join(Opal::Configuration.dist_tmp_directory,name_with_version))
-        FileUtils.mkdir(File.join(Opal::Configuration.dist_tmp_directory,name_with_version))
-        FileUtils.cp_r(Opal::Configuration.bin_directory,File.join(Opal::Configuration.dist_tmp_directory,name_with_version))
-        FileUtils.cp_r(Opal::Configuration.lib_directory,File.join(Opal::Configuration.dist_tmp_directory,name_with_version))
-        FileUtils.cp_r(Opal::Configuration.doc_directory,File.join(Opal::Configuration.dist_tmp_directory,name_with_version))
+        dist_root = File.join(Opal::Configuration.dist_tmp_directory,name_with_version)
+        FileUtils.rm_rf(dist_root)
+        FileUtils.mkdir(dist_root)
+        # Copy opal_init
+        FileUtils.cp(File.join(Opal::Configuration.lib_directory,'install','installer','opal_init.rb'),dist_root)
+        FileUtils.cp_r(Opal::Configuration.bin_directory,dist_root)
+        FileUtils.cp_r(Opal::Configuration.lib_directory,dist_root)
+        FileUtils.cp_r(Opal::Configuration.doc_directory,dist_root)
         qualified_zip_file_name = make_zip(Opal::Configuration.dist_tmp_directory,name_with_version)
         opal_logger.debug(&quot;Opal::Build::Builder:create_rubyopals_opal generated zip \&quot;#{qualified_zip_file_name}\&quot;&quot;) 
         FileUtils.cp(qualified_zip_file_name,versioned_directory_name_installer_image)</diff>
      <filename>lib/build/builder.rb</filename>
    </modified>
    <modified>
      <diff>@@ -12,8 +12,16 @@ require 'rbconfig'
 require 'optparse'
 require 'fileutils'
 
+
 module Opal
   module Install
+    INSTALL_DIRECTORY_TREE = ['/bin', '/opals', '/opals/cache', '/opals/doc', '/opals/opals', '/opals/specs'].freeze
+  end
+  module Logger
+    # Setup install defaults for MiniLogger
+    DEFAULT_LOG_DIR = Dir.getwd
+    DEFAULT_LOG_NAME = 'opal_install.log'
+    DEFAULT_LOG_LEVEL = 0 # :debug
   end
 end
 
@@ -59,17 +67,30 @@ module Opal
     # Main install method for RubyOpals
     #
     # @param [Array] args Command-line arguments
+    #
     def self.install(args = [])
 
+      minimal_requires
+      opal_logger.debug(&quot;Opal::Install.install V#{RUBYOPALS_VERSION}&quot;)
       check_root_user
-
       options = parse_command_line_arguments(args)
-      set_install_environment(options)
-      puts &quot;Opal::Install.install options #{options.inspect}&quot; 
-      #Opal::Install::RubyHook.install_hooks
+      create_install_environment(options)
+      install_rubyopals_opal(options)
+      install_bootstrap_opals(options)
+      #$:.each {|path| puts &quot;Opal::Install.install: #{path}&quot;}
+      Opal::Install::RubyHook.install_hooks
     end
 
     ##
+    # Require the minimal files to make installer happy before the main libraries are loaded
+    #
+    #
+    def self.minimal_requires
+      require File.join(File.dirname(__FILE__),'version')
+      require File.join(File.dirname(__FILE__),'mini_logger')
+    end
+    
+    ##
     # Check for root user
     #
     # Exits unless current user is root
@@ -77,7 +98,7 @@ module Opal
     def self.check_root_user
       user = `whoami`
       unless user =~ /root/
-        puts &quot;You must run the RubyOpals installer as root. Please restart with sudo ./install_ruby_opals&quot;
+        opal_logger.fatal(&quot;You must run the RubyOpals installer as root. Please restart with sudo ./install_ruby_opals&quot;)
         exit(1)
       end
     end
@@ -98,14 +119,125 @@ module Opal
     end
 
     ##
-    # Set install environment
+    # Create install environment
     #
-    # @param [options]
+    # @param [Hash] options Options hash
     #
-    def self.set_install_environment(options = {})
+    # $INSTALL_DIR
+    #   |_ bin
+    #   |_ opals
+    #        |__ cache
+    #        |__ doc
+    #        |__ opals
+    #        |__ specs
+    #
+    def self.create_install_environment(options = {})
+
       options[:working_dir] = Dir.getwd
+
+      # Create target installation directory (tree)
+      install_dir = options[:install_dir]
+      FileUtils.mkdir_p(install_dir)
+
+      Opal::Install::INSTALL_DIRECTORY_TREE.each do |relative_install_path|
+        full_install_path = File.join(install_dir,relative_install_path)
+        FileUtils.mkdir_p(full_install_path)
+      end
+      
+      rubyopals_install_location = File.join(options[:working_dir],'rubyopals_install_location.rb')
+      File.open(rubyopals_install_location,'w+') do |file|
+        file.puts install_dir
+      end
+      
     end
 
+    ##
+    # Install the RubyOpals opal
+    #
+    # @param [Hash] options Options hash
+    #
+    def self.install_rubyopals_opal(options = {})
+      Dir.chdir(options[:working_dir]) do |working_dir|
+
+        cmd = &quot;unzip opal-#{RUBYOPALS_VERSION}.zip&quot;
+        opal_logger.debug(&quot;Opal::Install.install_rubyopals_opal \&quot;#{cmd}\&quot;&quot;)
+        cmd_result = `#{cmd}`
+        #opal_logger.debug(&quot;Opal::Install.install_rubyopals_opal result \n#{cmd_result}&quot;)
+
+        target_dir = File.join(options[:install_dir],'/opals/opals',&quot;opal-#{RUBYOPALS_VERSION}&quot;)
+        FileUtils.rm_rf(target_dir)
+        opal_logger.debug(&quot;Opal::Install.install_rubyopals_opal removing \&quot;#{target_dir}\&quot;&quot;)
+        source_dir = File.join(working_dir,&quot;opal-#{RUBYOPALS_VERSION}&quot;)
+        FileUtils.cp_r(source_dir,File.join(options[:install_dir],'/opals/opals'))
+        opal_logger.debug(&quot;Opal::Install.install_rubyopals_opal copying \&quot;#{source_dir}\&quot; to \&quot;#{target_dir}\&quot;&quot;)
+        
+        if File.exists?(File.join(target_dir,'opal_init.rb'))
+          require File.join(target_dir,'opal_init')
+        end
+        
+      end
+    end
+    
+    ##
+    # Install bootstrap opals if present
+    #
+    # @param [Hash] options Options hash
+    #
+    def self.install_bootstrap_opals(options = {})
+
+      Dir.chdir(options[:working_dir]) do |working_dir|
+
+        require 'initialization/configuration'
+        
+        boostrap_unpack_dir = File.basename(Opal::Configuration.bootstrap_opals_tmp_directory)
+        zip_file_name = &quot;#{boostrap_unpack_dir}.zip&quot;
+
+        if File.exists?(zip_file_name)
+          cmd = &quot;unzip #{zip_file_name}&quot;
+          opal_logger.debug(&quot;Opal::Install.install_bootstrap_opals \&quot;#{cmd}\&quot;&quot;)
+          cmd_result = `#{cmd}`
+          #opal_logger.debug(&quot;Opal::Install.install_bootstrap_opals result \n#{cmd_result}&quot;)
+          Dir.chdir(boostrap_unpack_dir) do |bootstrap_dir|
+            Dir.glob('*.zip').each do |bootstrap_zip|
+              install_bootstrap_opal(bootstrap_zip, options)
+            end
+          end
+        
+        end
+      end
+    end
+
+    ##
+    # Install bootstrap opal
+    #
+    # @param [String]  boostrap_zip Name of bootstrap zip to install
+    # @param [Hash] options Options hash
+    #
+    def self.install_bootstrap_opal(bootstrap_zip, options = {})
+
+      bootstrap_name = bootstrap_zip_dir = bootstrap_zip.gsub(/\.zip/,'')
+      
+      if File.exists?(bootstrap_zip)
+        cmd = &quot;unzip #{bootstrap_zip}&quot;
+        opal_logger.debug(&quot;Opal::Install.install_bootstrap_opals \&quot;#{cmd}\&quot;&quot;)
+        cmd_result = `#{cmd}`
+        #opal_logger.debug(&quot;Opal::Install.install_bootstrap_opals result \n#{cmd_result}&quot;)
+
+        target_dir = File.join(options[:install_dir],'/opals/opals', bootstrap_name)
+        FileUtils.rm_rf(target_dir)
+        opal_logger.debug(&quot;Opal::Install.install_bootstrap_opal removing \&quot;#{target_dir}\&quot;&quot;)
+        source_dir = File.join(Dir.getwd,bootstrap_name)
+        FileUtils.cp_r(source_dir,File.join(options[:install_dir],'/opals/opals'))
+        opal_logger.debug(&quot;Opal::Install.install_bootstrap_opals copying \&quot;#{source_dir}\&quot; to \&quot;#{target_dir}\&quot;&quot;)
+        
+        if File.exists?(File.join(target_dir,'opal_init.rb'))
+          require File.join(target_dir,'opal_init')
+        end
+
+      end
+    end
+
+    
   end
 end
 </diff>
      <filename>lib/install/installer/install_rubyopals</filename>
    </modified>
    <modified>
      <diff>@@ -8,7 +8,7 @@
 ##
 
 #CHANGEME Add logging
-#puts &quot;Loading RubyOpals Kernel extension&quot;
+puts &quot;Loading RubyOpals Kernel extension&quot;
 
 module Kernel
   </diff>
      <filename>lib/install/installer/rubyopals.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,8 +2,9 @@ module Opal
   module Logger
     
     DEFAULT_LOG_LEVELS = { :debug =&gt; 0, :info =&gt; 1 , :warn =&gt; 2 , :error =&gt; 3, :fatal =&gt; 4 } unless defined?(DEFAULT_LOG_LEVELS)
-    DEFAULT_LOG_DIR = 'logs' unless defined?(DEFAULT_LOG_DIR)
-    DEFAULT_LOG_NAME = &quot;opal_logger.log&quot; unless defined?(DEFAULT_LOG_NAME)
+    DEFAULT_LOG_DIR = 'logs' unless defined?(Opal::Logger::DEFAULT_LOG_DIR)
+    DEFAULT_LOG_NAME = &quot;opal_logger.log&quot; unless defined?(Opal::Logger::DEFAULT_LOG_NAME)
+    DEFAULT_LOG_LEVEL = DEFAULT_LOG_LEVELS[:debug] unless defined?(Opal::Logger::DEFAULT_LOG_LEVEL)
     
     ##
     # Mimimal class to supply logging until main opal libraries are loaded
@@ -35,9 +36,9 @@ module Opal
       # @param [Hash] options Configuration options
       #
       def initialize(options = {})
-        @options = {:logger_types =&gt; [:stdout, :file], :default_level =&gt; 0 }.merge(options)
+        @options = {:logger_types =&gt; [:stdout, :file], :default_level =&gt; DEFAULT_LOG_LEVEL}.merge(options)
         @logger_types = @options[:logger_types]
-        @log_level = @options[:default_level]
+        @log_level = @options[:default_level] 
         @log_dir = DEFAULT_LOG_DIR
         @log_name = DEFAULT_LOG_NAME
       end
@@ -50,7 +51,11 @@ module Opal
       # @return [String] Fully qualified log dir
       #
       def qualified_log_dir
-        return File.expand_path(File.join(File.dirname(__FILE__),&quot;../..&quot;,@log_dir))
+        if @log_dir =~ /^\//
+          return @log_dir
+        else
+          return File.expand_path(File.join(File.dirname(__FILE__),&quot;../..&quot;,@log_dir))
+        end
       end
       
       private :qualified_log_dir</diff>
      <filename>lib/logger/mini_logger.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,11 @@
-#!/usr/bin/env ruby
+#!/bin/sh
 
-cmd = 'cd tmp; cp ../dist/installer_image/rubyopals-0.0.1.zip . ; rm -rf rubyopals-0.0.1 ; unzip rubyopals-0.0.1.zip ; cd rubyopals-0.0.1 ; sudo ./install_rubyopals ; cd ../..'
-puts `#{cmd}`
+# Don't get tempted to convert this script to ruby ! You'll get tangled in loading sequences ...
+
+cd tmp
+cp ../dist/installer_image/rubyopals-0.0.1.zip . 
+sudo rm -rf rubyopals-0.0.1
+unzip -q rubyopals-0.0.1.zip
+cd rubyopals-0.0.1
+sudo ruby ./install_rubyopals
+cd ../..</diff>
      <filename>test/unpack_and_install.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>e661be89f6a6728f6d6b5c286335014e368ee11a</id>
    </parent>
  </parents>
  <author>
    <name>Tracy Flynn</name>
    <email>info@rubyopals.org</email>
  </author>
  <url>http://github.com/tflynn/rubyopals/commit/52dc9d8ba9c51367eddabf07c5ca582bead99ed0</url>
  <id>52dc9d8ba9c51367eddabf07c5ca582bead99ed0</id>
  <committed-date>2008-07-07T15:05:03-07:00</committed-date>
  <authored-date>2008-07-07T15:05:03-07:00</authored-date>
  <message>Basic install with bootstrap opals and rubyopals hook works</message>
  <tree>5de9134e1f80f34e79e6efe08ca3e89de811f6fe</tree>
  <committer>
    <name>Tracy Flynn</name>
    <email>info@rubyopals.org</email>
  </committer>
</commit>
