diff options
| author | Max Howell | 2009-07-24 15:10:01 +0100 |
|---|---|---|
| committer | Max Howell | 2009-07-24 23:57:54 +0100 |
| commit | fb5aefd4a053d718637ea8690c6eeba2d6e56008 (patch) | |
| tree | 9f6e1a91e04963985093cb60e4764cf62d9f316b /Library/Homebrew/keg.rb | |
| parent | 5eb9d6519d9411a4715d06efcb7b0c7480e3f01d (diff) | |
| download | brew-0.3.tar.bz2 | |
Refactor--object orientate where sensible0.3
Diffstat (limited to 'Library/Homebrew/keg.rb')
| -rw-r--r-- | Library/Homebrew/keg.rb | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb new file mode 100644 index 000000000..8330c650f --- /dev/null +++ b/Library/Homebrew/keg.rb @@ -0,0 +1,153 @@ +# Copyright 2009 Max Howell <max@methylblue.com> +# +# This file is part of Homebrew. +# +# Homebrew is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Homebrew is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Homebrew. If not, see <http://www.gnu.org/licenses/>. + +require 'env' +require 'formula' + +class Keg + attr_reader :path, :version, :name + + def initialize formula + if formula.is_a? AbstractFormula + @path=formula.prefix + @name=formula.name + @version=formula.version + elsif formula.is_a? Pathname + # TODO + elsif formula.is_a? String + kids=($cellar+formula).children + raise "Multiple versions installed" if kids.length > 1 + @path=kids[0] + @name=formula + @version=@path.basename + end + end + + def clean + # TODO unset write permission more + %w[bin lib].each {|d| (Pathname.new(path)+d).find do |path| + if not path.file? + next + elsif path.extname == '.la' + # .la files are stupid + path.unlink + else + fo=`file -h #{path}` + args=nil + perms=0444 + if fo =~ /Mach-O dynamically linked shared library/ + args='-SxX' + elsif fo =~ /Mach-O executable/ # defaults strip everything + args='' # still do the strip + perms=0544 + elsif fo =~ /script text executable/ + perms=0544 + end + if args + puts "Stripping: #{path}" if ARGV.include? '--verbose' + path.chmod 0644 # so we can strip + unless path.stat.nlink > 1 + `strip #{args} #{path}` + else + # strip unlinks the file and recreates it, thus breaking hard links! + # is this expected behaviour? patch does it too… still,mktm this fixes it + tmp=`mktemp -t #{path.basename}`.strip + `strip -o #{tmp} #{path}` + `cat #{tmp} > #{path}` + File.unlink tmp + end + end + path.chmod perms + end + end} + + # remove empty directories TODO Rubyize! + `perl -MFile::Find -e"finddepth(sub{rmdir},'#{path}')"` + end + + def rm + if path.directory? + FileUtils.chmod_R 0777, path # ensure we have permission to delete + path.rmtree + end + end + +private + def __symlink_relative_to from, to + tod=to.dirname + tod.mkpath + Dir.chdir(tod) do + #TODO use Ruby function so we get exceptions + #NOTE Ruby functions are fucked up! + `ln -sf "#{from.relative_path_from tod}"` + @n+=1 + end + end + + # symlinks a directory recursively into our FHS tree + def __ln start + start=path+start + return unless start.directory? + + start.find do |from| + next if from == start + + prune=false + + relative_path=from.relative_path_from path + to=$root+relative_path + + if from.file? + __symlink_relative_to from, to + elsif from.directory? + # no need to put .app bundles in the path, the user can just use + # spotlight, or the open command and actual mac apps use an equivalent + Find.prune if from.extname.to_s == '.app' + + branch=from.relative_path_from start + + case yield branch when :skip + Find.prune + when :mkpath + to.mkpath + @n+=1 + else + __symlink_relative_to from, to + Find.prune + end + end + end + end + +public + def ln + # yeah indeed, you have to force anything you need in the main tree into + # these dirs REMEMBER that *NOT* everything needs to be in the main tree + # TODO consider using hardlinks + @n=0 + + __ln('etc') {:mkpath} + __ln('bin') {:link} + __ln('lib') {|path| :mkpath if ['pkgconfig','php'].include? path.to_s} + __ln('include') {:link} + + mkpaths=(1..9).collect {|x| "man/man#{x}"} <<'man'<<'doc'<<'locale'<<'info'<<'aclocal' + __ln('share') {|path| :mkpath if mkpaths.include? path.to_s} + + return @n + end +end
\ No newline at end of file |
