revisions API: have release_revisions() release "cmdline"
Extend the the release_revisions() function so that it frees the
"cmdline" in the "struct rev_info". This in combination with a
preceding change to free "commits" and "mailmap" means that we can
whitelist another test under "TEST_PASSES_SANITIZE_LEAK=true".
There was a proposal in [1] to do away with xstrdup()-ing this
add_rev_cmdline(), perhaps that would be worthwhile, but for now let's
just free() it.
We could also make that a "char *" in "struct rev_cmdline_entry"
itself, but since we own it let's expose it as a constant to outside
callers. I proposed that in [2] but have since changed my mind. See
14d30cdfc04 (ref-filter: fix memory leak in `free_array_item()`,
2019-07-10), c514c62a4fd (checkout: fix leak of non-existent branch
names, 2020-08-14) and other log history hits for "free((char *)" for
prior art.
This includes the tests we had false-positive passes on before my
6798b08e848 (perl Git.pm: don't ignore signalled failure in
_cmd_close(), 2022-02-01), now they pass for real.
Since there are 66 tests matching t/t[0-9]*git-svn*.sh it's easier to
list those that don't pass than to touch most of those 66. So let's
introduce a "TEST_FAILS_SANITIZE_LEAK=true", which if set in the tests
won't cause lib-git-svn.sh to set "TEST_PASSES_SANITIZE_LEAK=true.
This change also marks all the tests that we removed
"TEST_FAILS_SANITIZE_LEAK=true" from in an earlier commit due to
removing the UNLEAK() from cmd_format_patch(), we can now assert that
its API use doesn't leak any "struct rev_info" memory.
This change also made commit "t5503-tagfollow.sh" pass on current
master, but that would regress when combined with
ps/fetch-atomic-fixup's de004e848a9 (t5503: simplify setup of test
which exercises failure of backfill, 2022-03-03) (through no fault of
that topic, that change started using "git clone" in the test, which
has an outstanding leak). Let's leave that test out for now to avoid
in-flight semantic conflicts.
1. https://lore.kernel.org/git/YUj%2FgFRh6pwrZalY@carlos-mbp.lan/
2. https://lore.kernel.org/git/87o88obkb1.fsf@evledraar.gmail.com/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-04-13 23:01:47 +03:00
|
|
|
if test -z "$TEST_FAILS_SANITIZE_LEAK"
|
|
|
|
then
|
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
|
|
|
fi
|
2006-07-06 11:14:16 +04:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
if test -n "$NO_SVN_TESTS"
|
2006-05-24 06:23:41 +04:00
|
|
|
then
|
2010-06-24 21:44:48 +04:00
|
|
|
skip_all='skipping git svn tests, NO_SVN_TESTS defined'
|
2006-07-06 11:14:16 +04:00
|
|
|
test_done
|
2006-05-24 06:23:41 +04:00
|
|
|
fi
|
2009-04-03 23:33:59 +04:00
|
|
|
if ! test_have_prereq PERL; then
|
2010-06-24 21:44:48 +04:00
|
|
|
skip_all='skipping git svn tests, perl not available'
|
2009-04-03 23:33:59 +04:00
|
|
|
test_done
|
|
|
|
fi
|
2006-05-24 06:23:41 +04:00
|
|
|
|
2006-12-16 10:58:07 +03:00
|
|
|
GIT_DIR=$PWD/.git
|
2009-08-12 07:14:27 +04:00
|
|
|
GIT_SVN_DIR=$GIT_DIR/svn/refs/remotes/git-svn
|
2006-12-16 10:58:07 +03:00
|
|
|
SVN_TREE=$GIT_SVN_DIR/svn-tree
|
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 SVNSERVE_PORT
|
2006-12-16 10:58:07 +03:00
|
|
|
|
2006-05-24 06:23:41 +04:00
|
|
|
svn >/dev/null 2>&1
|
2006-07-07 14:17:16 +04:00
|
|
|
if test $? -ne 1
|
2006-05-24 06:23:41 +04:00
|
|
|
then
|
2017-12-01 18:56:52 +03:00
|
|
|
skip_all='skipping git svn tests, svn not found'
|
|
|
|
test_done
|
2006-05-24 06:23:41 +04:00
|
|
|
fi
|
|
|
|
|
|
|
|
svnrepo=$PWD/svnrepo
|
2008-05-04 09:37:57 +04:00
|
|
|
export svnrepo
|
2009-05-08 12:06:16 +04:00
|
|
|
svnconf=$PWD/svnconf
|
|
|
|
export svnconf
|
2006-05-24 06:23:41 +04:00
|
|
|
|
2013-10-29 05:23:03 +04:00
|
|
|
perl -w -e "
|
2007-01-01 08:49:45 +03:00
|
|
|
use SVN::Core;
|
|
|
|
use SVN::Repos;
|
|
|
|
\$SVN::Core::VERSION gt '1.1.0' or exit(42);
|
2008-05-04 09:37:57 +04:00
|
|
|
system(qw/svnadmin create --fs-type fsfs/, \$ENV{svnrepo}) == 0 or exit(41);
|
2007-01-14 11:22:47 +03:00
|
|
|
" >&3 2>&4
|
2007-01-01 08:49:45 +03:00
|
|
|
x=$?
|
|
|
|
if test $x -ne 0
|
git-svn: SVN 1.1.x library compatibility
Tested on a plain Ubuntu Hoary installation
using subversion 1.1.1-2ubuntu3
1.1.x issues I had to deal with:
* Avoid the noisy command-line client compatibility check if we
use the libraries.
* get_log() arguments differ (now using a nice wrapper from
Junio's suggestion)
* get_file() is picky about what kind of file handles it gets,
so I ended up redirecting STDOUT. I'm probably overflushing
my file handles, but that's the safest thing to do...
* BDB kept segfaulting on me during tests, so svnadmin will use FSFS
whenever we can.
* If somebody used an expanded CVS $Id$ line inside a file, then
propsetting it to use svn:keywords will cause the original CVS
$Id$ to be retained when asked for the original file. As far as
I can see, this is a server-side issue. We won't care in the
test anymore, as long as it's not expanded by SVN, a static
CVS $Id$ line is fine.
While we're at making ourselves more compatible, avoid grep
along with the -q flag, which is GNU-specific. (grep avoidance
tip from Junio, too)
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-06-28 14:07:14 +04:00
|
|
|
then
|
2007-01-01 08:49:45 +03:00
|
|
|
if test $x -eq 42; then
|
2010-07-08 05:16:06 +04:00
|
|
|
skip_all='Perl SVN libraries must be >= 1.1.0'
|
2007-01-13 13:47:53 +03:00
|
|
|
elif test $x -eq 41; then
|
2010-07-08 05:16:06 +04:00
|
|
|
skip_all='svnadmin failed to create fsfs repository'
|
2007-01-01 08:49:45 +03:00
|
|
|
else
|
2010-07-08 05:16:06 +04:00
|
|
|
skip_all='Perl SVN libraries not found or unusable'
|
2007-01-01 08:49:45 +03:00
|
|
|
fi
|
|
|
|
test_done
|
git-svn: SVN 1.1.x library compatibility
Tested on a plain Ubuntu Hoary installation
using subversion 1.1.1-2ubuntu3
1.1.x issues I had to deal with:
* Avoid the noisy command-line client compatibility check if we
use the libraries.
* get_log() arguments differ (now using a nice wrapper from
Junio's suggestion)
* get_file() is picky about what kind of file handles it gets,
so I ended up redirecting STDOUT. I'm probably overflushing
my file handles, but that's the safest thing to do...
* BDB kept segfaulting on me during tests, so svnadmin will use FSFS
whenever we can.
* If somebody used an expanded CVS $Id$ line inside a file, then
propsetting it to use svn:keywords will cause the original CVS
$Id$ to be retained when asked for the original file. As far as
I can see, this is a server-side issue. We won't care in the
test anymore, as long as it's not expanded by SVN, a static
CVS $Id$ line is fine.
While we're at making ourselves more compatible, avoid grep
along with the -q flag, which is GNU-specific. (grep avoidance
tip from Junio, too)
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-06-28 14:07:14 +04:00
|
|
|
fi
|
|
|
|
|
2006-12-05 08:17:38 +03:00
|
|
|
rawsvnrepo="$svnrepo"
|
2006-11-28 08:46:50 +03:00
|
|
|
svnrepo="file://$svnrepo"
|
2006-05-24 06:23:41 +04:00
|
|
|
|
2007-02-13 03:33:37 +03:00
|
|
|
poke() {
|
2018-03-24 10:44:31 +03:00
|
|
|
test-tool chmtime +1 "$1"
|
2007-02-13 03:33:37 +03:00
|
|
|
}
|
2007-07-16 08:53:50 +04:00
|
|
|
|
2009-05-08 12:06:16 +04:00
|
|
|
# We need this, because we should pass empty configuration directory to
|
|
|
|
# the 'svn commit' to avoid automated property changes and other stuff
|
|
|
|
# that could be set from user's configuration files in ~/.subversion.
|
|
|
|
svn_cmd () {
|
|
|
|
[ -d "$svnconf" ] || mkdir "$svnconf"
|
|
|
|
orig_svncmd="$1"; shift
|
|
|
|
if [ -z "$orig_svncmd" ]; then
|
|
|
|
svn
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
svn "$orig_svncmd" --config-dir "$svnconf" "$@"
|
|
|
|
}
|
|
|
|
|
2016-07-23 07:26:08 +03:00
|
|
|
maybe_start_httpd () {
|
|
|
|
loc=${1-svn}
|
|
|
|
|
tests: add 'test_bool_env' to catch non-bool GIT_TEST_* values
Since 3b072c577b (tests: replace test_tristate with "git env--helper",
2019-06-21) we get the normalized bool values of various GIT_TEST_*
environment variables via 'git env--helper'. Now, while the 'git
env--helper' command itself does catch invalid values in the
environment variable or in the given --default and exits with error
(exit code 128 or 129, respectively), it's invoked in conditions like
'if ! git env--helper ...', which means that all invalid bool values
are interpreted the same as the ordinary 'false' (exit code 1). This
has led to inadvertently skipped httpd tests in our CI builds for a
couple of weeks, see 3960290675 (ci: restore running httpd tests,
2019-09-06).
Let's be more careful about what the test suite accepts as bool values
in GIT_TEST_* environment variables, and error out loud and clear on
invalid values instead of simply skipping tests. Add the
'test_bool_env' helper function to encapsulate the invocation of 'git
env--helper' and the verification of its exit code, and replace all
invocations of that command in our test framework and test suite with
a call to this new helper (except in 't0017-env-helper.sh', of
course).
$ GIT_TEST_GIT_DAEMON=YesPlease ./t5570-git-daemon.sh
fatal: bad numeric config value 'YesPlease' for 'GIT_TEST_GIT_DAEMON': invalid unit
error: test_bool_env requires bool values both for $GIT_TEST_GIT_DAEMON and for the default fallback
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-11-22 16:14:36 +03:00
|
|
|
if test_bool_env GIT_TEST_SVN_HTTPD false
|
2019-06-21 13:18:11 +03:00
|
|
|
then
|
2016-07-23 07:26:08 +03:00
|
|
|
. "$TEST_DIRECTORY"/lib-httpd.sh
|
|
|
|
LIB_HTTPD_SVN="$loc"
|
|
|
|
start_httpd
|
2019-06-21 13:18:11 +03:00
|
|
|
fi
|
2007-07-16 08:53:50 +04:00
|
|
|
}
|
2007-12-09 10:27:41 +03:00
|
|
|
|
|
|
|
convert_to_rev_db () {
|
2020-06-22 21:04:11 +03:00
|
|
|
perl -w -- - "$(test_oid rawsz)" "$@" <<\EOF
|
2007-12-09 10:27:41 +03:00
|
|
|
use strict;
|
2020-06-22 21:04:11 +03:00
|
|
|
my $oidlen = shift;
|
2013-02-25 02:48:39 +04:00
|
|
|
@ARGV == 2 or die "usage: convert_to_rev_db <input> <output>";
|
2020-06-22 21:04:11 +03:00
|
|
|
my $record_size = $oidlen + 4;
|
|
|
|
my $hexlen = $oidlen * 2;
|
2007-12-09 10:27:41 +03:00
|
|
|
open my $wr, '+>', $ARGV[1] or die "$!: couldn't open: $ARGV[1]";
|
|
|
|
open my $rd, '<', $ARGV[0] or die "$!: couldn't open: $ARGV[0]";
|
|
|
|
my $size = (stat($rd))[7];
|
2020-06-22 21:04:11 +03:00
|
|
|
($size % $record_size) == 0 or die "Inconsistent size: $size";
|
|
|
|
while (sysread($rd, my $buf, $record_size) == $record_size) {
|
|
|
|
my ($r, $c) = unpack("NH$hexlen", $buf);
|
|
|
|
my $offset = $r * ($hexlen + 1);
|
2007-12-09 10:27:41 +03:00
|
|
|
seek $wr, 0, 2 or die $!;
|
|
|
|
my $pos = tell $wr;
|
|
|
|
if ($pos < $offset) {
|
2020-06-22 21:04:11 +03:00
|
|
|
for (1 .. (($offset - $pos) / ($hexlen + 1))) {
|
|
|
|
print $wr (('0' x $hexlen),"\n") or die $!;
|
2007-12-09 10:27:41 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
seek $wr, $offset, 0 or die $!;
|
|
|
|
print $wr $c,"\n" or die $!;
|
|
|
|
}
|
|
|
|
close $wr or die $!;
|
|
|
|
close $rd or die $!;
|
|
|
|
EOF
|
|
|
|
}
|
2008-09-15 01:14:15 +04:00
|
|
|
|
|
|
|
require_svnserve () {
|
tests: add 'test_bool_env' to catch non-bool GIT_TEST_* values
Since 3b072c577b (tests: replace test_tristate with "git env--helper",
2019-06-21) we get the normalized bool values of various GIT_TEST_*
environment variables via 'git env--helper'. Now, while the 'git
env--helper' command itself does catch invalid values in the
environment variable or in the given --default and exits with error
(exit code 128 or 129, respectively), it's invoked in conditions like
'if ! git env--helper ...', which means that all invalid bool values
are interpreted the same as the ordinary 'false' (exit code 1). This
has led to inadvertently skipped httpd tests in our CI builds for a
couple of weeks, see 3960290675 (ci: restore running httpd tests,
2019-09-06).
Let's be more careful about what the test suite accepts as bool values
in GIT_TEST_* environment variables, and error out loud and clear on
invalid values instead of simply skipping tests. Add the
'test_bool_env' helper function to encapsulate the invocation of 'git
env--helper' and the verification of its exit code, and replace all
invocations of that command in our test framework and test suite with
a call to this new helper (except in 't0017-env-helper.sh', of
course).
$ GIT_TEST_GIT_DAEMON=YesPlease ./t5570-git-daemon.sh
fatal: bad numeric config value 'YesPlease' for 'GIT_TEST_GIT_DAEMON': invalid unit
error: test_bool_env requires bool values both for $GIT_TEST_GIT_DAEMON and for the default fallback
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-11-22 16:14:36 +03:00
|
|
|
if ! test_bool_env GIT_TEST_SVNSERVE false
|
2017-12-01 18:56:52 +03:00
|
|
|
then
|
2017-12-01 18:56:53 +03:00
|
|
|
skip_all='skipping svnserve test. (set $GIT_TEST_SVNSERVE to enable)'
|
2017-12-01 18:56:52 +03:00
|
|
|
test_done
|
|
|
|
fi
|
2008-09-15 01:14:15 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
start_svnserve () {
|
2017-12-01 18:56:52 +03:00
|
|
|
svnserve --listen-port $SVNSERVE_PORT \
|
|
|
|
--root "$rawsvnrepo" \
|
|
|
|
--listen-once \
|
|
|
|
--listen-host 127.0.0.1 &
|
2008-09-15 01:14:15 +04:00
|
|
|
}
|
|
|
|
|
t: use user-specified utf-8 locale for testing svn
In some test-cases, UTF-8 locale is required. To find such locale,
we're using the first available UTF-8 locale that returned by
"locale -a".
However, the locale(1) utility is unavailable on some systems,
e.g. Linux with musl libc.
However, without "locale -a", we can't guess provided UTF-8 locale.
Add a Makefile knob GIT_TEST_UTF8_LOCALE and activate it for
linux-musl in our CI system.
Rename t/lib-git-svn.sh:prepare_a_utf8_locale to prepare_utf8_locale,
since we no longer prepare the variable named "a_utf8_locale",
but set up a fallback value for GIT_TEST_UTF8_LOCALE instead.
The fallback will be LC_ALL, LANG environment variable,
or the first UTF-8 locale from output of "locale -a", in that order.
Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-06-08 09:56:28 +03:00
|
|
|
prepare_utf8_locale () {
|
|
|
|
if test -z "$GIT_TEST_UTF8_LOCALE"
|
|
|
|
then
|
|
|
|
case "${LC_ALL:-$LANG}" in
|
|
|
|
*.[Uu][Tt][Ff]8 | *.[Uu][Tt][Ff]-8)
|
|
|
|
GIT_TEST_UTF8_LOCALE="${LC_ALL:-$LANG}"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
GIT_TEST_UTF8_LOCALE=$(locale -a | sed -n '/\.[uU][tT][fF]-*8$/{
|
|
|
|
p
|
|
|
|
q
|
|
|
|
}')
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
fi
|
|
|
|
if test -n "$GIT_TEST_UTF8_LOCALE"
|
2016-02-22 05:17:51 +03:00
|
|
|
then
|
|
|
|
test_set_prereq UTF8
|
|
|
|
else
|
|
|
|
say "# UTF-8 locale not available, some tests are skipped"
|
|
|
|
fi
|
|
|
|
}
|