#!/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 <] -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 <