| #!/bin/bash |
| # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # A convenience script to largely replicate the behavior of `gclient sync` in a |
| # submodule-based checkout. Fetches latest commits for top-level solutions; |
| # updates submodules; and runs post-sync hooks. |
| |
| orig_args="$@" |
| ECHO= |
| pull=pull |
| pull_args= |
| hooks=yes |
| j=10 |
| crup_runner="crup-runner.sh" |
| |
| usage() { |
| cat <<EOF |
| Usage: git-crup [-n|--dry-run] [--fetch|--sync] [-j|--jobs [jobs]] |
| [--no-hooks] [<args to git-pull or git-fetch>] |
| |
| -n, --dry-run Don't do anything; just show what would have been done. |
| --fetch Run 'git fetch' on top-level sources, but don't merge. |
| --sync Don't do anything at all to the top-level sources. |
| -j, --jobs Run this many jobs in parallel. |
| --no-hooks Don't run hooks (e.g., to generate build files) after |
| updating. |
| EOF |
| } |
| |
| serial_update() { |
| ( cd "$1" |
| if test -n "$toplevel_cmd"; then |
| $ECHO $toplevel_cmd | sed "s/^/[$1] /g" |
| if [ $? -ne 0 ]; then |
| return $? |
| fi |
| fi |
| $ECHO git submodule --quiet sync |
| $ECHO git ls-files -s | grep ^160000 | awk '{print $4}' | |
| while read submod; do |
| $ECHO "$crup_runner" "$1/$submod" |
| done |
| ) |
| } |
| |
| while test $# -ne 0; do |
| case "$1" in |
| -j[0-9]*) |
| j=$(echo "$1" | cut -c3-) |
| ;; |
| --jobs=[0-9]*) |
| j=$(echo "$1" | cut -c8-) |
| ;; |
| -j|--jobs) |
| case "$2" in |
| ''|-*) |
| j=0 |
| ;; |
| *) |
| j="$2" |
| shift |
| ;; |
| esac |
| ;; |
| -n|--dry-run) |
| ECHO=echo |
| ;; |
| -h|--help) |
| usage |
| exit 0 |
| ;; |
| --fetch) |
| pull=fetch |
| ;; |
| --sync) |
| pull= |
| ;; |
| --no-hooks|--nohooks) |
| hooks=no |
| ;; |
| *) |
| pull_args="$pull_args $1" |
| break |
| ;; |
| esac |
| shift |
| done |
| |
| # Auto-update depot_tools. |
| if [ -z "$GIT_CRUP_REINVOKE" ]; then |
| kernel_name="\$(uname -s)" |
| if [ "\${kernel_name:0:5}" = "MINGW" ]; then |
| cmd '/C update_depot_tools.bat' |
| else |
| update_depot_tools |
| fi |
| GIT_CRUP_REINVOKE=1 exec bash "$0" $orig_args |
| fi |
| |
| while test "$PWD" != "/"; do |
| if test -f "$PWD/src/.gitmodules"; then |
| break |
| fi |
| cd .. |
| done |
| if test "$PWD" = "/"; then |
| echo "Could not find the root of your checkout; aborting." 1>&2 |
| exit 1 |
| fi |
| |
| export GIT_MERGE_AUTOEDIT=no |
| |
| if ( echo test | xargs --max-lines=1 true 2>/dev/null ); then |
| max_lines="--max-lines=1" |
| else |
| max_lines="-L 1" |
| fi |
| |
| if ( echo test | xargs -I bar true 2>/dev/null ); then |
| replace_arg="-I replace_arg" |
| else |
| replace_arg="-ireplace_arg" |
| fi |
| |
| if ( echo test test | xargs -P 2 true 2>/dev/null ); then |
| xargs_parallel=yes |
| else |
| if test "$j" != "1"; then |
| echo "Warning: parallel execution is not supported on this platform." 1>&2 |
| fi |
| xargs_parallel=no |
| fi |
| |
| if test -n "$pull"; then |
| toplevel_cmd="git $pull $pull_args -q origin" |
| else |
| toplevel_cmd= |
| fi |
| |
| set -o pipefail |
| if test "$xargs_parallel" = "yes"; then |
| ( ls -d */.git | sed 's/\/\.git$//' | |
| xargs $max_lines $replace_arg -P "$j" \ |
| "$crup_runner" replace_arg $ECHO $toplevel_cmd | |
| xargs $max_lines -P "$j" $ECHO "$crup_runner" ) |
| else |
| ls -d */.git | |
| while read gitdir; do |
| serial_update "${gitdir%%/.git}" |
| done |
| fi |
| |
| status=$? |
| |
| if [ "$status" -ne 0 ]; then |
| cat 1>&2 <<EOF |
| Please check the preceding terminal output for error messages. |
| Run 'git submodule status' to see the current state of submodule checkouts. |
| EOF |
| exit $status |
| fi |
| |
| if [ "$hooks" = "yes" ]; then |
| $ECHO git runhooks |
| status=$? |
| fi |
| |
| echo |
| exit $status |