2011-08-23 02:20:33 +00:00
|
|
|
#
|
2012-04-09 00:18:02 +00:00
|
|
|
# Library code for git p4 tests
|
2011-08-23 02:20:33 +00:00
|
|
|
#
|
|
|
|
|
2012-06-27 12:00:57 +00:00
|
|
|
# p4 tests never use the top-level repo; always build/clone into
|
|
|
|
# a subdirectory called "$git"
|
|
|
|
TEST_NO_CREATE_REPO=NoThanks
|
|
|
|
|
2015-11-19 08:58:08 +00:00
|
|
|
# Some operations require multiple attempts to be successful. Define
|
|
|
|
# here the maximal retry timeout in seconds.
|
|
|
|
RETRY_TIMEOUT=60
|
|
|
|
|
2015-11-19 08:58:09 +00:00
|
|
|
# Sometimes p4d seems to hang. Terminate the p4d process automatically after
|
|
|
|
# the defined timeout in seconds.
|
|
|
|
P4D_TIMEOUT=300
|
|
|
|
|
2011-08-23 02:20:33 +00:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
2013-01-27 03:11:11 +00:00
|
|
|
if ! test_have_prereq PYTHON
|
|
|
|
then
|
2012-04-09 00:18:02 +00:00
|
|
|
skip_all='skipping git p4 tests; python not available'
|
2011-08-23 02:20:33 +00:00
|
|
|
test_done
|
|
|
|
fi
|
|
|
|
( p4 -h && p4d -h ) >/dev/null 2>&1 || {
|
2012-04-09 00:18:02 +00:00
|
|
|
skip_all='skipping git p4 tests; no p4 or p4d'
|
2011-08-23 02:20:33 +00:00
|
|
|
test_done
|
|
|
|
}
|
|
|
|
|
2013-01-27 03:11:11 +00:00
|
|
|
# On cygwin, the NT version of Perforce can be used. When giving
|
|
|
|
# it paths, either on the command-line or in client specifications,
|
|
|
|
# be sure to use the native windows form.
|
|
|
|
#
|
|
|
|
# Older versions of perforce were available compiled natively for
|
|
|
|
# cygwin. Those do not accept native windows paths, so make sure
|
|
|
|
# not to convert for them.
|
|
|
|
native_path() {
|
|
|
|
path="$1" &&
|
|
|
|
if test_have_prereq CYGWIN && ! p4 -V | grep -q CYGWIN
|
|
|
|
then
|
|
|
|
path=$(cygpath --windows "$path")
|
|
|
|
else
|
|
|
|
path=$(test-path-utils real_path "$path")
|
|
|
|
fi &&
|
|
|
|
echo "$path"
|
|
|
|
}
|
|
|
|
|
2015-11-19 08:58:08 +00:00
|
|
|
# On Solaris the 'date +%s' function is not supported and therefore we
|
|
|
|
# need this replacement.
|
|
|
|
# Attention: This function is not safe again against time offset updates
|
|
|
|
# at runtime (e.g. via NTP). The 'clock_gettime(CLOCK_MONOTONIC)'
|
|
|
|
# function could fix that but it is not in Python until 3.3.
|
|
|
|
time_in_seconds() {
|
2016-04-26 07:51:01 +00:00
|
|
|
(cd / && "$PYTHON_PATH" -c 'import time; print(int(time.time()))')
|
2015-11-19 08:58:08 +00:00
|
|
|
}
|
|
|
|
|
2011-08-23 02:20:33 +00:00
|
|
|
# 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)))
|
|
|
|
|
2012-09-09 20:16:02 +00:00
|
|
|
P4PORT=localhost:$P4DPORT
|
|
|
|
P4CLIENT=client
|
2014-01-21 23:16:43 +00:00
|
|
|
P4USER=author
|
git p4 test: do not pollute /tmp
Generating the submit template for p4 uses tempfile.mkstemp(),
which by default puts files in /tmp. For a test that fails,
possibly on purpose, this is not cleaned up. Run with TMPDIR
pointing into the trash directory so the temp files go away
with the test results.
To do this required some other minor changes. First, the editor
is launched using system(editor + " " + template_file), using
shell expansion to build the command string. This doesn't work
if editor has a space in it. And is generally unwise as it's
easy to fool the shell into doing extra work. Exec the args
directly, without shell expansion.
Second, without shell expansion, the trick of "P4EDITOR=:" used
in the tests doesn't work. Use a real command, true, as the
non-interactive editor for testing.
Signed-off-by: Pete Wyckoff <pw@padd.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-01-21 23:16:44 +00:00
|
|
|
P4EDITOR=true
|
2013-08-10 20:15:12 +00:00
|
|
|
unset P4CHARSET
|
2014-01-21 23:16:43 +00:00
|
|
|
export P4PORT P4CLIENT P4USER P4EDITOR P4CHARSET
|
2011-08-23 02:20:33 +00:00
|
|
|
|
|
|
|
db="$TRASH_DIRECTORY/db"
|
2013-01-27 03:11:11 +00:00
|
|
|
cli="$TRASH_DIRECTORY/cli"
|
2011-08-23 02:20:33 +00:00
|
|
|
git="$TRASH_DIRECTORY/git"
|
|
|
|
pidfile="$TRASH_DIRECTORY/p4d.pid"
|
|
|
|
|
2015-11-19 08:58:10 +00:00
|
|
|
# Sometimes "prove" seems to hang on exit because p4d is still running
|
|
|
|
cleanup() {
|
|
|
|
if test -f "$pidfile"
|
|
|
|
then
|
|
|
|
kill -9 $(cat "$pidfile") 2>/dev/null && exit 255
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
trap cleanup EXIT
|
|
|
|
|
git p4 test: do not pollute /tmp
Generating the submit template for p4 uses tempfile.mkstemp(),
which by default puts files in /tmp. For a test that fails,
possibly on purpose, this is not cleaned up. Run with TMPDIR
pointing into the trash directory so the temp files go away
with the test results.
To do this required some other minor changes. First, the editor
is launched using system(editor + " " + template_file), using
shell expansion to build the command string. This doesn't work
if editor has a space in it. And is generally unwise as it's
easy to fool the shell into doing extra work. Exec the args
directly, without shell expansion.
Second, without shell expansion, the trick of "P4EDITOR=:" used
in the tests doesn't work. Use a real command, true, as the
non-interactive editor for testing.
Signed-off-by: Pete Wyckoff <pw@padd.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-01-21 23:16:44 +00:00
|
|
|
# git p4 submit generates a temp file, which will
|
|
|
|
# not get cleaned up if the submission fails. Don't
|
|
|
|
# clutter up /tmp on the test machine.
|
|
|
|
TMPDIR="$TRASH_DIRECTORY"
|
|
|
|
export TMPDIR
|
|
|
|
|
2011-08-23 02:20:33 +00:00
|
|
|
start_p4d() {
|
|
|
|
mkdir -p "$db" "$cli" "$git" &&
|
2012-06-28 02:48:07 +00:00
|
|
|
rm -f "$pidfile" &&
|
2011-08-23 02:20:33 +00:00
|
|
|
(
|
2013-01-27 03:11:10 +00:00
|
|
|
cd "$db" &&
|
|
|
|
{
|
2015-04-28 09:08:01 +00:00
|
|
|
p4d -q -p $P4DPORT "$@" &
|
2013-01-27 03:11:10 +00:00
|
|
|
echo $! >"$pidfile"
|
|
|
|
}
|
2011-08-23 02:20:33 +00:00
|
|
|
) &&
|
2012-06-28 02:48:07 +00:00
|
|
|
|
|
|
|
# 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")
|
2015-11-19 08:58:09 +00:00
|
|
|
|
|
|
|
timeout=$(($(time_in_seconds) + $P4D_TIMEOUT))
|
|
|
|
while true
|
|
|
|
do
|
|
|
|
if test $(time_in_seconds) -gt $timeout
|
|
|
|
then
|
|
|
|
kill -9 $pid
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
sleep 1
|
|
|
|
done &
|
|
|
|
watchdog_pid=$!
|
|
|
|
|
2012-06-28 02:48:07 +00:00
|
|
|
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
|
2011-08-23 02:20:33 +00:00
|
|
|
sleep 1
|
2012-06-28 02:48:07 +00:00
|
|
|
i=$(( $i - 1 ))
|
|
|
|
done
|
|
|
|
|
|
|
|
if test -z "$ready"
|
|
|
|
then
|
|
|
|
# p4d failed to start
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
2014-01-21 23:16:43 +00:00
|
|
|
# build a p4 user so author@example.com has an entry
|
|
|
|
p4_add_user author
|
|
|
|
|
2012-06-28 02:48:07 +00:00
|
|
|
# build a client
|
2013-01-27 03:11:07 +00:00
|
|
|
client_view "//depot/... //client/..." &&
|
|
|
|
|
2012-06-28 02:48:07 +00:00
|
|
|
return 0
|
2011-08-23 02:20:33 +00:00
|
|
|
}
|
|
|
|
|
2014-01-21 23:16:43 +00:00
|
|
|
p4_add_user() {
|
|
|
|
name=$1 &&
|
|
|
|
p4 user -f -i <<-EOF
|
|
|
|
User: $name
|
|
|
|
Email: $name@example.com
|
|
|
|
FullName: Dr. $name
|
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
2015-11-19 08:58:08 +00:00
|
|
|
retry_until_success() {
|
|
|
|
timeout=$(($(time_in_seconds) + $RETRY_TIMEOUT))
|
|
|
|
until "$@" 2>/dev/null || test $(time_in_seconds) -gt $timeout
|
|
|
|
do
|
|
|
|
sleep 1
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
retry_until_fail() {
|
|
|
|
timeout=$(($(time_in_seconds) + $RETRY_TIMEOUT))
|
|
|
|
until ! "$@" 2>/dev/null || test $(time_in_seconds) -gt $timeout
|
|
|
|
do
|
|
|
|
sleep 1
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2011-08-23 02:20:33 +00:00
|
|
|
kill_p4d() {
|
|
|
|
pid=$(cat "$pidfile")
|
2015-11-19 08:58:08 +00:00
|
|
|
retry_until_fail kill $pid
|
|
|
|
retry_until_fail kill -9 $pid
|
2011-08-23 02:20:33 +00:00
|
|
|
# complain if it would not die
|
|
|
|
test_must_fail kill $pid >/dev/null 2>&1 &&
|
2015-11-19 08:58:09 +00:00
|
|
|
rm -rf "$db" "$cli" "$pidfile" &&
|
|
|
|
retry_until_fail kill -9 $watchdog_pid
|
2011-08-23 02:20:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
cleanup_git() {
|
2015-11-19 08:58:08 +00:00
|
|
|
retry_until_success rm -r "$git"
|
|
|
|
test_must_fail test -d "$git" &&
|
|
|
|
retry_until_success mkdir "$git"
|
2011-08-23 02:20:33 +00:00
|
|
|
}
|
2012-07-04 13:34:19 +00:00
|
|
|
|
|
|
|
marshal_dump() {
|
|
|
|
what=$1 &&
|
|
|
|
line=${2:-1} &&
|
|
|
|
cat >"$TRASH_DIRECTORY/marshal-dump.py" <<-EOF &&
|
|
|
|
import marshal
|
|
|
|
import sys
|
2016-04-26 07:51:00 +00:00
|
|
|
instream = getattr(sys.stdin, 'buffer', sys.stdin)
|
2012-07-04 13:34:19 +00:00
|
|
|
for i in range($line):
|
2016-04-26 07:51:00 +00:00
|
|
|
d = marshal.load(instream)
|
|
|
|
print(d[b'$what'].decode('utf-8'))
|
2012-07-04 13:34:19 +00:00
|
|
|
EOF
|
|
|
|
"$PYTHON_PATH" "$TRASH_DIRECTORY/marshal-dump.py"
|
|
|
|
}
|
2012-08-11 16:55:00 +00:00
|
|
|
|
|
|
|
#
|
|
|
|
# Construct a client with this list of View lines
|
|
|
|
#
|
|
|
|
client_view() {
|
|
|
|
(
|
|
|
|
cat <<-EOF &&
|
2013-01-27 03:11:09 +00:00
|
|
|
Client: $P4CLIENT
|
|
|
|
Description: $P4CLIENT
|
2012-08-11 16:55:00 +00:00
|
|
|
Root: $cli
|
2013-01-27 03:11:11 +00:00
|
|
|
AltRoots: $(native_path "$cli")
|
2013-01-27 03:11:15 +00:00
|
|
|
LineEnd: unix
|
2012-08-11 16:55:00 +00:00
|
|
|
View:
|
|
|
|
EOF
|
2013-01-27 03:11:08 +00:00
|
|
|
printf "\t%s\n" "$@"
|
2012-08-11 16:55:00 +00:00
|
|
|
) | p4 client -i
|
|
|
|
}
|
git p4: cygwin p4 client does not mark read-only
There are some old versions of p4, compiled for cygwin, that
treat read-only files differently.
Normally, a file that is not open is read-only, meaning that
"test -w" on the file is false. This works on unix, and it works
on windows using the NT version of p4. The cygwin version
of p4, though, changes the permissions, but does not set the
windows read-only attribute, so "test -w" returns false.
Notice this oddity and make the tests work, even on cygiwn.
Signed-off-by: Pete Wyckoff <pw@padd.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-01-27 03:11:17 +00:00
|
|
|
|
|
|
|
is_cli_file_writeable() {
|
|
|
|
# cygwin version of p4 does not set read-only attr,
|
|
|
|
# will be marked 444 but -w is true
|
|
|
|
file="$1" &&
|
|
|
|
if test_have_prereq CYGWIN && p4 -V | grep -q CYGWIN
|
|
|
|
then
|
|
|
|
stat=$(stat --format=%a "$file") &&
|
|
|
|
test $stat = 644
|
|
|
|
else
|
|
|
|
test -w "$file"
|
|
|
|
fi
|
|
|
|
}
|