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
|
|
|
|
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)
|
|
|
|
|
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
|
2013-03-15 09:50:38 -04:00
|
|
|
puts_columns formula.uniq
|
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
|