2011-08-23 06:20:33 +04:00
|
|
|
#
|
2012-04-09 04:18:02 +04:00
|
|
|
# Library code for git p4 tests
|
2011-08-23 06:20:33 +04:00
|
|
|
#
|
|
|
|
|
2012-06-27 16:00:57 +04: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 11:58:08 +03:00
|
|
|
# Some operations require multiple attempts to be successful. Define
|
|
|
|
# here the maximal retry timeout in seconds.
|
|
|
|
RETRY_TIMEOUT=60
|
|
|
|
|
2015-11-19 11:58:09 +03:00
|
|
|
# Sometimes p4d seems to hang. Terminate the p4d process automatically after
|
|
|
|
# the defined timeout in seconds.
|
|
|
|
P4D_TIMEOUT=300
|
|
|
|
|
2011-08-23 06:20:33 +04:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
2013-01-27 07:11:11 +04:00
|
|
|
if ! test_have_prereq PYTHON
|
|
|
|
then
|
2012-04-09 04:18:02 +04:00
|
|
|
skip_all='skipping git p4 tests; python not available'
|
2011-08-23 06:20:33 +04:00
|
|
|
test_done
|
|
|
|
fi
|
|
|
|
( p4 -h && p4d -h ) >/dev/null 2>&1 || {
|
2012-04-09 04:18:02 +04:00
|
|
|
skip_all='skipping git p4 tests; no p4 or p4d'
|
2011-08-23 06:20:33 +04:00
|
|
|
test_done
|
|
|
|
}
|
|
|
|
|
2013-01-27 07:11:11 +04: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.
|
2016-04-19 22:49:41 +03:00
|
|
|
native_path () {
|
2013-01-27 07:11:11 +04:00
|
|
|
path="$1" &&
|
|
|
|
if test_have_prereq CYGWIN && ! p4 -V | grep -q CYGWIN
|
|
|
|
then
|
|
|
|
path=$(cygpath --windows "$path")
|
|
|
|
else
|
2018-03-24 10:44:49 +03:00
|
|
|
path=$(test-tool path-utils real_path "$path")
|
2013-01-27 07:11:11 +04:00
|
|
|
fi &&
|
|
|
|
echo "$path"
|
|
|
|
}
|
|
|
|
|
test-lib-functions: introduce the 'test_set_port' helper function
Several test scripts run daemons like 'git-daemon' or Apache, and
communicate with them through TCP sockets. To have unique ports where
these daemons are accessible, the ports are usually the number of the
corresponding test scripts, unless the user overrides them via
environment variables, and thus all those tests and test libs contain
more or less the same bit of one-liner boilerplate code to find out
the port. The last patch in this series will make this a bit more
complicated.
Factor out finding the port for a daemon into the common helper
function 'test_set_port' to avoid repeating ourselves.
Take special care of test scripts with "low" numbers:
- Test numbers below 1024 would result in a port that's only usable
as root, so set their port to '10000 + test-nr' to make sure it
doesn't interfere with other tests in the test suite. This makes
the hardcoded port number in 't0410-partial-clone.sh' unnecessary,
remove it.
- The shell's arithmetic evaluation interprets numbers with leading
zeros as octal values, which means that test number below 1000 and
containing the digits 8 or 9 will trigger an error. Remove all
leading zeros from the test numbers to prevent this.
Note that the 'git p4' tests are unlike the other tests involving
daemons in that:
- 'lib-git-p4.sh' doesn't use the test's number for unique port as
is, but does a bit of additional arithmetic on top [1].
- The port is not overridable via an environment variable.
With this patch even 'git p4' tests will use the test's number as
default port, and it will be overridable via the P4DPORT environment
variable.
[1] Commit fc00233071 (git-p4 tests: refactor and cleanup, 2011-08-22)
introduced that "unusual" unique port computation without
explaining why it was necessary (as opposed to simply using the
test number as is). It seems to be just unnecessary complication,
and in any case that commit came way before the "test nr as unique
port" got "standardized" for other daemons in commits c44132fcf3
(tests: auto-set git-daemon port, 2014-02-10), 3bb486e439 (tests:
auto-set LIB_HTTPD_PORT from test name, 2014-02-10), and
bf9d7df950 (t/lib-git-svn.sh: improve svnserve tests with parallel
make test, 2017-12-01).
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-01-05 04:08:58 +03:00
|
|
|
test_set_port P4DPORT
|
2011-08-23 06:20:33 +04:00
|
|
|
|
2012-09-10 00:16:02 +04:00
|
|
|
P4PORT=localhost:$P4DPORT
|
|
|
|
P4CLIENT=client
|
2014-01-22 03:16:43 +04: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-22 03:16:44 +04:00
|
|
|
P4EDITOR=true
|
2013-08-11 00:15:12 +04:00
|
|
|
unset P4CHARSET
|
2014-01-22 03:16:43 +04:00
|
|
|
export P4PORT P4CLIENT P4USER P4EDITOR P4CHARSET
|
2011-08-23 06:20:33 +04:00
|
|
|
|
|
|
|
db="$TRASH_DIRECTORY/db"
|
2013-01-27 07:11:11 +04:00
|
|
|
cli="$TRASH_DIRECTORY/cli"
|
2011-08-23 06:20:33 +04:00
|
|
|
git="$TRASH_DIRECTORY/git"
|
|
|
|
pidfile="$TRASH_DIRECTORY/p4d.pid"
|
|
|
|
|
git p4 test: clean up the p4d cleanup functions
Confusingly, the 'git p4' tests used two cleanup functions:
- 'kill_p4d' was run in the last test before 'test_done', and it not
only killed 'p4d', but it killed the watchdog process, and cleaned
up after 'p4d' as well by removing all directories used by the P4
daemon and client.
This cleanup is not necessary right before 'test_done', because
the whole trash directory is about to get removed anyway, but it
is necessary in 't9801-git-p4-branch.sh', which uses 'kill_p4d' to
stop 'p4d' before re-starting it in the middle of the test script.
- 'cleanup' was run in the trap on EXIT, and it killed 'p4d', but,
it didn't kill the watchdog process, and, contrarily to its name,
didn't perform any cleanup whatsoever.
Make it clearer what's going on by renaming and simplifying the
cleanup functions, so in the end we'll have:
- 'stop_p4d_and_watchdog' replaces 'cleanup' as it will try to live
up to its name and stop both the 'p4d' and the watchdog processes,
and as the sole function registered with 'test_atexit' it will be
responsible for no leaving any stray processes behind after 'git p4'
tests were finished or interrupted.
- 'stop_and_cleanup_p4d' replaces 'kill_p4d' as it will stop 'p4d'
(and the watchdog) and remove all directories used by the P4
daemon and cliean, so it can be used mid-script to stop and then
re-start 'p4d'.
Note that while 'cleanup' sent a single SIGKILL to 'p4d', 'kill_p4d'
was quite brutal, as it first sent SIGTERM to the daemon repeatedly,
either until its pid disappeared or until a given timeout was up, and
then it sent SIGKILL repeatedly, for good measure. This is overkill
(pardon the pun): a single SIGKILL should be able to take down any
process in a sensible state, and if a process were to somehow end up
stuck in the dreaded uninterruptible sleep state then even repeated
SIGKILLs won't bring immediate help. So ditch all the repeated
SIGTERM/SIGKILL parts, and use a single SIGKILL to stop 'p4d', and
make sure that there are no races between asynchron signal delivery
and subsequent restart of 'p4d' by waiting for it to die.
With this change the 'retry_until_fail' helper has no callers left,
remove it.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-03-13 15:24:16 +03:00
|
|
|
stop_p4d_and_watchdog () {
|
|
|
|
kill -9 $p4d_pid $watchdog_pid
|
2015-11-19 11:58:10 +03:00
|
|
|
}
|
|
|
|
|
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-22 03:16:44 +04: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
|
|
|
|
|
2019-03-13 15:24:15 +03:00
|
|
|
registered_stop_p4d_atexit_handler=
|
2016-04-19 22:49:41 +03:00
|
|
|
start_p4d () {
|
2019-03-13 15:24:15 +03:00
|
|
|
# One of the test scripts stops and then re-starts p4d.
|
|
|
|
# Don't register and then run the same atexit handlers several times.
|
|
|
|
if test -z "$registered_stop_p4d_atexit_handler"
|
|
|
|
then
|
git p4 test: clean up the p4d cleanup functions
Confusingly, the 'git p4' tests used two cleanup functions:
- 'kill_p4d' was run in the last test before 'test_done', and it not
only killed 'p4d', but it killed the watchdog process, and cleaned
up after 'p4d' as well by removing all directories used by the P4
daemon and client.
This cleanup is not necessary right before 'test_done', because
the whole trash directory is about to get removed anyway, but it
is necessary in 't9801-git-p4-branch.sh', which uses 'kill_p4d' to
stop 'p4d' before re-starting it in the middle of the test script.
- 'cleanup' was run in the trap on EXIT, and it killed 'p4d', but,
it didn't kill the watchdog process, and, contrarily to its name,
didn't perform any cleanup whatsoever.
Make it clearer what's going on by renaming and simplifying the
cleanup functions, so in the end we'll have:
- 'stop_p4d_and_watchdog' replaces 'cleanup' as it will try to live
up to its name and stop both the 'p4d' and the watchdog processes,
and as the sole function registered with 'test_atexit' it will be
responsible for no leaving any stray processes behind after 'git p4'
tests were finished or interrupted.
- 'stop_and_cleanup_p4d' replaces 'kill_p4d' as it will stop 'p4d'
(and the watchdog) and remove all directories used by the P4
daemon and cliean, so it can be used mid-script to stop and then
re-start 'p4d'.
Note that while 'cleanup' sent a single SIGKILL to 'p4d', 'kill_p4d'
was quite brutal, as it first sent SIGTERM to the daemon repeatedly,
either until its pid disappeared or until a given timeout was up, and
then it sent SIGKILL repeatedly, for good measure. This is overkill
(pardon the pun): a single SIGKILL should be able to take down any
process in a sensible state, and if a process were to somehow end up
stuck in the dreaded uninterruptible sleep state then even repeated
SIGKILLs won't bring immediate help. So ditch all the repeated
SIGTERM/SIGKILL parts, and use a single SIGKILL to stop 'p4d', and
make sure that there are no races between asynchron signal delivery
and subsequent restart of 'p4d' by waiting for it to die.
With this change the 'retry_until_fail' helper has no callers left,
remove it.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-03-13 15:24:16 +03:00
|
|
|
test_atexit 'stop_p4d_and_watchdog'
|
2019-03-13 15:24:15 +03:00
|
|
|
registered_stop_p4d_atexit_handler=AlreadyDone
|
|
|
|
fi
|
|
|
|
|
2011-08-23 06:20:33 +04:00
|
|
|
mkdir -p "$db" "$cli" "$git" &&
|
2012-06-28 06:48:07 +04:00
|
|
|
rm -f "$pidfile" &&
|
2011-08-23 06:20:33 +04:00
|
|
|
(
|
2013-01-27 07:11:10 +04:00
|
|
|
cd "$db" &&
|
|
|
|
{
|
2015-04-28 12:08:01 +03:00
|
|
|
p4d -q -p $P4DPORT "$@" &
|
2013-01-27 07:11:10 +04:00
|
|
|
echo $! >"$pidfile"
|
|
|
|
}
|
2011-08-23 06:20:33 +04:00
|
|
|
) &&
|
git p4 test: clean up the p4d cleanup functions
Confusingly, the 'git p4' tests used two cleanup functions:
- 'kill_p4d' was run in the last test before 'test_done', and it not
only killed 'p4d', but it killed the watchdog process, and cleaned
up after 'p4d' as well by removing all directories used by the P4
daemon and client.
This cleanup is not necessary right before 'test_done', because
the whole trash directory is about to get removed anyway, but it
is necessary in 't9801-git-p4-branch.sh', which uses 'kill_p4d' to
stop 'p4d' before re-starting it in the middle of the test script.
- 'cleanup' was run in the trap on EXIT, and it killed 'p4d', but,
it didn't kill the watchdog process, and, contrarily to its name,
didn't perform any cleanup whatsoever.
Make it clearer what's going on by renaming and simplifying the
cleanup functions, so in the end we'll have:
- 'stop_p4d_and_watchdog' replaces 'cleanup' as it will try to live
up to its name and stop both the 'p4d' and the watchdog processes,
and as the sole function registered with 'test_atexit' it will be
responsible for no leaving any stray processes behind after 'git p4'
tests were finished or interrupted.
- 'stop_and_cleanup_p4d' replaces 'kill_p4d' as it will stop 'p4d'
(and the watchdog) and remove all directories used by the P4
daemon and cliean, so it can be used mid-script to stop and then
re-start 'p4d'.
Note that while 'cleanup' sent a single SIGKILL to 'p4d', 'kill_p4d'
was quite brutal, as it first sent SIGTERM to the daemon repeatedly,
either until its pid disappeared or until a given timeout was up, and
then it sent SIGKILL repeatedly, for good measure. This is overkill
(pardon the pun): a single SIGKILL should be able to take down any
process in a sensible state, and if a process were to somehow end up
stuck in the dreaded uninterruptible sleep state then even repeated
SIGKILLs won't bring immediate help. So ditch all the repeated
SIGTERM/SIGKILL parts, and use a single SIGKILL to stop 'p4d', and
make sure that there are no races between asynchron signal delivery
and subsequent restart of 'p4d' by waiting for it to die.
With this change the 'retry_until_fail' helper has no callers left,
remove it.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-03-13 15:24:16 +03:00
|
|
|
p4d_pid=$(cat "$pidfile")
|
2012-06-28 06:48:07 +04: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}
|
2015-11-19 11:58:09 +03:00
|
|
|
|
2019-03-13 15:24:17 +03:00
|
|
|
nr_tries_left=$P4D_TIMEOUT
|
2015-11-19 11:58:09 +03:00
|
|
|
while true
|
|
|
|
do
|
2019-03-13 15:24:17 +03:00
|
|
|
if test $nr_tries_left -eq 0
|
2015-11-19 11:58:09 +03:00
|
|
|
then
|
git p4 test: clean up the p4d cleanup functions
Confusingly, the 'git p4' tests used two cleanup functions:
- 'kill_p4d' was run in the last test before 'test_done', and it not
only killed 'p4d', but it killed the watchdog process, and cleaned
up after 'p4d' as well by removing all directories used by the P4
daemon and client.
This cleanup is not necessary right before 'test_done', because
the whole trash directory is about to get removed anyway, but it
is necessary in 't9801-git-p4-branch.sh', which uses 'kill_p4d' to
stop 'p4d' before re-starting it in the middle of the test script.
- 'cleanup' was run in the trap on EXIT, and it killed 'p4d', but,
it didn't kill the watchdog process, and, contrarily to its name,
didn't perform any cleanup whatsoever.
Make it clearer what's going on by renaming and simplifying the
cleanup functions, so in the end we'll have:
- 'stop_p4d_and_watchdog' replaces 'cleanup' as it will try to live
up to its name and stop both the 'p4d' and the watchdog processes,
and as the sole function registered with 'test_atexit' it will be
responsible for no leaving any stray processes behind after 'git p4'
tests were finished or interrupted.
- 'stop_and_cleanup_p4d' replaces 'kill_p4d' as it will stop 'p4d'
(and the watchdog) and remove all directories used by the P4
daemon and cliean, so it can be used mid-script to stop and then
re-start 'p4d'.
Note that while 'cleanup' sent a single SIGKILL to 'p4d', 'kill_p4d'
was quite brutal, as it first sent SIGTERM to the daemon repeatedly,
either until its pid disappeared or until a given timeout was up, and
then it sent SIGKILL repeatedly, for good measure. This is overkill
(pardon the pun): a single SIGKILL should be able to take down any
process in a sensible state, and if a process were to somehow end up
stuck in the dreaded uninterruptible sleep state then even repeated
SIGKILLs won't bring immediate help. So ditch all the repeated
SIGTERM/SIGKILL parts, and use a single SIGKILL to stop 'p4d', and
make sure that there are no races between asynchron signal delivery
and subsequent restart of 'p4d' by waiting for it to die.
With this change the 'retry_until_fail' helper has no callers left,
remove it.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-03-13 15:24:16 +03:00
|
|
|
kill -9 $p4d_pid
|
2015-11-19 11:58:09 +03:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
sleep 1
|
2019-03-13 15:24:17 +03:00
|
|
|
nr_tries_left=$(($nr_tries_left - 1))
|
2019-03-13 15:24:18 +03:00
|
|
|
done 2>/dev/null 4>&2 &
|
2015-11-19 11:58:09 +03:00
|
|
|
watchdog_pid=$!
|
|
|
|
|
2012-06-28 06:48:07 +04: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
|
git p4 test: clean up the p4d cleanup functions
Confusingly, the 'git p4' tests used two cleanup functions:
- 'kill_p4d' was run in the last test before 'test_done', and it not
only killed 'p4d', but it killed the watchdog process, and cleaned
up after 'p4d' as well by removing all directories used by the P4
daemon and client.
This cleanup is not necessary right before 'test_done', because
the whole trash directory is about to get removed anyway, but it
is necessary in 't9801-git-p4-branch.sh', which uses 'kill_p4d' to
stop 'p4d' before re-starting it in the middle of the test script.
- 'cleanup' was run in the trap on EXIT, and it killed 'p4d', but,
it didn't kill the watchdog process, and, contrarily to its name,
didn't perform any cleanup whatsoever.
Make it clearer what's going on by renaming and simplifying the
cleanup functions, so in the end we'll have:
- 'stop_p4d_and_watchdog' replaces 'cleanup' as it will try to live
up to its name and stop both the 'p4d' and the watchdog processes,
and as the sole function registered with 'test_atexit' it will be
responsible for no leaving any stray processes behind after 'git p4'
tests were finished or interrupted.
- 'stop_and_cleanup_p4d' replaces 'kill_p4d' as it will stop 'p4d'
(and the watchdog) and remove all directories used by the P4
daemon and cliean, so it can be used mid-script to stop and then
re-start 'p4d'.
Note that while 'cleanup' sent a single SIGKILL to 'p4d', 'kill_p4d'
was quite brutal, as it first sent SIGTERM to the daemon repeatedly,
either until its pid disappeared or until a given timeout was up, and
then it sent SIGKILL repeatedly, for good measure. This is overkill
(pardon the pun): a single SIGKILL should be able to take down any
process in a sensible state, and if a process were to somehow end up
stuck in the dreaded uninterruptible sleep state then even repeated
SIGKILLs won't bring immediate help. So ditch all the repeated
SIGTERM/SIGKILL parts, and use a single SIGKILL to stop 'p4d', and
make sure that there are no races between asynchron signal delivery
and subsequent restart of 'p4d' by waiting for it to die.
With this change the 'retry_until_fail' helper has no callers left,
remove it.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-03-13 15:24:16 +03:00
|
|
|
kill -0 $p4d_pid 2>/dev/null || break
|
2012-06-28 06:48:07 +04:00
|
|
|
echo waiting for p4d to start
|
2011-08-23 06:20:33 +04:00
|
|
|
sleep 1
|
2012-06-28 06:48:07 +04:00
|
|
|
i=$(( $i - 1 ))
|
|
|
|
done
|
|
|
|
|
|
|
|
if test -z "$ready"
|
|
|
|
then
|
|
|
|
# p4d failed to start
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
2014-01-22 03:16:43 +04:00
|
|
|
# build a p4 user so author@example.com has an entry
|
|
|
|
p4_add_user author
|
|
|
|
|
2012-06-28 06:48:07 +04:00
|
|
|
# build a client
|
2013-01-27 07:11:07 +04:00
|
|
|
client_view "//depot/... //client/..." &&
|
|
|
|
|
2012-06-28 06:48:07 +04:00
|
|
|
return 0
|
2011-08-23 06:20:33 +04:00
|
|
|
}
|
|
|
|
|
2016-04-19 22:49:41 +03:00
|
|
|
p4_add_user () {
|
2014-01-22 03:16:43 +04:00
|
|
|
name=$1 &&
|
git-p4: improve encoding handling to support inconsistent encodings
git-p4 is designed to run correctly under python2.7 and python3, but
its functional behavior wrt importing user-entered text differs across
these environments:
Under python2, git-p4 "naively" writes the Perforce bytestream into git
metadata (and does not set an "encoding" header on the commits); this
means that any non-utf-8 byte sequences end up creating invalidly-encoded
commit metadata in git.
Under python3, git-p4 attempts to decode the Perforce bytestream as utf-8
data, and fails badly (with an unhelpful error) when non-utf-8 data is
encountered.
Perforce clients (especially p4v) encourage user entry of changelist
descriptions (and user full names) in OS-local encoding, and store the
resulting bytestream to the server unmodified - such that different
clients can end up creating mutually-unintelligible messages. The most
common inconsistency, in many Perforce environments, is likely to be utf-8
(typical in linux) vs cp-1252 (typical in windows).
Make the changelist-description- and user-fullname-handling code
python-runtime-agnostic, introducing three "strategies" selectable via
config:
- 'passthrough', behaving as previously under python2,
- 'strict', behaving as previously under python3, and
- 'fallback', favoring utf-8 but supporting a secondary encoding when
utf-8 decoding fails, and finally escaping high-range bytes if the
decoding with the secondary encoding also fails.
Keep the python2 default behavior as-is ('legacy' strategy), but switch
the python3 default strategy to 'fallback' with default fallback encoding
'cp1252'.
Also include tests exercising these encoding strategies, documentation for
the new config, and improve the user-facing error messages when decoding
does fail.
Signed-off-by: Tao Klerks <tao@klerks.biz>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-04-30 22:26:52 +03:00
|
|
|
fullname="${2:-Dr. $1}"
|
2014-01-22 03:16:43 +04:00
|
|
|
p4 user -f -i <<-EOF
|
|
|
|
User: $name
|
|
|
|
Email: $name@example.com
|
git-p4: improve encoding handling to support inconsistent encodings
git-p4 is designed to run correctly under python2.7 and python3, but
its functional behavior wrt importing user-entered text differs across
these environments:
Under python2, git-p4 "naively" writes the Perforce bytestream into git
metadata (and does not set an "encoding" header on the commits); this
means that any non-utf-8 byte sequences end up creating invalidly-encoded
commit metadata in git.
Under python3, git-p4 attempts to decode the Perforce bytestream as utf-8
data, and fails badly (with an unhelpful error) when non-utf-8 data is
encountered.
Perforce clients (especially p4v) encourage user entry of changelist
descriptions (and user full names) in OS-local encoding, and store the
resulting bytestream to the server unmodified - such that different
clients can end up creating mutually-unintelligible messages. The most
common inconsistency, in many Perforce environments, is likely to be utf-8
(typical in linux) vs cp-1252 (typical in windows).
Make the changelist-description- and user-fullname-handling code
python-runtime-agnostic, introducing three "strategies" selectable via
config:
- 'passthrough', behaving as previously under python2,
- 'strict', behaving as previously under python3, and
- 'fallback', favoring utf-8 but supporting a secondary encoding when
utf-8 decoding fails, and finally escaping high-range bytes if the
decoding with the secondary encoding also fails.
Keep the python2 default behavior as-is ('legacy' strategy), but switch
the python3 default strategy to 'fallback' with default fallback encoding
'cp1252'.
Also include tests exercising these encoding strategies, documentation for
the new config, and improve the user-facing error messages when decoding
does fail.
Signed-off-by: Tao Klerks <tao@klerks.biz>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-04-30 22:26:52 +03:00
|
|
|
FullName: $fullname
|
2014-01-22 03:16:43 +04:00
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
2016-04-19 22:49:41 +03:00
|
|
|
p4_add_job () {
|
|
|
|
p4 job -f -i <<-EOF
|
|
|
|
Job: $1
|
|
|
|
Status: open
|
|
|
|
User: dummy
|
|
|
|
Description:
|
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
2016-04-19 22:49:41 +03:00
|
|
|
retry_until_success () {
|
2019-03-13 15:24:17 +03:00
|
|
|
nr_tries_left=$RETRY_TIMEOUT
|
|
|
|
until "$@" 2>/dev/null || test $nr_tries_left -eq 0
|
2015-11-19 11:58:08 +03:00
|
|
|
do
|
|
|
|
sleep 1
|
2019-03-13 15:24:17 +03:00
|
|
|
nr_tries_left=$(($nr_tries_left - 1))
|
2015-11-19 11:58:08 +03:00
|
|
|
done
|
|
|
|
}
|
|
|
|
|
git p4 test: clean up the p4d cleanup functions
Confusingly, the 'git p4' tests used two cleanup functions:
- 'kill_p4d' was run in the last test before 'test_done', and it not
only killed 'p4d', but it killed the watchdog process, and cleaned
up after 'p4d' as well by removing all directories used by the P4
daemon and client.
This cleanup is not necessary right before 'test_done', because
the whole trash directory is about to get removed anyway, but it
is necessary in 't9801-git-p4-branch.sh', which uses 'kill_p4d' to
stop 'p4d' before re-starting it in the middle of the test script.
- 'cleanup' was run in the trap on EXIT, and it killed 'p4d', but,
it didn't kill the watchdog process, and, contrarily to its name,
didn't perform any cleanup whatsoever.
Make it clearer what's going on by renaming and simplifying the
cleanup functions, so in the end we'll have:
- 'stop_p4d_and_watchdog' replaces 'cleanup' as it will try to live
up to its name and stop both the 'p4d' and the watchdog processes,
and as the sole function registered with 'test_atexit' it will be
responsible for no leaving any stray processes behind after 'git p4'
tests were finished or interrupted.
- 'stop_and_cleanup_p4d' replaces 'kill_p4d' as it will stop 'p4d'
(and the watchdog) and remove all directories used by the P4
daemon and cliean, so it can be used mid-script to stop and then
re-start 'p4d'.
Note that while 'cleanup' sent a single SIGKILL to 'p4d', 'kill_p4d'
was quite brutal, as it first sent SIGTERM to the daemon repeatedly,
either until its pid disappeared or until a given timeout was up, and
then it sent SIGKILL repeatedly, for good measure. This is overkill
(pardon the pun): a single SIGKILL should be able to take down any
process in a sensible state, and if a process were to somehow end up
stuck in the dreaded uninterruptible sleep state then even repeated
SIGKILLs won't bring immediate help. So ditch all the repeated
SIGTERM/SIGKILL parts, and use a single SIGKILL to stop 'p4d', and
make sure that there are no races between asynchron signal delivery
and subsequent restart of 'p4d' by waiting for it to die.
With this change the 'retry_until_fail' helper has no callers left,
remove it.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-03-13 15:24:16 +03:00
|
|
|
stop_and_cleanup_p4d () {
|
|
|
|
kill -9 $p4d_pid $watchdog_pid
|
|
|
|
wait $p4d_pid
|
|
|
|
rm -rf "$db" "$cli" "$pidfile"
|
2011-08-23 06:20:33 +04:00
|
|
|
}
|
|
|
|
|
2016-04-19 22:49:41 +03:00
|
|
|
cleanup_git () {
|
2015-11-19 11:58:08 +03:00
|
|
|
retry_until_success rm -r "$git"
|
2019-12-20 21:15:48 +03:00
|
|
|
test_path_is_missing "$git" &&
|
2015-11-19 11:58:08 +03:00
|
|
|
retry_until_success mkdir "$git"
|
2011-08-23 06:20:33 +04:00
|
|
|
}
|
2012-07-04 17:34:19 +04:00
|
|
|
|
2016-04-19 22:49:41 +03:00
|
|
|
marshal_dump () {
|
2012-07-04 17:34:19 +04:00
|
|
|
what=$1 &&
|
|
|
|
line=${2:-1} &&
|
|
|
|
cat >"$TRASH_DIRECTORY/marshal-dump.py" <<-EOF &&
|
|
|
|
import marshal
|
|
|
|
import sys
|
2016-04-26 10:51:00 +03:00
|
|
|
instream = getattr(sys.stdin, 'buffer', sys.stdin)
|
2012-07-04 17:34:19 +04:00
|
|
|
for i in range($line):
|
2016-04-26 10:51:00 +03:00
|
|
|
d = marshal.load(instream)
|
|
|
|
print(d[b'$what'].decode('utf-8'))
|
2012-07-04 17:34:19 +04:00
|
|
|
EOF
|
|
|
|
"$PYTHON_PATH" "$TRASH_DIRECTORY/marshal-dump.py"
|
|
|
|
}
|
2012-08-11 20:55:00 +04:00
|
|
|
|
|
|
|
#
|
|
|
|
# Construct a client with this list of View lines
|
|
|
|
#
|
2016-04-19 22:49:41 +03:00
|
|
|
client_view () {
|
2012-08-11 20:55:00 +04:00
|
|
|
(
|
|
|
|
cat <<-EOF &&
|
2013-01-27 07:11:09 +04:00
|
|
|
Client: $P4CLIENT
|
|
|
|
Description: $P4CLIENT
|
2012-08-11 20:55:00 +04:00
|
|
|
Root: $cli
|
2013-01-27 07:11:11 +04:00
|
|
|
AltRoots: $(native_path "$cli")
|
2013-01-27 07:11:15 +04:00
|
|
|
LineEnd: unix
|
2012-08-11 20:55:00 +04:00
|
|
|
View:
|
|
|
|
EOF
|
2013-01-27 07:11:08 +04:00
|
|
|
printf "\t%s\n" "$@"
|
2012-08-11 20:55:00 +04: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 07:11:17 +04:00
|
|
|
|
2016-04-19 22:49:41 +03:00
|
|
|
is_cli_file_writeable () {
|
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 07:11:17 +04:00
|
|
|
# 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
|
|
|
|
}
|