Max Howell 21bddc7972 Make the tapping already there step actually work
For when the symlink for a tap already exists and points to the thing we are about to symlink. This can happen, mostly because my code has sucked, but since the filesystem can be edited by the user at whim, it's possible then too.
2012-03-18 01:14:00 +00:00

79 lines
2.1 KiB
Ruby

module Homebrew extend self
def tap
if ARGV.empty?
tapd = HOMEBREW_LIBRARY/"Taps"
tapd.children.each do |tap|
puts tap.basename.sub('-', '/') if (tap/'.git').directory?
end if tapd.directory?
else
install_tap(*tap_args)
end
end
def install_tap user, repo
raise "brew install git" unless system "/usr/bin/which -s git"
tapd = HOMEBREW_LIBRARY/"Taps/#{user}-#{repo}"
raise "Already tapped!" if tapd.directory?
abort unless system "git clone https://github.com/#{user}/homebrew-#{repo} #{tapd}"
files = []
tapd.find_formula{ |file| files << Pathname.new("#{user}-#{repo}").join(file) }
tapped = link_tap_formula(files)
puts "Tapped #{tapped} formula"
end
def link_tap_formula formulae
ignores = (HOMEBREW_LIBRARY/"Formula/.gitignore").read.split rescue []
tapped = 0
cd HOMEBREW_LIBRARY/"Formula" do
formulae.each do |formula|
from = HOMEBREW_LIBRARY.join("Taps/#{formula}")
to = HOMEBREW_LIBRARY.join("Formula/#{formula.basename}")
# Unexpected, but possible, lets proceed as if nothing happened
to.delete if to.symlink? and to.realpath == from
# using the system ln is the only way to get relative symlinks
system "ln -s ../Taps/#{formula} 2>/dev/null"
if $?.success?
ignores << formula.basename.to_s
tapped += 1
else
to = to.realpath if to.exist?
opoo "Could not tap #{Tty.white}#{from.tap_ref}#{Tty.reset} over #{Tty.white}#{to.tap_ref}#{Tty.reset}"
end
end
end
HOMEBREW_LIBRARY.join("Formula/.gitignore").atomic_write(ignores.uniq.join("\n"))
tapped
end
private
def tap_args
ARGV.first =~ %r{^(\w+)/(homebrew-)?(\w+)$}
raise "Invalid usage" unless $1 and $3
[$1, $3]
end
end
class Pathname
def tap_ref
case self.to_s
when %r{^#{HOMEBREW_LIBRARY}/Taps/(\w+)-(\w+)/(.+)}
"#$1/#$2/#{File.basename($3, '.rb')}"
when %r{^#{HOMEBREW_LIBRARY}/Formula/(.+)}
"mxcl/master/#{File.basename($1, '.rb')}"
else
nil
end
end
end