132 lines
3.9 KiB
Ruby
Raw Normal View History

2012-03-02 20:28:54 +00:00
module Homebrew extend self
def tap
if ARGV.empty?
tapd = HOMEBREW_LIBRARY/"Taps"
tapd.children.each do |tap|
# only replace the *last* dash: yes, tap filenames suck
puts tap.basename.to_s.reverse.sub('-', '/').reverse if (tap/'.git').directory?
end if tapd.directory?
elsif ARGV.first == "--repair"
repair_taps
2012-03-02 20:28:54 +00:00
else
opoo "Already tapped!" unless install_tap(*tap_args)
2012-03-02 20:28:54 +00:00
end
end
def install_tap user, repo
raise "brew install git" unless which 'git'
2012-03-02 20:28:54 +00:00
# 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}"
return false if tapd.directory?
abort unless system "git clone https://github.com/#{repouser}/homebrew-#{repo} #{tapd}"
2012-03-02 20:28:54 +00:00
files = []
tapd.find_formula{ |file| files << tapd.basename.join(file) }
link_tap_formula(files)
puts "Tapped #{files.length} formula"
# Figure out if this repo is private
# curl will throw an exception if the repo is private (Github returns a 404)
begin
curl('-Ifso', '/dev/null', "https://api.github.com/repos/#{repouser}/homebrew-#{repo}")
rescue
puts
puts "It looks like you tapped a private repository"
puts "In order to not input your credentials every time"
puts "you can use git HTTP credential caching or issue the"
puts "following command:"
puts
puts " cd #{tapd}"
puts " git remote set-url origin git@github.com:#{repouser}/homebrew-#{repo}.git"
puts
end
true
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?
# Whitelist gcc42 temporarily until Mavericks/Xcode 5.0 issues are resolved.
2013-12-14 18:15:59 +00:00
unless to.tap_ref == 'Homebrew/homebrew/apple-gcc42'
opoo "Could not tap #{Tty.white}#{from.tap_ref}#{Tty.reset} over #{Tty.white}#{to.tap_ref}#{Tty.reset}"
end
end
end
2012-03-02 20:28:54 +00:00
end
2012-03-16 12:58:39 +00:00
HOMEBREW_LIBRARY.join("Formula/.gitignore").atomic_write(ignores.uniq.join("\n"))
2012-03-16 22:06:41 +00:00
tapped
2012-03-02 20:28:54 +00:00
end
def repair_taps
count = 0
# prune dead symlinks in Formula
2013-10-30 13:20:48 -07:00
Dir["#{HOMEBREW_LIBRARY}/Formula/*.rb"].each do |fn|
if not File.exist? fn
File.delete fn
count += 1
end
end
puts "Pruned #{count} dead formula"
return unless HOMEBREW_REPOSITORY.join("Library/Taps").exist?
count = 0
# check symlinks are all set in each tap
HOMEBREW_REPOSITORY.join("Library/Taps").children.each do |tap|
files = []
tap.find_formula{ |file| files << tap.basename.join(file) } if tap.directory?
count += link_tap_formula(files)
end
puts "Tapped #{count} formula"
end
2012-03-02 20:28:54 +00:00
private
def tap_args
ARGV.first =~ %r{^(\S+)/(homebrew-)?(\w+)$}
raise "Invalid tap name" unless $1 && $3
2012-03-02 20:28:54 +00:00
[$1, $3]
end
end
2012-03-16 12:49:09 +00:00
class Pathname
def tap_ref
case self.to_s
when %r{^#{HOMEBREW_LIBRARY}/Taps/([a-z\-_]+)-(\w+)/(.+)}
2012-03-16 12:49:09 +00:00
"#$1/#$2/#{File.basename($3, '.rb')}"
when %r{^#{HOMEBREW_LIBRARY}/Formula/(.+)}
2013-12-14 18:15:59 +00:00
"Homebrew/homebrew/#{File.basename($1, '.rb')}"
2012-03-16 12:49:09 +00:00
else
nil
2012-03-16 12:49:09 +00:00
end
end
end