2009-08-31 16:01:36 +01:00
|
|
|
# Copyright 2009 Max Howell and other contributors.
|
2009-07-31 02:51:17 +01:00
|
|
|
#
|
2009-08-31 16:01:36 +01:00
|
|
|
# Redistribution and use in source and binary forms, with or without
|
|
|
|
# modification, are permitted provided that the following conditions
|
|
|
|
# are met:
|
2009-07-31 02:51:17 +01:00
|
|
|
#
|
2009-08-31 16:01:36 +01:00
|
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
|
|
# notice, this list of conditions and the following disclaimer.
|
|
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
|
|
# documentation and/or other materials provided with the distribution.
|
2009-07-31 02:51:17 +01:00
|
|
|
#
|
2009-08-31 16:01:36 +01:00
|
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
2009-08-10 16:33:15 +01:00
|
|
|
#
|
2009-07-31 02:51:17 +01:00
|
|
|
require 'pathname'
|
|
|
|
|
|
|
|
# we enhance pathname to make our code more readable
|
|
|
|
class Pathname
|
|
|
|
def install src
|
|
|
|
if src.is_a? Array
|
2009-08-10 16:34:04 +01:00
|
|
|
src.collect {|src| install src }
|
2009-08-21 18:26:50 +01:00
|
|
|
else
|
|
|
|
raise "#{src} does not exist" unless File.exist? src
|
2009-07-31 02:51:17 +01:00
|
|
|
mkpath
|
|
|
|
if File.symlink? src
|
|
|
|
# we use the BSD mv command because FileUtils copies the target and
|
|
|
|
# not the link! I'm beginning to wish I'd used Python quite honestly!
|
2009-08-10 16:34:04 +01:00
|
|
|
raise unless Kernel.system 'mv', src, to_s and $? == 0
|
2009-07-31 02:51:17 +01:00
|
|
|
else
|
|
|
|
# we mv when possible as it is faster and you should only be using
|
|
|
|
# this function when installing from the temporary build directory
|
|
|
|
FileUtils.mv src, to_s
|
|
|
|
end
|
2009-09-02 14:31:28 +01:00
|
|
|
src=Pathname.new src
|
|
|
|
return self+src.basename
|
2009-07-31 02:51:17 +01:00
|
|
|
end
|
|
|
|
end
|
2009-08-31 22:34:42 -06:00
|
|
|
|
|
|
|
# we assume this pathname object is a file obviously
|
|
|
|
def write content
|
2009-09-02 14:31:28 +01:00
|
|
|
raise "Will not overwrite #{to_s}" if exist? and not ARGV.force?
|
2009-08-31 22:34:42 -06:00
|
|
|
dirname.mkpath
|
|
|
|
File.open(self, 'w') {|f| f.write content }
|
|
|
|
end
|
2009-07-31 02:51:17 +01:00
|
|
|
|
|
|
|
def cp dst
|
|
|
|
if file?
|
|
|
|
FileUtils.cp to_s, dst
|
|
|
|
else
|
|
|
|
FileUtils.cp_r to_s, dst
|
|
|
|
end
|
2009-09-02 14:31:28 +01:00
|
|
|
return dst
|
2009-07-31 02:51:17 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
# extended to support the double extensions .tar.gz and .tar.bz2
|
|
|
|
def extname
|
|
|
|
/(\.tar\.(gz|bz2))$/.match to_s
|
|
|
|
return $1 if $1
|
|
|
|
return File.extname(to_s)
|
|
|
|
end
|
|
|
|
|
|
|
|
# for filetypes we support, basename without extension
|
|
|
|
def stem
|
|
|
|
return File.basename(to_s, extname)
|
|
|
|
end
|
|
|
|
|
2009-08-10 16:48:30 +01:00
|
|
|
# I don't trust the children.length == 0 check particularly, not to mention
|
|
|
|
# it is slow to enumerate the whole directory just to see if it is empty,
|
|
|
|
# instead rely on good ol' libc and the filesystem
|
|
|
|
def rmdir_if_possible
|
|
|
|
rmdir
|
2009-09-02 14:31:28 +01:00
|
|
|
true
|
2009-08-10 16:48:30 +01:00
|
|
|
rescue SystemCallError => e
|
2009-08-11 00:27:43 +01:00
|
|
|
raise unless e.errno == Errno::ENOTEMPTY::Errno or e.errno == Errno::EACCES::Errno
|
2009-09-02 14:31:28 +01:00
|
|
|
false
|
2009-08-10 16:48:30 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def chmod_R perms
|
|
|
|
require 'fileutils'
|
|
|
|
FileUtils.chmod_R perms, to_s
|
|
|
|
end
|
|
|
|
|
|
|
|
def abv
|
2009-09-02 14:31:28 +01:00
|
|
|
out=''
|
|
|
|
n=`find #{to_s} -type f | wc -l`.to_i
|
|
|
|
out<<"#{n} files, " if n > 1
|
2010-01-03 02:59:16 +00:00
|
|
|
out<<`/usr/bin/du -hd0 #{to_s} | cut -d"\t" -f1`.strip
|
2009-08-10 16:48:30 +01:00
|
|
|
end
|
|
|
|
|
2009-09-11 12:51:36 +01:00
|
|
|
# attempts to retrieve the version component of this path, so generally
|
|
|
|
# you'll call it on tarballs or extracted tarball directories, if you add
|
|
|
|
# to this please provide amend the unittest
|
2009-07-31 02:51:17 +01:00
|
|
|
def version
|
2009-08-12 13:43:20 +01:00
|
|
|
if directory?
|
|
|
|
# directories don't have extnames
|
|
|
|
stem=basename.to_s
|
|
|
|
else
|
|
|
|
stem=self.stem
|
|
|
|
end
|
|
|
|
|
2009-08-08 14:24:26 +01:00
|
|
|
# github tarballs are special
|
|
|
|
# we only support numbered tagged downloads
|
|
|
|
%r[github.com/.*/tarball/((\d\.)+\d)$].match to_s
|
|
|
|
return $1 if $1
|
2009-09-11 12:51:36 +01:00
|
|
|
|
2009-07-31 02:51:17 +01:00
|
|
|
# eg. boost_1_39_0
|
|
|
|
/((\d+_)+\d+)$/.match stem
|
|
|
|
return $1.gsub('_', '.') if $1
|
|
|
|
|
|
|
|
# eg. foobar-4.5.1-1
|
2009-08-30 15:49:38 +01:00
|
|
|
# eg. ruby-1.9.1-p243
|
2009-09-01 09:17:44 -05:00
|
|
|
/-((\d+\.)*\d\.\d+-(p|rc)?\d+)$/.match stem
|
2009-07-31 02:51:17 +01:00
|
|
|
return $1 if $1
|
2009-09-11 12:51:36 +01:00
|
|
|
|
|
|
|
# eg. lame-398-1
|
|
|
|
/-((\d)+-\d)/.match stem
|
|
|
|
return $1 if $1
|
2009-07-31 02:51:17 +01:00
|
|
|
|
|
|
|
# eg. foobar-4.5.1
|
|
|
|
/-((\d+\.)*\d+)$/.match stem
|
|
|
|
return $1 if $1
|
|
|
|
|
|
|
|
# eg. foobar-4.5.1b
|
|
|
|
/-((\d+\.)*\d+([abc]|rc\d))$/.match stem
|
|
|
|
return $1 if $1
|
|
|
|
|
|
|
|
# eg foobar-4.5.0-beta1
|
|
|
|
/-((\d+\.)*\d+-beta\d+)$/.match stem
|
|
|
|
return $1 if $1
|
|
|
|
|
|
|
|
# eg. foobar4.5.1
|
|
|
|
/((\d+\.)*\d+)$/.match stem
|
|
|
|
return $1 if $1
|
2009-09-23 07:56:07 -07:00
|
|
|
|
2009-09-06 00:43:00 -04:00
|
|
|
# eg foobar-4.5.0-bin
|
2009-12-12 17:40:15 -08:00
|
|
|
/-((\d+\.)+\d+[abc]?)[-.](bin|src|sources?)$/.match stem
|
2009-09-06 00:43:00 -04:00
|
|
|
return $1 if $1
|
2009-09-23 07:56:07 -07:00
|
|
|
|
2009-07-31 02:51:17 +01:00
|
|
|
# eg. otp_src_R13B (this is erlang's style)
|
|
|
|
# eg. astyle_1.23_macosx.tar.gz
|
|
|
|
stem.scan /_([^_]+)/ do |match|
|
|
|
|
return match.first if /\d/.match $1
|
|
|
|
end
|
2009-08-22 15:53:35 +01:00
|
|
|
|
|
|
|
nil
|
2009-07-31 02:51:17 +01:00
|
|
|
end
|
2009-09-30 22:17:46 -05:00
|
|
|
|
2009-12-30 18:56:46 +00:00
|
|
|
def md5
|
|
|
|
require 'digest'
|
|
|
|
Digest::MD5.hexdigest(File.read(self))
|
|
|
|
end
|
|
|
|
|
2009-09-30 22:17:46 -05:00
|
|
|
if '1.9' <= RUBY_VERSION
|
|
|
|
alias_method :to_str, :to_s
|
|
|
|
end
|
2009-07-31 02:51:17 +01:00
|
|
|
end
|
2009-08-10 16:48:30 +01:00
|
|
|
|
|
|
|
# sets $n and $d so you can observe creation of stuff
|
|
|
|
module ObserverPathnameExtension
|
|
|
|
def unlink
|
|
|
|
super
|
|
|
|
puts "rm #{to_s}" if ARGV.verbose?
|
|
|
|
$n+=1
|
|
|
|
end
|
|
|
|
def rmdir
|
|
|
|
super
|
|
|
|
puts "rmdir #{to_s}" if ARGV.verbose?
|
|
|
|
$d+=1
|
|
|
|
end
|
|
|
|
def resolved_path_exists?
|
|
|
|
(dirname+readlink).exist?
|
|
|
|
end
|
|
|
|
def mkpath
|
|
|
|
super
|
|
|
|
puts "mkpath #{to_s}" if ARGV.verbose?
|
|
|
|
$d+=1
|
|
|
|
end
|
|
|
|
def make_relative_symlink src
|
|
|
|
dirname.mkpath
|
|
|
|
Dir.chdir dirname do
|
|
|
|
# TODO use Ruby function so we get exceptions
|
|
|
|
# NOTE Ruby functions may work, but I had a lot of problems
|
|
|
|
rv=system 'ln', '-sf', src.relative_path_from(dirname)
|
|
|
|
raise "Could not create symlink #{to_s}" unless rv and $? == 0
|
|
|
|
puts "ln #{to_s}" if ARGV.verbose?
|
|
|
|
$n+=1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
$n=0
|
|
|
|
$d=0
|