diagnostic: speed up check for outdated Homebrew

Determine the age of the local `HEAD` first and only if it is older than
24 hours proceed with the much more expensive `git ls-remote` to check
if there are any new upstream commits (there usually will be).

This keeps the overall logic unaltered, but significantly speeds up the
check for users that have recently updated (still slow for all others).

Closes Homebrew/homebrew#48499.

Signed-off-by: Martin Afanasjew <martin@afanasjew.de>
This commit is contained in:
Martin Afanasjew 2016-01-27 00:46:31 +01:00
parent 2e2d2ab6ab
commit 4cc8d3ed8b

View File

@ -1226,28 +1226,27 @@ module Homebrew
def check_for_outdated_homebrew def check_for_outdated_homebrew
return unless Utils.git_available? return unless Utils.git_available?
HOMEBREW_REPOSITORY.cd do
if File.directory? ".git" timestamp = if File.directory?("#{HOMEBREW_REPOSITORY}/.git")
HOMEBREW_REPOSITORY.cd { `git log -1 --format="%ct" HEAD`.to_i }
else
HOMEBREW_LIBRARY.mtime.to_i
end
return if Time.now.to_i - timestamp <= 60 * 60 * 24 # 24 hours
if File.directory?("#{HOMEBREW_REPOSITORY}/.git")
HOMEBREW_REPOSITORY.cd do
local = `git rev-parse -q --verify refs/remotes/origin/master`.chomp local = `git rev-parse -q --verify refs/remotes/origin/master`.chomp
remote = /^([a-f0-9]{40})/.match(`git ls-remote origin refs/heads/master 2>/dev/null`) remote = /^([a-f0-9]{40})/.match(`git ls-remote origin refs/heads/master 2>/dev/null`)
if remote.nil? || local == remote[0] return if remote.nil? || local == remote[0]
return
end
end end
end
timestamp = if File.directory? ".git" <<-EOS.undent
`git log -1 --format="%ct" HEAD`.to_i
else
HOMEBREW_LIBRARY.mtime.to_i
end
if Time.now.to_i - timestamp > 60 * 60 * 24 then <<-EOS.undent
Your Homebrew is outdated. Your Homebrew is outdated.
You haven't updated for at least 24 hours. This is a long time in brewland! You haven't updated for at least 24 hours. This is a long time in brewland!
To update Homebrew, run `brew update`. To update Homebrew, run `brew update`.
EOS EOS
end
end
end end
def check_for_unlinked_but_not_keg_only def check_for_unlinked_but_not_keg_only