blob: b1b96527d89abbf94bec28d809865c89c3c286ec [file] [log] [blame]
#!/bin/bash
set -eu -o pipefail
function tick () {
if test -z "${tick+set}"
then
tick=1112911993
else
tick=$(($tick + 60))
fi
GIT_COMMITTER_DATE="$tick -0700"
GIT_AUTHOR_DATE="$tick -0700"
export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
}
tick
function commit() {
local message=${1:?first argument is the commit message}
local file="$message.t"
echo "$1" > "$file"
git add -- "$file"
tick
git commit -m "$message"
git tag "$message"
}
function negotiation_tips () {
local tips=""
for arg in "$@"; do
tips+=" --negotiation-tip=$arg"
done
echo "$tips"
}
function trace_fetch_baseline () {
local remote="${1:?need remote url}"; shift
git -C client commit-graph write --no-progress --reachable
git -C client repack -adq
for algo in noop consecutive skipping; do
GIT_TRACE_PACKET="$PWD/baseline.$algo" \
git -C client -c fetch.negotiationAlgorithm="$algo" fetch --negotiate-only $(negotiation_tips "$@") \
--upload-pack 'unset GIT_TRACE_PACKET; git-upload-pack' \
"$remote" || :
done
}
(mkdir no_parents && cd no_parents
git init -q server && cd server
commit to_fetch
cd ..
(git init -q client && cd client
for i in $(seq 7); do
commit c$i
done
)
trace_fetch_baseline file://$PWD/server main
)
(mkdir two_colliding_skips && cd two_colliding_skips
git init -q server && cd server
commit to_fetch
cd ..
(git init -q client && cd client
for i in $(seq 11); do
commit c$i
done
git checkout c5
commit c5side
)
trace_fetch_baseline file://$PWD/server HEAD main
)
(mkdir advertisement_as_filter && cd advertisement_as_filter
git init -q server && cd server
commit c1
commit c2
commit c3
git tag -d c1 c2 c3
cd ..
git clone server client && cd client
commit c4
commit c5
git checkout c4^^
commit c2side
cd ..
(cd server
git checkout --orphan anotherbranch
commit to_fetch
)
trace_fetch_baseline origin HEAD main
)
(mkdir multi_round && cd multi_round
git init -q server && cd server
commit to_fetch
cd ..
git init -q client && cd client
for i in $(seq 8); do
git checkout --orphan b$i &&
commit b$i.c0
done
for j in $(seq 19); do
for i in $(seq 8); do
git checkout b$i &&
commit b$i.c$j
done
done
cd ..
(cd server
git fetch --no-tags "$PWD/../client" b1:refs/heads/b1
git checkout b1
commit commit-on-b1
)
trace_fetch_baseline file://$PWD/server $(ls client/.git/refs/heads | sort)
)
(mkdir clock_skew && cd clock_skew
git init -q server && cd server
commit to_fetch
cd ..
(git init -q client && cd client
tick=2000000000
commit c1
commit c2
tick=1000000000
git checkout c1
commit old1
commit old2
commit old3
commit old4
)
trace_fetch_baseline file://$PWD/server HEAD main
)