#!/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. j=10 ECHO= pull=pull pull_args= hooks=yes if ( echo test | xargs --max-lines=1 true 2>/dev/null ); then max_lines="--max-lines=1" else max_lines="-L 1" fi usage() { cat <&2 Usage: git-crup [-n|--dry-run] [--fetch] [-j|--jobs [jobs]] [--no-hooks] [] EOF } parallel_update() { ( echo Entering "$1" cd "$1" $ECHO git $pull $pull_args origin $ECHO git submodule sync if test "$xargs_parallel" = "yes"; then git ls-files -s | grep ^160000 | awk '{print $4}' | xargs $max_lines -P "$j" $ECHO git submodule update --init else $ECHO git submodule update --init fi ) } 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 ;; --no-hooks) hooks=no ;; *) pull_args="$pull_args $1" break ;; esac shift done 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 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 ls -d */.git | while read gitdir; do parallel_update `dirname $gitdir` done gclient_spec="solutions=[{'name':'src','url':None,'deps_file':'.DEPS.git'}]" test "$hooks" = "yes" && gclient runhooks --spec="$gclient_spec"