diff options
Diffstat (limited to 'Library/Homebrew/cmd/update.rb')
| -rw-r--r-- | Library/Homebrew/cmd/update.rb | 159 | 
1 files changed, 159 insertions, 0 deletions
| diff --git a/Library/Homebrew/cmd/update.rb b/Library/Homebrew/cmd/update.rb new file mode 100644 index 000000000..32f144c8e --- /dev/null +++ b/Library/Homebrew/cmd/update.rb @@ -0,0 +1,159 @@ +module Homebrew extend self +  def update +    abort "Please `brew install git' first." unless system "/usr/bin/which -s git" + +    updater = RefreshBrew.new +    if updater.update_from_masterbrew! +      updater.report +    else +      puts "Already up-to-date." +    end +  end +end + +class RefreshBrew +  REPOSITORY_URL   = "http://github.com/mxcl/homebrew.git" +  INIT_COMMAND     = "git init" +  CHECKOUT_COMMAND = "git checkout -q master" +  UPDATE_COMMAND   = "git pull #{REPOSITORY_URL} master" +  REVISION_COMMAND = "git log -l -1 --pretty=format:%H 2> /dev/null" +  GIT_UP_TO_DATE   = "Already up-to-date." + +  formula_regexp   = 'Library/Formula/(.+?)\.rb' +  ADDED_FORMULA    = %r{^\s+create mode \d+ #{formula_regexp}$} +  UPDATED_FORMULA  = %r{^\s+#{formula_regexp}\s} +  DELETED_FORMULA  = %r{^\s+delete mode \d+ #{formula_regexp}$} + +  example_regexp   = 'Library/Contributions/examples/([^.\s]+).*' +  ADDED_EXAMPLE    = %r{^\s+create mode \d+ #{example_regexp}$} +  UPDATED_EXAMPLE  = %r{^\s+#{example_regexp}} +  DELETED_EXAMPLE  = %r{^\s+delete mode \d+ #{example_regexp}$} + +  attr_reader :added_formulae, :updated_formulae, :deleted_formulae, :initial_revision +  attr_reader :added_examples, :updated_examples, :deleted_examples + +  def initialize +    @added_formulae, @updated_formulae, @deleted_formulae = [], [], [] +    @added_examples, @updated_examples, @deleted_examples = [], [], [] +    @initial_revision = self.current_revision +  end + +  # Performs an update of the homebrew source. Returns +true+ if a newer +  # version was available, +false+ if already up-to-date. +  def update_from_masterbrew! +    output = '' +    HOMEBREW_REPOSITORY.cd do +      if File.directory? '.git' +        safe_system CHECKOUT_COMMAND +      else +        safe_system INIT_COMMAND +      end +      output = execute(UPDATE_COMMAND) +    end + +    output.split("\n").reverse.each do |line| +      case line +      when ADDED_FORMULA +        @added_formulae << $1 +      when DELETED_FORMULA +        @deleted_formulae << $1 +      when UPDATED_FORMULA +        @updated_formulae << $1 unless @added_formulae.include?($1) or @deleted_formulae.include?($1) +      when ADDED_EXAMPLE +        @added_examples << $1 +      when DELETED_EXAMPLE +        @deleted_examples << $1 +      when UPDATED_EXAMPLE +        @updated_examples << $1 unless @added_examples.include?($1) or @deleted_examples.include?($1) +      end +    end +    @added_formulae.sort! +    @updated_formulae.sort! +    @deleted_formulae.sort! +    @added_examples.sort! +    @updated_examples.sort! +    @deleted_examples.sort! + +    output.strip != GIT_UP_TO_DATE +  end + +  def pending_formulae_changes? +    !@updated_formulae.empty? +  end + +  def pending_new_formulae? +    !@added_formulae.empty? +  end + +  def deleted_formulae? +    !@deleted_formulae.empty? +  end + +  def pending_examples_changes? +    !@updated_examples.empty? +  end + +  def pending_new_examples? +    !@added_examples.empty? +  end + +  def deleted_examples? +    !@deleted_examples.empty? +  end + +  def current_revision +    HOMEBREW_REPOSITORY.cd { execute(REVISION_COMMAND).strip } +  rescue +    'TAIL' +  end + +  def report +    puts "Updated Homebrew from #{initial_revision[0,8]} to #{current_revision[0,8]}." +    ## New Formulae +    if pending_new_formulae? +      ohai "The following formulae are new:" +      puts_columns added_formulae +    end +    ## Deleted Formulae +    if deleted_formulae? +      ohai "The following formulae were removed:" +      puts_columns deleted_formulae +    end +    ## Updated Formulae +    if pending_formulae_changes? +      ohai "The following formulae were updated:" +      puts_columns updated_formulae +    else +      puts "No formulae were updated." +    end +    ## New examples +    if pending_new_examples? +      ohai "The following external commands are new:" +      puts_columns added_examples +    end +    ## Deleted examples +    if deleted_examples? +      ohai "The following external commands were removed:" +      puts_columns deleted_examples +    end +    ## Updated Formulae +    if pending_examples_changes? +      ohai "The following external commands were updated:" +      puts_columns updated_examples +    else +      puts "No external commands were updated." +    end +  end + +  private + +  def execute(cmd) +    out = `#{cmd}` +    if $? && !$?.success? +      puts out +      raise "Failed while executing #{cmd}" +    end +    ohai(cmd, out) if ARGV.verbose? +    out +  end +end | 
