aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Howell2012-03-02 20:28:54 +0000
committerMax Howell2012-03-16 21:06:15 +0000
commitfb13b6a99e48984fc74675784f74cb409a4a7557 (patch)
treef873307d6972ce088c9b0302ee7cce3d45573197
parent36ebeb2d04d03290e9721fb0e687532af84c9fb2 (diff)
downloadhomebrew-fb13b6a99e48984fc74675784f74cb409a4a7557.tar.bz2
`brew tap` and `brew untap`
-rw-r--r--.gitignore3
-rw-r--r--Library/Homebrew/cmd/tap.rb38
-rw-r--r--Library/Homebrew/cmd/untap.rb17
-rw-r--r--Library/Homebrew/extend/pathname.rb11
4 files changed, 68 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index 60119cef7..6a7ee0e63 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,4 +7,5 @@
!/bin/brew
!/share/man/man1/brew.1
.DS_Store
-/Library/LinkedKegs \ No newline at end of file
+/Library/LinkedKegs
+/Library/Taps
diff --git a/Library/Homebrew/cmd/tap.rb b/Library/Homebrew/cmd/tap.rb
new file mode 100644
index 000000000..e1f53db8b
--- /dev/null
+++ b/Library/Homebrew/cmd/tap.rb
@@ -0,0 +1,38 @@
+HOMEBREW_LIBRARY = HOMEBREW_REPOSITORY/"Library"
+
+module Homebrew extend self
+
+ def tap
+ if ARGV.empty?
+ (HOMEBREW_LIBRARY/"Taps").children.each do |tap|
+ puts tap.basename.sub('-', '/') if (tap/'.git').directory?
+ end
+ 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}"
+
+ cd HOMEBREW_LIBRARY/"Formula"
+ tapd.find_formula do |relative_pathname|
+ # using the system ln is the only way to get relative symlinks
+ system "ln -s ../Taps/#{user}-#{repo}/#{relative_pathname} 2>/dev/null"
+ opoo "#{relative_pathname.basename(".rb")} conflicts" unless $?.success?
+ end
+ end
+
+ private
+
+ def tap_args
+ ARGV.first =~ %r{^(\w+)/(homebrew-)?(\w+)$}
+ raise "Invalid usage" unless $1 and $3
+ [$1, $3]
+ end
+
+end
diff --git a/Library/Homebrew/cmd/untap.rb b/Library/Homebrew/cmd/untap.rb
new file mode 100644
index 000000000..78778e6fc
--- /dev/null
+++ b/Library/Homebrew/cmd/untap.rb
@@ -0,0 +1,17 @@
+require 'cmd/tap' # for Pathname.recursive_formula
+
+module Homebrew extend self
+ def untap
+ user, repo = tap_args
+ tapd = HOMEBREW_PREFIX/"Library/Taps/#{user}-#{repo}"
+
+ raise "No such tap!" unless tapd.directory?
+
+ tapd.find_formula do |pn|
+ pn = HOMEBREW_REPOSITORY/"Library/Formula"/pn.basename
+ pn.delete if pn.symlink? and pn.realpath.to_s =~ %r[^#{tapd.realpath}]
+ end
+
+ rm_rf tapd
+ end
+end
diff --git a/Library/Homebrew/extend/pathname.rb b/Library/Homebrew/extend/pathname.rb
index 6057c1437..d0ed3108b 100644
--- a/Library/Homebrew/extend/pathname.rb
+++ b/Library/Homebrew/extend/pathname.rb
@@ -313,6 +313,17 @@ class Pathname
end
system '/usr/bin/install-info', '--delete', '--quiet', self.to_s, (self.dirname+'dir').to_s
end
+
+ def find_formula pwd = self
+ children.map{ |child| child.relative_path_from(pwd) }.each do |pn|
+ yield pn if pn.to_s =~ /.rb$/
+ end
+ children.each do |child|
+ child.find_formula(pwd) do |pn|
+ yield pn
+ end if child.directory?
+ end
+ end
end
# sets $n and $d so you can observe creation of stuff