mirror of
https://github.com/git/git
synced 2024-11-05 18:59:29 +00:00
23bd0c99f7
The p4 program is finicky about making sure the recorded client Root matches the current working directory. The way it discovers the latter seems to be to inspect shell variable $PWD. This could involve symlinks, that while leading to the same place as the client Root, look different, and cause p4 to fail. Resolve all client paths using "test-path-utils real_path $path". This removes ".." and resolves all symlinks. Discovered while running with --root=/dev/shm, which is a link to /run/shm. Signed-off-by: Pete Wyckoff <pw@padd.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
99 lines
2 KiB
Bash
99 lines
2 KiB
Bash
#
|
|
# Library code for git p4 tests
|
|
#
|
|
|
|
. ./test-lib.sh
|
|
|
|
if ! test_have_prereq PYTHON; then
|
|
skip_all='skipping git p4 tests; python not available'
|
|
test_done
|
|
fi
|
|
( p4 -h && p4d -h ) >/dev/null 2>&1 || {
|
|
skip_all='skipping git p4 tests; no p4 or p4d'
|
|
test_done
|
|
}
|
|
|
|
# Try to pick a unique port: guess a large number, then hope
|
|
# no more than one of each test is running.
|
|
#
|
|
# This does not handle the case where somebody else is running the
|
|
# same tests and has chosen the same ports.
|
|
testid=${this_test#t}
|
|
git_p4_test_start=9800
|
|
P4DPORT=$((10669 + ($testid - $git_p4_test_start)))
|
|
|
|
export P4PORT=localhost:$P4DPORT
|
|
export P4CLIENT=client
|
|
export P4EDITOR=:
|
|
|
|
db="$TRASH_DIRECTORY/db"
|
|
cli=$(test-path-utils real_path "$TRASH_DIRECTORY/cli")
|
|
git="$TRASH_DIRECTORY/git"
|
|
pidfile="$TRASH_DIRECTORY/p4d.pid"
|
|
|
|
start_p4d() {
|
|
mkdir -p "$db" "$cli" "$git" &&
|
|
rm -f "$pidfile" &&
|
|
(
|
|
p4d -q -r "$db" -p $P4DPORT &
|
|
echo $! >"$pidfile"
|
|
) &&
|
|
|
|
# This gives p4d a long time to start up, as it can be
|
|
# quite slow depending on the machine. Set this environment
|
|
# variable to something smaller to fail faster in, say,
|
|
# an automated test setup. If the p4d process dies, that
|
|
# will be caught with the "kill -0" check below.
|
|
i=${P4D_START_PATIENCE:-300}
|
|
pid=$(cat "$pidfile")
|
|
ready=
|
|
while test $i -gt 0
|
|
do
|
|
# succeed when p4 client commands start to work
|
|
if p4 info >/dev/null 2>&1
|
|
then
|
|
ready=true
|
|
break
|
|
fi
|
|
# fail if p4d died
|
|
kill -0 $pid 2>/dev/null || break
|
|
echo waiting for p4d to start
|
|
sleep 1
|
|
i=$(( $i - 1 ))
|
|
done
|
|
|
|
if test -z "$ready"
|
|
then
|
|
# p4d failed to start
|
|
return 1
|
|
fi
|
|
|
|
# build a client
|
|
(
|
|
cd "$cli" &&
|
|
p4 client -i <<-EOF
|
|
Client: client
|
|
Description: client
|
|
Root: $cli
|
|
View: //depot/... //client/...
|
|
EOF
|
|
)
|
|
return 0
|
|
}
|
|
|
|
kill_p4d() {
|
|
pid=$(cat "$pidfile")
|
|
# it had better exist for the first kill
|
|
kill $pid &&
|
|
for i in 1 2 3 4 5 ; do
|
|
kill $pid >/dev/null 2>&1 || break
|
|
sleep 1
|
|
done &&
|
|
# complain if it would not die
|
|
test_must_fail kill $pid >/dev/null 2>&1 &&
|
|
rm -rf "$db" "$cli" "$pidfile"
|
|
}
|
|
|
|
cleanup_git() {
|
|
rm -rf "$git"
|
|
}
|