diff --git a/Library/Homebrew/refresh_brew.rb b/Library/Homebrew/refresh_brew.rb new file mode 100644 index 0000000000000000000000000000000000000000..753036ed5560c18cb033ed75d950bb3922e193a2 --- /dev/null +++ b/Library/Homebrew/refresh_brew.rb @@ -0,0 +1,36 @@ +class RefreshBrew + UPDATE_COMMAND = 'git pull origin masterbrew' + REVISION_COMMAND = 'git log -l -1 --pretty=format:%H' + GIT_UP_TO_DATE = 'Already up-to-date.' + UPDATED_FORMULA = %r{^\s+Library/Formula/(.+?)\.rb\s} + + attr_reader :updated_formulae + + def initialize + @updated_formulae = [] + end + + # Performs an update of the homebrew source. Returns +true+ if a newer + # version was availble, +false+ if already up-to-date. + def update_from_masterbrew! + output = git_pull! + output.split("\n").each do |line| + @updated_formulae << $1 if line =~ UPDATED_FORMULA + end + output.strip != GIT_UP_TO_DATE + end + + def pending_formulae_changes? + !@updated_formulae.empty? + end + + def current_revision + `#{REVISION_COMMAND}`.strip + end + + private + + def git_pull! + Dir.chdir(HOMEBREW_PREFIX) { `#{UPDATE_COMMAND}` } + end +end \ No newline at end of file diff --git a/Library/Homebrew/unittest.rb b/Library/Homebrew/unittest.rb index 8d5f1b76f9b649e36c8b18d28323dfb3464bedf0..bc1cc6937c7deaa3e5a27122f704dfe428568a78 100755 --- a/Library/Homebrew/unittest.rb +++ b/Library/Homebrew/unittest.rb @@ -13,10 +13,11 @@ require 'keg' require 'utils' require 'brew.h' require 'hardware.rb' +require 'refresh_brew' # these are defined in global.rb, but we don't want to break our actual # homebrew tree, and we do want to test everything :) -HOMEBREW_PREFIX=Pathname.new '/tmp/testbrew/prefix' +HOMEBREW_PREFIX=Pathname.new '/private/tmp/testbrew/prefix' HOMEBREW_CACHE=HOMEBREW_PREFIX.parent+"cache" HOMEBREW_CELLAR=HOMEBREW_PREFIX.parent+"cellar" HOMEBREW_USER_AGENT="Homebrew" @@ -82,6 +83,20 @@ class TestScriptFileFormula <ScriptFileFormula end end +class RefreshBrewMock < RefreshBrew + def in_prefix_expect(expect, returns) + @expect, @returns = expect, returns + end + + def `(cmd) + if Dir.pwd == HOMEBREW_PREFIX.to_s and cmd == @expect + @returns + else + raise "<#{inspect}> Called backticks in pwd `#{HOMEBREW_PREFIX}' and command `#{cmd}'" + end + end +end + def nostdout if ARGV.include? '-V' yield @@ -485,4 +500,111 @@ class BeerTasting <Test::Unit::TestCase f=MockFormula.new 'http://ftp.mozilla.org/pub/mozilla.org/js/js-1.8.0-rc1.tar.gz' assert_equal '1.8.0-rc1', f.version end + + def test_updater_update_homebrew_without_any_changes + updater = RefreshBrewMock.new + updater.in_prefix_expect("git pull origin masterbrew", "Already up-to-date.\n") + + assert_equal false, updater.update_from_masterbrew! + assert updater.updated_formulae.empty? + end + + def test_updater_update_homebrew_without_formulae_changes + updater = RefreshBrewMock.new + output = fixture('update_git_pull_output_without_formulae_changes') + updater.in_prefix_expect("git pull origin masterbrew", output) + + assert_equal true, updater.update_from_masterbrew! + assert !updater.pending_formulae_changes? + assert updater.updated_formulae.empty? + end + + def test_updater_update_homebrew_with_formulae_changes + updater = RefreshBrewMock.new + output = fixture('update_git_pull_output_with_formulae_changes') + updater.in_prefix_expect("git pull origin masterbrew", output) + + assert_equal true, updater.update_from_masterbrew! + assert updater.pending_formulae_changes? + assert_equal %w{ antiword bash-completion xar yajl }, updater.updated_formulae + end + + def test_updater_returns_current_revision + updater = RefreshBrewMock.new + updater.in_prefix_expect('git log -l -1 --pretty=format:%H', 'the-revision-hash') + assert_equal 'the-revision-hash', updater.current_revision + end + + private + + def fixture(name) + self.class.fixture_data[name] + end + + def self.fixture_data + unless @fixture_data + require 'yaml' + @fixture_data = YAML.load(DATA) + end + @fixture_data + end end + +__END__ +update_git_pull_output_without_formulae_changes: | + remote: Counting objects: 58, done. + remote: Compressing objects: 100% (35/35), done. + remote: Total 39 (delta 20), reused 0 (delta 0) + Unpacking objects: 100% (39/39), done. + From git://github.com/mxcl/homebrew + * branch masterbrew -> FETCH_HEAD + Updating 14ef7f9..f414bc8 + Fast forward + Library/Homebrew/ARGV+yeast.rb | 35 ++-- + Library/Homebrew/beer_events.rb | 181 +++++++++++++ + Library/Homebrew/hardware.rb | 71 ++++++ + Library/Homebrew/hw.model.c | 17 -- + README | 337 +++++++++++++------------ + bin/brew | 137 ++++++++--- + 40 files changed, 1107 insertions(+), 426 deletions(-) + create mode 100644 Library/Homebrew/beer_events.rb + create mode 100644 Library/Homebrew/hardware.rb + delete mode 100644 Library/Homebrew/hw.model.c + delete mode 100644 Library/Homebrew/hw.model.rb +update_git_pull_output_with_formulae_changes: | + remote: Counting objects: 58, done. + remote: Compressing objects: 100% (35/35), done. + remote: Total 39 (delta 20), reused 0 (delta 0) + Unpacking objects: 100% (39/39), done. + From git://github.com/mxcl/homebrew + * branch masterbrew -> FETCH_HEAD + Updating 14ef7f9..f414bc8 + Fast forward + Library/Contributions/brew_bash_completion.sh | 6 +- + Library/Formula/antiword.rb | 13 + + Library/Formula/bash-completion.rb | 25 ++ + Library/Formula/xar.rb | 19 ++ + Library/Formula/yajl.rb | 2 +- + Library/Homebrew/ARGV+yeast.rb | 35 ++-- + Library/Homebrew/beer_events.rb | 181 +++++++++++++ + Library/Homebrew/hardware.rb | 71 ++++++ + Library/Homebrew/hw.model.c | 17 -- + Library/Homebrew/pathname+yeast.rb | 28 ++- + Library/Homebrew/unittest.rb | 106 ++++++++- + Library/Homebrew/utils.rb | 36 ++- + README | 337 +++++++++++++------------ + bin/brew | 137 ++++++++--- + 40 files changed, 1107 insertions(+), 426 deletions(-) + create mode 100644 Library/Formula/antiword.rb + create mode 100644 Library/Formula/bash-completion.rb + create mode 100644 Library/Formula/ddrescue.rb + create mode 100644 Library/Formula/dict.rb + create mode 100644 Library/Formula/lua.rb + delete mode 100644 Library/Formula/antiword.rb + delete mode 100644 Library/Formula/bash-completion.rb + delete mode 100644 Library/Formula/xar.rb + delete mode 100644 Library/Formula/yajl.rb + create mode 100644 Library/Homebrew/beer_events.rb + create mode 100644 Library/Homebrew/hardware.rb + delete mode 100644 Library/Homebrew/hw.model.c + delete mode 100644 Library/Homebrew/hw.model.rb \ No newline at end of file diff --git a/bin/brew b/bin/brew index bd57b7103c80fdf2e799a49ea21f0dfa33cdc963..79ac11520564e6e7f6b4cf06fb6ea244ee05b969 100755 --- a/bin/brew +++ b/bin/brew @@ -110,6 +110,17 @@ begin end + when 'up', 'update' + require 'refresh_brew' + updater = RefreshBrew.new + unless updater.update_from_masterbrew! + ohai "Already up-to-date." + else + ohai "Updated Homebrew to: #{updater.current_revision}" + ohai "No formulae were updated." unless updater.pending_formulae_changes? + ohai "The following formulae were updated: #{updater.updated_formulae.join(', ')}" + end + when 'ln', 'link' ARGV.kegs.each {|keg| puts "#{keg.link} links created for #{keg}"}