| 
									
										
										
										
											2012-03-07 22:48:44 +00:00
										 |  |  | require 'cmd/tap' | 
					
						
							| 
									
										
										
										
											2012-03-18 01:23:01 +00:00
										 |  |  | require 'cmd/untap' | 
					
						
							| 
									
										
										
										
											2012-03-07 22:48:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | module Homebrew extend self | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-06 17:04:08 -08:00
										 |  |  |   DEPRECATED_TAPS = ['adamv-alt'] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |   def update | 
					
						
							| 
									
										
										
										
											2013-02-17 13:42:45 +00:00
										 |  |  |     unless ARGV.named.empty? | 
					
						
							|  |  |  |       abort <<-EOS.undent
 | 
					
						
							|  |  |  |         This command updates brew itself, and does not take formula names. | 
					
						
							|  |  |  |         Use `brew upgrade <formula>`. | 
					
						
							|  |  |  |       EOS | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-05-07 20:32:04 -05:00
										 |  |  |     abort "Please `brew install git' first." unless which "git" | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 18:23:49 -06:00
										 |  |  |     # ensure GIT_CONFIG is unset as we need to operate on .git/config | 
					
						
							|  |  |  |     ENV.delete('GIT_CONFIG') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |     cd HOMEBREW_REPOSITORY | 
					
						
							|  |  |  |     git_init_if_necessary | 
					
						
							| 
									
										
										
										
											2011-09-20 02:25:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |     report = Report.new | 
					
						
							|  |  |  |     master_updater = Updater.new | 
					
						
							|  |  |  |     master_updater.pull! | 
					
						
							|  |  |  |     report.merge!(master_updater.report) | 
					
						
							| 
									
										
										
										
											2011-06-12 17:07:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |     Dir["Library/Taps/*"].each do |tapd| | 
					
						
							| 
									
										
										
										
											2012-10-28 12:30:52 -07:00
										 |  |  |       next unless File.directory?(tapd) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-06 17:04:08 -08:00
										 |  |  |       basename = Pathname.new(tapd).basename.to_s | 
					
						
							|  |  |  |       if DEPRECATED_TAPS.include?(basename) | 
					
						
							|  |  |  |         opoo "#{basename} is deprecated; please untap it" | 
					
						
							|  |  |  |         next | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |       cd tapd do | 
					
						
							| 
									
										
										
										
											2012-08-01 16:19:25 -04:00
										 |  |  |         begin | 
					
						
							|  |  |  |           updater = Updater.new | 
					
						
							|  |  |  |           updater.pull! | 
					
						
							|  |  |  |           report.merge!(updater.report) do |key, oldval, newval| | 
					
						
							|  |  |  |             oldval.concat(newval) | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         rescue | 
					
						
							|  |  |  |           tapd =~ %r{^Library/Taps/(\w+)-(\w+)} | 
					
						
							|  |  |  |           onoe "Failed to update tap: #$1/#$2" | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2011-06-12 17:07:59 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-03-18 01:23:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # we unlink first in case the formula has moved to another tap | 
					
						
							|  |  |  |     Homebrew.unlink_tap_formula(report.removed_tapped_formula) | 
					
						
							| 
									
										
										
										
											2012-03-07 22:48:44 +00:00
										 |  |  |     Homebrew.link_tap_formula(report.new_tapped_formula) | 
					
						
							| 
									
										
										
										
											2011-06-12 17:07:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |     if report.empty? | 
					
						
							|  |  |  |       puts "Already up-to-date." | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       puts "Updated Homebrew from #{master_updater.initial_revision[0,8]} to #{master_updater.current_revision[0,8]}." | 
					
						
							|  |  |  |       report.dump | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-06-12 17:07:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |   private | 
					
						
							| 
									
										
										
										
											2011-06-12 17:07:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |   def git_init_if_necessary | 
					
						
							|  |  |  |     if Dir['.git/*'].empty? | 
					
						
							|  |  |  |       safe_system "git init" | 
					
						
							|  |  |  |       safe_system "git config core.autocrlf false" | 
					
						
							|  |  |  |       safe_system "git remote add origin https://github.com/mxcl/homebrew.git" | 
					
						
							|  |  |  |       safe_system "git fetch origin" | 
					
						
							|  |  |  |       safe_system "git reset --hard origin/master" | 
					
						
							| 
									
										
										
										
											2009-09-08 00:02:28 +02:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |   rescue Exception | 
					
						
							|  |  |  |     FileUtils.rm_rf ".git" | 
					
						
							|  |  |  |     raise | 
					
						
							| 
									
										
										
										
											2011-06-12 17:07:59 +02:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-07-23 17:32:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2010-07-23 17:32:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  | class Updater | 
					
						
							|  |  |  |   attr_reader :initial_revision, :current_revision | 
					
						
							| 
									
										
										
										
											2010-07-23 17:32:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |   def pull! | 
					
						
							|  |  |  |     safe_system "git checkout -q master" | 
					
						
							| 
									
										
										
										
											2010-02-18 19:24:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |     @initial_revision = read_current_revision | 
					
						
							| 
									
										
										
										
											2010-02-18 19:24:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |     # ensure we don't munge line endings on checkout | 
					
						
							|  |  |  |     safe_system "git config core.autocrlf false" | 
					
						
							| 
									
										
										
										
											2010-07-23 17:32:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |     args = ["pull"] | 
					
						
							|  |  |  |     args << "--rebase" if ARGV.include? "--rebase" | 
					
						
							|  |  |  |     args << "-q" unless ARGV.verbose? | 
					
						
							|  |  |  |     args << "origin" | 
					
						
							|  |  |  |     # the refspec ensures that 'origin/master' gets updated | 
					
						
							|  |  |  |     args << "refs/heads/master:refs/remotes/origin/master" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     safe_system "git", *args | 
					
						
							| 
									
										
										
										
											2010-07-23 17:32:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |     @current_revision = read_current_revision | 
					
						
							| 
									
										
										
										
											2010-07-23 17:32:43 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-23 20:39:24 -05:00
										 |  |  |   # Matches raw git diff format (see `man git-diff-tree`) | 
					
						
							|  |  |  |   DIFFTREE_RX = /^:[0-7]{6} [0-7]{6} [0-9a-fA-F]{40} [0-9a-fA-F]{40} ([ACDMR])\d{0,3}\t(.+?)(?:\t(.+))?$/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-23 17:32:43 -07:00
										 |  |  |   def report | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |     map = Hash.new{ |h,k| h[k] = [] } | 
					
						
							| 
									
										
										
										
											2011-08-26 13:04:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |     if initial_revision && initial_revision != current_revision | 
					
						
							| 
									
										
										
										
											2012-03-23 20:39:24 -05:00
										 |  |  |       `git diff-tree -r --raw -M85% #{initial_revision} #{current_revision}`.each_line do |line| | 
					
						
							|  |  |  |         DIFFTREE_RX.match line | 
					
						
							|  |  |  |         path = case status = $1.to_sym | 
					
						
							|  |  |  |           when :R then $3 | 
					
						
							|  |  |  |           else $2 | 
					
						
							| 
									
										
										
										
											2012-03-22 18:22:39 -05:00
										 |  |  |           end | 
					
						
							|  |  |  |         path = Pathname.pwd.join(path).relative_path_from(HOMEBREW_REPOSITORY) | 
					
						
							| 
									
										
										
										
											2012-03-23 20:39:24 -05:00
										 |  |  |         map[status] << path.to_s | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-08-26 13:04:08 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |     map | 
					
						
							| 
									
										
										
										
											2010-07-23 17:32:43 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-08 00:02:28 +02:00
										 |  |  |   private | 
					
						
							| 
									
										
										
										
											2010-07-23 17:37:03 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |   def read_current_revision | 
					
						
							| 
									
										
										
										
											2012-03-22 18:22:19 -05:00
										 |  |  |     `git rev-parse -q --verify HEAD`.chomp | 
					
						
							| 
									
										
										
										
											2011-06-12 17:07:59 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |   def `(cmd) | 
					
						
							|  |  |  |     out = Kernel.`(cmd) #` | 
					
						
							|  |  |  |     if $? && !$?.success? | 
					
						
							|  |  |  |       $stderr.puts out | 
					
						
							|  |  |  |       raise ErrorDuringExecution, "Failure while executing: #{cmd}" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     ohai(cmd, out) if ARGV.verbose? | 
					
						
							|  |  |  |     out | 
					
						
							| 
									
										
										
										
											2011-06-12 17:07:59 +02:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Report < Hash | 
					
						
							| 
									
										
										
										
											2011-06-12 17:07:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |   def dump | 
					
						
							|  |  |  |     # Key Legend: Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-05 13:43:07 -07:00
										 |  |  |     dump_formula_report :A, "New Formulae" | 
					
						
							|  |  |  |     dump_formula_report :M, "Updated Formulae" | 
					
						
							|  |  |  |     dump_formula_report :D, "Deleted Formulae" | 
					
						
							|  |  |  |     dump_formula_report :R, "Renamed Formulae" | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  | #    dump_new_commands | 
					
						
							|  |  |  | #    dump_deleted_commands | 
					
						
							| 
									
										
										
										
											2011-06-12 17:07:59 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-18 01:23:01 +00:00
										 |  |  |   def tapped_formula_for key | 
					
						
							|  |  |  |     fetch(key, []).map do |path| | 
					
						
							|  |  |  |       case path when %r{^Library/Taps/(\w+-\w+/.*)} | 
					
						
							| 
									
										
										
										
											2012-03-07 22:48:44 +00:00
										 |  |  |         Pathname.new($1) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end.compact | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-18 01:23:01 +00:00
										 |  |  |   def new_tapped_formula | 
					
						
							|  |  |  |     tapped_formula_for :A | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def removed_tapped_formula | 
					
						
							|  |  |  |     tapped_formula_for :D | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |   def select_formula key | 
					
						
							|  |  |  |     fetch(key, []).map do |path| | 
					
						
							|  |  |  |       case path when %r{^Library/Formula} | 
					
						
							|  |  |  |         File.basename(path, ".rb") | 
					
						
							| 
									
										
										
										
											2012-03-18 01:23:01 +00:00
										 |  |  |       when %r{^Library/Taps/(\w+)-(\w+)/(.*)\.rb} | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |         "#$1/#$2/#{File.basename(path, '.rb')}" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end.compact.sort | 
					
						
							| 
									
										
										
										
											2011-06-12 17:07:59 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  |   def dump_formula_report key, title | 
					
						
							|  |  |  |     formula = select_formula(key) | 
					
						
							|  |  |  |     unless formula.empty? | 
					
						
							|  |  |  |       ohai title | 
					
						
							|  |  |  |       puts_columns formula | 
					
						
							| 
									
										
										
										
											2009-09-11 20:58:41 +02:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2009-09-11 20:09:39 +02:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2012-03-06 02:23:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-17 18:40:21 +01:00
										 |  |  | end |