mirror of
https://github.com/postgres/postgres.git
synced 2025-12-19 17:02:53 +03:00
Apply more consistent style for command options in TAP tests
This commit reshapes the grammar of some commands to apply a more
consistent style across the board, following rules similar to
ce1b0f9da0:
- Elimination of some pointless used-once variables.
- Use of long options, to self-document better the options used.
- Use of fat commas to link option names and their assigned values,
including redirections, so as perltidy can be tricked to put them
together.
Author: Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Discussion: https://postgr.es/m/87jz8rzf3h.fsf@wibble.ilmari.org
This commit is contained in:
@@ -108,14 +108,17 @@ sub new
|
||||
if ($interactive)
|
||||
{
|
||||
$run = IPC::Run::start $psql_params,
|
||||
'<pty<', \$psql->{stdin}, '>pty>', \$psql->{stdout}, '2>',
|
||||
\$psql->{stderr},
|
||||
'<pty<' => \$psql->{stdin},
|
||||
'>pty>' => \$psql->{stdout},
|
||||
'2>' => \$psql->{stderr},
|
||||
$psql->{timeout};
|
||||
}
|
||||
else
|
||||
{
|
||||
$run = IPC::Run::start $psql_params,
|
||||
'<', \$psql->{stdin}, '>', \$psql->{stdout}, '2>', \$psql->{stderr},
|
||||
'<' => \$psql->{stdin},
|
||||
'>' => \$psql->{stdout},
|
||||
'2>' => \$psql->{stderr},
|
||||
$psql->{timeout};
|
||||
}
|
||||
|
||||
|
||||
@@ -640,8 +640,11 @@ sub init
|
||||
or !defined $ENV{INITDB_TEMPLATE})
|
||||
{
|
||||
note("initializing database system by running initdb");
|
||||
PostgreSQL::Test::Utils::system_or_bail('initdb', '-D', $pgdata, '-A',
|
||||
'trust', '-N', @{ $params{extra} });
|
||||
PostgreSQL::Test::Utils::system_or_bail(
|
||||
'initdb', '--no-sync',
|
||||
'--pgdata' => $pgdata,
|
||||
'--auth' => 'trust',
|
||||
@{ $params{extra} });
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -838,11 +841,11 @@ sub backup
|
||||
|
||||
print "# Taking pg_basebackup $backup_name from node \"$name\"\n";
|
||||
PostgreSQL::Test::Utils::system_or_bail(
|
||||
'pg_basebackup', '-D',
|
||||
$backup_path, '-h',
|
||||
$self->host, '-p',
|
||||
$self->port, '--checkpoint',
|
||||
'fast', '--no-sync',
|
||||
'pg_basebackup', '--no-sync',
|
||||
'--pgdata' => $backup_path,
|
||||
'--host' => $self->host,
|
||||
'--port' => $self->port,
|
||||
'--checkpoint' => 'fast',
|
||||
@{ $params{backup_options} });
|
||||
print "# Backup finished\n";
|
||||
return;
|
||||
@@ -946,7 +949,7 @@ sub init_from_backup
|
||||
}
|
||||
|
||||
local %ENV = $self->_get_env();
|
||||
my @combineargs = ('pg_combinebackup', '-d');
|
||||
my @combineargs = ('pg_combinebackup', '--debug');
|
||||
if (exists $params{tablespace_map})
|
||||
{
|
||||
while (my ($olddir, $newdir) = each %{ $params{tablespace_map} })
|
||||
@@ -959,19 +962,21 @@ sub init_from_backup
|
||||
{
|
||||
push @combineargs, $params{combine_mode};
|
||||
}
|
||||
push @combineargs, @prior_backup_path, $backup_path, '-o', $data_path;
|
||||
push @combineargs, @prior_backup_path, $backup_path,
|
||||
'--output' => $data_path;
|
||||
PostgreSQL::Test::Utils::system_or_bail(@combineargs);
|
||||
}
|
||||
elsif (defined $params{tar_program})
|
||||
{
|
||||
mkdir($data_path) || die "mkdir $data_path: $!";
|
||||
PostgreSQL::Test::Utils::system_or_bail($params{tar_program}, 'xf',
|
||||
$backup_path . '/base.tar',
|
||||
'-C', $data_path);
|
||||
PostgreSQL::Test::Utils::system_or_bail(
|
||||
$params{tar_program}, 'xf',
|
||||
$backup_path . '/pg_wal.tar', '-C',
|
||||
$data_path . '/pg_wal');
|
||||
$params{tar_program},
|
||||
'xf' => $backup_path . '/base.tar',
|
||||
'-C' => $data_path);
|
||||
PostgreSQL::Test::Utils::system_or_bail(
|
||||
$params{tar_program},
|
||||
'xf' => $backup_path . '/pg_wal.tar',
|
||||
'-C' => $data_path . '/pg_wal');
|
||||
|
||||
# We need to generate a tablespace_map file.
|
||||
open(my $tsmap, ">", "$data_path/tablespace_map")
|
||||
@@ -991,9 +996,10 @@ sub init_from_backup
|
||||
my $newdir = $params{tablespace_map}{$tsoid};
|
||||
|
||||
mkdir($newdir) || die "mkdir $newdir: $!";
|
||||
PostgreSQL::Test::Utils::system_or_bail($params{tar_program},
|
||||
'xf', $backup_path . '/' . $tstar,
|
||||
'-C', $newdir);
|
||||
PostgreSQL::Test::Utils::system_or_bail(
|
||||
$params{tar_program},
|
||||
'xf' => $backup_path . '/' . $tstar,
|
||||
'-C' => $newdir);
|
||||
|
||||
my $escaped_newdir = $newdir;
|
||||
$escaped_newdir =~ s/\\/\\\\/g;
|
||||
@@ -1133,8 +1139,10 @@ sub start
|
||||
# -w is now the default but having it here does no harm and helps
|
||||
# compatibility with older versions.
|
||||
$ret = PostgreSQL::Test::Utils::system_log(
|
||||
'pg_ctl', '-w', '-D', $self->data_dir,
|
||||
'-l', $self->logfile, '-o', "--cluster-name=$name",
|
||||
'pg_ctl', '--wait',
|
||||
'--pgdata' => $self->data_dir,
|
||||
'--log' => $self->logfile,
|
||||
'--options' => "--cluster-name=$name",
|
||||
'start');
|
||||
|
||||
if ($ret != 0)
|
||||
@@ -1211,10 +1219,10 @@ sub stop
|
||||
return 1 unless defined $self->{_pid};
|
||||
|
||||
print "### Stopping node \"$name\" using mode $mode\n";
|
||||
my @cmd = ('pg_ctl', '-D', $pgdata, '-m', $mode, 'stop');
|
||||
my @cmd = ('pg_ctl', '--pgdata' => $pgdata, '--mode' => $mode, 'stop');
|
||||
if ($params{timeout})
|
||||
{
|
||||
push(@cmd, ('--timeout', $params{timeout}));
|
||||
push(@cmd, ('--timeout' => $params{timeout}));
|
||||
}
|
||||
$ret = PostgreSQL::Test::Utils::system_log(@cmd);
|
||||
|
||||
@@ -1251,7 +1259,9 @@ sub reload
|
||||
local %ENV = $self->_get_env();
|
||||
|
||||
print "### Reloading node \"$name\"\n";
|
||||
PostgreSQL::Test::Utils::system_or_bail('pg_ctl', '-D', $pgdata,
|
||||
PostgreSQL::Test::Utils::system_or_bail(
|
||||
'pg_ctl',
|
||||
'--pgdata' => $pgdata,
|
||||
'reload');
|
||||
return;
|
||||
}
|
||||
@@ -1279,8 +1289,11 @@ sub restart
|
||||
|
||||
# -w is now the default but having it here does no harm and helps
|
||||
# compatibility with older versions.
|
||||
$ret = PostgreSQL::Test::Utils::system_log('pg_ctl', '-w', '-D',
|
||||
$self->data_dir, '-l', $self->logfile, 'restart');
|
||||
$ret = PostgreSQL::Test::Utils::system_log(
|
||||
'pg_ctl', '--wait',
|
||||
'--pgdata' => $self->data_dir,
|
||||
'--log' => $self->logfile,
|
||||
'restart');
|
||||
|
||||
if ($ret != 0)
|
||||
{
|
||||
@@ -1318,8 +1331,11 @@ sub promote
|
||||
local %ENV = $self->_get_env();
|
||||
|
||||
print "### Promoting node \"$name\"\n";
|
||||
PostgreSQL::Test::Utils::system_or_bail('pg_ctl', '-D', $pgdata, '-l',
|
||||
$logfile, 'promote');
|
||||
PostgreSQL::Test::Utils::system_or_bail(
|
||||
'pg_ctl',
|
||||
'--pgdata' => $pgdata,
|
||||
'--log' => $logfile,
|
||||
'promote');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1342,8 +1358,11 @@ sub logrotate
|
||||
local %ENV = $self->_get_env();
|
||||
|
||||
print "### Rotating log in node \"$name\"\n";
|
||||
PostgreSQL::Test::Utils::system_or_bail('pg_ctl', '-D', $pgdata, '-l',
|
||||
$logfile, 'logrotate');
|
||||
PostgreSQL::Test::Utils::system_or_bail(
|
||||
'pg_ctl',
|
||||
'--pgdata' => $pgdata,
|
||||
'--log' => $logfile,
|
||||
'logrotate');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2120,7 +2139,9 @@ sub psql
|
||||
|
||||
my @psql_params = (
|
||||
$self->installed_command('psql'),
|
||||
'-XAtq', '-d', $psql_connstr, '-f', '-');
|
||||
'--no-psqlrc', '--no-align', '--tuples-only', '--quiet',
|
||||
'--dbname' => $psql_connstr,
|
||||
'--file' => '-');
|
||||
|
||||
# If the caller wants an array and hasn't passed stdout/stderr
|
||||
# references, allocate temporary ones to capture them so we
|
||||
@@ -2142,7 +2163,8 @@ sub psql
|
||||
$params{on_error_stop} = 1 unless defined $params{on_error_stop};
|
||||
$params{on_error_die} = 0 unless defined $params{on_error_die};
|
||||
|
||||
push @psql_params, '-v', 'ON_ERROR_STOP=1' if $params{on_error_stop};
|
||||
push @psql_params, '--variable' => 'ON_ERROR_STOP=1'
|
||||
if $params{on_error_stop};
|
||||
push @psql_params, @{ $params{extra_params} }
|
||||
if defined $params{extra_params};
|
||||
|
||||
@@ -2168,9 +2190,9 @@ sub psql
|
||||
{
|
||||
local $@;
|
||||
eval {
|
||||
my @ipcrun_opts = (\@psql_params, '<', \$sql);
|
||||
push @ipcrun_opts, '>', $stdout if defined $stdout;
|
||||
push @ipcrun_opts, '2>', $stderr if defined $stderr;
|
||||
my @ipcrun_opts = (\@psql_params, '<' => \$sql);
|
||||
push @ipcrun_opts, '>' => $stdout if defined $stdout;
|
||||
push @ipcrun_opts, '2>' => $stderr if defined $stderr;
|
||||
push @ipcrun_opts, $timeout if defined $timeout;
|
||||
|
||||
IPC::Run::run @ipcrun_opts;
|
||||
@@ -2325,13 +2347,16 @@ sub background_psql
|
||||
|
||||
my @psql_params = (
|
||||
$self->installed_command('psql'),
|
||||
'-XAtq', '-d', $psql_connstr, '-f', '-');
|
||||
'--no-psqlrc', '--no-align',
|
||||
'--tuples-only', '--quiet',
|
||||
'--dbname' => $psql_connstr,
|
||||
'--file' => '-');
|
||||
|
||||
$params{on_error_stop} = 1 unless defined $params{on_error_stop};
|
||||
$params{wait} = 1 unless defined $params{wait};
|
||||
$timeout = $params{timeout} if defined $params{timeout};
|
||||
|
||||
push @psql_params, '-v', 'ON_ERROR_STOP=1' if $params{on_error_stop};
|
||||
push @psql_params, '--set' => 'ON_ERROR_STOP=1' if $params{on_error_stop};
|
||||
push @psql_params, @{ $params{extra_params} }
|
||||
if defined $params{extra_params};
|
||||
|
||||
@@ -2402,7 +2427,8 @@ sub interactive_psql
|
||||
|
||||
my @psql_params = (
|
||||
$self->installed_command('psql'),
|
||||
'-XAt', '-d', $self->connstr($dbname));
|
||||
'--no-psqlrc', '--no-align', '--tuples-only',
|
||||
'--dbname' => $self->connstr($dbname));
|
||||
|
||||
push @psql_params, @{ $params{extra_params} }
|
||||
if defined $params{extra_params};
|
||||
@@ -2424,7 +2450,7 @@ sub _pgbench_make_files
|
||||
for my $fn (sort keys %$files)
|
||||
{
|
||||
my $filename = $self->basedir . '/' . $fn;
|
||||
push @file_opts, '-f', $filename;
|
||||
push @file_opts, '--file' => $filename;
|
||||
|
||||
# cleanup file weight
|
||||
$filename =~ s/\@\d+$//;
|
||||
@@ -2650,8 +2676,9 @@ sub poll_query_until
|
||||
$expected = 't' unless defined($expected); # default value
|
||||
|
||||
my $cmd = [
|
||||
$self->installed_command('psql'), '-XAt',
|
||||
'-d', $self->connstr($dbname)
|
||||
$self->installed_command('psql'), '--no-psqlrc',
|
||||
'--no-align', '--tuples-only',
|
||||
'--dbname' => $self->connstr($dbname)
|
||||
];
|
||||
my ($stdout, $stderr);
|
||||
my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default;
|
||||
@@ -2659,8 +2686,10 @@ sub poll_query_until
|
||||
|
||||
while ($attempts < $max_attempts)
|
||||
{
|
||||
my $result = IPC::Run::run $cmd, '<', \$query,
|
||||
'>', \$stdout, '2>', \$stderr;
|
||||
my $result = IPC::Run::run $cmd,
|
||||
'<' => \$query,
|
||||
'>' => \$stdout,
|
||||
'2>' => \$stderr;
|
||||
|
||||
chomp($stdout);
|
||||
chomp($stderr);
|
||||
@@ -3534,15 +3563,17 @@ sub pg_recvlogical_upto
|
||||
|
||||
my @cmd = (
|
||||
$self->installed_command('pg_recvlogical'),
|
||||
'-S', $slot_name, '--dbname', $self->connstr($dbname));
|
||||
push @cmd, '--endpos', $endpos;
|
||||
push @cmd, '-f', '-', '--no-loop', '--start';
|
||||
'--slot' => $slot_name,
|
||||
'--dbname' => $self->connstr($dbname),
|
||||
'--endpos' => $endpos,
|
||||
'--file' => '-',
|
||||
'--no-loop', '--start');
|
||||
|
||||
while (my ($k, $v) = each %plugin_options)
|
||||
{
|
||||
croak "= is not permitted to appear in replication option name"
|
||||
if ($k =~ qr/=/);
|
||||
push @cmd, "-o", "$k=$v";
|
||||
push @cmd, "--option" => "$k=$v";
|
||||
}
|
||||
|
||||
my $timeout;
|
||||
@@ -3555,7 +3586,7 @@ sub pg_recvlogical_upto
|
||||
{
|
||||
local $@;
|
||||
eval {
|
||||
IPC::Run::run(\@cmd, ">", \$stdout, "2>", \$stderr, $timeout);
|
||||
IPC::Run::run(\@cmd, '>' => \$stdout, '2>' => \$stderr, $timeout);
|
||||
$ret = $?;
|
||||
};
|
||||
my $exc_save = $@;
|
||||
@@ -3669,15 +3700,14 @@ sub create_logical_slot_on_standby
|
||||
|
||||
$handle = IPC::Run::start(
|
||||
[
|
||||
'pg_recvlogical', '-d',
|
||||
$self->connstr($dbname), '-P',
|
||||
'test_decoding', '-S',
|
||||
$slot_name, '--create-slot'
|
||||
'pg_recvlogical',
|
||||
'--dbname' => $self->connstr($dbname),
|
||||
'--plugin' => 'test_decoding',
|
||||
'--slot' => $slot_name,
|
||||
'--create-slot'
|
||||
],
|
||||
'>',
|
||||
\$stdout,
|
||||
'2>',
|
||||
\$stderr);
|
||||
'>' => \$stdout,
|
||||
'2>' => \$stderr);
|
||||
|
||||
# Arrange for the xl_running_xacts record for which pg_recvlogical is
|
||||
# waiting.
|
||||
|
||||
@@ -104,7 +104,7 @@ sub new
|
||||
my ($host, $hostaddr, $realm) = @_;
|
||||
|
||||
my ($stdout, $krb5_version);
|
||||
run_log [ $krb5_config, '--version' ], '>', \$stdout
|
||||
run_log [ $krb5_config, '--version' ], '>' => \$stdout
|
||||
or BAIL_OUT("could not execute krb5-config");
|
||||
BAIL_OUT("Heimdal is not supported") if $stdout =~ m/heimdal/;
|
||||
$stdout =~ m/Kerberos 5 release ([0-9]+\.[0-9]+)/
|
||||
|
||||
@@ -20,7 +20,7 @@ PostgreSQL::Test::Utils - helper module for writing PostgreSQL's C<prove> tests.
|
||||
command_fails(['initdb', '--invalid-option'],
|
||||
'command fails with invalid option');
|
||||
my $tempdir = PostgreSQL::Test::Utils::tempdir;
|
||||
command_ok('initdb', '-D', $tempdir);
|
||||
command_ok('initdb', '--pgdata' => $tempdir);
|
||||
|
||||
# Miscellanea
|
||||
print "on Windows" if $PostgreSQL::Test::Utils::windows_os;
|
||||
@@ -333,7 +333,7 @@ sub has_wal_read_bug
|
||||
return
|
||||
$Config{osname} eq 'linux'
|
||||
&& $Config{archname} =~ /^sparc/
|
||||
&& !run_log([ qw(df -x ext4), $tmp_check ], '>', '/dev/null', '2>&1');
|
||||
&& !run_log([ qw(df -x ext4), $tmp_check ], '&>' => '/dev/null');
|
||||
}
|
||||
|
||||
=pod
|
||||
@@ -419,7 +419,7 @@ sub run_command
|
||||
{
|
||||
my ($cmd) = @_;
|
||||
my ($stdout, $stderr);
|
||||
my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr;
|
||||
my $result = IPC::Run::run $cmd, '>' => \$stdout, '2>' => \$stderr;
|
||||
chomp($stdout);
|
||||
chomp($stderr);
|
||||
return ($stdout, $stderr);
|
||||
@@ -723,8 +723,9 @@ sub scan_server_header
|
||||
my ($header_path, $regexp) = @_;
|
||||
|
||||
my ($stdout, $stderr);
|
||||
my $result = IPC::Run::run [ 'pg_config', '--includedir-server' ], '>',
|
||||
\$stdout, '2>', \$stderr
|
||||
my $result = IPC::Run::run [ 'pg_config', '--includedir-server' ],
|
||||
'>' => \$stdout,
|
||||
'2>' => \$stderr
|
||||
or die "could not execute pg_config";
|
||||
chomp($stdout);
|
||||
$stdout =~ s/\r$//;
|
||||
@@ -761,8 +762,9 @@ sub check_pg_config
|
||||
{
|
||||
my ($regexp) = @_;
|
||||
my ($stdout, $stderr);
|
||||
my $result = IPC::Run::run [ 'pg_config', '--includedir' ], '>',
|
||||
\$stdout, '2>', \$stderr
|
||||
my $result = IPC::Run::run [ 'pg_config', '--includedir' ],
|
||||
'>' => \$stdout,
|
||||
'2>' => \$stderr
|
||||
or die "could not execute pg_config";
|
||||
chomp($stdout);
|
||||
$stdout =~ s/\r$//;
|
||||
@@ -925,8 +927,9 @@ sub program_help_ok
|
||||
my ($cmd) = @_;
|
||||
my ($stdout, $stderr);
|
||||
print("# Running: $cmd --help\n");
|
||||
my $result = IPC::Run::run [ $cmd, '--help' ], '>', \$stdout, '2>',
|
||||
\$stderr;
|
||||
my $result = IPC::Run::run [ $cmd, '--help' ],
|
||||
'>' => \$stdout,
|
||||
'2>' => \$stderr;
|
||||
ok($result, "$cmd --help exit code 0");
|
||||
isnt($stdout, '', "$cmd --help goes to stdout");
|
||||
is($stderr, '', "$cmd --help nothing to stderr");
|
||||
@@ -956,8 +959,9 @@ sub program_version_ok
|
||||
my ($cmd) = @_;
|
||||
my ($stdout, $stderr);
|
||||
print("# Running: $cmd --version\n");
|
||||
my $result = IPC::Run::run [ $cmd, '--version' ], '>', \$stdout, '2>',
|
||||
\$stderr;
|
||||
my $result = IPC::Run::run [ $cmd, '--version' ],
|
||||
'>' => \$stdout,
|
||||
'2>' => \$stderr;
|
||||
ok($result, "$cmd --version exit code 0");
|
||||
isnt($stdout, '', "$cmd --version goes to stdout");
|
||||
is($stderr, '', "$cmd --version nothing to stderr");
|
||||
@@ -979,9 +983,9 @@ sub program_options_handling_ok
|
||||
my ($cmd) = @_;
|
||||
my ($stdout, $stderr);
|
||||
print("# Running: $cmd --not-a-valid-option\n");
|
||||
my $result = IPC::Run::run [ $cmd, '--not-a-valid-option' ], '>',
|
||||
\$stdout,
|
||||
'2>', \$stderr;
|
||||
my $result = IPC::Run::run [ $cmd, '--not-a-valid-option' ],
|
||||
'>' => \$stdout,
|
||||
'2>' => \$stderr;
|
||||
ok(!$result, "$cmd with invalid option nonzero exit code");
|
||||
isnt($stderr, '', "$cmd with invalid option prints error message");
|
||||
return;
|
||||
@@ -1002,7 +1006,7 @@ sub command_like
|
||||
my ($cmd, $expected_stdout, $test_name) = @_;
|
||||
my ($stdout, $stderr);
|
||||
print("# Running: " . join(" ", @{$cmd}) . "\n");
|
||||
my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr;
|
||||
my $result = IPC::Run::run $cmd, '>' => \$stdout, '2>' => \$stderr;
|
||||
ok($result, "$test_name: exit code 0");
|
||||
is($stderr, '', "$test_name: no stderr");
|
||||
like($stdout, $expected_stdout, "$test_name: matches");
|
||||
@@ -1031,7 +1035,7 @@ sub command_like_safe
|
||||
my $stdoutfile = File::Temp->new();
|
||||
my $stderrfile = File::Temp->new();
|
||||
print("# Running: " . join(" ", @{$cmd}) . "\n");
|
||||
my $result = IPC::Run::run $cmd, '>', $stdoutfile, '2>', $stderrfile;
|
||||
my $result = IPC::Run::run $cmd, '>' => $stdoutfile, '2>' => $stderrfile;
|
||||
$stdout = slurp_file($stdoutfile);
|
||||
$stderr = slurp_file($stderrfile);
|
||||
ok($result, "$test_name: exit code 0");
|
||||
@@ -1055,7 +1059,7 @@ sub command_fails_like
|
||||
my ($cmd, $expected_stderr, $test_name) = @_;
|
||||
my ($stdout, $stderr);
|
||||
print("# Running: " . join(" ", @{$cmd}) . "\n");
|
||||
my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr;
|
||||
my $result = IPC::Run::run $cmd, '>' => \$stdout, '2>' => \$stderr;
|
||||
ok(!$result, "$test_name: exit code not 0");
|
||||
like($stderr, $expected_stderr, "$test_name: matches");
|
||||
return;
|
||||
@@ -1093,7 +1097,7 @@ sub command_checks_all
|
||||
# run command
|
||||
my ($stdout, $stderr);
|
||||
print("# Running: " . join(" ", @{$cmd}) . "\n");
|
||||
IPC::Run::run($cmd, '>', \$stdout, '2>', \$stderr);
|
||||
IPC::Run::run($cmd, '>' => \$stdout, '2>' => \$stderr);
|
||||
|
||||
# See http://perldoc.perl.org/perlvar.html#%24CHILD_ERROR
|
||||
my $ret = $?;
|
||||
|
||||
Reference in New Issue
Block a user