
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.
46 lines
1.2 KiB
Ruby
46 lines
1.2 KiB
Ruby
require 'cmd/tap' # for tap_args
|
|
|
|
module Homebrew extend self
|
|
def untap
|
|
user, repo = tap_args
|
|
|
|
# we consistently downcase in tap to ensure we are not bitten by case-insensive
|
|
# filesystem issues. Which is the default on mac. The problem being the
|
|
# filesystem cares, but our regexps don't. So unless we resolve *every* path
|
|
# we will get bitten.
|
|
user.downcase!
|
|
repo.downcase!
|
|
|
|
tapd = HOMEBREW_LIBRARY/"Taps/#{user}-#{repo}"
|
|
|
|
raise "No such tap!" unless tapd.directory?
|
|
|
|
files = []
|
|
tapd.find_formula{ |file| files << Pathname.new("#{user}-#{repo}").join(file) }
|
|
untapped = unlink_tap_formula(files)
|
|
rm_rf tapd
|
|
puts "Untapped #{untapped} formula"
|
|
end
|
|
|
|
def unlink_tap_formula formulae
|
|
untapped = 0
|
|
gitignores = (HOMEBREW_LIBRARY/"Formula/.gitignore").read.split rescue []
|
|
|
|
formulae.each do |formula|
|
|
tapd = (HOMEBREW_LIBRARY/"Taps/#{formula}").dirname
|
|
bn = formula.basename.to_s
|
|
pn = HOMEBREW_LIBRARY/"Formula/#{bn}"
|
|
|
|
if pn.symlink? and pn.realpath.to_s =~ %r[^#{tapd}]
|
|
pn.delete
|
|
gitignores.delete(bn)
|
|
untapped += 1
|
|
end
|
|
end
|
|
|
|
HOMEBREW_REPOSITORY.join("Library/Formula/.gitignore").atomic_write(gitignores * "\n")
|
|
|
|
untapped
|
|
end
|
|
end
|