#!/bin/sh # # Copyright (c) 2005 Johannes Schindelin # test_description='Testing multi_ack pack fetching ' . ./test-lib.sh # Test fetch-pack/upload-pack pair. # Some convenience functions function show_count () { commit_count=$(($commit_count+1)) printf " %d\r" $commit_count } function add () { local name=$1 local text="$@" local branch=${name:0:1} local parents="" shift while test $1; do parents="$parents -p $1" shift done echo "$text" > test.txt git-update-index --add test.txt tree=$(git-write-tree) # make sure timestamps are in correct order sec=$(($sec+1)) commit=$(echo "$text" | GIT_AUTHOR_DATE=$sec \ git-commit-tree $tree $parents 2>>log2.txt) export $name=$commit echo $commit > .git/refs/heads/$branch eval ${branch}TIP=$commit } function count_objects () { ls .git/objects/??/* 2>>log2.txt | wc -l | tr -d " " } function test_expect_object_count () { local message=$1 local count=$2 output="$(count_objects)" test_expect_success \ "new object count $message" \ "test $count = $output" } function test_repack () { local rep=$1 test_expect_success "repack && prune-packed in $rep" \ '(git-repack && git-prune-packed)2>>log.txt' } function pull_to_client () { local number=$1 local heads=$2 local count=$3 local no_strict_count_check=$4 cd client test_expect_success "$number pull" \ "git-fetch-pack -v .. $heads > log.txt 2>&1" case "$heads" in *A*) echo $ATIP > .git/refs/heads/A;; esac case "$heads" in *B*) echo $BTIP > .git/refs/heads/B;; esac git-symbolic-ref HEAD refs/heads/${heads:0:1} test_expect_success "fsck" 'git-fsck-objects --full > fsck.txt 2>&1' test_expect_object_count "after $number pull" $count pack_count=$(grep Unpacking log.txt|tr -dc "0-9") test -z "$pack_count" && pack_count=0 if [ -z "$no_strict_count_check" ]; then test_expect_success "minimal count" "test $count = $pack_count" else test $count != $pack_count && \ echo "WARNING: $pack_count objects transmitted, only $count of which were needed" fi cd .. } # Here begins the actual testing # A1 - ... - A20 - A21 # \ # B1 - B2 - .. - B70 # client pulls A20, B1. Then tracks only B. Then pulls A. ( mkdir client && cd client && git-init-db 2>> log2.txt ) add A1 prev=1; cur=2; while [ $cur -le 10 ]; do add A$cur $(eval echo \$A$prev) prev=$cur cur=$(($cur+1)) done add B1 $A1 echo $ATIP > .git/refs/heads/A echo $BTIP > .git/refs/heads/B git-symbolic-ref HEAD refs/heads/B pull_to_client 1st "B A" $((11*3)) (cd client; test_repack client) add A11 $A10 prev=1; cur=2; while [ $cur -le 65 ]; do add B$cur $(eval echo \$B$prev) prev=$cur cur=$(($cur+1)) done pull_to_client 2nd "B" $((64*3)) (cd client; test_repack client) pull_to_client 3rd "A" $((1*3)) # old fails test_done