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. |