Max Howell ceeb768c84 Special case Homebrew organization taps
We allow homebrew/dupes for instance, rather than Homebrew/dupes. Because nobody likes shifting in the terminal.

In the process of doing this I discovered some case-insensitive filesystem bugs we have avoided before because I had the foresight to mandate lowercase in formula names. GitHub considers Homebrew and homebrew to be different (even though you can't create both). So we had to allow case insensitivity in tap input. I have made it now so the resulting directory however is lowercased, neatly avoiding the issue. And so we also downcase tap arguments when applying them to tap directories or formula.
2012-03-18 01:45:26 +00:00

84 lines
2.3 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"
# we special case homebrew so users don't have to shift in a terminal
repouser = if user == "homebrew" then "Homebrew" else user end
user = "homebrew" if user == "Homebrew"
# we downcase to avoid case-insensitive filesystem issues
tapd = HOMEBREW_LIBRARY/"Taps/#{user.downcase}-#{repo.downcase}"
raise "Already tapped!" if tapd.directory?
abort unless system "git clone https://github.com/#{repouser}/homebrew-#{repo} #{tapd}"
files = []
tapd.find_formula{ |file| files << tapd.basename.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