X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=git-fetch.sh;h=6d3a3468b3f22d8eeb1a2ba568a6c8ed48606dbd;hb=cfabd6eee1745cfec58cfcb794ce8847e43b888a;hp=93349330d45ad43c5c7e146a942d76b78c0e2ee9;hpb=2603fa5fb358ee7834bc9e1a2e391f69d8fce815;p=git.git diff --git a/git-fetch.sh b/git-fetch.sh index 93349330d..6d3a3468b 100755 --- a/git-fetch.sh +++ b/git-fetch.sh @@ -26,6 +26,7 @@ keep= shallow_depth= no_progress= test -t 1 || no_progress=--no-progress +quiet= while case "$#" in 0) break ;; esac do case "$1" in @@ -56,8 +57,11 @@ do --update-head-o|--update-head-ok) update_head_ok=t ;; + -q|--q|--qu|--qui|--quie|--quiet) + quiet=--quiet + ;; -v|--verbose) - verbose=Yes + verbose="$verbose"Yes ;; -k|--k|--ke|--kee|--keep) keep='-k -k' @@ -173,9 +177,40 @@ fetch_all_at_once () { git-bundle unbundle "$remote" $rref || echo failed "$remote" else - git-fetch-pack --thin $exec $keep $shallow_depth $no_progress \ - "$remote" $rref || - echo failed "$remote" + if test -d "$remote" && + + # The remote might be our alternate. With + # this optimization we will bypass fetch-pack + # altogether, which means we cannot be doing + # the shallow stuff at all. + test ! -f "$GIT_DIR/shallow" && + test -z "$shallow_depth" && + + # See if all of what we are going to fetch are + # connected to our repository's tips, in which + # case we do not have to do any fetch. + theirs=$(echo "$ls_remote_result" | \ + git-fetch--tool -s pick-rref "$rref" "-") && + + # This will barf when $theirs reach an object that + # we do not have in our repository. Otherwise, + # we already have everything the fetch would bring in. + git-rev-list --objects $theirs --not --all \ + >/dev/null 2>/dev/null + then + echo "$ls_remote_result" | \ + git-fetch--tool pick-rref "$rref" "-" + else + flags= + case $verbose in + YesYes*) + flags="-v" + ;; + esac + git-fetch-pack --thin $exec $keep $shallow_depth \ + $quiet $no_progress $flags "$remote" $rref || + echo failed "$remote" + fi fi ) | ( @@ -235,20 +270,13 @@ fetch_per_ref () { fi # Find $remote_name from ls-remote output. - head=$( - IFS=' ' - echo "$ls_remote_result" | - while read sha1 name - do - test "z$name" = "z$remote_name" || continue - echo "$sha1" - break - done - ) + head=$(echo "$ls_remote_result" | \ + git-fetch--tool -s pick-rref "$remote_name" "-") expr "z$head" : "z$_x40\$" >/dev/null || die "No such ref $remote_name at $remote" echo >&2 "Fetching $remote_name from $remote using $proto" - git-http-fetch -v -a "$head" "$remote/" || exit + case "$quiet" in '') v=-v ;; *) v= ;; esac + git-http-fetch $v -a "$head" "$remote" || exit ;; rsync://*) test -n "$shallow_depth" && @@ -257,8 +285,9 @@ fetch_per_ref () { rsync -L -q "$remote/$remote_name" "$TMP_HEAD" || exit 1 head=$(git-rev-parse --verify TMP_HEAD) rm -f "$TMP_HEAD" + case "$quiet" in '') v=-v ;; *) v= ;; esac test "$rsync_slurped_objects" || { - rsync -av --ignore-existing --exclude info \ + rsync -a $v --ignore-existing --exclude info \ "$remote/objects/" "$GIT_OBJECT_DIRECTORY/" || exit # Look at objects/info/alternates for rsync -- http will