aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike McQuaid2016-08-10 09:33:47 +0100
committerMike McQuaid2016-08-10 15:37:04 +0100
commit11116c2467710c9b3df37164dce2bb012a205d33 (patch)
tree67e74f57d98335b97d324a13d0a148e8572d0fec
parent33912e218e0d12e545a7319d72215e4bddc194f5 (diff)
downloadbrew-11116c2467710c9b3df37164dce2bb012a205d33.tar.bz2
update.sh: further speed up `brew update`.
Tweak the logic further to make the no-op case even faster. Before: ``` brew update 1.10s user 1.05s system 92% cpu 2.325 total brew update --preinstall 0.60s user 0.77s system 96% cpu 1.433 total ``` After: ``` brew update 0.60s user 0.34s system 83% cpu 1.132 total brew update --preinstall 0.29s user 0.24s system 62% cpu 0.860 total ``` These times are now fast enough to avoid any further special-casing for `--preinstall`, roll it out to users by default and not print a message unless we've actually found some updates.
-rw-r--r--Library/Homebrew/cmd/update.sh113
1 files changed, 74 insertions, 39 deletions
diff --git a/Library/Homebrew/cmd/update.sh b/Library/Homebrew/cmd/update.sh
index 4121078e1..2e40d1d42 100644
--- a/Library/Homebrew/cmd/update.sh
+++ b/Library/Homebrew/cmd/update.sh
@@ -166,7 +166,35 @@ reset_on_interrupt() {
exit 130
}
-pull() {
+# Used for testing purposes, e.g., for testing formula migration after
+# renaming it in the currently checked-out branch. To test run
+# "brew update --simulate-from-current-branch"
+simulate_from_current_branch() {
+ local DIR
+ local TAP_VAR
+ local UPSTREAM_BRANCH
+ local CURRENT_REVISION
+
+ DIR="$1"
+ cd "$DIR" || return
+ TAP_VAR="$2"
+ UPSTREAM_BRANCH="$3"
+ CURRENT_REVISION="$4"
+
+ INITIAL_REVISION="$(git rev-parse -q --verify "$UPSTREAM_BRANCH")"
+ export HOMEBREW_UPDATE_BEFORE"$TAP_VAR"="$INITIAL_REVISION"
+ export HOMEBREW_UPDATE_AFTER"$TAP_VAR"="$CURRENT_REVISION"
+ if [[ "$INITIAL_REVISION" != "$CURRENT_REVISION" ]]
+ then
+ HOMEBREW_UPDATED="1"
+ fi
+ if ! git merge-base --is-ancestor "$INITIAL_REVISION" "$CURRENT_REVISION"
+ then
+ odie "Your $DIR HEAD is not a descendant of $UPSTREAM_BRANCH!"
+ fi
+}
+
+merge_or_rebase() {
if [[ -n "$HOMEBREW_VERBOSE" ]]
then
echo "Updating $DIR..."
@@ -174,38 +202,14 @@ pull() {
local DIR
local TAP_VAR
+ local UPSTREAM_BRANCH
DIR="$1"
cd "$DIR" || return
- TAP_VAR=$(repo_var "$DIR")
+ TAP_VAR="$2"
+ UPSTREAM_BRANCH="$3"
unset STASHED
- # The upstream repository's default branch may not be master;
- # check refs/remotes/origin/HEAD to see what the default
- # origin branch name is, and use that. If not set, fall back to "master".
- INITIAL_BRANCH="$(git symbolic-ref --short HEAD 2>/dev/null)"
- UPSTREAM_BRANCH="$(upstream_branch)"
-
- # Used for testing purposes, e.g., for testing formula migration after
- # renaming it in the currently checked-out branch. To test run
- # "brew update --simulate-from-current-branch"
- if [[ -n "$HOMEBREW_SIMULATE_FROM_CURRENT_BRANCH" ]]
- then
- INITIAL_REVISION="$(git rev-parse -q --verify "$UPSTREAM_BRANCH")"
- CURRENT_REVISION="$(read_current_revision)"
- export HOMEBREW_UPDATE_BEFORE"$TAP_VAR"="$INITIAL_REVISION"
- export HOMEBREW_UPDATE_AFTER"$TAP_VAR"="$CURRENT_REVISION"
- if [[ "$INITIAL_REVISION" != "$CURRENT_REVISION" ]]
- then
- HOMEBREW_UPDATED="1"
- fi
- if ! git merge-base --is-ancestor "$INITIAL_REVISION" "$CURRENT_REVISION"
- then
- odie "Your $DIR HEAD is not a descendant of $UPSTREAM_BRANCH!"
- fi
- return
- fi
-
trap reset_on_interrupt SIGINT
if [[ -n "$(git status --untracked-files=all --porcelain 2>/dev/null)" ]]
@@ -223,6 +227,7 @@ pull() {
STASHED="1"
fi
+ INITIAL_BRANCH="$(git symbolic-ref --short HEAD 2>/dev/null)"
if [[ "$INITIAL_BRANCH" != "$UPSTREAM_BRANCH" && -n "$INITIAL_BRANCH" ]]
then
# Recreate and check out `#{upstream_branch}` if unable to fast-forward
@@ -329,11 +334,6 @@ user account:
EOS
fi
- if [[ -n "$HOMEBREW_UPDATE_PREINSTALL" ]]
- then
- echo "Checking for Homebrew updates..."
- fi
-
if ! git --version >/dev/null 2>&1
then
# we cannot install brewed git if homebrew/core is unavailable.
@@ -378,19 +378,34 @@ EOS
for DIR in "$HOMEBREW_REPOSITORY" "$HOMEBREW_LIBRARY"/Taps/*/*
do
[[ -d "$DIR/.git" ]] || continue
+ cd "$DIR" || continue
+
+ TAP_VAR="$(repo_var "$DIR")"
+ declare PREFETCH_REVISION"$TAP_VAR"="$(read_current_revision)"
+
[[ -n "$SKIP_FETCH_BREW_REPOSITORY" && "$DIR" = "$HOMEBREW_REPOSITORY" ]] && continue
[[ -n "$SKIP_FETCH_CORE_REPOSITORY" && "$DIR" = "$HOMEBREW_LIBRARY/Taps/homebrew/homebrew-core" ]] && continue
- cd "$DIR" || continue
+
+ # The upstream repository's default branch may not be master;
+ # check refs/remotes/origin/HEAD to see what the default
+ # origin branch name is, and use that. If not set, fall back to "master".
UPSTREAM_BRANCH="$(upstream_branch)"
+ declare UPSTREAM_BRANCH"$TAP_VAR"="$UPSTREAM_BRANCH"
+
# the refspec ensures that the default upstream branch gets updated
(
if [[ -n "$HOMEBREW_UPDATE_PREINSTALL" ]]
then
# Skip taps checked/fetched recently
- [[ -n "$(find "$DIR/.git/FETCH_HEAD" -type f -mmin -1 2>/dev/null)" ]] && exit
- # Skip taps without formulae.
- FORMULAE="$(find "$DIR" -maxdepth 1 \( -name "*.rb" -or -name Formula -or -name HomebrewFormula \) -print -quit)"
- [[ -z "$FORMULAE" ]] && exit
+ [[ -n "$(find "$DIR/.git/FETCH_HEAD" -type f -mtime -60s 2>/dev/null)" ]] && exit
+
+ # Skip taps without formulae (but always update Homebrew/brew and Homebrew/homebrew-core)
+ if [[ "$DIR" != "$HOMEBREW_REPOSITORY" &&
+ "$DIR" != "$HOMEBREW_LIBRARY/Taps/homebrew/homebrew-core" ]]
+ then
+ FORMULAE="$(find "$DIR" -maxdepth 1 \( -name "*.rb" -or -name Formula -or -name HomebrewFormula \) -print -quit)"
+ [[ -z "$FORMULAE" ]] && exit
+ fi
fi
UPSTREAM_REPOSITORY_URL="$(git config remote.origin.url)"
@@ -448,7 +463,27 @@ EOS
for DIR in "$HOMEBREW_REPOSITORY" "$HOMEBREW_LIBRARY"/Taps/*/*
do
[[ -d "$DIR/.git" ]] || continue
- pull "$DIR"
+ cd "$DIR" || continue
+
+ TAP_VAR="$(repo_var "$DIR")"
+ UPSTREAM_BRANCH_VAR="UPSTREAM_BRANCH$TAP_VAR"
+ UPSTREAM_BRANCH="${!UPSTREAM_BRANCH_VAR}"
+ CURRENT_REVISION="$(read_current_revision)"
+
+ PREFETCH_REVISION_VAR="PREFETCH_REVISION$TAP_VAR"
+ PREFETCH_REVISION="${!PREFETCH_REVISION_VAR}"
+
+ if [[ -n "$HOMEBREW_SIMULATE_FROM_CURRENT_BRANCH" ]]
+ then
+ simulate_from_current_branch "$DIR" "$TAP_VAR" "$UPSTREAM_BRANCH" "$CURRENT_REVISION"
+ elif [[ "$PREFETCH_REVISION" = "$CURRENT_REVISION" ]]
+ then
+ export HOMEBREW_UPDATE_BEFORE"$TAP_VAR"="$CURRENT_REVISION"
+ export HOMEBREW_UPDATE_AFTER"$TAP_VAR"="$CURRENT_REVISION"
+ else
+ merge_or_rebase "$DIR" "$TAP_VAR" "$UPSTREAM_BRANCH"
+ fi
+
[[ -n "$HOMEBREW_VERBOSE" ]] && echo
done