install.rb #10

  • //
  • guest/
  • jen_bottom/
  • P4RubyGem/
  • install.rb
  • View
  • Commits
  • Open Download .zip Download (6 KB)
require 'net/ftp'
require 'rbconfig'
require 'zlib'
require 'rubygems/package'

BUILD_DIR = "./build"
DIST_DIR = "./dist"

FTP_SERVER = "ftp.perforce.com"
TOP_DIR = "perforce"
P4RUBY_FTP_DIR = "bin.tools"

P4RUBY_ARCHIVE = "p4ruby.tgz"

class Installer 
    def initialize
        unless File.directory?(DIST_DIR)
            Dir.mkdir(DIST_DIR)
        end

        unless File.directory?(BUILD_DIR)
            Dir.mkdir(BUILD_DIR)
        end

        @platform = guess_platform
     
        #TODO some way of the user supplying their own ftp path/ local path for the api's
        fetch
        build
    end

    def fetch
        p4_ftp = P4Ruby_FTP.new(@platform)
        p4_ftp.download
    end

    def build
        wd = Dir.getwd
        api_dir = get_api_build_dir
        Dir.chdir(get_ruby_build_dir)
        #Find out if the customer wants to build with SSL support
puts "Would you like to build P4Ruby with ssl support? y/n"
sslbuild = gets.chomp

#Test that the content we expect to see in this variable is there and act accordingly
exit = 0
while exit == 0
if sslbuild=='n'        
        puts `yes | ruby p4conf.rb -d #{api_dir}`
        exit = 1
  else if sslbuild == 'y'
        puts `yes | ruby p4conf.rb -d #{api_dir} --ssl`
        exit = 1
      else puts "Please enter y or n"
        sslbuild = gets.chomp
        exit = 0
      end
    end
      end        
        puts `make`
        puts `ruby test.rb`
        puts `make install`
        #TODO Deal with known issue wheree we have to ignore -Werror in Makefile
        Dir.chdir(wd)
    end
    def guess_cpu(os)
        cpu = RbConfig::CONFIG['target_cpu']
        case os 
        when :darwin, :linux
            if cpu =~ /i686/
                "x86"
            else
                cpu
            end
        else
            case cpu
            when /ia/i
                'ia64'
            else
                cpu 
            end
        end
    end

    def guess_platform()
        case RbConfig::CONFIG["target_os"].downcase 
        when /nt|mswin/
            "nt#{guess_cpu(:windows)}"
        when /mingw/
            "mingwx86"
        when /darwin/
            #TODO look at darwin 100, can you complile bin for 90 on 100?
            "darwin90#{guess_cpu(:darwin)}"
        when /solaris/
            "solaris10#{guess_cpu(:solaris)}"
        when /linux/
            "linux26#{guess_cpu(:linux)}" 
        when /cygwin/
            #No longer built for
        end
    end

    def get_ruby_build_dir
        Dir.foreach(BUILD_DIR) do |d|
            if d =~ /p4ruby/
                return File.join(BUILD_DIR,d)
            end
        end
    end

    def get_api_build_dir
        Dir.foreach(BUILD_DIR) do |d|
            if d =~ /p4api/
                return File.join(Dir.getwd, BUILD_DIR,d)
            end
        end
    end
end

class P4Ruby_FTP

    def initialize(platform)
        @ftp = Net::FTP.new(FTP_SERVER)
        @ftp.login
        @ftp.chdir(TOP_DIR)

        @latest = latest_version
        @ftp.chdir("r#{@latest}")

        @platform = "bin.#{platform}"

        if @platform =~ /nt|mingw/
            @p4api_archive = "p4api.zip"
        else
            @p4api_archive = "p4api.tgz"
        end
    end

    def versions
        remote_files_matching(".", /r(1\d\.\d)/) { |match|
            match.captures.first
        }.sort
    end

    def latest_version
        versions.reverse_each{ |v|
            begin
                remote_files_matching("r#{v}/bin.tools",/p4ruby/) do
                    return v
                end
            rescue
                next
            end
        }
    end
    
    def remote_files_matching(dir, regex)
        @ftp.ls(dir.to_s).map { |entry|
            if match = entry.match(regex)
                yield match
            else
                nil
            end
        }.reject { |entry|
            entry.nil?
        }
    end

    def download
        begin
            download_p4api
            download_p4ruby
        rescue => e
            puts "Failed to download API or p4ruby, please compile manually"
        end
    end

    def download_p4api
        @ftp.chdir(@platform)
        @ftp.getbinaryfile(@p4api_archive, "#{DIST_DIR}/#{@p4api_archive}", 1024)
        @ftp.chdir("..")

        decompress("#{DIST_DIR}/#{@p4api_archive}","#{BUILD_DIR}/")
    end

    def download_p4ruby
        @ftp.chdir(P4RUBY_FTP_DIR)
        @ftp.getbinaryfile(P4RUBY_ARCHIVE, "#{DIST_DIR}/#{P4RUBY_ARCHIVE}", 1024)
        @ftp.chdir("..")

        decompress("#{DIST_DIR}/#{P4RUBY_ARCHIVE}","#{BUILD_DIR}/")
    end

    def decompress(tgz, destination)
        if tgz =~ /\.zip/
            `unzip #{tgz} -d #{destination}`
            return 
        end
        Gem::Package::TarReader.new(Zlib::GzipReader.open tgz) do |tar|
            tar.each do |entry|
                if entry.directory?
                    puts "Making dir #{File.join(destination, entry.full_name)}"
                    unless File.exists?(File.join(destination, entry.full_name))
                        Dir.mkdir(File.join(destination, entry.full_name))
                    end
                elsif entry.file?
                    puts "Making file #{File.join(destination, entry.full_name)}"
                    unless File.exists?(File.join(destination, entry.full_name))
                        File.open(File.join(destination, entry.full_name), "w") do |f|
                            f.write(entry.read)
                        end
                    end
                elsif entry.header.typeflag == '2'
                    #TODO remove if not necessary
                    binding.pry
                end
            end
        end
    end
end

i = Installer.new

# Change User Description Committed
#10 10176 Jen Bottom Changed the logic for finding out if the customer has entered the required values in the variable sslbuild.
Seems to function ok, but need to test that what is build with system ssl libs connects to ssl enabled P4D before submitting to RubyGems.
#9 10169 Jen Bottom Added a check for whether the variable sslbuild is empty.
If it is instruct the user to select y or n. Still need to add handling for cases where the user enters something other than y or n.
#8 10168 Jen Bottom Adding a mechanism for the user to specify whether they want P4Ruby built with SSL support.
Need to add error checking, for if the variable is empty or a value other than 'y' or 'n' is entered.
#7 9464 Jen Bottom Pulling in Brett's changes.
#6 9459 Jen Bottom Integrating Brett's changes into my branch.
#5 9257 Jen Bottom deleting p4config file and adding to .ignore file.
#4 9256 Jen Bottom Fixed a typo.
'test.b' should have been 'test.rb'.
#3 8879 Jen Bottom integrating Brett Bates's latest work on P4Ruby gem for further enhancement.
#2 8483 Jen Bottom submitting some minor changes to the 'install.rb' file.
Have replaced 'config' with 'rbconfig'. Have also removed the build of the gem, as now it will be out of date
#1 8366 Jen Bottom Adding the source code and docs for the P4Ruby Gem to the Public Depot.