2012-03-02 20:28:54 +00:00
|
|
|
module Homebrew extend self
|
|
|
|
|
|
|
|
def tap
|
|
|
|
if ARGV.empty?
|
2012-03-17 00:04:11 +00:00
|
|
|
tapd = HOMEBREW_LIBRARY/"Taps"
|
|
|
|
tapd.children.each do |tap|
|
2012-08-07 09:18:14 -04:00
|
|
|
# only replace the *last* dash: yes, tap filenames suck
|
|
|
|
puts tap.basename.to_s.reverse.sub('-', '/').reverse if (tap/'.git').directory?
|
2012-03-17 00:04:11 +00:00
|
|
|
end if tapd.directory?
|
2012-08-04 15:06:37 -04:00
|
|
|
elsif ARGV.first == "--repair"
|
|
|
|
repair_taps
|
2012-03-02 20:28:54 +00:00
|
|
|
else
|
|
|
|
install_tap(*tap_args)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def install_tap user, repo
|
2012-05-13 19:00:10 -05:00
|
|
|
raise "brew install git" unless which 'git'
|
2012-03-02 20:28:54 +00:00
|
|
|
|
2012-03-18 01:45:26 +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}"
|
2012-03-02 20:28:54 +00:00
|
|
|
raise "Already tapped!" if tapd.directory?
|
2012-03-18 01:45:26 +00:00
|
|
|
abort unless system "git clone https://github.com/#{repouser}/homebrew-#{repo} #{tapd}"
|
2012-03-02 20:28:54 +00:00
|
|
|
|
2012-03-07 22:48:44 +00:00
|
|
|
files = []
|
2012-03-18 01:45:26 +00:00
|
|
|
tapd.find_formula{ |file| files << tapd.basename.join(file) }
|
2012-03-16 17:11:40 +00:00
|
|
|
tapped = link_tap_formula(files)
|
|
|
|
puts "Tapped #{tapped} formula"
|
2012-05-14 16:18:24 -06:00
|
|
|
|
|
|
|
# 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
|
2012-03-07 22:48:44 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def link_tap_formula formulae
|
|
|
|
ignores = (HOMEBREW_LIBRARY/"Formula/.gitignore").read.split rescue []
|
2012-03-16 17:11:40 +00:00
|
|
|
tapped = 0
|
2012-03-07 22:48:44 +00:00
|
|
|
|
|
|
|
cd HOMEBREW_LIBRARY/"Formula" do
|
|
|
|
formulae.each do |formula|
|
2012-03-17 01:23:53 +00:00
|
|
|
from = HOMEBREW_LIBRARY.join("Taps/#{formula}")
|
|
|
|
to = HOMEBREW_LIBRARY.join("Formula/#{formula.basename}")
|
2012-03-16 17:11:40 +00:00
|
|
|
|
|
|
|
# Unexpected, but possible, lets proceed as if nothing happened
|
2012-03-18 00:39:57 +00:00
|
|
|
to.delete if to.symlink? and to.realpath == from
|
2012-03-16 17:11:40 +00:00
|
|
|
|
2012-03-07 22:48:44 +00:00
|
|
|
# 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
|
2012-03-16 17:11:40 +00:00
|
|
|
tapped += 1
|
2012-03-07 22:48:44 +00:00
|
|
|
else
|
2012-03-17 01:23:53 +00:00
|
|
|
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}"
|
2012-03-07 22:48:44 +00:00
|
|
|
end
|
2012-03-04 02:47:11 +00:00
|
|
|
end
|
2012-03-02 20:28:54 +00:00
|
|
|
end
|
2012-03-04 02:47:11 +00:00
|
|
|
|
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
|
|
|
|
|
2012-08-04 15:06:37 -04:00
|
|
|
def repair_taps
|
|
|
|
count = 0
|
|
|
|
# prune dead symlinks in Formula
|
|
|
|
Dir["#{HOMEBREW_REPOSITORY}/Library/Formula/*.rb"].each do |fn|
|
|
|
|
if not File.exist? fn
|
|
|
|
File.delete fn
|
|
|
|
count += 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
puts "Pruned #{count} dead formula"
|
|
|
|
|
|
|
|
count = 0
|
|
|
|
# check symlinks are all set in each tap
|
|
|
|
HOMEBREW_REPOSITORY.join("Library/Taps").children.each do |tap|
|
|
|
|
files = []
|
2013-02-01 18:02:09 -08:00
|
|
|
tap.find_formula{ |file| files << tap.basename.join(file) } if tap.directory?
|
2012-08-04 15:06:37 -04:00
|
|
|
count += link_tap_formula(files)
|
|
|
|
end
|
|
|
|
|
|
|
|
puts "Tapped #{count} formula"
|
|
|
|
end
|
|
|
|
|
2012-03-02 20:28:54 +00:00
|
|
|
private
|
|
|
|
|
|
|
|
def tap_args
|
2012-04-30 14:02:23 -05:00
|
|
|
ARGV.first =~ %r{^(\S+)/(homebrew-)?(\w+)$}
|
2012-03-02 20:28:54 +00:00
|
|
|
raise "Invalid usage" unless $1 and $3
|
|
|
|
[$1, $3]
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
2012-03-16 12:49:09 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Pathname
|
|
|
|
def tap_ref
|
2012-03-16 17:11:40 +00:00
|
|
|
case self.to_s
|
2012-08-04 13:56:36 -04:00
|
|
|
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/(.+)}
|
|
|
|
"mxcl/master/#{File.basename($1, '.rb')}"
|
|
|
|
else
|
2012-03-16 17:11:40 +00:00
|
|
|
nil
|
2012-03-16 12:49:09 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|