From e5599b1f44499eb9a7f6ed0defbf85684a37baa2 Mon Sep 17 00:00:00 2001 From: "szager@chromium.org" Date: Fri, 28 Dec 2012 23:14:18 +0000 Subject: [PATCH] Another round of refactoring and optimizing. Call update_depot_tools and re-invoke from git-crup, to get latest updates. Move more of the target os functionality into git-crup.sh, so there's no longer a need for a first-checkout script. `git submodule sync` is horribly slow on windows. Replicate the functionality (but faster) in git-crup.sh. TBR=mmoss@chromium.org,cmp@chromium.org Review URL: https://codereview.chromium.org/11709003 git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@174747 0039d316-1c4b-4281-b951-d872f2087c98 --- crup-runner.sh | 85 +++++++++++++++++++++++++++++++++++++------------- git-crup | 6 ++++ 2 files changed, 69 insertions(+), 22 deletions(-) diff --git a/crup-runner.sh b/crup-runner.sh index 97e79ce45..987dcc293 100755 --- a/crup-runner.sh +++ b/crup-runner.sh @@ -1,5 +1,60 @@ #!/bin/bash +set_target_os () { + # Get the os we're building for. On first run, this will be unset. + target_os=$(git config target.os 2>/dev/null) + if [ -z "$target_os" ]; then + case $(uname -s) in + Linux) target_os=unix ;; + Darwin) target_os=mac ;; + CYGWIN*|MINGW*) target_os=win ;; + *) + echo "[$solution] *** No target.os set in .git/config, and I can't" 1>&2 + echo "[$solution] *** figure it out from 'uname -s'" 1>&2 + exit 1 + ;; + esac + git config target.os "$target_os" + fi +} + +update_submodule_url () { + # If the submodule's URL in .gitmodules has changed, propagate the new + # new URL down. This is the same as `git submodule sync`, but we do it + # this way because `git submodule sync` is absurdly slow. + new_url=$(git config -f .gitmodules "submodule.$1.url" 2>/dev/null) + old_url=$(git config "submodule.$1.url" 2>/dev/null) + if [ -n "$old_url" -a "$new_url" != "$old_url" ]; then + git config "submodule.$1.url" "$new_url" + if [ -e "$1"/.git ]; then + ( cd $submod && git config remote.origin.url "$new_url" ) + fi + fi +} + +process_submodule () { + # Check whether this submodule should be ignored or updated. + # If it's a new submodule, match the os specified in .gitmodules against + # the os specified in .git/config. + update_policy=$(git config --get "submodule.$1.update") + if [ -z "$update_policy" ]; then + submod_os=$(git config -f .gitmodules --get "submodule.$1.os") + if [ -n "$submod_os" -a \ + "$submod_os" != "all" -a \ + "${submod_os/${target_os}/}" = "${submod_os}" ]; then + update_policy=none + else + git submodule --quiet init "$1" + update_policy=checkout + fi + git config "submodule.$1.update" $update_policy + fi + if [ "$update_policy" != "none" ]; then + update_submodule_url "$1" + echo "$solution/$1" + fi +} + if [ -z "$*" ]; then exit 0 fi @@ -7,9 +62,10 @@ set -o pipefail dir="$1" solution="${1%%/*}" cd "$solution" + if [ "$solution" = "$1" ]; then - shift # Don't "pull" if checkout is not on a named branch + shift if test "$2" = "pull" && ( ! git symbolic-ref HEAD >/dev/null 2>/dev/null ); then first_args="$1 fetch" else @@ -20,33 +76,18 @@ if [ "$solution" = "$1" ]; then if [ $? -ne 0 ]; then exit $? fi - "$GIT_EXE" submodule --quiet sync + + set_target_os + "$GIT_EXE" ls-files -s | grep ^160000 | awk '{print $4}' | while read submod; do - # Check whether this submodule should be ignored or updated. - # If it's a new submodule, match the os specified in .gitmodules against - # the os specified in .git/config. - update_policy=$(git config "submodule.$submod.update" 2>/dev/null) - if [ -z "$update_policy" ]; then - target_os=$(git config target.os 2>/dev/null) - submod_os=$(git config -f .gitmodules "submodule.$submod.os" 2>/dev/null) - if [ -n "$target_os" -a -n "$submod_os" ] && - [ "$submod_os" != "all" -a "$submod_os" != "$target_os" ]; then - update_policy=none - else - update_policy=checkout - fi - git config "submodule.$submod.update" $update_policy 2>/dev/null - fi - if [ "$update_policy" != "none" ]; then - echo "$solution/$submod" - fi + process_submodule "$submod" done status=$? else submodule="${1#*/}" - echo "[$solution] updating $submodule ..." - "$GIT_EXE" submodule update --quiet --init "$submodule" | + echo "[$solution] updating $submodule" + "$GIT_EXE" submodule update --quiet "$submodule" | ( grep -v '^Skipping submodule' || true ) | sed "s|^|[$1] |g" status=$? if [ "$status" -ne "0" ]; then diff --git a/git-crup b/git-crup index 8633aa20d..6f7f533fc 100755 --- a/git-crup +++ b/git-crup @@ -7,6 +7,12 @@ # submodule-based checkout. Fetches latest commits for top-level solutions; # updates submodules; and runs post-sync hooks. +# Auto-update depot_tools +if [ -z "$GIT_CRUP_REINVOKE" ]; then + update_depot_tools || exit 1 + GIT_CRUP_REINVOKE=1 exec bash "$0" "$@" +fi + export GIT_MERGE_AUTOEDIT=0 ECHO=