| 
									
										
										
										
											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? | 
					
						
							| 
									
										
										
										
											2013-03-12 17:53:34 +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) } | 
					
						
							| 
									
										
										
										
											2013-02-28 10:56:40 -06:00
										 |  |  |     link_tap_formula(files) | 
					
						
							| 
									
										
										
										
											2013-04-02 16:28:46 -05:00
										 |  |  |     puts "Tapped #{files.length} 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 | 
					
						
							| 
									
										
										
										
											2013-03-12 17:53:34 +00:00
										 |  |  |       curl('-Ifso', '/dev/null', "https://api.github.com/repos/#{repouser}/homebrew-#{repo}") | 
					
						
							| 
									
										
										
										
											2012-05-14 16:18:24 -06:00
										 |  |  |     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}" | 
					
						
							| 
									
										
										
										
											2013-03-12 17:53:34 +00:00
										 |  |  |       puts "   git remote set-url origin git@github.com:#{repouser}/homebrew-#{repo}.git" | 
					
						
							| 
									
										
										
										
											2012-05-14 16:18:24 -06:00
										 |  |  |       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" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-14 09:35:16 -07:00
										 |  |  |     return unless HOMEBREW_REPOSITORY.join("Library/Taps").exist? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-04 15:06:37 -04:00
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											2013-03-12 17:53:34 +00: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 |